在网上溜达了一下午,也没有看到好的解决方案。
有不少人在论坛中都提到了,可是没有解答。。。
现在我再次把这个问题提出来,希望各位大侠都指点指点。希望对别人有所帮助。
问题我再描述下吧:
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;};
------解决方案--------------------
------解决方案--------------------
给你个解决方案参考一下
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 :