可视化:资源在windows编程中的应用

资源

包括:加速键,位图,光标,对话框,菜单,工具条等。在.rc文件中。

  • windows可执行文件中,资源是独立于代码的,可以单独用resource compiler编译,并嵌入到可执行文件。
  • vs提供可视化资源编辑器帮助开发,但是自动生成的代码结构复杂,比较不好懂,作为程序员手动编写资源脚本是必须滴。

菜单与加速键

  • 菜单的创建

1、定义菜单
myMenuID MENU [MOVEABLE | PRELOAD ]
myMenuID为自定义1~65535的整数,用来标识特定的菜单。若自定义菜单名,则要注册:在头文件resource.h中定义宏。
定义菜单项:
①定义弹出式菜单
POPUP "菜单项名"  [可选]
②MENUITEM项(用BEGIN END包含在弹出式菜单项中)
MENUITEM "新建 (&N)" ,IDM_NEW
同样,IDM_NEW要在Menu.h中定义宏。

IDC_CREATEMENU MENU
BEGIN
    POPUP "文件(&F)"
    BEGIN
	MENUITEM "创建统计计算菜单项(&P)\t Ctrl+P",			IDM_ADDMENU
	MENUITEM "删除统计计算菜单项(&D)\t Ctrl+D",         IDM_DELETEMENU
	MENUITEM SEPARATOR
	MENUITEM "退出(&X)",								IDM_EXIT
    END
    POPUP "帮助(&H)"
    BEGIN
        MENUITEM "关于(&A) ...",                  IDM_ABOUT
    END
END


2、加载菜单资源
三种方法:1':在窗口类的定义中加载:
WNDCLASSEX wndclass;
wndclass.lpszMenuName=menuName;
2'在调用函数CreateWindow()创建窗口前创建:
HWND hwnd;
HMENU hmenu;

hmenu=LoadMenu(hInstance,"my_menu");
hwnd=CreateWindow(,,,,,,,,hmenu,,,);该参数为NULL时表示用默认菜单。
3'动态加载菜单:
通过SetMenu()函数,在程序运行过程中可修改菜单:
HWND hwnd;
HMENU hmenu;

hmenu1=LoadMenu(hInstance,"my_menu");
hwnd=CreateWindow(,,,,,,,,hmenu1,,,);

hmenu2=LoadMenu(hInstance,"my_menu2");
SetMenu(hwnd,hmenu2);

菜单实例:

 WndProc函数中的switch

case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ADDMENU:
				hmenu = GetMenu(hWnd);
				haddmenu = CreateMenu();
				AppendMenu(haddmenu, MF_ENABLED, IDM_qiuhe, L"求和");
				AppendMenu(haddmenu, MF_ENABLED, IDM_fangcha, L"方差");
				AppendMenu(haddmenu, MF_ENABLED, IDM_pingjunzhi, L"平均值");
				AppendMenu(haddmenu, MF_ENABLED, IDM_junfanggen, L"均方根");

				InsertMenu(hmenu,2, MF_POPUP | MF_BYPOSITION, (UINT)haddmenu, L"统计计算(&c)");

				EnableMenuItem(hmenu, IDM_ADDMENU, MF_GRAYED);
				EnableMenuItem(hmenu, IDM_DELETEMENU, MF_ENABLED);
				DrawMenuBar(hWnd);
                break;
			case IDM_DELETEMENU:
				hmenu = GetMenu(hWnd);
				DeleteMenu(hmenu, 2, MF_BYPOSITION);

				EnableMenuItem(hmenu, IDM_ADDMENU, MF_ENABLED);
				EnableMenuItem(hmenu, IDM_DELETEMENU, MF_GRAYED);
				DrawMenuBar(hWnd);
				break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;


加速键(如ctrl+c等,与快捷键不同)

创建加速键:

IDC_CREATEMENU ACCELERATORS
BEGIN
    "?",            IDM_ABOUT,              ASCII,  ALT
    "/",            IDM_ABOUT,              ASCII,  ALT
	"^P",			IDM_ADDMENU,				ASCII,  NOINVERT
	"^D",			IDM_DELETEMENU,				ASCII,  NOINVERT
	"^X",			IDM_EXIT,			ASCII,  NOINVERT
END

加载加速键资源

HACCEL hAccel; ... hAccel=LoadAcceleratord(hInstance,IpAcceIname);

翻译加速键:

在消息循环中

TranslateAccelerator(hWid,hAccel,&Mag);

在MFC中创建菜单资源步骤:

①创建基于单文档MFC文件

②资源视图|menu中找到IDR_MAINFRAME,从中添加新菜单

③对于非弹出式菜单,为菜单控件添加command消息响应。

command消息是在用户单击菜单项时产生的。

位图

位图的操作包括定义、加载、选入内存设备环境和输出。

(1 ) 定义位图句柄

定义位图句柄的方式如下:

HBI TMAP hBi tmap;

(2 ) 加载位图

调用函数 hBitmap = LoadBitMap( . . .) 加载位图,获得位图的句柄。

(3 ) 选入设备环境

调用函数 CreateCompatibleDC 向系统申请内存设备句柄, 获取了内存设备句柄后,

调用函数 SelectObject 将位图选入内存设备环境。此时即可对其进行编辑。

(4 ) 输出位图

应用程序调用函数 BitBlt 将位图从内存设备环境中输出到指定的设备上。

对话框

两类:

  1. 模式对话框:这种类型对话框弹出后,则只能关闭该对话框后再切换到其它窗口。模式对话框的对话框消息循环将处理消息,并不返回给WinProc()
  2. 非模式对话框:从WinProc()的消息循环中接受输入。

模式对话框编程方法:

(1)定义对话框资源:(在资源视图中插入对话框,拖出所需控件即可)

格式为:

对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height 
[设置选项] 
Begin 
    控件定义 
End

实例:

IDD_MFCDIALOGEE2_3_DIALOG  DIALOGEX  0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,209,179,50,14
    PUSHBUTTON      "取消",IDCANCEL,263,179,50,14
    PUSHBUTTON      "红色",IDC_BUTTON1,33,43,50,14
    PUSHBUTTON      "绿色",IDC_BUTTON2,98,43,50,14
    PUSHBUTTON      "蓝色",IDC_BUTTON3,163,44,50,14
    PUSHBUTTON      "确认",IDC_BUTTON4,231,45,50,14
    EDITTEXT        IDC_EDIT1,90,110,146,14,ES_AUTOHSCROLL
END 

(2)调用DialogBox()函数显示对话框

(3)构造对话框消息处理函数DlgProc

BOOL CALLBACK DlgProc(HWND hDlg,UNIT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
        case:WM_INITDIALOG:
            return 1;
        case:WM_COMMAND:
            switch(LOWORD(wParam))
            {
                ...
            }
    }
}

(4)关闭对话框:EndDialog()

非模式对话框编程方法:

(1)定义对话框资源:必须有WS_VISIBLE

格式为:

对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height 
STYLE WS_POPUP|WS_CAPTION|WS_VISIBLE
Begin 
    控件定义 
End

(2)创建对话框函数:CreateDialog()

(3)WinMain中消息循环处理:

while(GetMessage(&Msg,NULL,0,0)
{
    if(!IsDialogMessage(hdlg,&Msg))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

(4)关闭对话框:DestroyWindow();

对话框消息类型为WM_COMMAND

所以在WinProc函数中case WM_COMMAND:处理

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值