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;   
}
复制代码

运行截图:

相关文章
相关标签/搜索