星期一, 九月 11, 2006

004 - Hello, WINX!

提到WINX,总是感觉有太多的背景需要交代,以致于到现在才迎来我们经典的第一课——Hello程序。

一个我们已经提到过的事实是:WTL的很多关键特性在模态对话框中不可用。例如PreTranslateMessage (包括快捷键的支持)、UpdateUI等等。而与WTL对模态对话框的“轻视”相反,WINX极大化的强化模态对话框的能力。为了突出这一点,我们的Hello程序首先从模态对话框开始:

// -----------------------------------------
// MFC的Hello程序

class CHelloMfcDlg : public CDialog
{
public:
enum { IDD = IDD_HELLOMFC_DIALOG };

CHelloMfcDlg(CWnd* pParent = NULL)
: CDialog(CHelloMfcDlg::IDD, pParent) {}
};

class CHelloMfcApp : public CWinApp
{
public:
BOOL InitInstance()
{
CHelloMfcDlg dlg;
dlg.DoModal();
return FALSE;
}
};

CHelloMfcApp theApp;

// -----------------------------------------
// WTL的Hello程序

class CHelloDlg : public ATL::CDialogImpl<CHelloDlg>
{
public:
enum { IDD = IDD_HELLO };

public:
BEGIN_MSG_MAP(CHelloDlg)
COMMAND_RANGE_HANDLER(IDOK, IDNO, OnCloseCmd)
END_MSG_MAP()

LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
::EndDialog(m_hWnd, wID);
return 0;
}
};

WTL::CAppModule _Module;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
_Module.Init(NULL, hInstance);
{
CHelloDlg dlg;
dlg.DoModal();
}
_Module.Term();
return 0;
}

// -----------------------------------------
// WINX的Hello程序

class CHelloDlg : public winx::ModalDialog<CHelloDlg, IDD_HELLO>
{
};

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
CHelloDlg dlg;
dlg.DoModal();
return 0;
}
// -----------------------------------------

是的,对比三者模态对话框的样例,你至少可以看出两点:

1)MFC框架带给MFC模态对话框的,是累赘。WTL、WINX均不提供框架,你可以按自己的意愿写WinMain中的代码。

2)WTL的代码总是看起来显得笨拙(尽管高效)。而单看对话框代码,MFC、WINX看起来比较简洁,因为他们隐含已经处理了IDCANCEL、IDOK代码。

不过,由于只有WTL写了消息处理代码,其余两者均未处理消息,这个样例对WTL而言并不公平。让我们再来看看三者提供的最原始的SDI窗体。

关于这里的各个例子,你可以在WINX提供的tutorials中找到。它们分别是:

tutorials/winx/step001/hello,mfc
tutorials/winx/step001/hello,wtl
tutorials/winx/step001/hello,winx

没有评论: