1. 程式人生 > >Win32應用程式基本框架詳解

Win32應用程式基本框架詳解

#include <windows.h>

//視窗過程的回撥函式,函式名WndProc可自由定義
LRESULT CALLBACK WndProc(HWND hWnd,				//當前接收訊息的視窗控制代碼
						 UINT uMsg,				//被傳送過來的訊息ID
						 WPARAM wParam,			//訊息引數:附加在訊息上的資料,與MSG結構體是一樣
						 LPARAM lParam)			//訊息引數:附加在訊息上的資料
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
}


//應用程式入口函式WinMain()
//在 Visual Studio 2005 下則為int APIENTRY WinMain...
//在 Visual Studio 2012 下則為int CALLBACK WinMain...
int WINAPI WinMain( HINSTANCE hInstance,		//當前例項控制代碼		   
				   HINSTANCE hPrevInstance,		//先前例項控制代碼
				   LPSTR lpCmdLine,				//指向應用程式命令列的字串指標
				   int nShowCmd)				//視窗顯示方式(隱藏、最大化、最小化等)
{
	MSG Msg;
	HWND hWnd;
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOWFRAME + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = "ClsName";
	wcex.hIconSm = NULL;
	
	if (!RegisterClassEx(& wcex))
	{
		return -1;
	}
	hWnd = CreateWindowEx( WS_EX_APPWINDOW,
		"ClsName",
		"WndName",
		WS_OVERLAPPEDWINDOW,
		200, 200, 500, 500,
		NULL,
		NULL,
		hInstance,
		NULL);
	if (!hWnd)
	{
		return -1;
	}
	ShowWindow(hWnd, SW_SHOW);
	while (GetMessage(& Msg, NULL, 0, 0))
	{
		TranslateMessage(& Msg);
		DispatchMessage(& Msg);
	}
	return Msg.wParam;
}


/*
WinMain()函式
int WINAPI WinMain
(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)

1、引數:
第一個引數,hInstance:應用程式當前例項的控制代碼。

第二個引數,hPrevlnstance:應用程式的先前例項的控制代碼。對於同一個程式開啟兩次,出現兩個視窗第一次開啟的視窗就是先前例項的視窗。
	對於一個32位程式,該引數總為NULL。如果需要檢測另外一個例項是否已經存在,則使用CreateMutex函式建立一個獨一無二的名字。
	即使互斥名已經存在,CreateMutex函式也是成功的,但是GetLastError函式將返回 ERROR_ALREADY_EXISTS,這就表明應用程式有另外
	一個例項存在,因為它首先建立了互斥名。

第三個引數,lpCmdLine:指向應用程式命令列的字串的指標,不包括執行檔名。獲得整個命令列,參看GetCommandLine。lpCmdLine是
	一個以空終止的字串,指定傳遞給應用程式的命令列引數。例如:在D盤下有一個sunxin.txt檔案,當我們用滑鼠雙擊這個檔案時將啟
	動記事本程式(notepad.exe),此時系統會將D:\sunxin.txt作為命令列引數傳遞給記事本程式的WinMain函式,記事本程式在得到這個
	檔案的全路徑名後,就在視窗中顯示該檔案的內容。

第四個引數,nCmdShow:指明視窗如何顯示。該引數可以是下列值之一:
	SW_HIDE:隱藏視窗並且啟用另外一個視窗。
	SW_MINIMIZE:最小化指定的視窗,並且啟用在系統表中的頂層視窗。
	SW_RESTORE:啟用並顯示視窗。如果視窗已經最小化或最大化,系統將以恢復到原來的尺寸和位置顯示視窗(與SW_SHOWNORMAL相同)。
	SW_SHOW:啟用一個視窗並以原來的尺寸和位置顯示視窗。
	SW_SHOWMAXIMIZED:啟用視窗並且將其最大化。
	SW_SHOWMINIMIZED:啟用視窗並將其最小化(以圖示顯示)。
	SW_SHOWMINNOACTIVE:將一個視窗顯示為圖示。啟用視窗維持活動狀態。
	SW_SHOWNA:以視窗的當前狀態顯示視窗。啟用視窗保持活動狀態。
	SW_SHOWNOACTIVATE:以視窗的最近一次的尺寸和位置顯示視窗。啟用視窗維持啟用狀態。
	SW_SHOWNORMAL:啟用並顯示視窗。如果視窗最大化或最小化,系統將其恢復到原來的尺寸和位置(與SW_RESTORE相同)。


2、返回值

	如果函式成功,當它接收到一個WM_QUIT訊息時就中止,函式應該返回在該訊息的wParam引數的退出值。如果函式在進入訊息迴圈前退出,應該返回零。
*/