面向对象的Windows编程实战(上)(使用C++和Win32 API)

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






你可能感兴趣的:(编程,C++,windows,api,application,callback)