读书人

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

发布时间: 2012-01-18 00:23:26 作者: rapoo

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 :


case WM_QUERYDRAGICON :
case WM_CTLCOLORMSGBOX :
case WM_CTLCOLOREDIT :
case WM_CTLCOLORLISTBOX :
case WM_CTLCOLORBTN :
case WM_CTLCOLORDLG :
case WM_CTLCOLORSCROLLBAR :
case WM_CTLCOLORSTATIC :
break;
default:
::SetWindowLongPtr(m_hWnd,DWLP_MSGRESULT,(LONG_PTR)lReturn);
lReturn=TRUE;
break;
}
}
return lReturn;
}
void SubclassDialog(HWND hWndDlg){
assert(::IsWindow(hWndDlg) && m_hWnd==0);
::SetWindowLongPtr(hWndDlg,DWLP_DLGPROC,(LONG_PTR)GetThunkedProcPtr());
}
bool EndDialog(int nRetCode){return 0!=::EndDialog(m_hWnd,nRetCode);}
void SetDlgMsgResult(LONG_PTR lResult){::SetWindowLongPtr(m_hWnd,DWLP_MSGRESULT,(LONG_PTR)lResult);}

INT_PTR DoModal(HWND hParent=::GetActiveWindow(),HINSTANCE hInst=::GetModuleHandle(0),LPARAM lpInitParam=NULL,
LPCTSTR tszTemplateName=MAKEINTRESOURCE(T::IDD)){
assert(m_hWnd==NULL);
m_hInst=hInst;
return ::DialogBoxParam(hInst,tszTemplateName,hParent,(DLGPROC)GetThunkedProcPtr(),lpInitParam);
}

INT_PTR DoModalIndirect(HWND hParent=::GetActiveWindow(),HINSTANCE hInst=::GetModuleHandle(0),
LPARAM lpInitParam=NULL,LPCDLGTEMPLATE pDlgTemplate=0){
assert(m_hWnd==NULL);
m_hInst=hInst;
if(!pDlgTemplate)
pDlgTemplate=m_pDlgTemplate;

return ::DialogBoxIndirectParam(hInst,pDlgTemplate,hParent,(DLGPROC)GetThunkedProcPtr(),lpInitParam);
}

HWND Create(HWND hParent=::GetActiveWindow(),HINSTANCE hInst=::GetModuleHandle(0),LPARAM lpInitParam=NULL,
LPCTSTR tszTemplateName=MAKEINTRESOURCE(T::IDD)){
assert(m_hWnd==NULL);
m_hInst=hInst;
return ::CreateDialogParam(hInst,tszTemplateName,hParent,(DLGPROC)GetThunkedProcPtr(),lpInitParam);
}
HWND CreateIndirect(HWND hParent=::GetActiveWindow(),HINSTANCE hInst=::GetModuleHandle(0),
LPARAM lpInitParam=NULL,LPCDLGTEMPLATE pDlgTemplate=0){
assert(m_hWnd==NULL);
m_hInst=hInst;
if(!pDlgTemplate)
pDlgTemplate=m_pDlgTemplate;

return ::CreateDialogIndirectParam(hInst,pDlgTemplate,hParent,(DLGPROC)GetThunkedProcPtr(),lpInitParam);
}
protected:
LPCDLGTEMPLATE m_pDlgTemplate;
};

读书人网 >Windows Mobile

热点推荐