跟我一起玩Win32开发(14):用对话框作为主窗口

摘要:
我们以前编写Win32应用程序的想法是:1。设计窗口类。因此,我们有一个想法:使用对话框作为主窗口,这样我们就可以轻松地布局控件。事实上,这个想法已经被一些人在互联网上实现了。但是,这是通过使用Win32程序集完成的。当然,将其更改为C++更容易。首先,我们介绍第一种方法,它直接使用桌面作为父窗口来创建对话框。最后,响应WM_When CREATE消息,创建并显示一个对话框。父窗口是我们的主窗口。

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

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

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

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

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

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

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

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

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

[cpp] view plain copy
 
  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.   
  8. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);  
  9.   
  10. HINSTANCE hgInst;  
  11. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)  
  12. {  
  13.     hgInst = hThisApp;  
  14.     HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc);  
  15.     if(!hdlg)  
  16.     {  
  17.         return 0;  
  18.     }  
  19.     ShowWindow(hdlg,SW_SHOW);  
  20.     MSG msg;  
  21.     while(GetMessage(&msg,NULL,0,0))  
  22.     {  
  23.         TranslateMessage(&msg);  
  24.         DispatchMessage(&msg);  
  25.     }  
  26.     return 0;  
  27. }  
  28.   
  29. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)  
  30. {  
  31.     switch(msg)  
  32.     {  
  33.     case WM_INITDIALOG:  
  34.         // 设置对话框的图标  
  35.         SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, MAKEINTRESOURCE(IDI_APP)));  
  36.         return 0;  
  37.     case WM_SYSCOMMAND:  
  38.         if(wParam == SC_CLOSE)  
  39.         {  
  40.             PostQuitMessage(0);//退出  
  41.         }  
  42.         return 0;  
  43.     }  
  44.     return (INT_PTR)FALSE;  
  45. }  

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

跟我一起玩Win32开发(14):用对话框作为主窗口第1张

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

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

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

跟我一起玩Win32开发(14):用对话框作为主窗口第2张

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

跟我一起玩Win32开发(14):用对话框作为主窗口第3张

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

跟我一起玩Win32开发(14):用对话框作为主窗口第4张

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

[cpp] view plain copy
 
  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;  


最后运行结果如下:

跟我一起玩Win32开发(14):用对话框作为主窗口第5张

完整的代码清单:

[cpp] view plain copy
 
  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.   
  7. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);  
  8. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);  
  9.   
  10. HINSTANCE hgAppInst;  
  11. int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)  
  12. {  
  13.     // 设计窗口类  
  14.     WNDCLASS wc = { };  
  15.     wc.hbrBackground = (HBRUSH)COLOR_WINDOW;  
  16.     wc.lpfnWndProc = (WNDPROC)WindowProc;  
  17.     wc.lpszClassName = L"supper_man";  
  18.     wc.hInstance = hThisApp;  
  19.     wc.style = CS_HREDRAW | CS_VREDRAW;  
  20.     RegisterClass(&wc);  
  21.     hgAppInst = hThisApp;  
  22.     // 创建窗口  
  23.     HWND hwnd = CreateWindow(L"supper_man", L"超级应用",   
  24.         WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL);  
  25.     if(!hwnd)  
  26.         return 0;  
  27.     ShowWindow(hwnd, nShow);  
  28.     UpdateWindow(hwnd);  
  29.     // 消息循环  
  30.     MSG msg;  
  31.     while(GetMessage(&msg,NULL,0,0))  
  32.     {  
  33.         TranslateMessage(&msg);  
  34.         DispatchMessage(&msg);  
  35.     }  
  36.     return 0;  
  37. }  
  38.   
  39. LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)  
  40. {  
  41.     switch (msg)  
  42.     {  
  43.     case WM_CREATE:  
  44.         {  
  45.             // 创建对话框  
  46.             HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);  
  47.             // 显示对话框  
  48.             ShowWindow(hdlg, SW_SHOWNA);  
  49.         }  
  50.         return 0;  
  51.     case WM_DESTROY:  
  52.         PostQuitMessage(0);  
  53.         return 0;  
  54.     default:  
  55.         return DefWindowProc(hwnd,msg,wParam,lParam);  
  56.     }  
  57.     return 0;  
  58. }  
  59.   
  60. // 处理对话框消息  
  61. INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)  
  62. {  
  63.     /* .............. */  
  64.     return (INT_PTR)FALSE;  
  65. }  

免责声明:文章转载自《跟我一起玩Win32开发(14):用对话框作为主窗口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇websockify文档windows-根据进程PID 获取进程路径下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Window Classes in Win32

探索Win32系统之窗口类(Window Classes in Win32) Kyle MarshMicrosoft Developer Network Technology GroupMSDN技术组 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化。 在本文中,"类","窗口类"这两个术语等同,...

如果你不懂.net逆向,又对它感兴趣

先声明,偶既不是专业程序员,从事的工作也和IT毫无关系,只是有兴趣时就看一点逆向的东东,纯粹是当游戏。所以各位大牛不用以专业的眼光来审视偶写的文章及偶做的工作。偶接触.net可能比某些新手早些,为了让对.net逆向有兴趣的朋友少走弯路,特写此文。1、从哪儿着手    要想逆,首先对写程序多少要有点了解。因此,偶觉得掌握一门高级的.net编程语言是必须的,一...

Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)

大龙的博客 C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理...

eclipse官网下载

Provided byIBM Cloud Eclipse IDE for Java Developers http://eclipse.bluemix.net/packages/photon/data/eclipse-java-photon-R-win32-x86_64.zip http://eclipse.bluemix.net/packages/p...

创建cocos2dx lua 工程

-- 引擎版本 coco2dx 3.1.1 引擎的创建过程实际上从 hellolua 复制了一份出来,然后更改包名,路径名。 需要注意的是,通过命令行build的时候每次都会复制一堆脚本出来,这其中包含错误文件。需要将源头改正确 -- 重新创建工程过程记录 1.创建工程 cocos new chuanqi -p com.game.chuanqi -l l...

《Win32多线程程序设计》学习笔记 第6章 Overlapped I/o 在你的身后变戏法

这章很重要,所以才把放到最后写,压轴,同时希望自己能认真的总结一下。这一章主要就是异步编程的内容,自己的理解 Overlapped I/O是win32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。事实上,操作系统内部正是以线程来完成overlapped I/O,你可以获得线程的所有利益不需要付出什么代价。 Win32文件操作函数 wi...