Với: pData : Địa chỉ biến con trỏ quản lý vùng đệm nhận thông tin. nBytes : Địa chỉ biến chứa kích thước thông tin đọc được. ) Ứng dụng cần giải phóng vùng đệm pData khi chấm dứt sử dụng. 2 Đoạn chương trình sau thực hiện ghi xuống thành phần MY_TEST của tập tin INI của ứng dụng: MyName = Mr.Emp và MyVer = 11. CWinApp* pApp = AfxGetApp(); // Đối tượng quản lý ứng dụng pApp->WriteProfileString ("MY_TEST", "MyName", "Mr.Emp"); pApp->WriteProfileInt ("MY_TEST", "MyVer", 11);
2 Đoạn chương trình sau thực hiện đọc từ thành phần MY_TEST của tập tin INI giá trị hai mục nói trên.
CWinApp* pApp = AfxGetApp(); // Đối tượng quản lý ứng dụng CString myName = pApp->GetProfileString (
"MY_TEST", "MyName", "Mr.Emp" ); UINT myVer = pApp->GetProfileInt ("MY_TEST", "MyVer", 11); 12.2 SYSTEM REGISTRY:
System Registry là cơ sở dữ liệu do windows quản lý, được sử dụng để lưu trữ các nội dung phục vụ cho hoạt động của hệ thống và các ứng dụng. System registry có cấu trúc như sau (chương trình RegEdit.exe).
(System registry ở một máy sử dụng phiên bản Windows-Me )
Một số vấn đề trong Windows 161
- Mỗi mục trong cấu trúc cây (tree) gọi là khóa (key). - Khóa lá (không có con) là thành phần chứa các mục.
- Mỗi mục có một tên để nhận biết và có một giá trị xác định.
) Hành vi SetRegistryKey của lớp đối tượng CWinApp cho phép định hướng việc đọc/ghi giá trị các mục lên system registry thay vì sử dụng tập tin INI như (12.1). Hành vi loại protected này có cú pháp như sau:
void SetRegistryKey ( UINT lpszRegistryKey );
lpszRegistryKey : Thông thường là chuỗi chứa tên hãng phần mềm; ví dụ Netscape. Giá trị này trở thành khóa con của khóa Software thuộc khóa gốc HKEY_CURRENT_USER trong system registry.
) Khi ứng dụng thực hiện đọc/ghi giá trị mục, tên của ứng dụng (lưu trong m_pszAppName của đối tượng ứng dụng) trở thành khóa con của khóa xác định bởi lpszRegistryKey, và các thành phần chứa các mục trở thành khóa con của khóa m_pszAppName. Một thứ tự được thiết lập như sau:
HKEY_CURRENT_USER\Software\<Tên_hãng_phần_mềm>\ <Tên_ứng_dụng>\<Tên_thành_phần>\<Các_mục>. 2 Thực hiện ứng dụng IniReg. Ứng dụng đăng ký sử dụng system registry
với khóa "Mr.Emp", đồng thời tiến hành các tác vụ đọc / ghi hai giá trị như ví dụ mục (12.1).
Sau đây là các bước thực hiện dự án của ứng dụng:
Dùng MFC Wizard tạo dự án IniReg với giao diện chính là dialog. Hành vi InitInstance của lớp đối tượng quản lý ứng dụng thực hiện đặt
lại tên cho ứng dụng và đăng ký sử dụng registry với khóa "Mr.Emp": BOOL CIniRegApp::InitInstance()
{
free((void*)m_pszAppName); // Giải phóng vùng nhớ m_pszAppName=_tcsdup( _T("IniReg") ); // Đặt tên ứng dụng SetRegistryKey( _T("Mr.EMP") ); // Đăng ký registry CIniRegDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal(); // Thực hiện giao diện return TRUE;
}
Thực hiện các bổ sung sau cho lớp dialog giao diện CIniRegDlg: - Mở dialog resource, cài đặt các control sau:
162 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com- Hộp nhập giá trị mục MyName Edit IDC_WRITE_NAME - Hộp nhập giá trị mục MyName Edit IDC_WRITE_NAME - Hộp nhập giá trị mục MyVer Edit IDC_WRITE_VERSION - Hộp hiển thị mục MyName Static IDC_READ_NAME - Hộp hiển thị mục MyVer Static IDC_READ_VERSION - Nút chọn thực hiện ghi Button IDC_WRITE
- Nút chọn thực hiện đọc Button IDC_READ
- Hành vi OnWrite ứng với nút IDC_WRITE lưu giá trị các mục: void CIniRegDlg::OnWrite()
{
CWinApp* pApp = AfxGetApp(); CString myName;
UINT myVer;
GetDlgItemText(IDC_WRITE_NAME, myName); myVer = GetDlgItemInt(IDC_WRITE_VERSION);
pApp->WriteProfileString("MY_TEST", "MyName", myName); pApp->WriteProfileInt("MY_TEST", "MyVer", myVer);
}
- Hành vi OnRead ứng với nút IDC_READ đọc giá trị các mục: void CIniRegDlg::OnRead()
{
CWinApp* pApp = AfxGetApp(); CString myName;
UINT myVer;
myName = pApp->GetProfileString( "MY_TEST",
"MyName", "NoName" ); myVer = pApp->GetProfileInt( "MY_TEST", "MyVer", 0 ); SetDlgItemText( IDC_READ_NAME, myName );
SetDlgItemInt( IDC_READ_VERSION, myVer ); }
Biên dịch và chạy ứng dụng.
12.3 VÙNG STATUS AREA TRÊN TASKBAR:
Một số vấn đề trong Windows 163
Taskbar là thanh công cụ đặc biệt của ứng dụng desktop trong windows. Nội dung của taskbar được chia thành 4 thành phần chính:
- Start menu: Mục kích hoạt hệ thống menu các ứng dụng. - Quick Launch Bar: Danh mục các ứng dụng thường dùng. - Taskbar Buttons: Danh sách các ứng dụng đang chạy.
- Status Area: Chứa icon giao diện của các ứng dụng đang chạy. Ứng dụng có thể nhận được tín hiệu nhập của người dùng khi họ dùng phím hoặc chuột tác động lên icon của ứng dụng trên status area. Việc cài đặt hoặc hủy bỏ icon giao diện của ứng dụng trên status area đuợc thực hiện thông quan hàm sau:
BOOL Shell_NotifyIcon (
DWORD dwMessage, // Tác vụ thực hiện
PNOTIFYICONDATA lpdata // Cấu trúc chứa thông số liên quan ); Trả về giá trị TRUE nếu tác vụ thực hiện thành công.
dwMessage : Ấn định tác vụ thực hiện.
NIM_ADD : Tạo icon giao diện của ứng dụng trên status area. NIM_MODIFY : Thay đổi thông số liên quan icon giao diện. NIM_DELETE : Xóa icon giao diện của ứng dụng trên status area. lpdata : Địa chỉ cấu trúc NOTIFYICONDATA chứa các thông số. Các trường trong cấu trúc NOTIFYICONDATA có ý nghĩa như sau: typedef struct _NOTIFYICONDATA {
DWORD cbSize; // Kích thuớc cấu trúc
HWND hWnd; // Handle của cửa sổ xử lý message từ icon UINT uID; // Số hiệu của icon trên status area
UINT uFlags; // Qui định các thông số có ý nghĩa UINT uCallbackMessage; // Số hiệu message của icon gửi cửa sổ. HICON hIcon; // Handle của icon được sử dụng
TCHAR szTip[64]; // Nội dung chú thích của icon giao diện. } NOTIFYICONDATA, *PNOTIFYICONDATA;
uFlags : Qui định trường thông số trong cấu trúc có ý nghĩa sử dụng. NIF_MESSAGE : Trường uCallbackMessage được sử dụng. NIF_ICON : Trường hIcon được sử dụng.
NIF_TIP : Trường szTip được sử dụng.