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);
    }
    注意:在显示窗口函数ShowWindow()和刷新窗口函数UpdateWindow()中出现了符号“::”,大家也许知道这叫域作用符。如果出现这种符号时前面是空白,表示其后的函数是系统函数。

  5. 应用程序类的声明。

    如果把主函数中的整个函数体作为一个对象,并把它叫做应用程序,则还应该声明一个应用程序类,并命名为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;
    }
    
    
    
  6. 我们对窗口类和应用程序类进行封装后,再来设计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应用程序,运行结果是一样的)。

    Windows应用程序的面向对象特性 之 封装_第1张图片


    如何使用VC++6.0生成windows应用程序则参考博客:使用API,手工生成 Windows应用程序全过程(图解+文字说明)

你可能感兴趣的:(windows,封装,应用程序,vc++6.0,面向对象特)