結構體形式: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));
複製代碼
調用WindowsAPI RegisterClassEx( __in CONST WNDCLASSEXW )
示例代碼:
RegisterClassEx(&wclass);
複製代碼
調用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);
複製代碼
調用API ShowWindow(hwnd,ncmdshow)
和UpdateWindow(hwnd)
示例代碼:
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;
}
複製代碼
完整的代碼:
// 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;
}
複製代碼
運行截圖: