相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理。今天,我向大家分享两个使用对话框的技巧,还是比较实用的。不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写的博客,你不会有思想压力的。放心好了。

这两个技巧分别是:

1、在显示某个对话框时,向对话框传递数据。

这个我相信大家能够理解,就好比咱们在做Web开发的时候,在打开一个页面时,可能会考虑向目标页面传一些参数,如这样http://www.牛B.com/yyy.aspx?tid=19999,是吧,我们都很经常这样做,所以,在玩Win32的时候,我们也同样希望这样。

我们知道,要显示一个模态对话框,可以调用DialogBox函数,这个不难,我有理由相信大家只需稍稍研究一下,一定会玩的,就像遥控飞机那么简单。如果你认真阅读MSDN,你一定会发现有这么一个函数:DialogBoxParam。怎么样,是不是和前面的那个DialogBox很像,只是脑袋后面多了几根汗毛罢了,而且,从Param就可以猜到,应该与参数传递有关。对,猜得相当好,我们在显示某个对话框时,要向对话框传参数,就是用它了。

顺便提一下,什么是模态对话框呢?模态对话框就是说如果这个对话框弹出来(显示)了,你就不能操作父窗口或者其上面的控年了,程序也会在弹出对话框后停下,直到操作完成了,你把对话框关了,程序才会继续,你才能操作其他控件,就好像你开车上班,行驶到某个路口,前面有几辆车突然停了下来,车上下来一群不男不女的人,在马路上打起架来了,导致交通严重受阻,你的车夹在车流中间,既不前进,也不能后退,就卡在那里,你估计只好呆在车里,拿出MP5,看看恐怖片,等到交通恢复正常了,才能继续行车。

看看这个DialogBoxParam函数的定义:

  1. INT_PTR WINAPI DialogBoxParam(
  2. _In_opt_  HINSTANCE hInstance,
  3. _In_      LPCTSTR lpTemplateName,
  4. _In_opt_  HWND hWndParent,
  5. _In_opt_  DLGPROC lpDialogFunc,
  6. _In_      LPARAM dwInitParam
  7. );

前面几个参数估计不用我介绍了,大家都认识,比周杰伦和刀郎还要出名。重点是最后一个参数,它是一个LPARAM类型的,我记得Win32的许多类型的命名是有规律的,你看看,凡是P开头或者LP开头都是指针类型,不信你可以总结一下。

所以这个参数肯定是指定某种未知生物的指针,指针存的是地址,所以我们通过把我们要传给对话框的数据的地址传给这个参数,这样,对话框的消息处理函数如果想取到你传给它的数据,就从这个地址去找。就好像你同学介绍了一位美女给你认识,他告诉你这位MM的QQ号,然后你想泡她你就知道怎么做了,加QQ聊呗。

那么,这个参数会传到哪里去呢,怎么取出来呢?这个参数传给了WM_INITDIALOG消息的lParam参数,所以,在对话框的消息处理函数中,捕捉WM_INITDIALOG消息,从它的lParam参数就可以找到数据的首地址了。

显示对话框并传递参数。

  1. DialogBoxParam(glo_hInst,
  2. MAKEINTRESOURCE(IDD_DLG1),
  3. hwnd,
  4. (DLGPROC)DialogProcWithPrm,
  5. (LPARAM)L"Win32程序好玩不?");

我传递了一些文本给它,即“Win32程序好玩不?”,接着在响应WM_INITDIALOG消息时就接收并显示这个参数。

  1. switch (uMsg)
  2. {
  3. case WM_INITDIALOG:
  4. {
  5. LPCWSTR param = (LPCWSTR)lParam;
  6. //取得显示文本控件的句柄
  7. HWND stDisplay = GetDlgItem(hwndDlg, IDC_STINFO);
  8. //设置文本
  9. SendMessage(stDisplay, WM_SETTEXT, NULL, (WPARAM)param);
  10. }
  11. return 0;

哈哈,不难吧。

2、获取对话框返回的数据。

前面是传数据给对话框,现在要反过来,是获得从对话框传回来的数据。刚才我们说了,模态对话框显示时,父窗口会在等待,等啥,就是等DialogBox返回,它返回的类型是INT_PTR,所以,如果要返回比较复杂的数据,可以用它来保存指针,因为指针本质上就是一个数值。

  1. // 显示对话框并取得返回的数据
  2. LPCWSTR returnData = (LPCWSTR)DialogBox(glo_hInst,MAKEINTRESOURCE(IDD_DLG2),hwnd,(DLGPROC)DialogProcWithRtVl);
  3. if(returnData != NULL)
  4. {
  5. //先将字符拷贝一次
  6. WCHAR str[100];
  7. wcscpy(str, returnData);
  8. //显示从对话框返回的内容
  9. MessageBox(hwnd, str, L"从对话框返回的数据", MB_OK);
  10. }
  11. break;

我这个例子是在对话框中输入一些字符,然后把这些字符串返回。所以,返回的内容是指向字符数组首地址的指针,故我直接把它转换为LPCWSTR类型的变量。

在对话框中,调用EndDialog结束对话框,并在第二个参数中传回数据。

  1. if(LOWORD(wParam)== IDOK)
  2. {
  3. //获得Edit编辑框的句柄
  4. HWND hEdit = GetDlgItem(hwndDlg, IDC_EDTIN);
  5. //获得文本
  6. WCHAR wText[100];
  7. int len = Edit_GetText(hEdit, wText, 100);
  8. EndDialog(hwndDlg, (INT_PTR)wText);//退出对话框并返回数据
  9. }

例子运行之后的结果可以看看下面的截图。

示例源代码随后我上传到资源区,有兴趣的朋友可以下载来玩一下。

跟我一起玩Win32开发(18):使用对话框的两个技巧的更多相关文章

  1. 跟我一起玩Win32开发(转自CSDN-东邪独孤)

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  2. 跟我一起玩Win32开发(17):启动和结束进程

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...

  3. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  4. 跟我一起玩Win32开发(19):浏览和打开文件

    在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...

  5. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  6. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...

  7. 跟我一起玩Win32开发(2):完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

  8. 跟我一起玩Win32开发(25):监视剪贴板

    自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...

  9. 跟我一起玩Win32开发(23):渐变颜色填充

    GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充.我们先来看看GradientFill函数到底长得什么样子,帅不帅. BOOL GradientFill( _In_   ...

随机推荐

  1. (转)C中的volatile用法

    volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进 ...

  2. linux 标准i2c接口(一)

    一:I2C设备操作方式: 1.  应用程序操作法:i2c的设备的驱动可以直接利用linux内核提供的i2c-dev.c文件提供的ioctl函数接口在应用层实现对i2c设备的读写,但是在应用层使用ioc ...

  3. zabbix基于SNMP 协议监控路由器

    zabbix基于SNMP 协议监控路由器 步骤 步骤超级方便. 1. 路由器上开启snmp 2. 确保外网能訪问到 3. 用snmpwalk測试 4. 加入zabbix主机,SNMP interfac ...

  4. 项目Alpha冲刺(团队10/10)

    项目Alpha冲刺(团队10/10) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标: 完成项目Alpha版本 团队队员 队员学号 队员姓名 个人博客地址 备注 22160041 ...

  5. Robot Framework自己主动化測试框架之我见

    一些自己主动化測试现状: 盲目的去做自己主动化,终于以失败告终. 觉得是能提高效率的事情.却推广不下去: 事实上上述问题产生的原因是: 自己主动化測试案例稳定性不高,可维护性比較差: 自己主动化測试工 ...

  6. android adapter公共写法

    在开发过程中,会写很多的adapter类,其中很多公共的部分,不需要每次都去书写,可以为开发者省下很多时间 提取一个ListViewAdapter public abstract class List ...

  7. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  8. redis03----link 链表操作

    link 链表结构 之前是操作字符串string 链表:头元素,后面一个一个的指向后面的元素.Redis内部实现了链表的结构.链表的头尾,从一个元素找到另外的元素. 链表的名字也是一个key. flu ...

  9. linux下lk和kernel层通信方式[2]

    U-Boot与Linux内核的交互 说明:本文所使用的U-Boot的版本是1.1.6,平台是S3C2440. 目录 一.简介 1.1标记列表二.设置标记存放的地址 2.1相关的结构体定义 2.2标记存 ...

  10. vfork函数的使用【学习笔记】

    #include "apue.h" ; int main(void) { int var; pid_t pid; ; printf("before vfork\r\n&q ...