zoukankan      html  css  js  c++  java
  • 资源在Windows编程中的应用

    学习目的

    掌握菜单和对话框资源的创建和使用.

    编写程序: 设计一个窗口应用程序, 其中有一个VC菜单, 该菜单下有"显示", "隐藏", "退出"选项; 当选择"显示"选项时, 窗口中显示一个对话框, 在对话框中显示"我们一起来学习VC++"; 当选择"隐藏"按钮时,对话框消失;选择"退出"时, 退出应用程序; 并为该程序加载图标

    1.菜单资源设计

    在资源中新建一个菜单资源

    添加相应的菜单并设置属性

    2.对话框资源设计

    在资源中新建一个对话框资源

    设置对话框属性并添加文字

    3.编写菜单响应代码

    程序主要代码如下:

    #include <windows.h>

    #include "7_9.h"

     

    long WINAPI WndProc(HWND hWnd,UINT iMessage,

                        WPARAM wParam,LPARAM lParam);

    BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);        //对话框处理函数

     

    HWND hDlg;                //定义对话框句柄

    HINSTANCE hInst;        //定义应用程序实例句柄

     

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

                     LPSTR lpCmdLine,int nCmdShow)    

    {

        MSG Message;                    //定义消息变量

        HWND hWnd;                        //定义窗口句柄

        WNDCLASS WndClass;                //定义窗口类

        WndClass.cbClsExtra=0;            //无窗口类扩展

        WndClass.cbWndExtra=0;            //无窗口实例扩展

        WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//背景为白色

        WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);    //光标为为箭头

        WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);    //采用缺省图标

        WndClass.hInstance=hInstance;            //当前实例

        WndClass.lpfnWndProc=WndProc;            //消息处理函数

        WndClass.lpszClassName="DlgInstance";//窗口类名称

        WndClass.lpszMenuName="Menu";            //定义菜单为Menu

        WndClass.style=0;                        //缺省窗口风格

     

        if(!RegisterClass(&WndClass))            //注册窗口.

        {

            MessageBeep(0);            //注册失败发出警告声.

            return FALSE;

        }

     

        hWnd=CreateWindow("DlgInstance",        //窗口类名称

                        "7_9",              //标题栏名称

                        WS_OVERLAPPEDWINDOW,    //窗口样式.有标题栏和最大最小化按钮

                        CW_USEDEFAULT,            //窗口左上角坐标

                        0,

                        CW_USEDEFAULT,            //采用自定义的高度和宽度

                        0,

                        NULL,                    //无父窗口

                        NULL,                    //无菜单

                        hInstance,                //当前应用实例句柄

                        NULL);                    //指向传递给窗口的参数的指针

     

        ShowWindow(hWnd,nCmdShow);                //显示窗口

        UpdateWindow(hWnd);                        //刷新用户区

        hInst=hInstance;                        //将应用程序句柄传递给全局变量

     

        while(GetMessage(&Message,0,0,0))

        {

            if(!IsDialogMessage(hDlg,&Message))        //若是对话框消息,发往对话框处理函数

            {

                TranslateMessage(&Message);            //消息循环

                DispatchMessage(&Message);

            }

        }

        return Message.wParam;

    }

     

    long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

    {

        switch(iMessage)

        {

        case WM_CREATE:

            hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc);    

            break;

    (续前表)

    case WM_COMMAND:

            switch(LOWORD(wParam))

            {

            case IDM_SHOW:                        

                //hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc);

                ShowWindow(hDlg,SW_SHOW);

                break;

            case IDM_HIDE:                        

                //DestroyWindow(hDlg);

                ShowWindow(hDlg,SW_HIDE);

                break;

            case IDM_EXIT:

                DestroyWindow(hDlg);

                SendMessage(hWnd,WM_DESTROY,0,0);    

                break;

            }

            break;

        case WM_DESTROY:                        

            PostQuitMessage(0);

            break;

        default:

            return(DefWindowProc(hWnd,iMessage,wParam,lParam));

        }

        return 0;

    }

     

     

    //对话框处理函数

    BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)

    {

        switch(message)

        {

        case WM_INITDIALOG:            

            return 1;

        }

        return 0;

    }

    编译并调试程序,程序运行结果见第三部分

    4. 为程序加载图标

    设计图标并在应用程序中加载

    在定义窗口类时加载图标:

    WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));

    程序运行结果运行结果如下图:

    程序运行后点击"菜单",显示菜单项

     

    点击"显示"菜单,显示对话框

    问题与改进:

    1.最初显示与隐藏对话框直接使用:

    hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc);

    DestroyWindow(hDlg);

    创建与销毁对话框以达到对话框的显示与隐藏效果,这样可以达到预期效果;

    后面为了提高程序效率,改为在窗口创建时创建对话框,并在"显示"与"隐藏"菜单下使用

    ShowWindow(hDlg,SW_SHOW);

    ShowWindow(hDlg,SW_HIDE);

    来直接显示与隐藏对话框。

    改进后可以提高对话框的加载速度(对于较大的对话框资源更为有效)并且可以保持对话框的状态,隐藏之后再显示对话框状态不会改变(对于在对话框中的文本框或者选框之类的控件有很重要的意义)

    2. 创建图标资源之后要注意使用

    WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));

    将图标设置为程序图标。

    3.注意区别主窗口消息和对话框的消息

    if(!IsDialogMessage(hDlg,&Message))    //若是对话框消息,发往对话框处理函数

        {

            TranslateMessage(&Message);            //消息循环

            DispatchMessage(&Message);

    }

  • 相关阅读:
    zabbix3.4报警队列过多清理
    k8s安装nexus并导入第三方jar包
    kubeadmin安装最新版本的kubenets
    aws相关知识
    mysql忘记root密码做法
    mysql实现读写分离(proxy)与高可用(MGR)
    jvm调优
    zabbix监控php-fpm的性能
    脚本
    opencv demo
  • 原文地址:https://www.cnblogs.com/leftshine/p/5698627.html
Copyright © 2011-2022 走看看