橫秋掃盲系列(1): MessageBox 消息對話框 -- 2005-8-7 16:37:30

1.參數的使用(MB_SYSTEMMODAL和MB_SERVICE_NOTIFICATION)
MB_SYSTEMMODAL 所有窗口的Modal模式,含 WS_EX_TOPMOST 風格(該風格可通過MB_TOPMOST單獨設定) 
MB_SERVICE_NOTIFICATION 顯示在當前桌面,即使沒有用戶登錄(一般用於service 服務)

2.MessageBoxIndirect (一般用於自定義圖標)
  MSGBOXPARAMS msgBox;
  msgBox.cbSize = sizeof(MSGBOXPARAMS);
  msgBox.dwStyle = MB_USERICON | nButtons;
  msgBox.hInstance = AfxGetApp()->m_hInstance;
  msgBox.hwndOwner = NULL;
  msgBox.lpszCaption = lpszTitle;
  msgBox.lpszIcon = MAKEINTRESOURCE(nResourceID);//資源中的ICON
  msgBox.lpszText = lpszText;
  MessageBoxIndirect(&msgBox);

3.WH_CBT 鉤子 (一般用於設定窗口位置和修改按鈕文本)
a)設定窗口的位置(http://support.microsoft.com/default.aspx?scid=kb;en-us;180936
HHOOK hHook;
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HCBT_ACTIVATE)
{
RECT rect;
GetWindowRect(hWnd, &rect);
MoveWindow((HWND)hWnd, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE);
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

使用方法
hHook = SetWindowsHookEx(WH_CBT, CBTProc, GetModuleHandle(NULL), 0);
MessageBox(NULL, "hello world!", "info", MB_OK);

b)修改按鈕文本(一般用於國際化)
HHOOK hHook;
LRESULT __stdcall CBTHookProc( long nCode,WPARAM wParam,LPARAM lParam)
{
  if (nCode==HCBT_ACTIVATE)
  {
  SetDlgItemText((HWND)wParam,IDYES,"&Yes");
  SetDlgItemText((HWND)wParam,IDNO ,"&No");
  SetDlgItemText((HWND)wParam,IDOK,"&OK");
  SetDlgItemText((HWND)wParam,IDCANCEL,"&Cancel");
  UnhookWindowsHookEx(hHook);
  }
  return 0;
}
使用方法:
hHook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL);

P.S. 過一段時間消失的MessageBox(源自MSDN)
void CALLBACK MessageBoxTimer(HWND hwnd, UINT uiMsg, UINT idEvent, DWORD dwTime)
{
   PostQuitMessage(0);
}
UINT TimedMessageBox(HWND hwndParent, LPCTSTR ptszMessage, LPCTSTR ptszTitle, UINT flags, DWORD dwTimeout)
{
   MSG msg;
   UINT idTimer = SetTimer(NULL, 0, dwTimeout, (TIMERPROC)MessageBoxTimer);
   UINT uiResult = MessageBox(hwndParent, ptszMessage, ptszTitle, flags);
   KillTimer(NULL, idTimer);
   if (PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE)) {
       uiResult = 0;//默認值
   }
   return uiResult;
}
使用方法同MessageBox,只是多了個DWORD參數 dwTimeout

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章