前面我们在编写Win32应用程序的思路都是:

1、设计窗口类。2、注册窗口类。3、创建窗口。……

然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。

于是,就有了一个想法:把对话框用作主窗口,那我们在布局控件时就轻松了。

其实这想法在网上已有牛人做了,不过,人家是用Win32汇编干的,当然,要把它变为C++就更简单了。

首先,介绍第一个法子,直接以桌面作为父窗口来创建对话框。

1、创建一个对话框资源,界面就发挥你的设计天赋了。

2、创建一个图标资源,既作为应用程序的图标(VS编译时会选择第一个添加到资源中的图标作为EXE的图标),也作为对话框的图标。

3、在代码中创建并显示对话框。

  1. #include <Windows.h>
  2. #include "resource.h"
  3. // 开启可视化效果
  4. #pragma comment(linker,"\"/manifestdependency:type='win32' \
  5. name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  6. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
  7. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
  8. HINSTANCE hgInst;
  9. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)
  10. {
  11. hgInst = hThisApp;
  12. HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc);
  13. if(!hdlg)
  14. {
  15. return 0;
  16. }
  17. ShowWindow(hdlg,SW_SHOW);
  18. MSG msg;
  19. while(GetMessage(&msg,NULL,0,0))
  20. {
  21. TranslateMessage(&msg);
  22. DispatchMessage(&msg);
  23. }
  24. return 0;
  25. }
  26. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  27. {
  28. switch(msg)
  29. {
  30. case WM_INITDIALOG:
  31. // 设置对话框的图标
  32. SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, MAKEINTRESOURCE(IDI_APP)));
  33. return 0;
  34. case WM_SYSCOMMAND:
  35. if(wParam == SC_CLOSE)
  36. {
  37. PostQuitMessage(0);//退出
  38. }
  39. return 0;
  40. }
  41. return (INT_PTR)FALSE;
  42. }

这样,我们可以运行一下。

=================================================================

第二种方法,我们还是遵照设计窗口类、注册窗口类、创建窗口等步骤,只是把对话框作为窗口的子级,对话框采用Form View视图。

在插入资源的对话框中,点击Dialog左边的图标,展开列表,在列表中选择IDD_FORMVIEW,然后点“新建”。

然后你看到一个没有边框和标题栏的对话框。

接下来我们可以放些控件上去。

最后,在响应WM_CREATE消息时,创建并显示对话框,父级是我们的主窗口。

  1. case WM_CREATE:
  2. {
  3. // 创建对话框
  4. HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
  5. // 显示对话框
  6. ShowWindow(hdlg, SW_SHOWNA);
  7. }
  8. return 0;

最后运行结果如下:

完整的代码清单:

  1. #include <Windows.h>
  2. #include "resource.h"
  3. #pragma comment(linker,"\"/manifestdependency:type='win32' \
  4. name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  5. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
  6. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  7. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
  8. HINSTANCE hgAppInst;
  9. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)
  10. {
  11. // 设计窗口类
  12. WNDCLASS wc = { };
  13. wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  14. wc.lpfnWndProc = (WNDPROC)WindowProc;
  15. wc.lpszClassName = L"supper_man";
  16. wc.hInstance = hThisApp;
  17. wc.style = CS_HREDRAW | CS_VREDRAW;
  18. RegisterClass(&wc);
  19. hgAppInst = hThisApp;
  20. // 创建窗口
  21. HWND hwnd = CreateWindow(L"supper_man", L"超级应用",
  22. WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL);
  23. if(!hwnd)
  24. return 0;
  25. ShowWindow(hwnd, nShow);
  26. UpdateWindow(hwnd);
  27. // 消息循环
  28. MSG msg;
  29. while(GetMessage(&msg,NULL,0,0))
  30. {
  31. TranslateMessage(&msg);
  32. DispatchMessage(&msg);
  33. }
  34. return 0;
  35. }
  36. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  37. {
  38. switch (msg)
  39. {
  40. case WM_CREATE:
  41. {
  42. // 创建对话框
  43. HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
  44. // 显示对话框
  45. ShowWindow(hdlg, SW_SHOWNA);
  46. }
  47. return 0;
  48. case WM_DESTROY:
  49. PostQuitMessage(0);
  50. return 0;
  51. default:
  52. return DefWindowProc(hwnd,msg,wParam,lParam);
  53. }
  54. return 0;
  55. }
  56. // 处理对话框消息
  57. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
  58. {
  59. /* .............. */
  60. return (INT_PTR)FALSE;
  61. }

跟我一起玩Win32开发(14):用对话框作为主窗口的更多相关文章

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

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

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

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

  3. 跟我一起玩Win32开发(18):使用对话框的两个技巧

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Java 兔子问题(斐波那契数列)扩展篇

    Java兔子问题(斐波那契数列)扩展篇 斐波那契数列指的是这样一个数列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...对于这个数列仅仅能说将兔子生产周 ...

  2. Oracle RAC cache fusion原理測试

    Oracle RAC cache fusion是RAC最核心的工作机制.他把全部实例的SGA虚拟成一个大的SGA区,每当不同的实例请求同样的数据块,这个数据块就须要在实例间进行传递. 那究竟什么时候传 ...

  3. Neutron配置Floating IP

    下图是由一个虚拟机vm1,一个路由器ext-router,两个网络ext-net及demo-net组成的拓扑结构.要达到的目的很简单,即vm1不仅能使用私网IP和内部的其它虚拟机进行通信,还可以通过e ...

  4. arm-linux交叉编译环境搭建

    1.解压交叉编译工具链包 tar jxvf EABI-4.3.3_EmbedSky_20100610.tar.bz2 (笔者将交叉编译工具链包放在”/home ”目录下) 解压后会生成两个目录: [r ...

  5. JavaScript提高:001:ASP.NET使用easy UI

    jQuery EasyUI是一组基于jQuery的UI插件集合.能够简洁的开发出功能多内容丰富的界面,而不须要开发人员自己费力的写那些复杂的js代码.本文简介在ASP.NET开发中引用这些js文件和样 ...

  6. android keyEvent

    http://developer.android.com/reference/android/view/KeyEvent.html

  7. 梳理caffe代码common(八)

    因为想梳理data_layer的过程.整理一半发现有几个很重要的头文件就是题目列出的这几个: 追本溯源,先从根基開始学起.这里面都是些什么鬼呢? common类 命名空间的使用:google.cv.c ...

  8. python day - 8 文件

    文件的相关操作 1.文件的两种路径 绝对路径:需要从根目录下一层一层往下去找,文件或者程序所在的地方,中间所经过的所有的路径到你要找的文件或程序,就是绝对路径. 相对路径:只需要将要找的文件或者程序, ...

  9. Maven 用法

    scope标签 provided:如果存在编译需要而发布不需要的jar包,使用provided属性值

  10. java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistrationBean

    java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistrationBean 把 ...