zoukankan      html  css  js  c++  java
  • 跟我一起玩Win32开发(14):用对话框作为主窗口

    前面我们在编写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. }  

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

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

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

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

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

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

    最后,在响应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;  


    最后运行结果如下:

    完整的代码清单:

    [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. }  
  • 相关阅读:
    DES 加密算法
    socket编程之bind()函数
    如何启动ubuntu下的telnet服务
    基于duilib修改的版本上传了
    mmsPlayer, for android ,wince,windows,wm等
    [转]log4c 配置文件的用法
    mmsPlayer, for android ,wince,windows,wm等
    wince 版本的播放器 是基于 TC89系列
    cocos2dx做的一个圣诞节软件
    基于duilib修改的版本上传了
  • 原文地址:https://www.cnblogs.com/weekbo/p/8681918.html
Copyright © 2011-2022 走看看