当前位置: 首页 > 编程日记 > 正文

windows程序设计之对话框简介1

这里先介绍下wParam和lParam,对于鼠标而言,LOWORD(wParam)和HIWORD(wParam)代表鼠标位置x,y坐标,对于菜单和控件而言,两者wParam的低字节都是各自的ID,即LOWORD(wParam)都是ID。两者的高字节对菜单而言是0,对控件而言是消息码(消息码也可能是0)所以不能单凭wParam参数来判断消息是来自于菜单还是来自于控件,但是可以通过lParam来判断,对于菜单而言lParam恒为0,而对于控件而言却是子窗口句柄。因此就可以这样判断:

case WM_COMMAND: { if(lParam == 0) { //code 处理菜单ID, } else { //code 处理控件ID } }



现在开始介绍对话框(*^__^*)

模式对话框和无模式对话框:无模式对话框允许我们把输入焦点切换到同一个应用程序的另一个窗口,该对话框也无需关闭,这个比较普遍。可以用API函数CreateDialogParam创建。

模式对话框主要是两类:应用程序模式对话框和系统对话框。应用程序对话框不允许我们在本应用程序中切换输入焦点,但是可以切换到其他应用程序中去,比如点击记事本的文件打开按钮,会弹出选择打开文件的对话框,这个对话框不能切换到记事本中,但是可以切换到其他应用程序中去。这个就是属于应用程序模式对话框。系统对话框则比较恶毒,不允许你切换到任何一个应用程序中,我们一看名字就知道,系统对话框,看似比较紧急,要求我们必须首要解决····模式对话框可以用API函数DialogBoxParam产生。

首先了解下窗口过程处理函数

对话框过程处理函数格式为: BOOL CALLBACK DialogProc(              
        HWND hwndDlg,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
);返回值是TURE和FALSE,是BOOL类型。在windows头文件里是int类型。
窗口过程处理函数格式为:LRESULT CALLBACK ProcWinMain(   HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);返回值是LRESULT。
如果窗口过程函数不处理某个消息,那么就会调用DefWindowProc;但是如果对话框过程处理一个消息就返回TRUE,如果不处理就返回FALSE(0)。这里还要注意的是对话框过程不处理WM_PAINT或者WM_DESTORY消息,对话框也不接受WM_CREATE消息。代替MW_CREATE消息的是WM_INITDIALOG,对话框过程执行初始化。此外,对话框过程只处理WM_COMMAND消息,对于鼠标点击等wParam的低位字节就是控件的ID。关于结束对话框,对话框过程处理函数只接受WM_EndDialog消息,它来告诉windows清除对话框。对于其他消息都返回FALSE。



下面介绍一种对话框产生的方法:(把对话框当作窗口来处理)

RegisterClassEx函数把对话框模板注册为一个窗口类,然后创建一个由该窗口类派生的窗口。修改的地方是stdWndClass.cbWndExtra,原本都是NULL,现在改成DLGWINDOWEXTRA。如下

 stdWndClass.cbWndExtra = DLGWINDOWEXTRA;
 stdWndClass.lpszClassName = ClassName;
 stdWndClass.cbClsExtra = NULL;

这里要注意stdWndClass.lpszClassName对应的是窗口类的名字。这样才能把对话框当作是窗口进行处理。
改好之后照常调用函数RegisterClassEx注册窗口类
接着就是hDlg=CreateDialogParam(hInstance,DlgName,NULL,NULL,NULL);
非模态对话框对消息的处理都是要进过程序的消息队列的,也就是处理的时候都是要进过程序窗口过程的处理。

最后就是在消息循环里面的改进:(IsDialogMessage判断消息是否为对话框消息,用CreateDialogParam创建非模式对话框则需要)

 while(GetMessage(&stMsg,NULL,0,0))
 {
         if(

!IsDialogMessage(hDlg,&stMsg)

)

        {
                 TranslateMessage(&stMsg);
                  DispatchMessage(&stMsg);
         }
 }


下面介绍我当时的一个失误:

我最初用VC6.0以窗口的形式创建一个对话框,结果出现了一个问题,就是对话框是生成了,但就是关不了。我连点击右上角的关闭按钮也不行,我看了下资源文件,结果发现比正常的资源文件对话框那块少了句CLASS"DLGCLASS1"(“”里面的是窗口类的名字,我这里是我自己窗口类的名字)要是没有这一句就不能把对话框当作窗口来用,我们就不能进行任何操作。后来我发现是我引进资源的时候出了问题,我在资源文件对应的地方加了这句就可以了。

下面是资源文件的对话框部分:.rsrc.rc部分

MYDIALOG DIALOG DISCARDABLE 0, 0, 187, 96 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Our First Dialog Box" FONT 10, "System" CLASS "DLGCLASS1" //这一句非常重要 BEGIN PUSHBUTTON "exit",IDC_EXIT,17,16,48,23 EDITTEXT IDC_EDIT,81,20,84,43,ES_AUTOHSCROLL END

下面是源文件:

#include "Windows.h" #include "tchar.h" #include "resource.h" TCHAR ClassName[] = _T("DLGCLASS1"); TCHAR DlgName[] = _T("MyDialog"); TCHAR AppName[] = _T(" Dialog Box"); HINSTANCE g_hInstance; LRESULT CALLBACK ProcWinMain( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { switch(Msg) { break; case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_EXIT: SendMessage(hWnd,WM_DESTROY,0,0); break; } } break; case WM_DESTROY: { PostQuitMessage(NULL); } break; default: return DefWindowProc(hWnd, Msg, wParam, lParam ); } return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { HICON hIcon; HCURSOR hCursor; MSG stMsg; WNDCLASSEX stdWndClass; HWND hDlg; g_hInstance = hInstance; RtlZeroMemory(&stdWndClass, sizeof(stdWndClass)); stdWndClass.hCursor = LoadCursor(0,IDC_ARROW); stdWndClass.cbSize = sizeof(stdWndClass); stdWndClass.style = CS_HREDRAW|CS_VREDRAW; stdWndClass.lpfnWndProc = ProcWinMain; stdWndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); stdWndClass.lpszClassName = ClassName; stdWndClass.hInstance = hInstance; stdWndClass.cbClsExtra = NULL; stdWndClass.cbWndExtra = DLGWINDOWEXTRA; hIcon = LoadIcon(NULL,IDI_APPLICATION); stdWndClass.hIcon = hIcon; stdWndClass.hIconSm = hIcon; hCursor = LoadCursor(NULL,IDC_ARROW); stdWndClass.hCursor = hCursor; RegisterClassEx(&stdWndClass); hDlg = CreateDialogParam(hInstance,DlgName,NULL,NULL,NULL); if(!hDlg) return 0; ShowWindow(hDlg,SW_SHOWNORMAL); UpdateWindow(hDlg); while(GetMessage(&stMsg,NULL,0,0)) { if(!IsDialogMessage(hDlg,&stMsg)) { TranslateMessage(&stMsg); DispatchMessage(&stMsg); } } return stMsg.wParam; }

上面的做的很简单,我就是列举了一些注意点。才看了几天,也许有比较多的错误,希望指点。(*^__^*)

转载于:https://www.cnblogs.com/cryinstall/archive/2011/07/10/2280833.html

相关文章:

linux虚拟机下安装Tomcat

(1)首先通过挂载的方式把 tomcat的安装包从U盘上传到虚拟机中 我上传的路径是 :usr/tomcat (2) cd /usr/tomcat tar xzvf 压缩包的名字 ##进行解压(3)进到tomcat安装目录下的bin文件夹 ./…

unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题

最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏药 比如一个shader叫 Shader "xx/UnlitAlp…

动软代码生成器教程——懒人有福了

很多时候项目必须是三层架构模式,但是很多繁琐的代码让多数程序员闹心……那有没有一个省时省力的工具快速的帮我们搞定三层架构呢?回答是肯定的,很早之前技术牛人李天平就开发出了这么一款工具,目前该工具还在不断的更新&#xf…

unity3d做简单小游戏可以吗?

可以吗?当然。如果是独立开发,主要在美工,这类的游戏程序简单,有些基础就行,美工要做得好可不容易,要是效果要求不高,随便在max拉几个模型吧。unity方面,熟悉一下,如果有…

逻辑覆盖测试(一)语句覆盖

语句覆盖: 设计测试用例时保证程序的每条语句至少执行一次。 简单来说,就是每个语句都覆盖一遍。 例子: 流程图如下: 测试用例如下: x4,z9,第一个if语句执行到了; x4,y7,第二个if语句为true…

「小程序JAVA实战」小程序的视频展示页面初始化(63)

转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeshipinzhanshiyemianchushihua62/ 进入列表详情,展示点赞状态用户的名称,头像名称。源码:https://github.com/limingios/wxProgram.git 中No.15和springbo…

.NET判断字符串是否是数值型或xxx型

using System.Text.RegularExpressions; Regex digitregex new Regex("^[0-9]\d*[.]?\d*$"); if (!digitregex.IsMatch(TextBox1.Text)) { TextBox1.Text""; MessageBox.Show("只能输入数字!","提示…

Spring.net使用说明

使用方法&#xff1a;1.在配置文件设置Spring.net 节点在配置节中&#xff0c;声明Spring.net&#xff0c;配置 context&#xff0c;objects 标签&#xff0c;来源&#xff08;type&#xff09;<!--配置节&#xff1a;主要用来 配置 asp.net框架之外的 标签&#xff0c;告诉…

逻辑覆盖测试(三)条件覆盖

条件覆盖&#xff1a;设计测试用例时应保证程序中每个复合判定表达式中&#xff0c;每个简单判定条件的取真和取假情况至少执行一次。 例子&#xff1a; 流程图&#xff1a; 测试用例&#xff1a; 程序中一共两个if语句&#xff0c;都是复合判定条件&#xff0c;其中的简单…

Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology

catalog 0. 引言 1. Pam后门 2. SSH后门 3. Hijacking SSH 4. Hijacking SSH By Setup A Tunnel Which Allows Multiple Sessions Over The Same SSH Connection Without Re-Authentication 5. Hijacking Active SSH Screen Sessions 0. 引言 0x1: 安全攻防观点 1. Know Your …

澳大利亚多地热浪来袭 最高温度超40摄氏度

中新网1月24日电 据澳洲网报道&#xff0c;近日&#xff0c;澳大利亚多地热浪来袭&#xff0c;其中&#xff0c;南澳和维州的部分地区气温将飙升至40摄氏度以上。维州政府发布声明&#xff0c;提醒民众做好应对高温天气的准备。资料图&#xff1a;当地时间1月21日&#xff0c;澳…

Multithread 之 introduction

Why multithreading?&#xff08;摘自《win32 多线程程序设计》&#xff09;单线程程序就像超级市场中唯一的一位出纳&#xff0c;这个出纳对于小量采购可以快速结账。但如果有人采购了一大车货品&#xff0c;结账就需要点时间了&#xff0c;其他每个人都必须等待。多线程程序…

逻辑覆盖测试(四)判定/条件覆盖

判定/条件覆盖&#xff1a;测试用例的设计应满足判定节点的取真和取假分支至少执行一次&#xff0c;且每个简单判定条件的取真和取假情况也至少执行一次。 简单来说&#xff0c;就是判定覆盖和条件覆盖取交集。 例子&#xff1a; 流程图&#xff1a; 当判定覆盖和条件覆盖…

jQuery选择器的工作原理和优化

至于有那些选择器&#xff0c;在帮助手册中都有&#xff0c;自己去看&#xff0c;这篇主要是分析他的工作原理&#xff0c;而优化我们写 的选择器&#xff0c;尤其在页面内容很多的情况下&#xff0c;更应该需要优化。下边就言归正传。 每次申明一个jQuery对象的时候&#xff0…

webservice发送字符串

假设只是发送一个字符串client&#xff0c;这是很easy&#xff0c;只需要输入xfire包&#xff0c;编写接口&#xff0c;编写的实现方法。变化。 假设你要传输的数组或自定义类。到用于接口准备的需要agexis文件。更复杂。 尝试传输这些假设没有成功。在发送成功的字符串&#x…

600余名外出务工者免费乘高铁“返乡专列”回云南过春节

中新网昆明1月25日电(缪超)记者25日从中国铁路昆明局集团获悉&#xff0c;云南与广东两省人社部门近日组织开行高铁“返乡专列”&#xff0c;免费安排600多名云南籍外出务工人员乘坐高铁动车返乡过春节。图为志愿者与乘务员为外出务工人员精心准备的歌舞节目。中国铁路昆明局集…

逻辑覆盖测试(六)--路径测试

路径覆盖&#xff1a;设计足够多的测试用例&#xff0c;使得程序中所有可能的路径都被至少被执行一次。 例子&#xff1a; 测试用例&#xff1a; 思路&#xff1a; 先是都经过a&#xff0c;到一个if分支&#xff0c;可以有a 、b和 a、c&#xff0c;然后到第二个if分支&#…

浅谈MVP设计模式

最近公司在做一个医疗项目&#xff0c;使用WinForm界面作为客户端交互界面。在整个客户端解决方案中。使用了MVP模式实现。由于之前没有接触过该设计模式&#xff0c;所以在项目完成到某个阶段时&#xff0c;将使用MVP的体会写在博客里面。 所谓的MVP指的是Model&#xff0c;Vi…

C#委托与事件

之前写过一篇关于C#委托与事件的文章&#xff08;见《C#委托和事件例析》&#xff09;&#xff0c;不过还是收到一些网友的提问。所以&#xff0c;今天再换另一个角度来详解一下这个问题。 一、在控制台下使用委托和事件 我们都知道&#xff0c;C#中有“接口”这个概念&#xf…

Docker for mac安装

Mac安装Docker docker下载地址: https://hub.docker.com/editions/community/docker-ce-desktop-mac docker for mac document: https://docs.docker.com/docker-for-mac/ 系统要求 Docker Desktop - Mac适用于OS X Sierra 10.12和更新的macOS版本。 获得Docker 稳定边缘Stable…

白盒测试--基本路径测试法

1.为什么要有基本路径测试法&#xff1f; 对于路径测试&#xff0c;最理想的情况是路径全部覆盖&#xff0c;单对于复杂的大程序要做到路径覆盖是不可能的&#xff0c;因此可以采用基本路径测试。 2.基本路径测试法的步骤&#xff1f; &#xff08;1&#xff09;画出程序的控制…

Postmortem报告

1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? 2. 团队在beta 阶段吸取了那些alpha 阶段的经验教训? 在alpha阶段中&#xff0c;虽然我们团队已经对软件主要功能核心代码完成了&#xff0c;但是由于我们团队现有掌握有关于安卓开发的技术并不成熟&#xff0c;无法对软件…

是否可以人为修改发表时间

是否可以人为修改发表时间转载于:https://blog.51cto.com/14188306/2346747

关于win7_iis报500.19和500.21错误的解决方法

关于win7_iis报500.19和500.21错误的解决方法HTTP 错误 500.19 Internal Server Error的解决方法WIN7下.Net开发遇到的又一问题&#xff1a;HTTP 错误 500.19 - Internal Server Error&#xff0c;无法访问请求的页面&#xff0c;因为该页的相关配置数据无效。详细错误信息模块…

黑盒测试--因果图法

例子&#xff1a; (1)根据题目可以得到原因和结果分别是&#xff1a; &#xff08;2&#xff09;画出因果图 根据题意来画因果图&#xff0c;输入第一个字符是A或B要写成一个状态&#xff0c;且第二个字符为数字。 画因果图主要就是理清不同状态之间的关系&#xff0c;还有有…

php 学习笔记 数组1

1、一般情况下$name[tom]和$name[tom]是相同的&#xff1b;但没有引号的键不能和常量区别开&#xff0c;如&#xff1a;define(index, 5)时&#xff1b;$name[tom]和$name[tom]不同 2、双引号里的变量一般要用{}括起来是好习惯&#xff0c;如&#xff1a; echo "{$name}&q…

Linux的文件系统

一、文件的属性 linux文件属性的格式为- --- --- ---。第一位为文件的类型&#xff0c;剩下的9位&#xff0c;每三位为一组&#xff0c;分别对应文件所有者&#xff0c;文件所以者所属的用户组&#xff0c;其他人的关系。 r为可读&#xff0c;w为可写&#xff0c;x为可执行。如…

Python-100 练习题 01 列表推导式

最近打算好好练习下 python&#xff0c;因此找到一个练习题网站&#xff0c;打算每周练习 3-5 题吧。 www.runoob.com/python/pyth… 另外&#xff0c;这个网站其实也还有 Python 的教程&#xff0c;从基础到高级的知识都有。 Example-1 三位数组合 题目&#xff1a;有四个数字…

在思科模拟器下搭建WWW、DNS、FTP、Email服务

目录一、搭建基本的拓扑结构二、配置基本IP三、配置静态路由Router0&#xff1a;Router1:四、搭建WWW服务0号服务器&#xff1a;1号服务器&#xff1a;五、在pc0上测试www服务六、搭建FTP服务对于3号服务器&#xff1a;七、在pc0上测试搭建的FTP服务八、搭建E-mail服务对于2号服…

Android SQLite数据库之事务的学习

SQLite是Android系统内置的一款轻量级的关系型数据库&#xff0c;它的运算速度非常快&#xff0c;占用资源很少&#xff0c;通常只需要几百K的内存就足够了。SQLite不仅支持标准的SQL语法&#xff0c;还遵循了数据库的ACID事务。 模拟一个应用场景&#xff1a;进行一次转账操作…