学习目的

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

编写程序: 设计一个窗口应用程序, 其中有一个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. Android 日常总结的一些方法使用

    1. setImageResource : 更改图片的资源 2. setClickable :  设置为true时,表明控件可以点击,如果为false,就不能点击 .  注意,setOnClickLi ...

  2. brew - 安装gradle

    我安装完brew之后,马上开始安装gradle,但是shell总是卡在执行"brew update"这里,今天终于解决了,出现这样问题的原因是初次安装brew,它使用的源是国外的, ...

  3. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  4. 详述MySQL服务在渗透测试中的利用

    本文作者:i春秋签约作家——Binghe 致力于书写ichunqiu社区历史上最长篇最细致最真实的技术复现文章. 文章目录: MySQL之UDF提权 MySQL之MOF提权 MySQL之常规写启动项提 ...

  5. 【xsy1232】Magic 最小割

    题目大意:给你一个$n$个点,$m$条有向边的图,每个点有一个点权$a_i$,同时你可以用$b_i$的代价将$a_i$变为$0$ 另外你要付出$\sum\limits_{i=1}^n\max\limi ...

  6. nodeJS搭建一个简单的(代理)web服务器

    前端获取数据时经常遇见跨域问题,以前一直用nginx做反向代理.最近在用vuejs,发现webpack-dev-server的代理简单好用.于是仿照写了一个简单的web服务器,用于非webpack的项 ...

  7. spring boot和mybatis集成分页插件

    MyBatis提供了拦截器接口,我们可以实现自己的拦截器,将其作为一个plugin装入到SqlSessionFactory中. 首先要说的是,Spring在依赖注入bean的时候,会把所有实现MyBa ...

  8. 软件魔方制作系统启动盘并安装win10系统

    不多说,直接上干货!  推荐软件:软件魔方 http://mofang.ruanmei.com/ 这里,我想说的是,这个软件来制作系统盘,是真的方便和好处多多.具体我不多说,本人也是用过其他的如大白菜 ...

  9. 机器学习--boosting家族之GBDT

    本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 以下简称GBDT)做一个总结.GBDT有很多简称,有GBT(Gradient ...

  10. Python函数中的可变参数

    在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...