关于 WS_TABSTOP,我一直没搞明白,为何加了 WS_TABSTOP ,当按下 Tab 键时,窗口中的控件还是不能自动的切换焦点。

为何 SetFocus(hwnd); 后,虽然按钮已获得焦点,但焦点的虚线框不显示。

关于 BS_DEFPUSHBUTTON,为何加了,在窗体上按下【回车】什么反应都没有。

过去几年,我一直都是通过编写 WM_KEYDOWN 代码来实现 WS_TABSTOP 和 BS_DEFPUSHBUTTON,今天无意发现一篇文章上有这样的写法:

while (GetMessage(&msg, NULL, , )) 
{
        if (!IsDialogMessage(hWnd, &msg))
        {
TranslateMessage(&msg);             DispatchMessage(&msg);            
        }
}

关于 IsDialogMessage() 介绍:https://docs.microsoft.com/zh-cn/windows/desktop/api/winuser/nf-winuser-isdialogmessagea

通过下面几段代码,就可实现在窗口上按 Tab 键自动切换焦点, 同时也能实现 【默认按钮】效果:

CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "",
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_NUMBER | WS_TABSTOP,
, // xpos
, // ypos
, //width
, //height
hwnd_dialog_four_squares, (HMENU) NULL, hThisInst, NULL); CreateWindowEx(, "button", "确定",
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP, // | WS_DISABLED
, // xpos
, // ypos
, //width
, //height
hwnd_dialog_four_squares, (HMENU) IDOK, hThisInst, NULL); /** IDOK: 表示这个按钮是当前窗口中的默认按钮, 按下 【回车键】 触发 **/ CreateWindowEx(, "button", "取消",
WS_CHILD | WS_VISIBLE | WS_TABSTOP, // | WS_DISABLED
, // xpos
, // ypos
, //width
, //height
hwnd_dialog_four_squares, (HMENU) IDCANCEL, hThisInst, NULL); /** IDCANCEL: 表示这个按钮是当前窗口中的【取消按钮】, 按下 【ESC】 触发 **/
dialog_init(hwnd_parent_frame, lpData);

SendMessage(hwnd_b_cancel, BM_SETSTYLE, BS_PUSHBUTTON, TRUE); //如果上一次用户点了【取消】按钮,再次显示窗口的时候,这个【取消】按钮会有边框, 重置一下状态
SendMessage(hwnd_b_ok, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); //设置【默认按钮】样式
while (GetMessage(&msg, NULL, , ))
{
/* 提示: IsDialogMessage() + WS_TABSTOP 就可以让窗口上每一个带 WS_TABSTOP 样式的控件自动获取焦点 ------------------------------------------------------------------------------------------------------------------------ IsDialogMessage() 资料: https://docs.microsoft.com/zh-cn/windows/desktop/api/winuser/nf-winuser-isdialogmessagea 尽管 IsDialogMessage 函数适用于无模式对话框,但您可以将其用于包含控件的任何窗口,从而使窗口能够提供与对话框中使用的相同的键盘选择。 当 IsDialogMessage 处理消息时,它会检查键盘消息并将其转换为相应对话框的选择。例如,按下TAB键时,选择下一个控件或一组控件,按下DOWN ARROW键,选择组中的下一个控件。 由于 IsDialogMessage 函数执行所有必要的消息转换和分派,因此不能将 IsDialogMessage 处理的消息传递给 TranslateMessage 或 DispatchMessage 函数。 */
if(IsDialogMessage(hWnd, &msg))
{
// 由对话管理器自动处理 /** Tab 键自动切换焦点, BS_DEFPUSHBUTTON (默认按钮) 等工作在这里自动完成。 **/
}
else
{
TranslateMessage(&msg); DispatchMessage(&msg);
}
}

如果窗口中有多个嵌套子窗口,在 Tab 键切换焦点的时候,需要给子窗口的父窗口设置为:WS_EX_CONTROLPARENT,相关资料:https://stackoverrun.com/cn/q/338463

CreateWindowEx(WS_EX_CONTROLPARENT, "static", "",
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
, // xpos
, // ypos
, //width
, //height
hwnd_dialog_four_squares, (HMENU) NULL, hThisInst, NULL);

名品推荐:阿季 狼马 牧之逸

WS_TABSTOP 与 BS_DEFPUSHBUTTON 第一次使有的更多相关文章

  1. 46、android studio第一次使用时卡在gradle下载怎么解决?

    如果没法FQ或者FQ后网速慢,哥教你一个快速解决方案. 在根目录下的.gradle目录下,找到wrapper/dists目录,如果当前正在下载gradle.x.xx-all.zip,那么会发现grad ...

  2. antd-mobile使用报错

    在第一次使用时,按照官网的进行配置,完了报错找不到antd-mobile下面的css 解决方法来源于 :https://github.com/ant-design/ant-design-mobile/ ...

  3. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  4. ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  5. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

  6. Android 5.X新特性之RecyclerView基本解析及无限复用

    说到RecyclerView,相信大家都不陌生,它是我们经典级ListView的升级版,升级后的RecyclerView展现了极大的灵活性.同时内部直接封装了ViewHolder,不用我们自己定义Vi ...

  7. hashMap 深入理解

    1.java 的hashMap 是通过 链地址 法来解决 hash冲突的 2.初始时是一个empty table, 第一次添加数据时检查到时空数组就会 生成指定容量的数组,也就是 在第一次使用时才初始 ...

  8. maven学习(中)- 私服nexus搭建

    接上回继续,相信大家对maven每次都联网从国外站点下载依赖项的龟速网络已经不坎忍受了,今天先来看看如何搭建"仓库私服",目前nexus是使用比较广泛的私服软件之一,下面将介绍基本 ...

  9. java面试题总汇

    coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...

随机推荐

  1. Python+ITchart实现微信机器人对指定的朋友和群自动回复

    这里我主要用了3个机器人,可以切换. 1.图灵机器人  (傻的不行,一直在问别人问题,没有限制) http://www.tuling123.com 2.showApi上的图灵机器人 (感觉最聪明,可以 ...

  2. Redis数据库云端最佳技术实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 邹鹏,腾讯高级工程师,腾讯云数据库Redis负责人,多年数据库.网络安全研发经验. ...

  3. Operating system error 32(failed to retrieve text for this error. Reason: 15105)

    一台数据库服务器的事务日志备份作业偶尔会出现几次备份失败的情况,具体的错误信息为: DATE/TIME:    2018/7/30 12:10:52 DESCRIPTION: BackupDiskFi ...

  4. Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】

    在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着.目前,Marek Szyprow ...

  5. windows下安装MongoDB扩展和配置

    windows下安装MongoDB扩展和配置 1.下载mongoDB扩展,根据当前php版本进行下载 地址如下:http://pecl.php.net/package/mongo 我本地php版本是 ...

  6. 3星|《给产品经理讲技术》:APP开发技术介绍,没有技术背景的话恐怕只能看懂书中的比喻和结论

    基本是APP开发涉及到的相关技术的入门级介绍.涉及到的知识点与技术细节比较多,不少技术相关的内容并没有像标题暗示的那样没有技术背景也可以看懂,而是涉及到许多专业的术语.原理.也有一些内容是用比喻的方法 ...

  7. docker容器日志收集方案(方案四,目前使用的方案)

    先看数据流图,然后一一给大家解释 ​ 这个方案是将日志直接从应用代码中将日志输出到redis中(注意,是应用直接连接redis进行日志输出),redis充当一个缓存中间件有一定的缓存能力,不过有限,因 ...

  8. 日志学习系列(四)——NLog实例

    具体不想介绍了,新建一个解决方案 ,直接用NuGet安装就行了 具体项目代码可以在https://github.com/qiuxianhu/SimpleNLog下载

  9. Python爬虫【实战篇】百度贴吧爬取页面存到本地

    先上代码 import requests class TiebaSpider: def __init__(self, tieba_name): self.tieba_name = tieba_name ...

  10. CentOS 7 minimal配置网络连接及net-tools安装

    在Virtual Box中安装好CentOS 7的minimal后,第一件事就是设置网络访问. 首先需要用 nmtui 命令进入 Network Manager,如下: 选择 Edit a conne ...