在ATL中实现窗口

2016-01-29 12:42 54 1 收藏

在ATL中实现窗口,在ATL中实现窗口

【 tulaoshi.com - C语言心得技巧 】

  一、实现对话框

  ATL中有三个模板类可用于创建一个对话框:

  (1)CSimpleDialog:创建模式对话框, 可以host Windows Controls

template < WORD t_wDlgTemplateID, BOOL t_bCenter = TRUE >
class CSimpleDialog : public CDialogImplBase
  (2)CDialogImpl:创建模式或非模式对话框, 可以host Windows Controls

template < class T, class TBase = CWindow >
class ATL_NO_VTABLE CDialogImpl : public CDialogImplBaseT< TBase >
  (3)CAxDialogImpl:创建模式或非模式对话框, 可以host Windows Controls和ActiveX Controls

template < class T, class TBase = CWindow >
class ATL_NO_VTABLE CAxDialogImpl : public CDialogImplBaseT< TBase >
  用CSimpleDialog和CDialogImpl不能显示含有ActiveX控件的对话框,只有CAxDialogImpl可以。如果想处理对话框中ActiveX控件的事件,在OnInitDialog()中加入AtlAdviseSinkMap(this, TRUE)。在退出时加入 AtlAdviseSinkMap(this, FALSE)。通过Insert/New ATL Object/miscellaneous/Dialog生成的对话框缺省就是从CAxDialogImpl继承的。

  这三个类的使用方法很类似。都是派生出一个新类,并确保有一个IDD的成员指明资源ID。如:

class CMyDialog : public CDialogImpl, ...
{
public:
  enum { IDD = IDD_MYDIALOG };    //必须要有IDD这个成员,一般都是enum型

  BEGIN_MSG_MAP(CMyDialog)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  END_MSG_MAP()

  LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  {
   return 1;
  }
};
CMyDialog dlg ;
dlg.DoModal() ;
  CSimpleDialog的使用可以更简单一些,如下:

CSimpleDialog< IDD_MYDIALOG > dlg ;
dlg.DoModal() ;
  另外CSimpleDialog对IDOK和IDCANCEL有内在的支持,即会自动调用EndDialog,在其定义中包含如下代码:

BEGIN_MSG_MAP(thisClass)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    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;
}
  但CDialogImpl和CAxDialogImpl没有内在的支持,所以必须自己加消息处理函数调用EndDialog,比如:

COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)

LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
    EndDialog(wID);
    return 0;
}

LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
    EndDialog(wID);
    return 0;
}

来源:http://www.tulaoshi.com/n/20160129/1487254.html

延伸阅读
标签: 电脑入门
在PowerPoint 2002中没有对象翻转的功能,但设定两个对象可以模拟对象的翻转。 比如要把图1所示的实线三角形沿直角边AB翻转到虚线所示的位置,并且顶点字母C也随着移动,具体操作如下: 图1 画一个三角形,用文本框标上顶点字母,文本框C和三角形组合,再复制一个同样的图形,水平翻转后放在图1中的虚线位置(注意:不是让这个对象设为虚...
首先在Form上放置一个RichEdit。 在窗体的构造函数中添加以下代码: __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { unsigned mask = SendMessage(RichEdit1-Handle, EM_GETEVENTMASK, 0, 0); SendMessage(RichEdit1-Handle, EM_SETEVENTMASK, 0, mask | ENM_LINK); SendMessage(Ri...
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可。 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: pu...
大家有没有在LAN中远程的关过人家的电脑呀,或是让人家的电脑不明不白的重启或是注消呢?好像笔者在所有的媒体中都没有看到这项技术哦 ^_^!是不是很想学学怎么样坐在自已的电脑中来管理别人的计算机,那好吧,跟笔者来关机吧! 在LAN要实现远程关机,并不难,也不需要什么其它的第三方的软件支持,完全就是一个“绿色关机”。但是有...
1。Oracle中: select org_id from organizations start with org_id= :org_id connect by prior org_id=supervision_org_id order by supervision_org_id 2。Sql Functiong:  FunctionNo SubFunctionNo SubFunctionType     01.   systemadmin Privilege 0     01.   systemadmin subsysadmin 1(表示樹...

经验教程

745

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部