KWinUI sample 2: Dialog based应用程序

KWinUI配合ResEdit来开发Dialog Based Application还是比较轻松的。

启动ResEdit添加一个简单的dialog资源,ResEdit为你生成两个文件,一个是资源文件,一个包含资源ID的头文件resource.h。我这里简单的把这两个文件的内容贴出来。

resource.h
1 #ifndef IDC_STATIC
2 #define IDC_STATIC (-1)
3 #endif
4
5 #define IDD_DLG_MAIN                            100

dlgmain.rc
 1 // Generated by ResEdit 1.4.4.19
 2 // Copyright (C) 2006-2008
 3 // http://www.resedit.net
 4
 5 #include "resource.h"
 6 #include <windows.h>
 7 #include <commctrl.h>
 8 #include <richedit.h>
 9
10
11 //
12 // Dialog resources
13 //
14 IDD_DLG_MAIN DIALOG 0, 0, 186, 95
15 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
16 CAPTION "Dialog"
17 FONT 8, "Ms Shell Dlg 2"
18 {
19     DEFPUSHBUTTON   "OK", IDOK, 129, 7, 50, 14, BS_DEFPUSHBUTTON
20     PUSHBUTTON      "Cancel", IDCANCEL, 129, 24, 50, 14, BS_PUSHBUTTON
21 }

然后就是我们的KWinUI主程序了,内容如下:
 1 #include "resource.h"
 2 #include "kapp.h"
 3 #include "kwin.h"
 4
 5 using namespace kwinui;
 6
 7 class KDlgMain : public KDialogBase<KDlgMain>{
 8 public:
 9     typedef KDialogBase<KDlgMain> __base;
10     enum{IDD=IDD_DLG_MAIN};
11
12     BEGIN_MSG_MAP
13         COMMAND_ID_HANDLER(IDOK,OnOK)
14         COMMAND_ID_HANDLER(IDCANCEL,OnCancel)
15     END_MSG_MAP(__base)
16
17     LRESULT OnOK(WORD wID,WORD wNotifyCode,HWND hWndCtrl,bool& bHandled){
18         ShowMessage(_T("KWinUI dialog based program sample!"));
19         return TRUE;
20     }
21
22     LRESULT OnCancel(WORD wID,WORD wNotifyCode,HWND hWndCtrl,bool& bHandled){
23         EndDialog(wID);
24         ::PostQuitMessage(0);
25         return TRUE;
26     }
27 };
28
29 class KDlgApp : public KWinApp<KDlgApp>{
30 public:
31     bool InitInstance(){
32         m_pMainWindow=new KDlgMain();
33         m_pMainWindow->Create(NULL);
34         return true;
35     }
36 private:
37     KDlgMain* m_pMainWindow;
38 };
39
40 KDlgApp theApp;

当然,我这里创建的是一个无模式对话框,使用了KWinUI的消息循环,你也可以把第33、34行改为
m_pMainWindow->DoModal();
return false;
这样的话会创建一个模式对话框,使用对话框自己提供的消息循环。
使用模式对话框时,可以将程序的第24行注释掉,但是对于无模式对话框,此行代码必须存在才能正确的结束程序。

实际上KWinUI程序的风格和WTL是很相似的,有WTL开发经历的童鞋看到这段代码应该感觉比较亲切。
用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为47KB。
代码下载
截图:dialog

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.