当前位置: 代码迷 >> Windows Mobile >> win32中怎么封装一个自己的对话框
  详细解决方案

win32中怎么封装一个自己的对话框

热度:243   发布时间:2016-04-25 08:01:51.0
win32中如何封装一个自己的对话框
在网上溜达了一下午,也没有看到好的解决方案。
有不少人在论坛中都提到了,可是没有解答。。。

现在我再次把这个问题提出来,希望各位大侠都指点指点。希望对别人有所帮助。

问题我再描述下吧:
dialogbox调用的dialog他不想要键盘消息。所以又要自己再处理,而且,mobile这样的开发平台中,
界面用的比较多。如果都那样处理的话,觉得不是很好。

所以,我的提议说,新建个类,封装属于自己的dialog,每次调用的时候,直接调用这个类就可以了。
调用这个类中的create()吧。(都是自己创建的呗)

我跟高手讨论过,他说用CreateDialogIndirect()个函数吧。就是非模态对话框吧。这样就可以想
创建窗口一样,进行wm_等的消息处理了吧。我不怎么懂,请高手们多多指点啊。。

谢谢!!

------解决方案--------------------
你怎么封装window的? dialog一样封即可

我没太明白你想封成什么样, 你可以先定义一个接口出来吗?希望别人如何调用你所封的类. 这样容易理解你的问题所在

BTW: 对window的封装有很多, 比如MFC, ATL等.
我推荐你看下ATL里的封装,代码很少, 很简练. atlwin.h里的CDialogImpl(在vc的Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include目录下)
------解决方案--------------------
是想封装成模式对话框,还是非模式的?

贴几行代码你看看吧.

下面是一个模式的,

dialog dlg;

dlg.do_modal(xxx);

跟mfc的差不多.


C/C++ code
class dialog{public:   dialog();   ~dialog();   int                        do_modal                            (HWND                    _h_parent_wnd)   {      return ::DialogBoxParam(m_h_instance, MAKEINTRESOURCE(IDD), _h_parent_wnd, (DLGPROC)__dlg_proc, (LPARAM)this);   }   int                        end_dialog                          ()   {      ::EndDialog(__m_h_dlg, 0);   };   inline   BOOL              __on_init_dialog                    (HWND                    _h_dlg,                                                                   WPARAM                  _w_param,                                                                   LPARAM                  _l_param);   inline   BOOL              __on_destroy                        (HWND                    _h_dlg,                                                                   WPARAM                  _w_param,                                                                   LPARAM                  _l_param);private:   HWND            __m_h_dlg;};
------解决方案--------------------
引用楼主 okadler0518 的帖子:
在网上溜达了一下午,也没有看到好的解决方案。
有不少人在论坛中都提到了,可是没有解答。。。

现在我再次把这个问题提出来,希望各位大侠都指点指点。希望对别人有所帮助。

问题我再描述下吧:
dialogbox调用的dialog他不想要键盘消息。所以又要自己再处理,而且,mobile这样的开发平台中,
界面用的比较多。如果都那样处理的话,觉得不是很好。

所以,我的提议说,新建个类,封装属于自己的dialog,每次调用…

------解决方案--------------------
给你个解决方案参考一下

template <typename T,typename TBase=KWindow>
 class KDialogBase : public KWindowRoot<T,TBase>{
public:
typedef KWindowRoot<T,TBase> __base;
KDialogBase():KWindowRoot<T,TBase>(),m_pDlgTemplate(0){}

BEGIN_MSG_MAP
MSG_HANDLER(WM_INITDIALOG,OnInitDialog)
COMMAND_ID_HANDLER(IDCANCEL,OnCancel)
END_MSG_MAP(__base)

LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,bool& bHandled){
CentralizeWindow();
return TRUE;
}
LRESULT OnCancel(WORD wID,WORD wNotifyCode,HWND hWndCtrl,bool& bHandled){
EndDialog(wID);
return 0;
}

LRESULT DoDefault(UINT uMsg, WPARAM wParam, LPARAM lParam){return FALSE;}
LRESULT KCALLBACK KWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam){
#ifdef PRETRANSLATEMESSAGE
if(uMsg==WM_INITDIALOG)
if(!m_hHookGetMsg)
m_hHookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)m_thunkGetMsgProc.GetThunkedCodePtr(),NULL,::GetCurrentThreadId());
#endif
LRESULT lReturn=KWindowRoot<T,TBase>::KWndProc(uMsg,wParam,lParam);
if(lReturn!=FALSE){
switch(uMsg){
case WM_COMPAREITEM :
case WM_VKEYTOITEM :
case WM_CHARTOITEM :
case WM_INITDIALOG :
  相关解决方案