写这一篇文章的目的就是使用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: [email protected]
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: [email protected]
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语言更加好的!!