Khi người dùng tác động lên icon giao diện của ứng dụng, hệ thống gửi một message đến cửa sổ xử lý liên quan icon với nội dung như sau: - message : Số hiệu message của icon (trong uCallbackMessage). - wParam : Số hiệu của icon.
- lParam : Chứa các trạng thái của chuột hoặc phím mà người dùng đã sử dụng để tác động lên icon giao diện. Hành vi WindowProc của cửa sổ xử lý liên quan sẽ tùy nghi xử lý: LRESULT CTaskbarIconDlg::WindowProc ( UINT message,
WPARAM wParam, LPARAM lParam ) {
if ( message == Icon_uCallbackMessage ) { switch ( lParam ) {
… // Xử lý biến cố phím / chuột trong lParam }
return 0 ; }
return CDialog::WindowProc(message, wParam, lParam); }
2 Giả sử cần thực hiện ứng dụng như sau:
- Set Icon: Cài icon của ứng dụng lên status area. - Remove Icon: Xóa icon của ứng dụng khỏi status area. - Hộp thông báo cho biết các biến cố nhập tác động lên icon.
Một số vấn đề trong Windows 165
Các bước thực hiện dự án của ứng dụng:
Dùng MFC Wizard tạo ứng dụng TaskbarIcon có giao diện là dialog. Thực hiện các bổ sung sau đây cho lớp dialog CTaskbarIconDlg:
- Mở dialog resource, cài đặt các control sau:
- Hộp thông báo trạng thái icon Static IDC_ICON_INFO - Nút thực hiện đặt icon Button IDC_ICON_SET - Nút thực hiện xóa icon Button IDC_ICON_REMOVE - Khai báo thuộc tính protected m_isIconShow kiểu luận lý, để ghi
nhận tình trạng đặt icon; m_isIconShow = FALSE : icon chưa được đặt, m_isIconShow = TRUE : icon đã được đặt.
- Hành vi OnInitDialog chuẩn bị các thông số: BOOL CTaskbarIconDlg::OnInitDialog() {
CDialog::OnInitDialog();
m_isIconShow = FALSE; // Bắt đầu, icon chưa được đặt. return TRUE;
}
- Hành vi OnIconSet ứng với nút chọn IDC_ICON_SET thực hiện cài icon giao diện lên status area:
void CTaskbarIconDlg::OnIconSet() {
if ( m_isIconShow ) return; NOTIFYICONDATA dt;
memset(&dt, 0, sizeof( NOTIFYICONDATA ) ); dt.cbSize = sizeof(NOTIFYICONDATA); dt.uID = 100;
dt.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); dt.hWnd = this->GetSafeHwnd();
dt.uCallbackMessage = WM_USER + 10;
dt.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; strcpy(dt.szTip,"Mr.Emp, hello world !");
if ( Shell_NotifyIcon( NIM_ADD, &dt ) )
m_isIconShow = TRUE; // Đặt icon thành công }
- Hành vi OnIconRemove ứng với nút chọn IDC_ICON_REMOVE thực hiện xóa icon giao diện khỏi status area:
166 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.comvoid CTaskbarIconDlg::OnIconRemove() void CTaskbarIconDlg::OnIconRemove()
{ if ( !m_isIconShow ) return; NOTIFYICONDATA dt; memset(&dt, 0, sizeof(NOTIFYICONDATA)); dt.cbSize = sizeof(NOTIFYICONDATA); dt.uID = 100; dt.hWnd = this->GetSafeHwnd(); if ( Shell_NotifyIcon( NIM_DELETE, &dt ) )
m_isIconShow = FALSE; // Xóa icon thành công }
- Hành vi WindowProc xử lý thông tin nhập tác động lên icon: LRESULT CTaskbarIconDlg::WindowProc(UINT message,
WPARAM wParam, LPARAM lParam) {
if ( message == WM_USER + 10 ) {
// WM_USER + 10 : số hiệu messge đăng ký cho icon. // Xử lý các thao tác bấm nút chuột (BT) của người dùng.
switch (lParam) {
case WM_MOUSEMOVE:
SetDlgItemText(IDC_ICON_INFO, "Mouse moves!"); break;
case WM_LBUTTONDOWN:
SetDlgItemText(IDC_ICON_INFO, "Left BT down !"); break;
case WM_LBUTTONUP:
SetDlgItemText(IDC_ICON_INFO, "Left BT up !"); break;
case WM_RBUTTONDOWN:
SetDlgItemText(IDC_ICON_INFO, "Right BT down !"); break; case WM_RBUTTONUP: SetDlgItemText(IDC_ICON_INFO, "Right BT up !"); break; } return 0; }
return CDialog::WindowProc(message, wParam, lParam); }
Biên dịch và chạy ứng dụng.
Một số vấn đề trong Windows 167
12.4 ỨNG DỤNG SCREEN SAVER:
ScreenSaver là ứng dụng được lưu trong tập tin chương trình có phần mở rộng .SCR. Để sử dụng ứng dụng ScreenSaver, ta chép tập tin chương trình của ứng dụng vào thư mục hệ thống, sau đó sử dụng chức năng Desktop của Control Panel (Desktop Properties) cài đặt ứng dụng ScreenSaver cho hệ thống thông qua trang Screen Saver:
2 Tên tập tin chương trình của ứng dụng ScreenSaver được dùng làm tên ScreenSaver trong danh sách lựa chọn các ScreenSaver. Nếu ta khai báo một hằng chuỗi với số hiệu là 1 trong StringTable resource của ứng dụng thì nội dung hằng chuỗi này (không được nhiều hơn 64 ký tự) được dùng làm tên ScreenSaver trong danh sách nói trên.