Windows应用程序的面向对象特性 之 封装
2016-03-29 20:39
316 查看
在早期的编程生涯中,程序员采用C语言和Windows API函数进行Windows程序设计。 但采用这种方式进行程序开发,使得开发过程艰苦、乏味。
随着编程技术的不断发展,Windows编程采用了面向对象的程序设计思想(Object Oriented Programming,OOP)。这种思想集抽象性、封装性、集成性和多态性于一体,提高了编程的效率。
下面主要讲一讲应用程序主函数中类的封装。从面向对象的思想进行分析,为了形成程序框架,应该声明两个类:窗口类和应用程序类。
窗口类的声明。
在窗口类中,应该实现窗口类的设计、窗口类的注册、窗口类的创建、窗口类的显示和窗口类的更新等功能。
上述功能是窗口类的成员函数,为了辅助这些成员函数,还应该有一个数据成员,HWND类型的窗口句柄。
下面给出窗口类对窗口句柄以及窗口操作的API函数的封装。我们将窗口类声明为CFrameWnd。
应用程序类的声明。
如果把主函数中的整个函数体作为一个对象,并把它叫做应用程序,则还应该声明一个应用程序类,并命名为CWinApp。
在CWinApp类中,主要完成两个功能:一是调用成员函数InitInstance()来完成窗口的设计、注册、创建与显示工作,
二是调用成员函数Run()来实现消息循环。
下面给出CWinApp类具体编写的代码。
我们对窗口类和应用程序类进行封装后,再来设计Windows应用程序就非常方便了。
下面经过我们亲手封装过后的代码:
下面是VC++6.0的运行截图。(在devc++中也可以很方便的运行win32应用程序,运行结果是一样的)。
如何使用VC++6.0生成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应用程序就非常方便了。
下面经过我们亲手封装过后的代码:
//头文件在VC++6.0中新建一个空的Win32Application应用程序。再将上面的代码拷贝到工程的CPP文件中,编译运行即可。
#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的运行截图。(在devc++中也可以很方便的运行win32应用程序,运行结果是一样的)。
如何使用VC++6.0生成windows应用程序则参考博客:使用API,手工生成 Windows应用程序全过程(图解+文字说明)
相关文章推荐
- windows 服务访问共享目录(smb)
- BestCoder Round#77
- 剑指offer面试题之求1到n之间1的个数
- POJ 2528
- 【原】SparkContex源码解读(二)
- canvas实现五子棋界面
- JSON 简介
- 多态详解
- Java编程手册-Collection框架(上)
- Building a Space Station(POJ_2031)
- HDU 3065 AC自动机模版题
- 八皇后问题两种基本解法
- CAS单点登录(SSO)完整教程
- 第五周项目一三角形类雏形5
- MongoDB -- 查询
- Mongodb 3.0 创建用户
- 一个正整数表示为n个连续正整数之和(第1届第2题)
- JNI学习笔记
- listView 选最后一个把前面的勾去掉,选择中间的把后面的去掉
- mysql 编码问题