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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势&#xff1a; 服务解耦 性能提升&#xff0c;吞吐量提高 服务没有强依赖&#xff0c;不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高&#xff0c;所有大多数时间用同步。而如果不需要对方的结果&#xff0c;且吞吐…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下&#xff0c;使用medium中等模型&#xff0c;7分钟的中文视频需要851829.69 ms&#xf…

代码随想录 Leetcode51. N 皇后

题目&#xff1a; 代码(首刷看解析 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<string>> res;void backtracking(int n, int row, vector<string>& chessboard) {if (row n) {res.push_back(chessboard);return;}f…

SpringBoot activemq收发消息、配置及原理

SpringBoot集成消息处理框架 Spring framework提供了对JMS和AMQP消息框架的无缝集成&#xff0c;为Spring项目使用消息处理框架提供了极大的便利。 与Spring framework相比&#xff0c;Spring Boot更近了一步&#xff0c;通过auto-configuration机制实现了对jms及amqp主流框架…

C++ 动态规划 状态压缩DP 最短Hamilton路径

给定一张 n 个点的带权无向图&#xff0c;点从 0∼n−1 标号&#xff0c;求起点 0 到终点 n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 n 。 接下来 n 行每行 n 个整数&#xff0c;其中第 i 行…

什么是TCP三次握手、四次挥手?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、三次握手 你(客户端)给一个朋友(服务器)打电…

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

我在namesilo买的域名&#xff0c;coludflare做的解析&#xff0c;华为云的SSL&#xff0c;用宝塔部署的SSL&#xff0c;访问https报错&#xff0c;http却正常&#xff1a; 报错&#xff1a;此网站无法提供安全连接www.hongkong.ioyunxin.top 使用了不受支持的协议。 ERR_SSL_…

机器学习 | 探索朴素贝叶斯算法的应用

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域&#xff0c;并且在实际应用中表现出色。 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法&#xff1a; 1&#xff09;对于给定的待分类项r…

字节AIGC场景发力,云雀大模型+扣子智能体,快速构建专属AI应用

之前给大家推荐过类似的编排工具dify,今天给大家推荐的字节的这个产品&#xff0c;总体体验还是不错的。 第一步登录扣子 点击创建BOT-编排 创建插件 插件能够让 Bot 调用外部 API&#xff0c;例如搜索信息、浏览网页、生成图片等&#xff0c;扩展 Bot 的能力和使用场景。 我…

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

【Java程序设计】【C00246】基于Springboot的留守儿童爱心网站(有论文)

基于Springboot的留守儿童爱心网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的留守儿童爱心网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统首页的主要功能展…

我在项目中使用Redis的几个场景

目录 缓存 会话存储 分布式锁 消息队列 位统计 计数器 排行榜 缓存 缓存的目的是为了提高系统响应速度、减少数据库等资源的压力&#xff0c;redis作为键值对形式的内存数 据库&#xff0c;可以提供非常快速的读取速度&#xff0c;使得它成为存储热点数据或频繁访问数…

使用STM32 HAL库配置和控制外设接口

使用STM32 HAL库配置和控制外设接口非常简单&#xff0c;以下是一个示例&#xff0c;演示如何使用STM32 HAL库配置和控制USART外设接口。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注我的知乎&#xff1a;对error视而不见 代码获取…

小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】

2966 将数组划分为具有最大差值的数组 小白渣翻译&#xff1a; 给定一个大小为 n 的整数数组 nums 和一个正整数 k 。 将数组分成一个或多个大小为 3 的数组&#xff0c;满足以下条件&#xff1a; nums 的每个元素都应该位于一个数组中。一个数组中任意两个元素之间的差异小…

【力扣】两数之和,暴力枚举+哈希表

两数之和原题地址 方法一&#xff1a;暴力枚举 首先&#xff0c;我们需要枚举数组中所有可能的下标对组合&#xff0c;对于n个数的数组&#xff0c;从中选2个下标&#xff0c;有种可能。做法很简单&#xff0c;遍历数组中的所有元素&#xff0c;对于每一个元素&#xff0c;遍…

【数据开发】pyspark入门与RDD编程

【数据开发】pyspark入门与RDD编程 文章目录 1、pyspark介绍2、RDD与基础概念3、RDD编程3.1 Transformation/Action3.2 数据开发流程与环节 1、pyspark介绍 pyspark的用途 机器学习专有的数据分析。数据科学使用Python和支持性库的大数据。 spark与pyspark的关系 spark是一…

Golang 学习(一)基础知识

面向对象 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。 Golang 没有类(class)&#xff0c;Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位&#xff0c;Golang 是基于 struct 来实现 OOP…

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者&#xff1a;来自 Jessica Garson 大约一年前&#xff0c;我经历了一段压力很大的时期&#xff0c;最后参加了一场篮球比赛。 在整个过程中&#xff0c;我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…

新书速览|Kubernetes从入门到DevOps企业应用实战

从0到1&#xff0c;从零开始全面精通Kubernetes&#xff0c;助力企业DevOps应用实践 本书内容 《Kubernetes从入门到DevOps企业应用实战》以实战为主&#xff0c;内容涵盖容器技术、Kubernetes核心资源以及基于Kubernetes的企业级实践。从容器基础知识开始&#xff0c;由浅入深…