学习目的

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

编写程序: 设计一个窗口应用程序, 其中有一个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四种数据存储方式

    一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...

  2. 内存耗用:VSS/RSS/PSS/USS

    Terms VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS - P ...

  3. 四,memcached的机制

    memcached机制: 1,基于c/s架构,协议简单. (1)c/s架构,此时memcached为服务端,我们可以使用如PHP,c/c++等程序连接memcached服务器. (2)memcache ...

  4. Codeforces Round #456 (Div. 2) B. New Year's Eve

    B. New Year's Eve time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  5. 【JS深入学习】——函数创建和重载

    今天做一个关注/取消的功能,由于需要向后台发送请求,想通过控制用户点击发送的频次减少不必要的请求,即在一定时间内,用户点击多次但只发送一次数据,自然而然想到了使用[函数节流]. function th ...

  6. 经典MVC框架技术-struts2基础知识

    Struts2框架简介 struts2框架是在struts1和webwork技术的基础上,进行合并的全新框架,struts2以Webwork为核心,采用拦截器来处理用户的请求,这样的设计使得业务逻辑控 ...

  7. jvm内存结构(二)(栈的变化,机器指令的格式/执行模式)

    栈的结构: <Java虚拟机原理图解>4.JVM机器指令集 局部变量表: 方法执行时,虚拟机会把字节码中方法数据区的code类型的属性中的局部变量放到栈的局部变量表中. 操作栈: jvm指 ...

  8. java 0 开始

    利用了61天的时间学习了 se 不过忘得也很多  .在这里开一个帖子   打算利用几天的时间进行复习,把凡是能用到的都放在这边. 不带图形界面的第一个项目已经弄完 (看视频加看书..而且自己往上面加东 ...

  9. 添加新内容的四个 jQuery 方法:append,prepend,after,before

    添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...

  10. Mac下使用zsh不执行/etc/profile文件

    Mac下使用了zsh会不执行/etc/profile文件,当然,如果用原始的是会执行. 转而执行的是这两个文件,每次登陆都会执行: ~/.zshrc与/etc/zshenv与/etc/zshrc 所以 ...