ATL如此显示窗口及对话框

来源:互联网 发布:wifidisplay软件下载 编辑:程序博客网 时间:2024/05/18 06:04

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;
}

原创粉丝点击