关闭窗口和隐藏窗口

 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值