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
这样就实现了窗口的自由调用。。哈哈大功告成。嘿嘿。。。。。。折磨了一天的问题解决了,好爽,希望这样的问题不要再为难以后的朋友,,希望对大家有帮助。