学习目的

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

编写程序: 设计一个窗口应用程序, 其中有一个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. Redis的快照

    博客链接:http://www.cnblogs.com/zhenghongxin/p/8669913.html redis 本地持久化到硬盘有两种方式,一是快照(snapshotting),二是只追加 ...

  2. flask之flask_sqlalchemy

    一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL ...

  3. 使用Navicat 创建mysql存储过程,实现日期加流水号序列

    目的:使用Navicat 创建mysql存储过程,实现格式为8位日期(年月日)+5位流水号序列. 步骤: 1.打开Navicat 登录数据库,点击导航栏上的函数,如下图: 2.点击新建函数,选择“过程 ...

  4. javascript浅拷贝深拷贝理解记录

    javascript的深拷贝和浅拷贝问题几乎是面试必问的问题.好记性不如烂笔头,特此来记录一下自己对深拷贝浅拷贝的理解. 顾名思义,拷贝就是copy复制,在js中可以浅而理解为对一个对象或者数组的复制 ...

  5. jsp页面,jstl标签中的数据在<%%>java中使用

    可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...

  6. 前端小例子 基础js css html练习

    前情提要: 学前端也有一阵了,个人感觉前端还是重要的. html 学习教程 https://www.cnblogs.com/baili-luoyun/p/10466040.html css 教程 js ...

  7. Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】

    写在前面的: 作为一个控制专业的女研究生,不知道每天在研究什么,但总归逃脱不了码代码的命运.之前也学习过一些C语言.C++,基础嘛,稍稍微有一些.本不想走上码农的道路,天真烂漫的过此生(白日梦过程中. ...

  8. 【lintcode】834. Remove Duplicate Letters

    题目描述: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  9. POJ 2247

    #include<iostream> #include<algorithm> #include<vector> #include<string> #in ...

  10. 第6章—渲染web视图—使用Apache Tiles视图定义布局

    使用Apache Tiles视图定义布局   Tiles是一个免费的开源模板Java应用程序的框架.基于复合模式简化的用户界面的构建.对于复杂的网站仍是最简单.最优雅的方式与任何MVC技术一起工作.S ...