现在的位置: 首页 > 综合 > 正文

ATL GUI (二)

2013年02月14日 ⁄ 综合 ⁄ 共 2268字 ⁄ 字号 评论关闭

ATL中的对话框

生成一个新对话框和生成一个主窗口几乎一样,只有两点不同:

1. 窗口的基类是CDialogImpl而不是CWindowImpl。
2. 你需要定义名称为IDD的公有成员用来保存对话框资源的ID。

class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
    enum { IDD = IDD_ABOUT };
 
    BEGIN_MSG_MAP(CAboutDlg)
    END_MSG_MAP()
};

下面是一个About完整的实现
class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
    enum { IDD = IDD_ABOUT };
 
    BEGIN_MSG_MAP(CAboutDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        MESSAGE_HANDLER(WM_CLOSE, OnClose)
        COMMAND_ID_HANDLER(IDOK, OnOKCancel)
        COMMAND_ID_HANDLER(IDCANCEL, OnOKCancel)
    END_MSG_MAP()
 
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        CenterWindow();
        return TRUE;    // let the system set the focus
    }
 
    LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        EndDialog(IDCANCEL);
        return 0;
    }
 
    LRESULT OnOKCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
    {
        EndDialog(wID);
        return 0;
    }
};

一般是使用DialogBox或者CreateDialog这两个函数来建立对话框的,同时EndDialog是发个消息给
父窗体,要求它对对话框资源做清理工作。

使用一个消息响应函数同时处理“OK”和“Cancel”两个按钮的WM_COMMAND消息,
因为命令响应函数的wID参数就已经指明了消息是来自“OK”按钮还是来自“Cancel”按钮。

显示对话框的方法与MFC相似,创建一个新对话框类的实例,然后调用DoModal()方法。
现在我们返回主窗口,添加一个带有About菜单项的菜单用来显示我们的对话框,这需要再添加两个消息响应函数,
一个是响应WM_CREATE,另一个是响应菜单的IDC_ABOUT命令。

class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>,
                  public CPaintBkgnd<CMyWindow,RGB(0,0,255)>
{
public:
    BEGIN_MSG_MAP(CMyWindow)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        COMMAND_ID_HANDLER(IDC_ABOUT, OnAbout)
        // ...
        CHAIN_MSG_MAP(CPaintBkgndBase)
    END_MSG_MAP()
 
    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    HMENU hmenu = LoadMenu ( _Module.GetResourceInstance(),
                             MAKEINTRESOURCE(IDR_MENU1) );
 
        SetMenu ( hmenu );
        return 0;
    }
 
    LRESULT OnAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
    {
    CAboutDlg dlg;
 
        dlg.DoModal();
        return 0;
    }
    // ...
};

在指定对话框的父窗口的方式上有些不同,MFC是通过构造函数将父窗口的指针传递给对话框而在
ATL中是将父窗口的指针作为DoModal() 方法的第一个参数传递给对话框的,如果象上面的代码一
样没有指定父窗口,
ATL会使用GetActiveWindow() 得到的窗口(也就是我们的主框架窗口)作为
对话框的父窗口。

对LoadMenu()方法的调用展示了CComModule的另一个方法-GetResourceInstance(),
它返回你的EXE的 HINSTANCE实例,
和MFC的AfxGetResourceHandle()方法相似。(当然还有CComModule:: GetModuleInstance(),它相当于MFC的AfxGetInstanceHandle()。)

文章转至http://www.imyaker.com/wtl/,加入了自己的理解。

抱歉!评论已关闭.