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.mzph.cn/news/657156.shtml

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

相关文章

[AG32VF407]国产MCU+FPGA Verilog编写控制2路gpio输出不同频率方波实验

视频讲解 [AG32VF407]国产MCUFPGA Verilog编写控制2路gpio输出不同频率方波实验 实验过程 根据原理图&#xff0c;选择两个pin脚作为输出 修改VE文件&#xff0c;clk选择PIN_OSC&#xff0c;使用内部晶振8Mhz&#xff0c;gpio使用PIN_51和52&#xff0c;pinout是数组 添加pll…

Uniapp小程序端打包优化实践

背景描述&#xff1a; 在我们最近开发的一款基于uniapp的小程序项目中&#xff0c;随着功能的不断丰富和完善&#xff0c;发现小程序包体积逐渐增大&#xff0c;加载速度也受到了明显影响。为了提升用户体验&#xff0c;团队决定对小程序进行一系列打包优化。 项目优化点&…

CentOS 7如何修改用户密码

一、问题 CentOS 7如何修改用户密码&#xff1f; 二、解答 1、passwd命令 [rootlocalhost ~]# passwd 用户名#需要在root用户下修改 [rootlocalhost ~]# su root#切换到root下&#xff0c;输入密码 #修改用户的密码&#xff0c;按提示输入新密码和确认密码&#xff0c;密码是…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器&#xff0c;未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】&#xff0c;查看运行结果

安装并开始设置 Windows 终端(命令提示符或Windows PowerShell或Azure Cloud Shell)

安装 安装 若要试用最新的预览功能&#xff0c;可能还需要安装 Windows 终端预览。 ‼️备注 如果你无法访问 Microsoft Store&#xff0c;GitHub 发布页上发布有内部版本。 如果从 GitHub 安装&#xff0c;Windows 终端将不会自动更新为新版本。 有关使用包管理器&#xff…

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标&#xff1a; Application.cpp:把渲染循环里的glad代码封装成自己的类&#xff1a; #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

Android Studio使用小记

复制了一个原来的项目&#xff0c;准备基于它调整一个OEM版本 因为svn服务器上分出了一个单独的版本&#xff0c;于是在工程目录下手工删除了.svn文件&#xff0c;并手工去除了vcs.xml <?xml version"1.0" encoding"UTF-8"?> <project versi…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容&#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例&#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…

高通GAIA V3命令参考手册的研读学习(十三):GAIA通知

如前文《高通GAIA V3命令参考手册的研读学习&#xff08;四&#xff09;》所述&#xff0c;PDU一共有四种&#xff0c;前面已经讲了命令、回应以及错误码&#xff0c;现在来看最后一种&#xff1a;通知。 4. QTIL GAIA通知 通知发送的方向&#xff0c;是由设备发送到移动应用…

【Node.js】fs与path模块的基础使用

文章目录 前言一、什么叫做模块二、fs模块2.1 fs模块是干什么的&#xff1f;2.2 fs模块的使用导入fs模块读取文件的内容写入文件内容处理路径问题path路径模块 总结 前言 在Node.js中&#xff0c;fs模块&#xff08;文件系统模块&#xff09;是一个重要的核心模块&#xff0c;…

【操作系统】调用硬盘并且实现MBR与Loader的过渡——实战篇

一.概述 有了上一篇文章&#xff1a;【操作系统】调用硬盘并且实现MBR与Loader的过渡——原理篇的理论支持&#xff0c;我们就可以开始代码实操了&#xff0c;接下来我们将优化MBR程序&#xff0c;使其从扇区中读取出loader加载器&#xff0c;并将其存放到内存处&#xff0c;将…

excel怎么设置密码?轻松保护您的工作表

在数字化时代&#xff0c;数据的安全性显得尤为重要。excel作为我们日常工作中广泛使用的办公软件&#xff0c;其中可能包含了大量的敏感数据。为了确保这些数据不被未授权的人访问&#xff0c;本文将为您详细介绍excel怎么设置密码&#xff0c;从而有效地保护您的数据安全。 方…

基于Redis的高可用分布式锁——RedLock

目录 RedLock简介 RedLock工作流程 获取锁 释放锁 RedLock简介 Redis作者提出来的高可用分布式锁由多个完全独立的Redis节点组成&#xff0c;注意是完全独立&#xff0c;而不是主从关系或者集群关系&#xff0c;并且一般是要求分开机器部署的利用分布式高可以系统中大多数存…

delphi fmxui 做的一些跨平台app

pascal语音显然已经没落&#xff0c;但delphi还在坚挺着&#xff0c;每年都会发布新版本&#xff0c; 主要是做跨平台应用。 如果你觉得qt qml 写android app 比较麻烦&#xff0c;那可以尝试delphi 12&#xff0c;可以用c builder 尝试 android&#xff0c;ios 开发 下面的…

适用于 Windows 7/8/10/11电脑的 12 款顶级数据恢复软件

很多时候&#xff0c;我们在 Windows 7 /8/10/11下不小心按了删除键&#xff0c;从而丢失了硬盘或 USB 驱动器中的重要文件和数据。在某些情况下&#xff0c;病毒或软件错误可能会损坏您的硬盘&#xff0c;从而影响您的文件。在这种情况下&#xff0c;您迫切需要一款适用于 Win…

Labview 图像处理系统设计

1. 总体主界面设计 前面板界面如下&#xff1a; 界面总共分为一个实时采集加拍照控制模块&#xff0c;两个图像显示模块&#xff08;实时图像显示和直方图显示&#xff09;以及三个图像处理模块 前面板中各模块具体功能及使用说明如下&#xff1a; 1.当实时按钮关闭时&#x…

mysql .ibd 文件过大清理方法

问题 有一个 info_track 表用来临时存储告警推送数据&#xff0c;逻辑处理完成后&#xff0c;会执行 Delete 语句删除对应的记录。 问题&#xff1a;项目现场运行了几个月后&#xff0c;发现磁盘空间莫名占用了过多的存储&#xff0c;> 100GB&#xff0c;且无法释放。 生…

向上调整向下调整算法

目录 AdjustUp向上调整 AdjustDown向下调整 AdjustUp向上调整 前提是&#xff1a;插入数据之后&#xff0c;除去插入的数据其他的数据还是为堆 应用&#xff1a;插入数据。 先插入一个10到数组的尾上&#xff0c;再进行向上调整算法&#xff0c;直到满足堆。 性质&#xff1…

基础算法(二)

一 高精度计算 int能表示范围为2^32&#xff0c;这看起来很大&#xff0c;但在大数据时代的如今&#xff0c;不说是int 哪怕是long long也是不够的&#xff0c;那么为了使用或计算这些超出或远超整形大小的数&#xff0c;我们这些数的计算方法称为高精度计算。 &#xff08;1)…

代码随想录 Leetcode113. 路径总和 II

题目&#xff1a; 代码(首刷看解析 2024年1月30日&#xff09;&#xff1a; class Solution { public:vector<int> temp;vector<vector<int>> res;void recursion(TreeNode* cur, int sum) {if (!cur->left && !cur->right && sum 0…