0
点赞
收藏
分享

微信扫一扫

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


  1. 在早期的编程生涯中,程序员采用C语言和Windows API函数进行Windows程序设计。 但采用这种方式进行程序开发,使得开发过程艰苦、乏味。
  2. 随着编程技术的不断发展,Windows编程采用了面向对象的程序设计思想(Object Oriented Programming,OOP)。这种思想集抽象性、封装性、集成性和多态性于一体,提高了编程的效率。
  3. 下面主要讲一讲应用程序主函数中类的封装。从面向对象的思想进行分析,为了形成程序框架,应该声明两个类:窗口类应用程序类
  4. 窗口类的声明。
    在窗口类中,应该实现窗口类的设计、窗口类的注册、窗口类的创建、窗口类的显示和窗口类的更新等功能。

    上述功能是窗口类的成员函数,为了辅助这些成员函数,还应该有一个数据成员,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);
}

  1. 注意:在显示窗口函数ShowWindow()和刷新窗口函数UpdateWindow()中出现了符号“::”,大家也许知道这叫域作用符。如果出现这种符号时前面是空白,表示其后的函数是系统函数。
  2. 应用程序类的声明。

    如果把主函数中的整个函数体作为一个对象,并把它叫做应用程序,则还应该声明一个应用程序类,并命名为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;
}

  1. 我们对窗口类和应用程序类进行封装后,再来设计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);
}

  1. 在VC++6.0中新建一个空的Win32Application应用程序。再将上面的代码拷贝到工程的CPP文件中,编译运行即可。
    下面是VC++6.0的运行截图。(在devc++中也可以很方便的运行win32应用程序,运行结果是一样的)。



举报

相关推荐

0 条评论