BOOL Close() { return SendMessage(WM_CLOSE,0,0); }
LRESULT SendMessage(UINT nMessage,WPARAM wParam,LPARAM lParam) { return ::SendMessage(m_hWnd,nMessage,wParam,lParam); }
首先,關閉視窗的話,再下次再要建立剛才的視窗的話,就會
m_Atom=RegisterClass(&wc);
if(m_Atom==0) return FALSE;
直接跳出,RegisterClass不成功。跟進去你會發現是1410-類別已存在。
這是因為視窗的建立是註冊再建立的。所以剛才調用了close後,系統會自動調用
case WM_DESTROY:
CommandBar_Destroy(g_hWndMenuBar);
PostQuitMessage(0);
break;
摧毀視窗。但註冊資訊並沒有刪除,這就好比你在一個檔案夾下放2個同名的檔案一樣,是放不進去的。
這個問題的解決辦法就是調用:
UnregisterClass(GetClassName(),GetEmbApp()->GetInstance()); // 銷毀註冊的視窗資訊
這樣下次再建立就不會有問題了。。
如果你的視窗是自己封裝的類,視窗裡面又放了視窗,當你close大視窗的時候,下次再恢複,只有大視窗顯示了,小的視窗(我的是button)就不會顯示出來。所以,這樣又要怎麼辦呢?
進過一下午的摸索,終於找到了跟好的方法,那就是隱藏視窗。mobile中總是摧毀,建立,摧毀,建立,視窗這樣是不好的。耗資源。所以最好的方法就是讓程式到後台去工作。
具體做法就是:
case IDM_NO:
::ShowWindow(this->m_hWnd,0); // 隱藏視窗
下次再要調用的話,就到你建立的地方加個判斷。
#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
HWND hWnd=FindWindow(GetClassName(),szTitle);
// UnregisterClass(GetClassName(),GetEmbApp()->GetInstance()); // 銷毀註冊的視窗資訊
if(hWnd)
{ // 將焦點置於最前面的子視窗
// “| 0x00000001”用於將所有附屬視窗置於前台並
// 啟用這些視窗。
SetForegroundWindow((HWND)((ULONG) hWnd|0x00000001)); // 將建立指定視窗的線程設定到前台,並且啟用該視窗
ShowWindow(SW_RESTORE); // 恢複隱藏的視窗
return FALSE;
}
#endif
這樣就實現了視窗的自由調用。。哈哈大功告成。嘿嘿。。。。。。折磨了一天的問題解決了,好爽,希望這樣的問題不要再為難以後的朋友,,希望對大家有協助。