将Win32Lib封装成类
前面两个工程都还是全局函数的形式,现在我们来将Win32Lib封装成class,为向MFC过渡埋下伏笔。
Win32Lib工程中,我们仅仅是改造了WinProc()这个窗口处理函数,对WinMain()主函数并没有改造。仔细分析WinMain()函数,发现其本质就做了2件事情:一是创建和显示窗口,一是进行消息循环以响应窗口消息。因此,我们的封装思想也是基于这2点的。将其封装成2个类:CMyWnd类,和CMyApp类。CMyWnd类专门负责和窗口创建相关的工作,CMyApp类专门负责初始化、程序的运行(消息循环)等应用性的工作。
将Win32Lib工程复制一份,将目录改名为Win32Class,我们将在此基础上封装我们的Win32Class类。打开Win32Class工程,添加一个新类CMyWnd。
函数WinMain()中的代码在编写任何一个Win32工程时几乎都是上述固定的步骤,即注册窗口类,创建窗口,显示窗口,更新窗口,消息循环。
Win32Lib.h文件
// Win32Lib.h: interface for the CMyWnd class.
//
#ifndef AFX_MYWIN32LIB_H_
#define AFX_MYWIN32LIB_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//返回元素的个数
#define dim(x)(sizeof(x) / sizeof(x[0]))
//定义函数指针
typedef LRESULT(*FXN)(HWND, UINT, WPARAM, LPARAM);
//消息映射结构
struct tagMESSAGEMAP
{
UINT Code; //消息
FXN Fxn; //响应函数
};
class CMyWnd
{
public:
HINSTANCE m_hInstance;
HWND m_hWnd;
public:
BOOL UpdateWindow();
BOOL ShowWindow();
BOOL Create();
CMyWnd();
virtual ~CMyWnd(){};
//主窗口回调函数
static LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
//声明消息响应函数
static LRESULT OnChar(HWND, UINT, WPARAM, LPARAM);
static LRESULT OnLButtonDown(HWND, UINT, WPARAM, LPARAM);
static LRESULT OnPaint(HWND, UINT, WPARAM, LPARAM);
static LRESULT OnDestroy(HWND, UINT, WPARAM, LPARAM);
static LRESULT OnTimer(HWND, UINT, WPARAM, LPARAM);
};
//消息映射数组
tagMESSAGEMAP MessageMaps[] = {
WM_CHAR, CMyWnd::OnChar,
WM_LBUTTONDOWN, CMyWnd::OnLButtonDown,
WM_PAINT, CMyWnd::OnPaint,
WM_DESTROY, CMyWnd::OnDestroy,
WM_TIMER, CMyWnd::OnTimer,
};
class CMyApp
{
public:
CMyWnd* m_pMainWnd; //主窗口
public:
CMyApp();
virtual ~CMyApp(){};
BOOL InitInstance(); //初始化主窗口
BOOL Run(); //消息循环
};
#endif // defined(AFX_MYWIN32LIB_H_)
Win32Lib.cpp文件
#include <windows.h>
#include <stdio.h>
#include "Win32Lib.h"
CMyApp theApp;
//入口函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE h