17APLab3:图标、菜单、加速键、消息框

要求如下:

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

  

猜你喜欢

转载自www.cnblogs.com/ecnu/p/10663355.html