前面我们在编写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. python-一个小练习

    myseq = '''[a:1,b:2,c:3] [a:3,b:3,c:8] [a:7,c:2:m:7,r:4] [a:2,c:4:m:6,r:4] [a:3,b:2,c:7,o:5]''' def ...

  2. SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)

    Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...

  3. OC小实例关于init 方法不小心的错误

    OC小实例关于init 方法不小心的错误  正视遇到的每一个错误 在一个遥控器类操控小车玩具的小实例项目中,我采用组合的方式,将遥控器拥有小汽车对象(has a)关系,而不是继承(is a)关系. 想 ...

  4. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  5. Node中的promise简说及入门

    Node的特色之一就是异步回调,可是回调过多,就会形成著名的回调金字塔. 直接上例子,我要读取1.txt里的内容,然后在这个内容上加上'test'并重新写入文件,如下代码所示: var fs = re ...

  6. 对于iOS 7 隐藏特性和解决之道

    当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app.这样的结果,使得人们根本无暇去探究 iOS7 所带来的新东西. ...

  7. scrollView 代理方法的实现顺序的些许区别

  8. fuse的mount机制 2 -系统调用mount

    经过上一篇的分析,目前已经知道mount函数最终进入到mount.c 中的 int fuse_kern_mount(const char *mountpoint, struct fuse_args * ...

  9. codeforces 669D D. Little Artem and Dance(乱搞题)

    题目链接: D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes in ...

  10. gunicorn启动django时静态文件的加载

    目前在用nginx+gunicorn对django进行部署 当我用gunicorn -w 4 -b 127.0.0.1:8080 myproject.wsig:application启动django时 ...