学习目的

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

编写程序: 设计一个窗口应用程序, 其中有一个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);

}

资源在Windows编程中的应用的更多相关文章

  1. 资源在windows编程中的应用----菜单

    资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...

  2. 第七章 资源在Windows编程中的应用 P157 7-8

    资源在基于SDK的程序设计中的应用实验 一.实验目的 1.掌握各种资源的应用及资源应用的程序设计方法.   二.实验内容及步骤 实验任务 1.熟悉菜单资源的创建过程: 2.熟悉位图资源的创建: 3.熟 ...

  3. Windows编程中的若干难点 - Windows程序设计(SDK)007

    Windows编程中的若干难点 让编程改变世界 Change the world by program 一个窗口的生与死 我记得有童鞋会问:如果我的程序需要在关闭前让用户判断是否确定要关闭窗口,我应该 ...

  4. windows编程中的数据类型

    在windows编程中,有许多奇怪的数据类型,初学者不知道这些代表什么,下面就把一些数据类型列出如下: ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BY ...

  5. Windows编程中UNICODE和_UNICODE定义问题

    Windows编程中UNICODE和_UNICODE定义问题 先转一篇文章: 初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别 ...

  6. Windows 编程中恼人的各种字符以及字符指针类型

    在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就 ...

  7. Windows编程中char*转LPCWSTR解决的方法总结

    Windows编程中常常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题.于是自己总结了几种解决的方法. 1.通过T2W转换宏 char* szStr = " ...

  8. Windows编程中各种操作文件的方法

    windows编程中文件操作有以下几种常见方法:1.C语言中文件操作.2.C++语言中的文件操作.3.Win32 API函数文件操作.4.MFC CFile类文件操作.5.MFC CFileDialo ...

  9. Windows编程中回调函数的使用心得(MFC篇)

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...

随机推荐

  1. jzoj5928

    tj:題解裡公式是錯的 我們可以考慮每一個節點[a,a+2^b-1]對答案的貢獻 則當這個節點是左兒子時,貢獻為2^b 是右兒子時,貢獻為2n−a−2b+12^n-a-2^b+12n−a−2b+1 左 ...

  2. 一,php的错误处理和异常处理

    php程序中如果语法或逻辑错误,会引起php默认错误处理机制,不会引起异常处理机制,只有在程序中throw抛出异常后,如果没有catch捕捉异常,默认调用php默认异常处理. php有默认错误机制和默 ...

  3. webpack快速入门——打包后如何调试

    在配置devtool时,webpack给我们提供了四种选项. source-map:在一个单独文件中产生一个完整且功能完全的文件.这个文件具有最好的source map,但是它会减慢打包速度: che ...

  4. 【bzoj4332】【JSOI2012】 分零食 生成函数 FFT

    我们构造$f(x)$的生成函数$G(x)$,那么显然$[x^k]G(x)=Ok^2+Sk+U$ 那么显然,答案即为$\sum_{i=1}^{n} [x^m]G^i(x)$ 我们构造答案的生成函数$F( ...

  5. Linux CentOS7系统中php安装配置

    本篇讲解如何配置php开发环境,让你的php代码可以正常的在网页中运行. 准备工作 linux centos7操作系统 ssh软件 nginx php资源 想要了解更多关于php的内容,请访问: ph ...

  6. TapTap推广统计逻辑

    当我们在Taptap上访问某款游戏时,比如https://www.taptap.com/app/34762,taptap会记录下这次访问,它是怎么做的呢. 首先,用记事本打开这个网址,在head部分看 ...

  7. 剑指offer三十二之把数组排成最小的数

    一.题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 二.思路 ( ...

  8. 关于 PHP 开放 enable_dl 函数利用 图片Disable_functions

    三篇引文地址: 利用PHP扩展模块突破Disable_functions执行命令 如何编写PHP扩展 php dl函数(详细解释)

  9. CentOS 配置使用 EPEL YUM 源

    EPEL(Extra Packages for Enterprise Linux)是一个由特别兴趣小组创建.维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS. ...

  10. css 中 stick footer 布局实现

    做项目中,我们在写弹框的时候,不管弹框的内容多或者少,可能需要一些内容需要固定在框底部,比如关闭按钮.stick footer 就是让 footer 元素固定在底部 当内容不足满屏时,footer 紧 ...