Windows编程入门-窗口控件-资源操作

window控件:
控件是常见的窗口上的交互元素例如:一个按钮,一个复选框,一个列表框等。
当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给控件控制控件的行为。
控件的本质是一个窗口

windows窗口风格
windows窗口从其特点是主要分为两大类

  1. 表明窗口和其他窗口关系的(WS_OVERLAPED(重叠)、WS_POPPUP(弹出)、WS_CHILD(子窗口))
  2. 表明窗口自身外观特征的(WS_BORDER、WS_CAPITON…)

windows标准控件:

窗口类名控件名称
WC_BUTTON按钮
WC_STATIC静态文本
WC_COMBOBOX复合框
WC_EDIT编辑框
WC_LISTBOX列表框
WC_SCROLLBAR滚动条

windows通用控件:
WC_LISTVIEW 列表框控件
WC_TREEVIEW 树控件
WC_TABCONTROL Tab控件

控件的响应
子控件通知父窗口一些事件,例如子控件被点击,需要通过以下两类消息
标准控件的消息:WM_COMMAND
通用控件的消息:WM_NOTIFY

添加一个按钮演示

{
	static HINSTANCE hInstance = GetModuleHandleW(NULL);
	switch (uMsg)
	{
	case WM_CREATE:
		//添加控件
		CreateWindowW(WC_BUTTON,L"按钮1",WS_CHILD|WS_VISIBLE,10,10,80,60,hwnd,(HMENU)0x100, hInstance,0);
		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		PostQuitMessage(0);
		break;
	}
	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

按钮消息处理

LRESULT CALLBACK WindowProc(
	_In_ HWND hwnd,
	_In_ UINT uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
)
{
	static HINSTANCE hInstance = GetModuleHandleW(NULL);
	switch (uMsg)
	{
	case WM_CREATE:
		//添加控件
		CreateWindowW(WC_BUTTON,L"按钮1",WS_CHILD|WS_VISIBLE,10,10,80,60,hwnd,(HMENU)0x100, hInstance,0);
		CreateWindowW(WC_BUTTON,L"按钮2",WS_CHILD|WS_VISIBLE,10,80,80,60,hwnd,(HMENU)0x101, hInstance,0);
		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		WORD ContrlId = LOWORD(wParam);
		if (ContrlId==0x100) 
		{
			MessageBoxW(hwnd, L"按钮1", L"提示", MB_OK);
		}else if(ContrlId == 0x101) 
		{
			MessageBoxW(hwnd, L"按钮2", L"提示", MB_OK);
		}
		break;
	}
	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

image.png
image.png

窗口操作函数的使用

操作窗口的通用函数

函数说明
MoveWindow移动窗口
UpdateWindow更新窗口
GetWindowText获取窗口标题
SetWindowText设置窗口标题
FindWindow查找窗口返回句柄
GetClientRect获取窗口客户区大小
SetWindowPos设置窗口位置
EnumChildWindows枚举窗口下的所有子窗口

实现按钮(窗口)移动

#include<Windows.h>
#include<iostream>
#include<CommCtrl.h>
LRESULT CALLBACK WindowProc(
	_In_ HWND hwnd,
	_In_ UINT uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
)
{
	static HINSTANCE hInstance = GetModuleHandleW(NULL);
	switch (uMsg)
	{
	case WM_CREATE:
		//添加控件
		CreateWindowW(WC_BUTTON,L"移动按钮",WS_CHILD|WS_VISIBLE,10,10,80,60,hwnd,(HMENU)0x100, hInstance,0);
		CreateWindowW(WC_BUTTON,L"获取文本框内容",WS_CHILD|WS_VISIBLE,10,80,80,60,hwnd,(HMENU)0x101, hInstance,0);
		CreateWindowW(WC_BUTTON,L"设置文本框内容",WS_CHILD|WS_VISIBLE,10,160,80,60,hwnd,(HMENU)0x102, hInstance,0);
		CreateWindowW(WC_BUTTON,L"设置父窗口",WS_CHILD|WS_VISIBLE,10,240,80,60,hwnd,(HMENU)0x103, hInstance,0);
		CreateWindowW(WC_EDIT,L"文本框内容",WS_CHILD|WS_BORDER|WS_VISIBLE,10,320,80,60,hwnd,(HMENU)0x104, hInstance,0);
		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		WORD ContrlId = LOWORD(wParam);
		switch (ContrlId)
		{
			case 0x100:
			{
				RECT rect{ 0 };
				GetClientRect(hwnd, &rect);
				int x = rand() % rect.right;
				int y = rand() % rect.bottom;
				MoveWindow((HWND)lParam, x, y, 80, 60, TRUE);
			}
		}
		break;
	}
	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPreInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)
{
	//1、创建一个窗口类
	WNDCLASSW myClass = { 0 };
	myClass.lpszClassName = L"xiaowang";
	myClass.lpfnWndProc = WindowProc;
	myClass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	//2、注册窗口类
	RegisterClassW(&myClass);
	//3、创建窗口
	HWND hwindow=CreateWindowW(
		myClass.lpszClassName,
		L"xiaowang",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		NULL,
		NULL,
		hInstance,
		0
	);
	//4、显示窗口
	ShowWindow(hwindow,SW_SHOWNORMAL );
	//5、获取消息
	MSG msg = { 0 };
	while (GetMessageW(&msg,0,0,0)) 
	{
		DispatchMessageW(&msg);//分发消息给消息处理函数
	}
	
	return 0;
}

实现获取文本框内容

case 0x101:
{
    WCHAR buff[100]{ 0 };
    HWND hedit = GetDlgItem(hwnd, 0x104);
    GetWindowTextW(hedit, buff, 100);
    MessageBoxW(hwnd, buff, L"提示", MB_OK);
    break;
}

设置文本内容

case 0x102:
{
    HWND hedit = GetDlgItem(hwnd, 0x104);
    //SetWindowTextW(hedit, L"设置了文本内容");
    SetDlgItemTextW(hedit, 0x104,L"设置了文本内容SetDlgItemTextW");

    break;
}

设置父窗口

case 0x103:
{
    HWND hnote = FindWindowW(NULL, L"记事本");
    SetParent((HWND)lParam, hnote);
    break;
}

使文本框内容可编辑
加上
TranslateMessage(&msg);
image.png

	//4、显示窗口
	ShowWindow(hwindow,SW_SHOWNORMAL );
	//5、获取消息
	MSG msg = { 0 };
	while (GetMessageW(&msg,0,0,0)) 
	{
		TranslateMessage(&msg);
		DispatchMessageW(&msg);//分发消息给消息处理函数
	}
	
	return 0;
}

资源操作

无法直接定位到资源,并使用函数操作他们,和窗口一样,一般情况需要得到资源的句柄
LoadXXX:XXX是资源类型
LoadTcon 载入图标、LoadCursor载入光标 LoadMenu 载入菜单
图标资源:LoadIcon
光标资源:LoadCursor
菜单资源:
1、
lpszMenuName
2、
LoadMenu
CreateWindow();
3、
LoadMenu
GetSubMenu();
TrackPopupMenu()
图标
添加 一个资源
image.png
选择icon
image.png
image.png
载入图标
按钮点击后改变

#include"resource.h"
case 0x101:
    {
        //MAKEINTRESOURCEW为强制转换
        //IDI_ICON1为资源视图中图标的名字
        HICON hIcon=LoadIcon(hInstance,MAKEINTRESOURCEW(IDI_ICON1));
        SetClassLongW(hwnd, GCL_HICON, (LONG)hIcon);
        break;
    }

image.png
窗口创建时改变图标

	//1、创建一个窗口类
	WNDCLASSW myClass = { 0 };
	myClass.lpszClassName = L"xiaowang";
	myClass.lpfnWndProc = WindowProc;
	myClass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	myClass.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_ICON1));
	//系统提供图标
	//myClass.hIcon = LoadIconW(0, IDI_ERROR);
	//2、注册窗口类
	RegisterClassW(&myClass);

光标
创建光标文件
image.png
载入光标

case 0x102:
{
    HCURSOR hcursor = LoadCursorW(hInstance, MAKEINTRESOURCEW(IDC_CURSOR1));
    SetClassLongW(hwnd, GCL_HCURSOR, (LONG)hcursor);
    break;
}

窗口创建时改变光标

//1、创建一个窗口类
	WNDCLASSW myClass = { 0 };
	myClass.lpszClassName = L"xiaowang";
	myClass.lpfnWndProc = WindowProc;
	myClass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	myClass.hCursor = LoadCursorW(hInstance, MAKEINTRESOURCEW(IDC_CURSOR1))

菜单
image.png
image.png
初始化时载入菜单

//1、创建一个窗口类
	WNDCLASSW myClass = { 0 };
	myClass.lpszClassName = L"xiaowang";
	myClass.lpfnWndProc = WindowProc;
	myClass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	myClass.lpszMenuName = MAKEINTRESOURCEW(IDR_MENU1);

创建窗口时

	//3、创建窗口
	HMENU hmenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_MENU1));
	HWND hwindow=CreateWindowW(
		myClass.lpszClassName,
		L"xiaowang",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		NULL,
		hmenu,
		hInstance,
		0
	);

通过按钮载入

case 0x100:
    {
        HMENU hmenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_MENU1));
        SetMenu(hwnd, hmenu);

鼠标右键点击时出现菜单

	switch (uMsg)
	{
	case WM_CREATE:
		.....
	case WM_RBUTTONDOWN:
	{
		POINT point{ 0 };
		ClientToScreen(hwnd, &point);
		GetCursorPos(&point);
		HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_MENU1));
		HMENU hSubMenu = GetSubMenu(hMenu, 0);
		TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, point.x, point.y, 0, hwnd, NULL);
		break;
	}

image.png
捕获菜单被点击

case ID_40001:
{
    MessageBoxW(hwnd, L"子菜单1被点击了",L"提示",MB_OK);
}

image.png
对话框资源
对话框资源可以创建一个对话框,以及其上的子控件。通过对话框可以进行可视化编辑。
对话框有两种形式:
模态对话框、非模态对话框
区别:模态对话框会阻塞主窗口,非模态对话框不会
添加一个对话框
image.png
创建非模态对话框

#include<Windows.h>
#include<CommCtrl.h>
#include"resource.h"
INT_PTR CALLBACK Dlgproc(
	HWND hWnd,
	UINT Umsg,
	WPARAM wparam,
	LPARAM lparam
) {
	switch (Umsg)
	{
		case WM_INITDIALOG: 
		{
			MessageBox(hWnd,L"窗口创建了",L"标题",MB_OK);
			break;
		}
		case WM_CLOSE:
		{
			DestroyWindow(hWnd);
			PostQuitMessage(0);
			break;
		}
		default:
		{
			return FALSE;
		}
	}
	return TRUE;
}
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPreInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)
{
	HWND hwnd=CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_DIALOG1),NULL,Dlgproc);
	ShowWindow(hwnd, SW_SHOWNORMAL);
	MSG msg{ 0 };
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessageW(&msg);
	}
	return 0;
}

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Utreexo:优化Bitcoin UTXO集合的基于哈希的动态累加器

1. 引言 前序博客&#xff1a; Utreexo&#xff1a;比特币UTXO merkle tree proof以节约节点存储空间 MIT Digital Currency Initiative 的 Thaddeus Dryja 2019年论文 Utreexo: A dynamic hash-based accumulator optimized for the Bitcoin UTXO set。 开源代码实现见&…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

使用流服务器m7s对接gb28181

优&#xff1a;sip品牌兼容性比较好&#xff0c;大华&#xff0c;海康都稳定可以&#xff0c;srs的5.0 sip品牌兼容性大华没反应&#xff0c;akstream-sip 大华也有问题&#xff0c;wvp也还可以 缺&#xff1a;目前最新的4.7.4版本&#xff0c;&#xff0c;sip协议用udp正常&a…

年底特殊时期外贸装柜多花点心思

如果可以&#xff0c;尽量不要在工厂快要放假的时候安排装柜了&#xff0c;一个是人手不够&#xff0c;一个是容易漏货&#xff0c;还有就是柜子不好定。 看到有人说自己客户收到货的时候比预期晚了两个星期&#xff0c;一直延误&#xff0c;已经比原来要计划开业的时间推迟&a…

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务&#xff0c;直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader&#xff0c;是我们在目前 Spring 框架中对于服务功能测试的使用方式&#xff0c;它能很好的体现出 Spring 是如何对 xm…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统&#xff0c;完全依赖代码进行实现&#xff0c;动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标&#xff08;x,y&#xff09; //1秒时间内&#xff0c;移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能&#xff0c;用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置&#xff0c;然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import&#xff0c;将 Walrus file 提交给 Walrus server&#xff0c;由 …

Qt简易的五子棋

五子棋是个简单的小游戏&#xff0c;尝试使用Qt将他做出来&#xff0c;学习时的练习demo。 成果展示 需求分析 五子棋&#xff1a;在棋盘上&#xff0c;黑棋先行&#xff0c;交替下棋&#xff0c;五子练成直线获取胜利。 实现过程 1.棋盘绘制&#xff1a;下棋的第一步肯定是绘制…

7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ&#xff0c;包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。 我将使用 waynboot-mall 项目作为代码讲解&#xff0c;项目地址&#xff1a;https://github.com/wayn111/waynboot-mall。本文大…

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑&#xff0c;开发者选项中打开 USB 调试。&#xff08;开发者选项默认隐藏&#xff0c;需要在关于手机中多次点击版本号才能调出&#xff09;。 安装手机驱动&#xff0c;下载安装 ADB 工具包。 开始操作…

世界坐标系转换为平面地图坐标

将世界坐标系转换为平面地图坐标的方法通常涉及地图投影。地图投影是一种将地球(一个三维球体)上的点转换为平面(二维)地图上的点的方法。 这里介绍几种常见的地图投影方法: 墨卡托投影(Mercator Projection): 这是最常见的投影方式之一,尤其用于航海地图。它将经纬度…

3D数据转换器HOOPS Exchange如何获取模型的几何数据? 干货预警!

一、概述 前面讲解过模型在内存中的结构&#xff0c;现在回顾一下&#xff0c;当模型导入成功后&#xff0c;整个模型数据会以原生结构的 PRC 组装树形式存放到内存中。&#xff08;申请 HOOPS Exchange 试用&#xff09; PRC结构的主要类型包含四种&#xff0c;分别是…

Pipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

数据结构:大顶堆、小顶堆

堆是其中一种非常重要且实用的数据结构。堆可以用于实现优先队列&#xff0c;进行堆排序&#xff0c;以及解决各种与查找和排序相关的问题。本文将深入探讨两种常见的堆结构&#xff1a;大顶堆和小顶堆&#xff0c;并通过 C 语言展示如何实现和使用它们。 一、定义 堆是一种完…

【代码随想录-链表】两两交换链表中的节点

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

虹科方案|释放总线潜力:汽车总线离线模拟解决方案

导读&#xff1a;传统的ECU模拟工具通常需要依赖上位机软件来发起通信&#xff0c;这在离线场景和自动化产线中带来不便。为了应对这一挑战&#xff0c;虹科推出了创新的汽车总线离线模拟解决方案&#xff0c;基于PCAN-Router系列网关&#xff0c;通过内部可编程固件&#xff0…

Ubuntu 22.04 中文乱码解决方案

sudo apkg-reconfigure locales 按空格键选中

TypeScript(七) 函数

1. TypeScript 函数 1.1. 函数的定义 函数就是包裹在花括号中的代码块&#xff0c;前面使用关键字function。 语法&#xff1a; // An highlighted block function function_name() {// 执行代码 }实例&#xff1a; function test() { // 函数定义console.log("我就是…

【leetcode题解C++】257.二叉树的所有路径 and 404.左叶子之和 and 112.路径总和

257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&…