资源主要 分为五个部分,分别是菜单,加速键,位图,对话框和图标。
①首先看菜单和加速键的操作,菜单再资源文件编写范例如下:
#include "c:\prog_book\7_1\7_1.h"
#include "windows.h"
MENU MENU DISCARDABLE
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "创建统计计算菜单项(&P)\t Ctrl+P", IDM_ADDMENU
MENUITEM "删除统计计算菜单项(&D)\t Ctrl+D", IDM_DELMENU, GRAYED
MENUITEM SEPARATOR
MENUITEM "退出(&X)", IDM_EXIT
END
MENUITEM "帮助(&H)", IDM_HELP
END
MENU ACCELERATORS MOVEABLE PURE
BEGIN
"^P", IDM_ADDMENU, ASCII
"^D", IDM_DELMENU, ASCII
END
期中IDM_ADDMENU 这些都是自己定义的表示,其实都是数字,需要再头文件声明,再看下主函数
#include "windows.h"
#include "7_1.h"
HMENU hmenu,haddmenu; //定义菜单句柄
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
HACCEL hAccel;
WNDCLASS wndclass ;
char lpszMenuName[]="Menu";
char lpszClassName[] = "菜单";
char lpszTitle[]= "My_Menu_Example";
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH) GetStockObject( WHITE_BRUSH);
wndclass.lpszMenuName = lpszMenuName ; //加载窗口类菜单
wndclass.lpszClassName = lpszClassName ;
if( !RegisterClass( &wndclass))
{
MessageBeep(0) ;
return FALSE ;
}
hwnd = CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;
ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd);
//加载加速键资源
hAccel=LoadAccelerators(hInstance,lpszMenuName);
while( GetMessage(&Msg, NULL, 0, 0))
{
//在消息循环中截获加速键消息
if (!TranslateAccelerator(hwnd,hAccel,&Msg))
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
//处理菜单消息
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_ADDMENU://在主菜单中添加弹出式统计计算菜单
//获取主菜单句柄
hmenu=GetMenu(hwnd);
//动态创建菜单
haddmenu=CreateMenu();
//在创建的菜单中增加菜单项
AppendMenu(haddmenu,MF_ENABLED,IDM_qiuhe,"求和");
AppendMenu(haddmenu,MF_ENABLED,IDM_fangcha,"方差");
AppendMenu(haddmenu,MF_ENABLED,IDM_pinjunzhi,"平均值");
AppendMenu(haddmenu,MF_ENABLED,IDM_junfanggen,"均方根");
//将创建的弹出式菜单插入主菜单中
InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,(UINT)haddmenu,"统计计算(&C)");
//相应改变菜单中有关绘图统计计算菜单项的属性
EnableMenuItem(hmenu,IDM_ADDMENU,MF_GRAYED);
EnableMenuItem(hmenu,IDM_DELMENU,MF_ENABLED);
//重新显示窗口菜单
DrawMenuBar(hwnd);
break;
//从主菜单中删除弹出式统计计算菜单
case IDM_DELMENU:
//删除统计计算菜单项
DeleteMenu(hmenu,2,MF_BYPOSITION);
//相应改变“文件”菜单中有关统计计算菜单项的属性
EnableMenuItem(hmenu,IDM_ADDMENU,MF_ENABLED);
EnableMenuItem(hmenu,IDM_DELMENU,MF_GRAYED);
//重新显示窗口菜单
DrawMenuBar(hwnd);
break;
case IDM_EXIT:
//选择“退出”菜单项时,向应用程序发出WM_DESTROY消息
SendMessage(hwnd,WM_DESTROY,0,0);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
我们可以利用appendmenu动态创建菜单
加速键资源需要LoadAccelerators(hInstance,lpszMenuName)并重写消息获取函数
if (!TranslateAccelerator(hwnd,hAccel,&Msg))
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
②位图
主函数
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//定义变量
HDC hdc; //设备环境句柄
HDC hdcmem; //内存设备环境句柄
HBITMAP hBm; //位图句柄
BITMAP bm; //BITMAP结构
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR lpszCmdLine,
int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
WNDCLASS wndclass ;
char lpszClassName[] = "位图";
char lpszTitle[]= "Example_For_BitMap";
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = lpszClassName ;
if( !RegisterClass( &wndclass))
{
MessageBeep(0) ;
return FALSE ;
}
hwnd = CreateWindow( lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;
//加载位图
hBm=LoadBitmap(hInstance,"pic7");
//获取位图尺寸
GetObject( hBm, sizeof( BITMAP), (LPVOID)&bm) ;
ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd);
while( GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{ PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
//获取设备环境句柄
hdc=GetDC(hwnd);
//获取内存设备环境句柄
hdcmem=CreateCompatibleDC(hdc);
//释放设备环境句柄
ReleaseDC(hwnd,hdc);
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//将位图选入内存设备环境
SelectObject(hdcmem,hBm);
//调用函数BitBlt将内存设备环境中的位图拷贝到设备环境中
BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
//释放设备环境句柄
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
//释放位图
DeleteObject(hBm);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
资源文件
//位图示例.rc
pic7 BITMAP pic7_2.bmp //定义位图资源
③对话框
#include <windows.h>
#include "7_3.h"
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,
LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
HACCEL hAccel;
WNDCLASS wndclass ;
char lpszMenuName[]="Menu";
char lpszClassName[] = "模态对话框";
char lpszTitle[]= "模态对话框样例";
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;
wndclass.lpszMenuName = lpszMenuName ;
wndclass.lpszClassName = lpszClassName ;
if( !RegisterClass( &wndclass))
{
MessageBeep(0) ;
return FALSE ;
}
hwnd = CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd);
hInst=hInstance;
hAccel=LoadAccelerators(hInst,lpszMenuName);
while( GetMessage(&Msg, NULL, 0, 0))
{
if (!TranslateAccelerator(hwnd,hAccel,&Msg))
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_OPEN: //打开文件操作
//文件打开成功则显示消息框
MessageBox(hwnd,"文件已经打开!","文件打开",MB_OK);
break;
case IDM_SAVE: //存储操作
//文件保存成功则显示消息框
MessageBox(hwnd,"文件保存成功!","文件保存",MB_OK);
break;
case IDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
break;
case IDM_ABOUT: //创建对话框
DialogBox(hInst,"About",hwnd,(DLGPROC)DlgProc);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
//对话框窗口处理函数
BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
//初始化对话框
case WM_INITDIALOG:
return 1;
//处理对话框消息
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK: //关闭对话框
EndDialog( hdlg, 0) ;
return 1;
}
break ;
case WM_CLOSE:
EndDialog( hdlg, 0) ;
return 1;
}
return 0;
}
可以利用messagebox之际弹出一个模态框,也可以自己在资源文件中定义:
#include <windows.h>
#include "7_3.h"
Menu MENU DISCARDABLE
{
POPUP "文件(&F)"
{
MENUITEM "打开(&O)\t Ctrl+O", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "保存(&S)\t Ctrl+S", IDM_SAVE
MENUITEM SEPARATOR
MENUITEM "退出(&X)", IDM_EXIT
}
POPUP "帮助(&H)"
{
MENUITEM "关于(&A)...", IDM_ABOUT
}
}
Menu ACCELERATORS
{
"^O", IDM_OPEN
"^S", IDM_SAVE
}
About DIALOG 10, 10, 100, 50
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于"
FONT 18, "楷体" //定义对话框中的文本字体类型及大小
{
CTEXT "Windows模态对话框",-1,13,10,80,10
DEFPUSHBUTTON "确定",IDOK,35,30,30,12
}
④ 图标
定义示例
TREE ICON C:\prog_book\7_6\tree.ico