星期三, 九月 13, 2006

005 - 窗体属性(Window Property)

摆脱丑陋的MessageMap,你不再需要进行消息映射。这是WINX带给你的第一份惊喜。

你的第二份惊喜,是一种全新(至少对MFC、WTL程序员如此)的编程体验:类Delphi的窗体属性编程。

先看几个例子:

// ---------------------------------------
// 设置对话框背景为灰色

class CHelloDlg : public winx::ModalDialog<CHelloDlg, IDD_HELLO>
{
WINX_BKGND_BRUSH(GRAY_BRUSH);
};

// ---------------------------------------
// 设置对话框背景为一幅位图

class CHelloDlg : public winx::ModalDialog<CHelloDlg, IDD_HELLO>
{
WINX_BKGND_PATTERN(IDB_BKGND);
// 这里IDB_BKGND是位图的资源ID
};

// ---------------------------------------
// 设置对话框快捷键

class CHelloDlg : public winx::ModalDialog<CHelloDlg, IDD_HELLO>
{
WINX_DLG_ACCEL();
WINX_ACCEL(IDR_ACCEL);

WINX_CMDS_BEGIN();
WINX_CMD(ID_HELP_ABOUT, OnCmdAbout);
WINX_CMDS_END();

public:
VOID OnCmdAbout(HWND hWnd)
{
winx::SimpleDialog dlg;
dlg.DoModal(hWnd, IDD_ABOUT);
}
};

我们看到,这种代码风格与MFC、WTL是十分不同的。我称之为基于窗体属性的编程风格。

首先需要指出的是,尽管这里以对话框作为例子,但是这些窗体属性是普适的,可以用于任何窗体。

只要一句WINX_ACCEL(IDR_ACCEL),搞定快捷键(WINX_DLG_ACCEL是打开快捷键功能。只需要顶层窗口调用,不是每个控件都需要。WINX_CMDXXX属于命令分派,与快捷键无关),这在WTL中非常难以办到。我们知道,WTL的快捷键机制是基于PreTranslateMessage的,而在WTL的模态对话框中根本没有PreTranslateMessage消息。所以,为了支持快捷键,你不得不改用非模态对话框。

关于窗体属性的概览性描述,请参考:

http://winxcn.blogspot.com/2006/09/002-winxproperty.html

没有评论: