学习目的

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

编写程序: 设计一个窗口应用程序, 其中有一个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. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  2. 920. Number of Music Playlists

    Your music player contains N different songs and she wants to listen to L (not necessarily different ...

  3. 887. Super Egg Drop

    You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is ident ...

  4. umeng推送, 生产环境deviceToken失效可能原因

    1 在系统升级之后会造成app的deviceToken重置(一定). 2 在app卸载之后可能会造成app的deviceToken重置. 3 deviceToken重置使用umeng推送时会因为dev ...

  5. linux 中定时执行python脚本

    一.让Python随Linux开机自动运行 准备好要自启的脚本auto.py 用root权限编辑以下文件 sudo vim /ect/rc.local 在exit 0上面编辑启动脚本的命令(编辑rc. ...

  6. jsp文件和HTML互相引入的乱码问题

    1.在jsp中用include指令引入HTML文件时遇到的问题: jsp.html都可以正确的显示,当jsp引入html时访问jsp页面HTML出现乱码,jsp原有的输出无乱码,解决方法: 在HTML ...

  7. 如何让IE 低版本下支持 css3属性

    依赖源  该文件为  ie-css3.htc    (特别提示.htc为二进制文件,只会在ie中识别,让IE浏览器支持CSS3的一些属性) 以下为依赖文件源码 通过源码我们可以看到 该文件在一定程度上 ...

  8. 解决后台json数据返回的字段需要替换的问题

    有时候后台json数据返回的字段含有“id”,也有可能是有时候为了减少代码的冗余,两页面之间只是数据模型个别属性的区别,所以这时候最好是用到模型属性的替换,用新的属性替换返回的json数据的字段.这里 ...

  9. 杂记---Mongo的Invalid BSON field name $gte

    1.前言 这几天使用mongo的时候遇到了一个异常:Invalid BSON field name $gte,该问题可能会有很多小伙伴会遇到,因此记录一下解决过程.起因是用JAVA翻译一个其他语言写的 ...

  10. Elasticsearch Aggregation 多个字段分组统计 Java API实现

    现有索引数据: index:school type:student --------------------------------------------------- {"grade&q ...