/WINCE应用:
如果一个子对话框里的控件带有TABSTOP风格,而且控件是自画的,此时在子对话框domodal显示后自画的控件会重新paint一次,造成界面闪烁。
如果一个子对话框初始化带有visible风格,主对话框按按钮domodal显示子对话框,在按钮事件里下断点,卡住消息循环,然后在PNP上狂点击按钮区域,
后面的按键消息将会传递到子对话框中,即时此时的按钮事件已经被断点卡住,也会出现点击一直有效的现像。
多个子对话框domodal,要想一次性切回主窗口并且使主窗口不闪烁,需要按照domodal的顺序来关闭子窗口。否则主窗口的按钮会多次被active并闪烁(自画按钮)。
对话框程序初始化隐藏的办法,把domodal改为create,模态窗口改为非模态的:
BOOL CBTPhoneApp::InitInstance()
{
#ifndef UNDER_CE
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
#endif
g_hWait[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
CBTPhoneDlg *pDlg = new CBTPhoneDlg ;
pDlg->Create(IDD_BTPHONE, NULL);//创建但是不显示
m_pMainWnd = pDlg;
while(1)
{
DWORD dwRet = ::MsgWaitForMultipleObjects(1, g_hWait, TRUE, INFINITE, QS_ALLINPUT);
if(dwRet == WAIT_OBJECT_0)
{
pDlg->DestroyWindow();
delete pDlg;
pDlg = NULL;
break;
}
else
{
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
CloseHandle(g_hWait[0]);
g_hWait[0] = NULL;
CloseHandle(g_hWakeupInitThread);
return FALSE;
}
注意QS_ALLINPUT参数,必须为此参数,否则会有的消息收不到,例如POST来的消息。另必须在对话框退出时setevent.
在资源里修改风格是无效的,因为Domodal会始终显示对话框,如果该对话框是主窗口。
///
窗口风格里的Tab_stop或group风格可能会导致窗口点击时产生一个ime窗口,如果此时进行enumwindow会出错,因为ime窗口也是顶层窗口,有可能会替掉真正的主窗口。
/
VS2008里有WM_HOTKEY的消息响应宏,但是VS2005和VS6里面没有。