C++建立Windows窗體流程(全網最全)

Windows建立窗體過程(C++)

1.建立窗體類

窗口類 WNDCLASSEX 說明

結構體形式:c++

typedef struct tagWNDCLASSEXW {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} 
複製代碼

參數解釋:windows

cbSize:設置WNDCLASSEX類的大小 直接用sizeof(WNDCLASSEX)便可bash

style: 窗口類的樣式 :能夠同時設置多個 以|劃分數據結構

包括以下樣式及說明:app

/* * Class styles */
#define CS_VREDRAW 0x0001 //高度改變時,重繪窗體
#define CS_HREDRAW 0x0002 //寬度改變時,重繪窗口
#define CS_DBLCLKS 0x0008 //雙擊窗口時,發送鼠標雙擊消息
#define CS_OWNDC 0x0020 //爲窗體類建立惟一的設備上下文
#define CS_CLASSDC 0x0040
#define CS_PARENTDC 0x0080 //使子窗口能夠在父窗口上繪圖
#define CS_NOCLOSE 0x0200 //設置關閉按鈕不可見
#define CS_SAVEBITS 0x0800
#define CS_BYTEALIGNCLIENT 0x1000
#define CS_BYTEALIGNWINDOW 0x2000
#define CS_GLOBALCLASS 0x4000

#define CS_IME 0x00010000
#if(_WIN32_WINNT >= 0x0501)
#define CS_DROPSHADOW 0x00020000
#endif /* _WIN32_WINNT >= 0x0501 */
複製代碼

lpfnWndProc:窗體消息的回調處理函數 重點 :用於處理Windows窗體各種消息,是Windows的靈魂函數

cbClsExtra:windows程序爲每個窗口設計類管理一個WNDCLASS結構。在應用程序註冊一個窗口類的時候,能夠讓windows分配必定字節空間的內存,這部份內存成爲類的附件內存,有屬於這個窗口類的全部窗口共享,類附件內存信息用於存儲窗口類的附加信息。windows系統將這部份內存初始化爲0,所以咱們常常設置此參數爲0.佈局

cbWndExtra:windows程序爲每個窗口管理一個內部數據結構,在註冊窗口類的時候,系統能夠爲每個窗口分配必定的字節數的附加內存空間,稱爲窗口附件內存。應用程序可以使用這部份內存存儲窗口特有的數據,windows系統把這部份內存初始化爲0.ui

hInstance:窗體所在的句柄spa

hIcon: 窗體程序圖標的句柄翻譯

圖標資源示例:

#define IDI_APPLICATION MAKEINTRESOURCE(32512)
#define IDI_HAND MAKEINTRESOURCE(32513)
#define IDI_QUESTION MAKEINTRESOURCE(32514)
#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)
#define IDI_ASTERISK MAKEINTRESOURCE(32516)
複製代碼

hCursor:鼠標樣式

鼠標樣式包括:

#define IDC_ARROW MAKEINTRESOURCE(32512)
#define IDC_IBEAM MAKEINTRESOURCE(32513)
#define IDC_WAIT MAKEINTRESOURCE(32514)
#define IDC_CROSS MAKEINTRESOURCE(32515)
#define IDC_UPARROW MAKEINTRESOURCE(32516)
#define IDC_SIZE MAKEINTRESOURCE(32640) /* OBSOLETE: use IDC_SIZEALL */
#define IDC_ICON MAKEINTRESOURCE(32641) /* OBSOLETE: use IDC_ARROW */
#define IDC_SIZENWSE MAKEINTRESOURCE(32642)
#define IDC_SIZENESW MAKEINTRESOURCE(32643)
#define IDC_SIZEWE MAKEINTRESOURCE(32644)
#define IDC_SIZENS MAKEINTRESOURCE(32645)
#define IDC_SIZEALL MAKEINTRESOURCE(32646)
#define IDC_NO MAKEINTRESOURCE(32648) /*not in win3.1 */
#if(WINVER >= 0x0500)
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0x0500 */
#define IDC_APPSTARTING MAKEINTRESOURCE(32650) /*not in win3.1 */
#if(WINVER >= 0x0400)
#define IDC_HELP MAKEINTRESOURCE(32651)
#endif /* WINVER >= 0x0400 */
複製代碼

hbrBackground:客戶區顏色,即在導航欄下方的color

lpszMenuName:菜單名字

lpszClassName:類名(必須添加)

hIconSm:窗口標題欄圖標

建立窗體代碼示例:

//1.定義當前窗口類 WNDCLASSEX
WNDCLASSEX wclass;
wclass.cbSize = sizeof(WNDCLASSEX);
wclass.style = CS_VREDRAW|CS_HREDRAW|CS_NOCLOSE;
wclass.lpfnWndProc = MSGPROCFUN;
wclass.cbClsExtra = 0;
wclass.cbWndExtra = 0;
wclass.hInstance = hInstance;
wclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wclass.hbrBackground = (HBRUSH)(COLOR_WINDOW +2);
wclass.lpszMenuName = L"MENU";
wclass.lpszClassName = WNDCLASSNAME;
wclass.hIconSm=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
複製代碼

2.註冊窗體類

調用WindowsAPI RegisterClassEx( __in CONST WNDCLASSEXW )

示例代碼:

RegisterClassEx(&wclass);
複製代碼

3.建立窗體

調用WindowsAPICreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)

參數說明:

lpClassName:對應窗口類名 至關於綁定窗口類名

lpWindowName: 窗口顯示的名字

dwStyle:窗口類型

x:windows桌面的x位置

y:windows桌面的y位置

nWidth:窗體的寬度

nHeight:窗體的高度

hWndParent:父窗體的句柄

hMenu:主菜單的句柄

hInstance:窗體句柄

lpParam:傳給窗體的參數

返回值:HWND 當前建立成功窗體的句柄

示例代碼:

HWND hWnd = CreateWindow(WNDCLASSNAME,WINDOWNAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,700,NULL,NULL,hInstance,NULL);
複製代碼

4.顯示窗體和更新窗體

調用API ShowWindow(hwnd,ncmdshow)UpdateWindow(hwnd)

示例代碼:

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
複製代碼

5.初始化窗體消息模塊

示例代碼以下:

MSG msg; 
	while (GetMessage(&msg, NULL, 0, 0)) { 
		TranslateMessage(&msg); //翻譯消息
		DispatchMessage(&msg);  //派遣消息
	} 
	return (int) msg.wParam;
複製代碼

6.響應消息函數處理

//處理消息
LRESULT CALLBACK MSGPROCFUN(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	PAINTSTRUCT ps;  
	HDC hdc;   
	TCHAR greeting[] = _T("Hello, World!");   
	switch (message) {   
	case WM_PAINT:   
		hdc = BeginPaint(hWnd, &ps);   
		// -----------------在這段代碼對應用程序進行佈局------------------------ 
		// 對於此應用程序,開始調用和結束調用之間的邏輯是在窗口中顯示字符串 「Hello,World!」。 
		// 請注意 TextOut 函數用於顯示字符串。 
		TextOut(hdc, 50, 5, greeting, _tcslen(greeting));   
		EndPaint(hWnd, &ps);  
		break;   
	case WM_DESTROY:   
		PostQuitMessage(0);   
		break;  
	default:   
		//DefWindowProc缺省窗口處理函數 
		//這個函數是默認的窗口處理函數,咱們能夠把不關心的消息都丟給它來處理 
		return DefWindowProc(hWnd, message, wParam, lParam);   
		break;   
	}   
	return 0;   
}
複製代碼

完整的代碼:

// Calculate.cpp : 定義應用程序的入口點。
//

#include "stdafx.h"
#include "Calculate.h"

using namespace std;


HINSTANCE hCurInstance; //當前窗口句柄

// 主窗體類名 
static TCHAR szWindowClass[] = _T("win32app");   

//設置回調函數,用於處理windows窗體的消息
LRESULT CALLBACK MSGPROCFUN(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	//1.定義當前窗口類 WNDCLASSEX
	WNDCLASSEX wclass;
	wclass.cbSize = sizeof(WNDCLASSEX);
	wclass.style = CS_HREDRAW | CS_VREDRAW |CS_NOCLOSE;   
	wclass.lpfnWndProc = MSGPROCFUN;
	wclass.cbClsExtra = 0;
	wclass.cbWndExtra = 0;
	wclass.hInstance = hInstance;
	wclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wclass.hCursor = LoadCursor(NULL,IDC_ARROW);
	wclass.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
	wclass.lpszMenuName =NULL;
	wclass.lpszClassName = szWindowClass;
	wclass.hIconSm=LoadIcon(wclass.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    hCurInstance = hInstance;
	//2.註冊窗體類
	RegisterClassEx(&wclass);

	//3.建立窗體
	HWND hWnd = CreateWindow(szWindowClass,szWindowClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,700,NULL,NULL, hInstance ,NULL);

	//4.顯示窗體 和 更新窗體 
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);

	//初始化窗體消息模塊
	MSG msg; 
	while (GetMessage(&msg, NULL, 0, 0)) { 
		TranslateMessage(&msg); //翻譯消息
		DispatchMessage(&msg);  //派遣消息
	} 
	return (int) msg.wParam;
}

//處理消息
LRESULT CALLBACK MSGPROCFUN(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	PAINTSTRUCT ps;  
	HDC hdc;   
	TCHAR greeting[] = _T("Hello, World!");   
	switch (message) {   
	case WM_PAINT:   
		hdc = BeginPaint(hWnd, &ps);   
		// -----------------在這段代碼對應用程序進行佈局------------------------ 
		// 對於此應用程序,開始調用和結束調用之間的邏輯是在窗口中顯示字符串 「Hello,World!」。 
		// 請注意 TextOut 函數用於顯示字符串。 
		TextOut(hdc, 50, 5, greeting, _tcslen(greeting));   
		EndPaint(hWnd, &ps);  
		break;   
	case WM_DESTROY:   
		PostQuitMessage(0);   
		break;  
	default:   
		//DefWindowProc缺省窗口處理函數 
		//這個函數是默認的窗口處理函數,咱們能夠把不關心的消息都丟給它來處理 
		return DefWindowProc(hWnd, message, wParam, lParam);   
		break;   
	}   
	return 0;   
}
複製代碼

運行截圖:

相關文章
相關標籤/搜索