用CWindowImpl实现窗口
一、新建工程。在VC8创建一个ATL Project工程。名称为ATL_Test,,Server Type为Executable(EXE),完成。
二、新建窗口类。添加一个C++类,做为窗口类。向导中填写类名CMyWindow,基类CWindowImpl<CMyWindow>,OK。
在stdafx.h中包含头文件:#include <atlwin.h>
生成代码如下:
//version 1.0.0.0
MyWindow.h
#pragma once
class CMyWindow :
public CWindowImpl<CMyWindow>
{
public:
CMyWindow(void);
public:
~CMyWindow(void);
};
MyWindow.cpp
#include "StdAfx.h"
#include "MyWindow.h"
CMyWindow::CMyWindow(void)
{
}
CMyWindow::~CMyWindow(void)
{
}
三、修改类名、添加消息处理。
修改类名:DECLARE_WND_CLASS(_T("MyName"))
添加消息处理映射:
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
END_MSG_MAP()
添加消息处理函数:
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
代码如下:
//version 1.0.0.1
MyWindow.h
#pragma once
class CMyWindow :
public CWindowImpl<CMyWindow>
{
public:
// 窗口类名
DECLARE_WND_CLASS(_T("MyName"))
//消息映射
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP()
//消息处理
LRESULT OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
public:
CMyWindow(void);
public:
~CMyWindow(void);
};
MyWindow.cpp
#include "StdAfx.h"
#include "MyWindow.h"
CMyWindow::CMyWindow(void)
{
}
CMyWindow::~CMyWindow(void)
{
}
LRESULT CMyWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PAINTSTRUCT ps;
HDC hDC = GetDC();
BeginPaint( &ps );
TextOut( hDC, 0, 0, _T("Hello world"), 11 );
EndPaint( &ps );
return 0;
}
LRESULT CMyWindow::OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage( 0 );
return 0;
}
四、创建ATL窗口。
在ATL_Test.cpp的代码如下:
#include "stdafx.h"
#include "resource.h"
#include "ATL_Test.h"
#include "atlapp.h"
#include "MyWindow.h"
class CATL_TestModule : public CAtlExeModuleT< CATL_TestModule >
{
public :
DECLARE_LIBID(LIBID_ATL_TestLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_ATL_TEST, "{8ACB70F9-164D-4A7D-9D2B-477208567C28}")
};
CATL_TestModule _AtlModule;
//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
LPTSTR /*lpCmdLine*/, int nShowCmd)
{
CMyWindow Window;
Window.Create( NULL, CWindow::rcDefault, _T("Hello"),WS_OVERLAPPEDWINDOW );
Window.ShowWindow(nShowCmd);
Window.UpdateWindow();
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return _AtlModule.WinMain(nShowCmd);
}
发表于 @ 2008年04月09日 11:54:00|评论(loading...)|收藏