ATL如此显示窗口及对话框

ATL编程真不好理解,摸索了两三天,总算搞清楚了窗口和对话框的显示。

其消息映射原理好象与MFC差不太多,只不过模版就用得多了:

#include "stdafx.h"
#include "resource.h"

#include <atlbase.h>
CComModule _Module;
#include <atlwin.h>
//
class CModeDialog : public CDialogImpl<CModeDialog>
{
public:
 enum { IDD = IDD_DLG_SECOND};

 BEGIN_MSG_MAP(CModeDialog)
  MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
  MESSAGE_HANDLER(WM_CLOSE,OnClose)
 END_MSG_MAP()

 LRESULT OnInitDialog(UINT,WPARAM,LPARAM,BOOL&)
 {
  return 0;
 }
 
 LRESULT OnClose(UINT,WPARAM,LPARAM,BOOL&)
 {
  DestroyWindow();
  return 0;
 }

};
//
class CMainWindow : public CWindowImpl<CMainWindow>
{
 BEGIN_MSG_MAP(CMainWindow)
  MESSAGE_HANDLER(WM_CREATE,OnCreate)
  MESSAGE_HANDLER(WM_PAINT,OnPaint)
  MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)
  MESSAGE_HANDLER(WM_RBUTTONDOWN,OnRButtonDown)
  MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
 END_MSG_MAP()

 LRESULT OnCreate(UINT,WPARAM,LPARAM,BOOL&)
 {
  return 0;
 }

 LRESULT OnLButtonDown(UINT,WPARAM,LPARAM,BOOL&)
 {
  //显示模态对话框
  CSimpleDialog<IDD_DLG_FIRST> simdlg;
  simdlg.DoModal();
  return 0;
 }
 
 LRESULT OnRButtonDown(UINT,WPARAM,LPARAM,BOOL&)
 {
  //显示非模态对话框
  CModeDialog *pDlg = new CModeDialog;
  pDlg->Create(0);
  pDlg->ShowWindow(SW_NORMAL);
 
  return 0;
 }

 LRESULT OnPaint(UINT,WPARAM,LPARAM,BOOL&)
 {
  PAINTSTRUCT ps;
  HDC hdc = GetDC();
  BeginPaint(&ps);
  
  RECT rc;
  GetClientRect(&rc);

  HBRUSH hbr = CreateSolidBrush(RGB(0,255,255));
  HBRUSH oldHbr = (HBRUSH)SelectObject(hdc,hbr);
  FillRect(hdc,&rc,hbr);

  SelectObject(hdc,oldHbr);
  DeleteObject(hbr);

  EndPaint(&ps);
  return 0;
 }

 LRESULT OnDestroy(UINT,WPARAM,LPARAM,BOOL&)
 {
  PostQuitMessage(0);
  return 0;
 }
};

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 _Module.Init(0,hInstance);
 
 //创建和显示窗口
 CMainWindow window;
 RECT rcpos = {0,0,300,300};
 window.Create(NULL,
     rcpos,
     "Main Window",
     WS_VISIBLE|WS_OVERLAPPEDWINDOW);

 MSG msg;
 while(GetMessage(&msg,0,0,0))
 {
  //消息循环
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }


 _Module.Term();

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值