win32应用程序框架的两种方式

win32框架最为见的是把主窗口类和初始化窗口以及主窗口回调函数放在同一个文件中,适用于较为小型的软件开发。

先列出最基本的框架,紧接着展示另一种框架,便于比较。个人感觉是从MFC开发中移植过来的,但是程序具有很强的扩展性,适用于二次开发,方便修改。

原框架:

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")//窗口风格优化

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     
     switch (message)
     {
     case WM_CREATE:

          return 0 ;
          
     case WM_PAINT:
         hdc = BeginPaint (hwnd, &ps) ;
         
         EndPaint (hwnd, &ps) ;
        return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


进行拆分框架:

//initwindow.cpp 用于创建窗口类和实例  
#include "stdafx.h"

TCHAR szTitle[]=TEXT("tcpClient");
TCHAR szWindowClass[]=TEXT("tcpClient");
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
ATOM MyRegisterClass(PWNDCLASSEX wcex,HINSTANCE hInstance)
{


	wcex->cbSize = sizeof(WNDCLASSEX); 
	wcex->style	=  CS_HREDRAW | CS_VREDRAW;
	wcex->lpfnWndProc	= (WNDPROC)WndProc;
	wcex->cbClsExtra		= 0;
	wcex->cbWndExtra		= 0;
	wcex->hInstance		= hInstance;
	wcex->hIcon			= 0;
	wcex->hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex->hbrBackground	=(HBRUSH) GetStockObject (WHITE_BRUSH);
	wcex->lpszMenuName	= 0;
	wcex->lpszClassName	= szWindowClass;
	wcex->hIconSm		= 0;

	return RegisterClassEx(wcex);
}

HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	HWND hWnd;
	HINSTANCE hInst;
	hInst = hInstance; // Store instance handle in our global variable

	hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, windowx, windowy, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return hWnd;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	return hWnd;
}

//windowTool.cpp用于创建窗口中各种控件
#include "stdafx.h"
HWND hInputEdit,hSendButton,hChatEdit,hLaunchButton,hCloseButton,hIPaddrEdit,hIPaddrStatic;//定义控件句柄为局部变量,通过getDlgItem(hwnd,资源标识符进行调用)
void initTool(HWND hWnd)
{
	//动态创建各种子控件
}



//stdafx.h  用于包含全局变量、导入库及申明各cpp文件中的函数
#include <windows.h>
#include "resource.h"

#pragma comment(lib, "ws2_32.lib")       // 引入lib库文件
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")//win7窗口风格优化
ATOM MyRegisterClass(PWNDCLASSEX,HINSTANCE);
extern HWND InitInstance(HINSTANCE, int);//对窗口进行初始化并注册热键
extern void initTool(HWND hWnd);



#include "stdafx.h"

HINSTANCE g_hInstance;
int APIENTRY WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR     lpCmdLine,
	int       nCmdShow)
{
	g_hInstance = hInstance;
	HWND hWnd;
	MSG msg;
	WNDCLASSEX WndClass;
	MyRegisterClass(&WndClass, hInstance);

	if (!(hWnd = InitInstance(hInstance, nCmdShow))) 
		return FALSE;

	while (GetMessage(&msg, NULL, 0, 0))     //创建消息循环获取机制
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     
     switch (message)
     {
     case WM_CREATE:
	initTool();
          return 0 ;
          
     case WM_PAINT:
         hdc = BeginPaint (hwnd, &ps) ;
         
         EndPaint (hwnd, &ps) ;
        return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

//initwindow.cpp 用于创建窗口类和实例  
#include "stdafx.h"

TCHAR szTitle[]=TEXT("tcpClient");
TCHAR szWindowClass[]=TEXT("tcpClient");
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
ATOM MyRegisterClass(PWNDCLASSEX wcex,HINSTANCE hInstance)
{


	wcex->cbSize = sizeof(WNDCLASSEX); 
	wcex->style	=  CS_HREDRAW | CS_VREDRAW;
	wcex->lpfnWndProc	= (WNDPROC)WndProc;
	wcex->cbClsExtra		= 0;
	wcex->cbWndExtra		= 0;
	wcex->hInstance		= hInstance;
	wcex->hIcon			= 0;
	wcex->hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex->hbrBackground	=(HBRUSH) GetStockObject (WHITE_BRUSH);
	wcex->lpszMenuName	= 0;
	wcex->lpszClassName	= szWindowClass;
	wcex->hIconSm		= 0;

	return RegisterClassEx(wcex);
}

HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	HWND hWnd;
	HINSTANCE hInst;
	hInst = hInstance; // Store instance handle in our global variable

	hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, windowx, windowy, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return hWnd;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	return hWnd;
}

//windowTool.cpp用于创建窗口中各种控件
#include "stdafx.h"
HWND hInputEdit,hSendButton,hChatEdit,hLaunchButton,hCloseButton,hIPaddrEdit,hIPaddrStatic;//定义控件句柄为局部变量,通过getDlgItem(hwnd,资源标识符进行调用)
void initTool(HWND hWnd)
{
	//动态创建各种子控件
}



//stdafx.h  用于包含全局变量、导入库及申明各cpp文件中的函数
#include <windows.h>
#include "resource.h"

#pragma comment(lib, "ws2_32.lib")       // 引入lib库文件
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")//win7窗口风格优化
ATOM MyRegisterClass(PWNDCLASSEX,HINSTANCE);
extern HWND InitInstance(HINSTANCE, int);//对窗口进行初始化并注册热键
extern void initTool(HWND hWnd);



  这样就将最基本的win32进行了拆分,有效的提高了程序的扩展性查找起来也很方便,另外需要自定义资源标识符的时候,建议在resource.h头文件中进行定义,便于统一管理和维护。

这是本人的第一篇博客,希望大家多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值