您的位置:首页 > 其它

Windows应用程序的面向对象特性 之 封装

2016-03-29 20:39 316 查看
在早期的编程生涯中,程序员采用C语言和Windows API函数进行Windows程序设计。 但采用这种方式进行程序开发,使得开发过程艰苦、乏味。

随着编程技术的不断发展,Windows编程采用了面向对象的程序设计思想(Object Oriented Programming,OOP)。这种思想集抽象性、封装性、集成性和多态性于一体,提高了编程的效率。

下面主要讲一讲应用程序主函数中类的封装。从面向对象的思想进行分析,为了形成程序框架,应该声明两个类:窗口类应用程序类

窗口类的声明。

在窗口类中,应该实现窗口类的设计、窗口类的注册、窗口类的创建、窗口类的显示和窗口类的更新等功能。

上述功能是窗口类的成员函数,为了辅助这些成员函数,还应该有一个数据成员,HWND类型的窗口句柄。

下面给出窗口类对窗口句柄以及窗口操作的API函数的封装。我们将窗口类声明为CFrameWnd

class CFrameWnd
{
public:
HWND hWnd;
public:
int RegisterWindow();
void Create(LPCTSTR lpClassName,LPCTSTR lpWindowName);
void ShowWindow(int nCmdShow);
void UpdateWindow();
};
//类中的函数
//RegisterWindow()设计窗口
int CFrameWnd::RegisterWindow()
{

WNDCLASS wndclass;
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_PEN);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;

//注册窗口
return RegisterClass(&wndclass);
}

//创建窗口
void CFrameWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName)
{
RegisterWindow();
hInst=hInstance;
hWnd=CreateWindow(lpszClassName,
lpWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);

}

//显示窗口
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd,nCmdShow);
}

//注册窗口
void CFrameWnd::UpdateWindow()
{
::UpdateWindow(hWnd);
}
注意:在显示窗口函数ShowWindow()和刷新窗口函数UpdateWindow()中出现了符号“::”,大家也许知道这叫域作用符。如果出现这种符号时前面是空白,表示其后的函数是系统函数。

应用程序类的声明。

如果把主函数中的整个函数体作为一个对象,并把它叫做应用程序,则还应该声明一个应用程序类,并命名为CWinApp。

在CWinApp类中,主要完成两个功能:一是调用成员函数InitInstance()来完成窗口的设计、注册、创建与显示工作,
           二是调用成员函数Run()来实现消息循环。

下面给出CWinApp类具体编写的代码。
//声明应用程序类
class CWinApp
{
public:
CFrameWnd* m_pMainWnd;
public:
BOOL InitInstance(int nCmdShow);
int Run();
~CWinApp();
};

//类中的函数
//InitInstance()函数
BOOL CWinApp::InitInstance(int nCmdShow)
{
m_pMainWnd=new CFrameWnd;
m_pMainWnd->Create(NULL,"封装的应用程序窗口");
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}

//Run()函数
int CWinApp::Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

//析构函数
CWinApp::~CWinApp()
{
delete m_pMainWnd;
}

我们对窗口类和应用程序类进行封装后,再来设计Windows应用程序就非常方便了。

下面经过我们亲手封装过后的代码:


//头文件
#include "windows.h"
//定义全局变量和函数
HINSTANCE hInst;
HINSTANCE hInstance;
MSG msg;
char lpszClassName[]="hehe";
char* ShowText;
//声明消息响应函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam);
void OnLButtonDown(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam);
void OnPaint(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam);
void OnDestory(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam);
//声明窗口类
class CFrameWnd { public: HWND hWnd; public: int RegisterWindow(); void Create(LPCTSTR lpClassName,LPCTSTR lpWindowName); void ShowWindow(int nCmdShow); void UpdateWindow(); }; //类中的函数 //RegisterWindow()设计窗口 int CFrameWnd::RegisterWindow() { WNDCLASS wndclass; wndclass.style=0; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_PEN); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=lpszClassName; //注册窗口 return RegisterClass(&wndclass); } //创建窗口 void CFrameWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName) { RegisterWindow(); hInst=hInstance; hWnd=CreateWindow(lpszClassName, lpWindowName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); } //显示窗口 void CFrameWnd::ShowWindow(int nCmdShow) { ::ShowWindow(hWnd,nCmdShow); } //注册窗口 void CFrameWnd::UpdateWindow() { ::UpdateWindow(hWnd); }

//声明应用程序类 class CWinApp { public: CFrameWnd* m_pMainWnd; public: BOOL InitInstance(int nCmdShow); int Run(); ~CWinApp(); }; //类中的函数 //InitInstance()函数 BOOL CWinApp::InitInstance(int nCmdShow) { m_pMainWnd=new CFrameWnd; m_pMainWnd->Create(NULL,"封装的应用程序窗口"); m_pMainWnd->ShowWindow(nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } //Run()函数 int CWinApp::Run() { while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //析构函数 CWinApp::~CWinApp() { delete m_pMainWnd; }//构造应用程序类对象
CWinApp theApp;

//主函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ResultCode;
theApp.InitInstance(nCmdShow);

ResultCode=theApp.Run();
return ResultCode;
}

//窗口函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
OnLButtonDown(hWnd,message,wParam,lParam);
break;
case WM_PAINT:
OnPaint(hWnd,message,wParam,lParam);
break;
case WM_DESTROY:
OnDestory(hWnd,message,wParam,lParam);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}

//消息响应函数

//响应鼠标鼠标单击消息
void OnLButtonDown(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
ShowText="面向对象的封装性";
InvalidateRect(hWnd,NULL,1);
}

//刷新消息
void OnPaint(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,50,50,ShowText,16);
EndPaint(hWnd,&ps);
}

//关闭消息
void OnDestory(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0);
}
在VC++6.0中新建一个空的Win32Application应用程序。再将上面的代码拷贝到工程的CPP文件中,编译运行即可。

下面是VC++6.0的运行截图。(在devc++中也可以很方便的运行win32应用程序,运行结果是一样的)。




如何使用VC++6.0生成windows应用程序则参考博客:使用API,手工生成 Windows应用程序全过程(图解+文字说明)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: