手写代码用c++创建窗体

 1.工程创建(如下两种创建方式头 可以,使用的环境的是vs2019)

2.代码 

// GT_HelloWorldWin32.cpp 
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c 
// 这是一个最简单的Win32程序,亦可作为开发桌面应用程序的模板

#include <windows.h> 
#include <stdlib.h> 
#include <string.h> 
#include <tchar.h> 

// ------------------------Global variables---------------------------------
// 主窗体类名
static TCHAR szWindowClass[] = _T("win32app");
// 应用程序标题栏处出现的字符串
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

//HINSTANCE 是Windows里的一中数据类型,是用于标示(记录)一个程序的实例。
//它与HMODULE是一样的(通用的,这两种类型最终就是32位无符号长整形)。
//HINSTANCE,分开看就是 HANDLE(句柄) + INSTANCE(实例)
//实例就是一个程序。用qq来举例:你可以开同时开2个qq号,但是你电脑里的qq软件只有一份。
//这2个qq号就是qq的2个实例
HINSTANCE hInst;

// -------------------------需要预定义的函数放置在此代码块种:---------------------------- 


//每个 Windows 桌面应用程序必须具有一个窗口过程函数
//此函数处理应用程序从操作系统中接收的大量消息。 
//例如,如果应用程序的对话框中有“确定”按钮,那么用户单击该按钮时,
//操作系统会向应用程序发送一条消息,通知按钮已被单击。WndProc 负责对该事件作出响应。
//在本例中,相应的响应可能是关闭对话框。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//-------------------------------------正式内容-----------------------------------------

//主窗体函数(入口过程)
//每个基于 Win32 的应用程序的函数必须具有 WinMain 函数
//正如每个 C 应用程序和 C++ 控制台应用程序在起始点必须具有 main 函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	//创建 WNDCLASSEX 类型的窗口类结构。 此结构包含关于窗口的信息
	//例如应用程序图标、窗口背景色、标题栏中显示的名称、窗口过程函数的名称等。
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

	//对已创建的窗口类进行注册。 使用 RegisterClassEx 函数,并将窗口类结构作为参数传递。
	if (!RegisterClassEx(&wcex)) {
		MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL);
		return 1;
	}

	// Store instance handle in our global variable 
	// 将句柄实例存储于全局变量中
	hInst = hInstance;

	// CreateWindow 函数的参数解释: 
	// szWindowClass: the name of the application 
	// szTitle: the text that appears in the title bar 
	// WS_OVERLAPPEDWINDOW: the type of window to create 
	// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) 
	// 500, 100: initial size (width, length) 
	// NULL: the parent of this window 
	// NULL: this application does not have a menu bar 
	// hInstance: the first parameter from WinMain 
	// NULL: not used in this application 
	// 返回的HWND是一个窗口的句柄
	HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);
	if (!hWnd) {
		MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL);
		return 1;
	}


	// ShowWindow 函数的参数解释: 
	// hWnd: CreateWindow函数返回的窗口句柄 
	// nCmdShow: the fourth parameter from WinMain 
	ShowWindow(hWnd, nCmdShow);
	// UpdateWindow函数用于更新窗口指定的区域
	// 如果窗口更新的区域不为空,UpdateWindow函数就发送一个WM_PAINT消息来更新指定窗口的客户区。
	// 函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程
	// 如果更新区域为空,则不发送消息。
	UpdateWindow(hWnd);

	// Main message loop: 
	// 添加用于侦听操作系统所发送消息的消息循环。 
	// 当应用程序收到一条消息时,此循环将该消息调度到 WndProc 函数以进行处理。 
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg); //翻译消息
		DispatchMessage(&msg);  //派遣消息
	}
	return (int)msg.wParam;
}

// //  函数: WndProc(HWND, UINT, WPARAM, LPARAM) 
// //  目标:  处理主窗体产生的信息
// //  WM_PAINT消息代表绘制主窗体 
// //  WM_DESTROY消息代表投递一个退出消息并返回 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR greeting[] = _T("Hello, World!");
	switch (message) {
	case WM_PAINT:
		//要处理 WM_PAINT 消息,首先应调用 BeginPaint
		//然后处理所有的逻辑以及在窗口中布局文本、按钮和其他控件等
		//然后调用 EndPaint。 
		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;
}

3.运行效果 

4.问题解决 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows.h 头文件中提供了创建 Windows 口的相关函数和数据类型,可以通过它来实现文本输入框。以下是实现输入框的步骤: 1. 定义口类,其中包括口的名称、样式、大小、背景色等信息。这可以通过 WNDCLASS 结构来完成,如下所示: ```c WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = L"InputBoxClass"; RegisterClass(&wc); ``` 其中,WndProc 是口过程函数,hInstance 是应用程序的实例句柄,LoadCursor 函数用于加载光标,HBRUSH 表示口的背景刷,COLOR_WINDOW 表示默认口背景色,lpszClassName 是口类名。 2. 创建口,可以通过 CreateWindowEx 函数来创建,如下所示: ```c HWND hwnd = CreateWindowEx( 0, L"InputBoxClass", L"Input Box", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); ``` 其中,第一个参数是口的扩展样式,第二个参数是口类名,第三个参数是口标题,第四个参数是口的样式,第五个和第六个参数是口的位置,第七个和第八个参数是口的大小,第九个参数是父口的句柄,第十个参数是菜单的句柄,第十一个参数是应用程序实例的句柄,第十二个参数是指向口的参数。 3. 在口中添加文本框控件,可以通过 CreateWindowEx 函数来创建。这里需要设置口样式为 WS_CHILD,表示子口。如下所示: ```c HWND hwndEdit = CreateWindowEx( 0, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10, 10, 360, 180, hwnd, NULL, hInstance, NULL ); ``` 其中,第一个参数是口的扩展样式,第二个参数是控件类名,第三个参数是控件的文本内容,第四个参数是控件的样式,第五个和第六个参数是控件的位置,第七个参数是父口的句柄,第八个参数是菜单的句柄,第九个参数是应用程序实例的句柄,第十个参数是指向控件的参数。 4. 处理口消息,包括接收用户输入、显示输入框等。可以通过口过程函数 WndProc 来完成,如下所示: ```c LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // 创建文本框控件 HWND hwndEdit = CreateWindowEx( 0, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10, 10, 360, 180, hwnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); break; } case WM_COMMAND: { if (LOWORD(wParam) == ID_OK) { // 获取文本框内容 TCHAR szText[1024]; GetWindowText(hwndEdit, szText, 1024); // 显示输入框内容 MessageBox(hwnd, szText, L"Input Box", MB_OK | MB_ICONINFORMATION); } break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: { return DefWindowProc(hwnd, msg, wParam, lParam); } } return 0; } ``` 其中,WM_CREATE 消息用于在创建创建文本框控件,WM_COMMAND 消息用于处理用户输入,WM_DESTROY 消息用于销毁口。 以上就是使用 Windows.h 头文件实现文本输入框的基本步骤。注意在使用时需要包含相应的头文件并链接相应的库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值