写这一篇文章的目的就是使用C++这个面向对象的语言,使用大家都很熟悉的Win32 API,在windows平台上开发Windows程序,这也是我很久以前就有的想法了.参考了一些外国网站我封装了下面几个类:
class WinApp;
class Window;
一个windows程序当然少不了一个WinMain()函数了,所以我们还必须要一个WinMain()函数,这个函数我可是不知道怎么去封装,所以就不管它了.
所以程序就是一个WinMain(),一个WinApp,一个Window,你们觉得够了吗?
WinApp用来注册窗口类,提供实例句柄,并且响应所有的窗口消息.
Window用来从已经注册的窗口类创建主窗口和其他一切子窗口,并且显示主窗口.
我的目的就是这样的,下面就拿起C++来,开工吧~~!
1.Application 类
为了运行程序,当然我们必须先创建一个应用程序类了.它使用了WNDCLASS或者WNDCLASSEX结构来给自己一个定义.由于WNDCLASSEX比较起来有更新也更多的特性,所以我们就喜新厌旧的抛弃WNDCLASS吧,以后就只使用WNDCLASSEX了,特此声明!!!!
我们知道WNDCLASSEX结构有一个成员lpfnWndProc ,它指向一个回调函数WndProc,而在C语言+Win32 API编程中,大家都知道WndProc是用来处理窗口消息的,这就是我为什么要在WinApp类中封装WndProc的原因了~~~希望大家理解我
.下面是类定义:
//WinApp.h
/*
Name: WinApp.h
Copyright: (c) huyoo,changsha,hunan province,china
Author: huyoo
Email: huyoo353@hotmail.com
Tel: 0731-4534289
Date: 10-10-04 01:28
Description: 封装Cpp
*/
#ifndef WINAPP_H__
#define WINAPP_H__
#pragma once
#include <windows.h>
//---------------------------------------------------------------------------
//定义应用程序类
class WinApp
{
public:
// 构造函数初始化应用程序类
WinApp(HINSTANCE hInst, char *ClasName, LPCTSTR MenuName = NULL);
// 注册应用程序类
void Register();
//定义静态回调窗口函数
static LRESULT CALLBACK MainWndProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam);
protected:
// 记录类信息
WNDCLASSEX _WndClsEx;
};
//---------------------------------------------------------------------------
#endif
看到上面的类,你就会问我,为什么要把这个窗口回调函数定义为静态的?
我的想法是它在应用程序中一个只用一个,而且应该也不允许修改的!!!
况且,当我不把它定义为静态的时候,编译通不过,所以我也没有办法,只好把它搞成静态的,希望大家原谅我!!~~
应用程序类在构造函数中初始化类成员:WNDCLASSEX _WndClsEx;
类实现:
//WinApp.cpp
/*
Name: WinApp.cpp
Copyright: (c) huyoo,changsha,hunan province,china
Author: huyoo
Email: huyoo353@hotmail.com
Tel: 0731-4534289
Date: 10-10-04 01:28
Description: 封装Cpp
*/
#include "WinApp.h"
//---------------------------------------------------------------------------
WinApp::WinApp(HINSTANCE hInst, char *ClsName, LPCTSTR MenuName)
{
// 使用成员变量,来初始化应用程序类
_WndClsEx.cbSize = sizeof(WNDCLASSEX);
_WndClsEx.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
_WndClsEx.lpfnWndProc = MainWndProc;
_WndClsEx.cbClsExtra = 0;
_WndClsEx.cbWndExtra = 0;
_WndClsEx.hInstance = hInst;
_WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
_WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
_WndClsEx.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
_WndClsEx.lpszMenuName = MenuName;
_WndClsEx.lpszClassName = ClsName;
_WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
}
//---------------------------------------------------------------------------
void WinApp::Register()
{
RegisterClassEx(&_WndClsEx);
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WinApp::MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
{
switch(Msg)
{
case WM_CREATE:
return 0;
case WM_SIZE:
return 0;
case WM_PAINT:
return 0;
case WM_COMMAND:
return 0;
case WM_DESTROY:
PostQuitMessage(WM_QUIT);
return 0;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
//---------------------------------------------------------------------------
今天就到这里吧,明天或者今天晚上我就把窗口类定义和实现弄出来,进一步创建出来一个窗口
并显示出来,让大家看看C++的威力,要知道C++干得一样好甚至比C语言更加好的!!