要求如下:
图标: 注册类时使用自己画的大图标和小图标
菜单: 设计一个菜单,能控制动态改变图标(3选1单选),在四个位置显示文字信息(复选),以及“关于”
加速键: 每个菜单项都有加速键
消息框: 改变图标前确认是否真要修改
显示菜单前动态生成一个下拉菜单,加入到主菜单中(File下Exit,位置0), 也要设置加速键
选择图标3时复选菜单灰化
实现如下:
//resource.h
#define IDI_ICON1 101
#define IDI_ICON2 102
#define IDI_ICON3 103
#define IDR_MENU1 105
#define IDA_MENU1 106
#define ID_FILE_EXIT 40001
#define ID_ICON1 40002
#define ID_ICON2 40003
#define ID_ICON3 40004
#define ID_INDICATE1 40005
#define ID_INDICATE2 40006
#define ID_INDICATE3 40007
#define ID_INDICATE4 40008
#define ID_DETAIL 40009
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 106
#define _APS_NEXT_COMMAND_VALUE 40010
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
//主函数main.cpp
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
TCHAR szAppName[] = TEXT ("IDR_MENU1") ;
TCHAR information[] =
TEXT("17APlab3(SDK)资源\n图标、菜单、加速键、消息框\n\n学号\
:1017510****\n姓名:XXX");
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
HACCEL hAccel;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1)) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Failed to RegisterClass!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
HMENU hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
hwnd = CreateWindow (szAppName, TEXT ("lab3_demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, hMenu, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
hAccel = LoadAccelerators (hInstance,MAKEINTRESOURCE(IDA_MENU1)) ;
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)
{
static HINSTANCE hInst;
HMENU hMenu = GetMenu (hwnd),hSubMenu;
PAINTSTRUCT ps;
HDC hdc;
static HICON hIcon[3];
for(int i=0; i<3; i++)
hIcon[i] = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1+i));
const int idicon [3] = {ID_ICON1,ID_ICON2,ID_ICON3};
static int iSelection = ID_ICON1;
static int icon = 1;
static bool indi[4] = {0};
int temp;
TCHAR words[50];
switch (message)
{
case WM_INITMENU:
hMenu = (HMENU)wParam;
CheckMenuRadioItem(hMenu,ID_ICON1,ID_ICON3,iSelection, MF_BYCOMMAND);
return 0;
case WM_CREATE:
hInst = ((LPCREATESTRUCT)lParam)->hInstance;
hMenu = GetMenu (hwnd);
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu,MF_STRING,ID_FILE_EXIT,"Exit\tCtrl+Shift+Delete");
//AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)hSubMenu,"File");//加在后面的写法
InsertMenu(hMenu,0,MF_BYPOSITION|MF_POPUP,(UINT)hSubMenu,"File");
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
for(int i=0; i<4; i++)
{
if(indi[i])
TextOut(hdc,(i%2+1)*200,(i/2+1)*200,words,wsprintf(words,TEXT("显示%d"),i+1));
}
TextOut(hdc,200,50,words,wsprintf(words,TEXT("当前使用的图标是:图标%d"),icon));
DrawMenuBar(hwnd);
EndPaint(hwnd,&ps);
return 0;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case ID_FILE_EXIT:
SendMessage (hwnd, WM_CLOSE, 0, 0) ;
return 0 ;
case ID_ICON1:
case ID_ICON2:
case ID_ICON3:
iSelection = LOWORD (wParam) ;
if(iSelection-ID_ICON1!=icon-1)
{
CheckMenuRadioItem(hMenu,ID_ICON1,ID_ICON3,iSelection,MF_BYCOMMAND);
temp = MessageBox (hwnd, TEXT ("确认要修改吗?"),
TEXT("确定"), MB_ICONQUESTION | MB_OKCANCEL) ;
if(temp==IDOK)
{
for(int i=0; i<3; i++)
{
if(iSelection==idicon[i])
{
icon = i+1;
SetClassLong(hwnd,GCL_HICON,(long)hIcon[i]);
//SendMessage(hwnd, WM_SETICON, 0, (LPARAM)hIcon[i]);//也可以使用sendmessage()来重载图标
break;
}
}
if(iSelection == ID_ICON3)
EnableMenuItem(hMenu,2,MF_BYPOSITION | MF_GRAYED);
else EnableMenuItem(hMenu,2,MF_BYPOSITION | MF_ENABLED);
InvalidateRect (hwnd, NULL, TRUE) ;
}
}
return 0;
case ID_INDICATE1:
case ID_INDICATE2:
case ID_INDICATE3:
case ID_INDICATE4:
iSelection = LOWORD(wParam);
temp = iSelection - ID_INDICATE1;
if(indi[temp])
CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);
else
CheckMenuItem(hMenu,iSelection,MF_CHECKED);
indi[temp]=!indi[temp];
InvalidateRect (hwnd, NULL, TRUE) ;
MessageBeep (0) ;
return 0 ;
case ID_DETAIL:
MessageBeep (0) ;
MessageBox (hwnd, information,
TEXT("17APLab3(SDK)"), MB_ICONASTERISK | MB_OK) ;
return 0 ;
}
break ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//lab3.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
/
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON DISCARDABLE "icon1.ico"
IDI_ICON2 ICON DISCARDABLE "icon2.ico"
IDI_ICON3 ICON DISCARDABLE "icon3.ico"
/
//
// Menu
//
IDR_MENU1 MENU
BEGIN
// POPUP "File"
// BEGIN
// MENUITEM "Exit\tCtrl+Shift+Delete", ID_FILE_EXIT
// END
POPUP "图标(&I)"
BEGIN
MENUITEM "图标1\tCtrl+1", ID_ICON1
MENUITEM "图标2\tCtrl+2", ID_ICON2
//MENUITEM SEPARATOR
MENUITEM "图标3\tCtrl+3", ID_ICON3
END
POPUP "显示(&D)"
BEGIN
MENUITEM "显示1\tCtrl+Shift+1", ID_INDICATE1
MENUITEM "显示2\tCtrl+Shift+2", ID_INDICATE2
MENUITEM "显示3\tCtrl+Shift+3", ID_INDICATE3
MENUITEM "显示4\tCtrl+Shift+4", ID_INDICATE4
END
POPUP "关于(&A)"
BEGIN
MENUITEM "程序信息\tF1", ID_DETAIL
END
END
IDA_MENU1 ACCELERATORS
BEGIN
// VK_INSERT, ID_INDICATE1, VIRTKEY, SHIFT, NOINVERT
// VK_, ID_ICON1, ASCII, NOINVERT
VK_DELETE,ID_FILE_EXIT,VIRTKEY,CONTROL,SHIFT,NOINVERT
"^1", ID_ICON1, ASCII, NOINVERT
"^2", ID_ICON2, ASCII, NOINVERT
"^3", ID_ICON3, ASCII, NOINVERT
"^1", ID_INDICATE1, VIRTKEY,CONTROL,SHIFT,NOINVERT
"^2", ID_INDICATE2, VIRTKEY,CONTROL,SHIFT,NOINVERT
"^3", ID_INDICATE3, VIRTKEY,CONTROL,SHIFT,NOINVERT
"^4", ID_INDICATE4, VIRTKEY,CONTROL,SHIFT,NOINVERT
VK_F1, ID_DETAIL, VIRTKEY, NOINVERT
END
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // 中文(简体,中国) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED