要求如下:
图标: 注册类时使用自己画的大图标和小图标
菜单: 设计一个菜单,能控制动态改变图标(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