Một số vấn đề trong windows
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.
164 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
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.com
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