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{
8 public:
9     typedef KDialogBase __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{
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