回 帖 发 新 帖 刷新版面

主题:急求助~

帮忙看看这段API写的动态菜单为什么没有效果?编译通过

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include "resource.h"

#define ID_NEWITEM 1013            //¶¨Òåв˵¥ÏîµÄ±êʶ·û

#define ID_NEWSYSITEM 60441       //¶¨ÒåÐÂϵͳ²Ëµ¥Ïî±êʶ·û



LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);    //Ö÷´°¿Úº¯Êý

BOOL WINAPI DoDispPopupMenu(HWND,int,int);        //´´½¨µ¯³öʽ²Ëµ¥

VOID WINAPI DoDispMessage(int);              //ÏÔʾÏà¹ØÐÅÏ¢  

VOID WINAPI DoInsertMenuItem(void);          //ÏòÒÑÓв˵¥ÖвåÈëÐÂÏî

VOID WINAPI DoDeleteMenuItem(void);          //ɾ³ý²Ëµ¥ÖеÄÑ¡Ïî

VOID WINAPI DoCheckMenuItem(void);           //ÉèÖò˵¥ÏîΪѡÖбêÖ¾

VOID WINAPI DoCheckRadio(void);              //ÉèÖò˵¥ÏîΪµ¥Ñ¡±êÖ¾

VOID WINAPI DoInsertSysMenu(void);           //Ïòϵͳ²Ëµ¥ÖвåÈëÐÂÏî



char szAppName[]="Begin";

HINSTANCE hIns;

HWND hMainWnd;

BOOL isInsert;        //²åÈë²Ëµ¥±êÖ¾

BOOL isCheck;            //Ñ¡ÖбêÖ¾

int  idRadio=2;      //µ¥Ñ¡±êÖ¾



int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

    MSG msg;

    HWND hWnd;

    WNDCLASSEX wc;

    wc.cbClsExtra                =0;

    wc.cbSize                    =sizeof(WNDCLASSEX);

    wc.cbWndExtra                =0;

    wc.hbrBackground         =(HBRUSH)GetStockObject(WHITE_BRUSH);

    wc.hCursor                   =LoadCursor(NULL,IDC_ARROW);

    wc.hIcon                    =LoadIcon(NULL,IDI_APPLICATION);

    wc.hIconSm                   =0;

    wc.hInstance             =hInstance;

    wc.lpfnWndProc               =(WNDPROC)MainProc;

    wc.lpszClassName         =szAppName;

    wc.lpszMenuName              =MAKEINTRESOURCE(IDR_MENU1);

    wc.style                    =CS_HREDRAW | CS_VREDRAW |

                                 CS_DBLCLKS | CS_OWNDC;

    RegisterClassEx(&wc);



    hWnd=CreateWindowEx(0,szAppName,szAppName,WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

        NULL,NULL,hInstance,NULL);

    hMainWnd=hWnd;

    hIns=hInstance;

//ÔÚ´Ë´¦Ïòϵͳ²Ëµ¥ÖвåÈë²Ëµ¥Ïî

    DoInsertSysMenu();

    ShowWindow(hWnd,nCmdShow);

    UpdateWindow(hWnd);



    while(GetMessage(&msg,NULL,0,0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    return msg.wParam;

}

回复列表 (共5个回复)

沙发

LRESULT CALLBACK MainProc(HWND hWnd,UINT message,

                          WPARAM wParam,LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    switch(message)

    {

    case WM_CREATE:

        return 0;

    case WM_PAINT:

        hdc=BeginPaint(hWnd,&ps);

        //do drawing

        EndPaint(hWnd,&ps);

        return 0;

    case WM_RBUTTONDOWN:

//Êó±êÔÚ´°¿ÚÖÐÓÒ¼ü±»°´ÏÂʱ£¬µ¯³ö¸¡¶¯Ê½²Ëµ¥

        if(DoDispPopupMenu(hWnd,LOWORD(lParam),HIWORD(lParam)))

        return 0;    //º¯Êýµ÷Óóɹ¦

        else

        break;        //º¯Êýµ÷ÓÃʧ°Ü

    case WM_COMMAND:

        switch(LOWORD(wParam))

        {

        case ID_INSERT:

            if(isInsert==0)

            {//²åÈëеIJ˵¥Ïî

                DoInsertMenuItem();

            //ÏÔʾÏà¹ØÐÅÏ¢

                DoDispMessage(4);

            }

            break;

        case ID_NEWITEM:

            DoDispMessage(3);

            break;

        case ID_DELETE:

            if(isInsert!=0)

            {//ɾ³ý²Ëµ¥Ïî

                DoDeleteMenuItem();

                DoDispMessage(5);

            }

            break;

        case IDEXIT:

            PostQuitMessage(0);

            break;

        case ID_CHECK:    //Ôڲ˵¥Ñ¡Ïîǰ´ò¹³

            DoCheckMenuItem();

            break;

        case ID_RADIO1:    //Ôڲ˵¥Ñ¡Ïîǰ×öÒ»Ô²ÐαêÖ¾£¬±íÃ÷´ËÏѡÖУ¬

                    //²¢Çå³ý¾ÉµÄ±êÖ¾

            idRadio=2;

            DoCheckRadio();

            break;

        case ID_RADIO2:    //ͬÉÏ

            idRadio=3;

            DoCheckRadio();

            break;

        case ID_RADIO3:    //ͬÉÏ

            idRadio=4;

            DoCheckRadio();

            break;

        case ID_FLOAT1:    //¸¡¶¯²Ëµ¥µÄÑ¡ÏѡÖÐʱµÄ´¦Àí

            DoDispMessage(0);

            break;

        case ID_FLOAT2:    //ͬÉÏ

            DoDispMessage(1);

            break;

        case ID_FLOAT3:    //ͬÉÏ

            DoDispMessage(2);

            break;

        }

        return 0;

    case WM_CLOSE:

        PostQuitMessage(0);

        return 0;

    }

    return DefWindowProc(hWnd,message,wParam,lParam);

}

板凳

BOOL WINAPI DoDispPopupMenu(HWND hWnd,int x,int y)

{

    HMENU hMenu;

    HMENU hPopupMenu;

    POINT pt={x,y};

//´Ó×ÊÔ´ÎļþÖÐÔØÈë²Ëµ¥×ÊÔ´

    hMenu=LoadMenu(hIns,MAKEINTRESOURCE(IDR_MENU2));

//»ñµÃ×Ӳ˵¥µÄ¾ä±ú

    hPopupMenu=GetSubMenu(hMenu,0);

//´°¿Ú×ø±êת»¯µ½ÆÁÄ»×ø±ê

    ClientToScreen(hMainWnd,&pt);

//´´½¨¸¡¶¯²Ëµ¥

    if(TrackPopupMenu(hPopupMenu,TPM_LEFTALIGN | TPM_RIGHTBUTTON,

        pt.x,pt.y,0,hMainWnd,NULL)==FALSE)

        return FALSE;

//ʹÓÃÍê±Ï£¬»ØÊÕÄÚ´æ

    DestroyMenu(hMenu);

    return TRUE;

}

VOID WINAPI DoDispMessage(int id)

{//Ôڲ˵¥Ê¼þ·¢Éúʱ£¬Êä³öÏàÓ¦µÄ×Ö·û´®

    HDC hdc;

    char *mess[]={"Command Floating Menuitem 1 ",

                  "Command Floating Menuitem 2 ",

                  "Command Floating Menuitem 3 ",

                  "Command New Menu Item       ",

                  "New Item Have Been Inserted ",

                  "New Item Have Been Deleted  "};

    InvalidateRect(hMainWnd,NULL,FALSE);

    hdc=GetDC(hMainWnd);

    TextOut(hdc,0,0,mess[id],strlen(mess[id]));

    ReleaseDC(hMainWnd,hdc);

}

VOID WINAPI DoInsertMenuItem()

{//²åÈë²Ëµ¥Ïî

    HMENU hMenu;

    HMENU hPopupMenu;

    MENUITEMINFO info;

//ÿһ¸öвåÈëµÄ²Ëµ¥Ïî¶¼±ØÐëÌîдMENUITEMINFO½á¹¹

    info.cbSize          =sizeof(MENUITEMINFO);

    info.fMask           =MFT_STRING | MIIM_DATA | MIIM_ID | MIIM_TYPE;

    info.fType           =MFT_STRING;

    info.fState          =0;

    info.wID            =ID_NEWITEM;

    info.hSubMenu        =NULL;

    info.hbmpChecked    =NULL;

    info.hbmpUnchecked    =NULL;

    info.dwItemData      =ID_NEWITEM;

    info.dwTypeData      ="New Item";

    info.cch            =8;

//»ñµÃÒÑ´æÔڲ˵¥µÄ¾ä±ú

    hMenu=GetMenu(hMainWnd);

//»ñµÃ×Ӳ˵¥µÄ¾ä±ú

    hPopupMenu=GetSubMenu(hMenu,0);

//²åÈë²Ëµ¥Ïî

    InsertMenuItem(hPopupMenu,1,TRUE,&info);

//ÖòåÈë±ê־Ϊ1

    isInsert=1;

}

3 楼

VOID WINAPI DoDeleteMenuItem()

{//ɾ³ý²Ëµ¥Ïî

    HMENU hMenu;

    HMENU hPopupMenu;

    hMenu=GetMenu(hMainWnd);

    hPopupMenu=GetSubMenu(hMenu,0);

    RemoveMenu(hPopupMenu,ID_NEWITEM,MF_BYCOMMAND);

    isInsert=0;

}

VOID WINAPI DoCheckMenuItem()

{//´Ëº¯ÊýÏÈÅжϲ˵¥ÏîÊÇ·ñ±»´ò¹³£¬ÈôûÓУ¬Ôò×ö´ò¹³±ê¼Ç

//ÈôÒÑÓУ¬Ôòɾ³ý´ò¹³±ê¼Ç

    HMENU hMenu;

    HMENU hPopupMenu;

    hMenu=GetMenu(hMainWnd);

    hPopupMenu=GetSubMenu(hMenu,1);



    if(isCheck)

    {

        CheckMenuItem(hPopupMenu,0,MF_BYPOSITION | MF_UNCHECKED);

        isCheck=0;

    }

    else

    {

        CheckMenuItem(hPopupMenu,0,MF_BYPOSITION | MF_CHECKED);

        isCheck=1;

    }

}

VOID WINAPI DoCheckRadio()

{

    HMENU hMenu;

    HMENU hPopupMenu;

    hMenu=GetMenu(hMainWnd);

    hPopupMenu=GetSubMenu(hMenu,1);

    CheckMenuRadioItem(hPopupMenu,2,4,idRadio,MF_BYPOSITION);

}

VOID WINAPI DoInsertSysMenu()

{//ÔÚϵͳ²Ëµ¥ÖвåÈë²Ëµ¥Ïî

    HMENU hSysMenu;

    MENUITEMINFO info;

//»ñµÃϵͳ²Ëµ¥µÄ¾ä±ú

    hSysMenu=GetSystemMenu(hMainWnd,FALSE);

    info.cbSize          =sizeof(MENUITEMINFO);

    info.fMask           =MFT_STRING | MIIM_DATA | MIIM_ID | MIIM_TYPE;

    info.fType           =MFT_STRING;

    info.fState          =MFS_DEFAULT;

    info.wID            =ID_NEWSYSITEM;

    info.hSubMenu        =NULL;

    info.hbmpChecked    =NULL;

    info.hbmpUnchecked    =NULL;

    info.dwItemData      =15;

    info.dwTypeData      ="New system Item";

    info.cch            =15;

    InsertMenuItem(hSysMenu,6,TRUE,&info);

}

4 楼

---资源文件:

#include "resource.h"


IDR_MENU1 MENU DISCARDABLE

BEGIN

    POPUP "Menu&1"

    BEGIN

        MENUITEM "InsertItem\t[I]",             ID_INSERT

        MENUITEM "DeleteItem\t[D]",             ID_DELETE

        MENUITEM "&Exit\tAlt+F4",               IDEXIT

    END

    POPUP "Menu&2"

    BEGIN

        MENUITEM "CheckText",                   ID_CHECK

        MENUITEM SEPARATOR

        MENUITEM "Radio1",                      ID_RADIO1

        MENUITEM "Radio2",                      ID_RADIO2

        MENUITEM "Radio3",                      ID_RADIO3

        MENUITEM SEPARATOR

        MENUITEM "About",                       ID_ABOUT

    END

END

IDR_MENU2 MENU DISCARDABLE

BEGIN

    POPUP "Test"

    BEGIN

        MENUITEM "Floating Menu Item1",         ID_FLOAT1, MENUBREAK

        MENUITEM "Floating Menu Item2",         ID_FLOAT2

        MENUITEM "Floating Menu Item3",         ID_FLOAT3

    END

END

5 楼

---资源头文件

#define ID_INSERT  15
#define ID_DELETE  16
#define ID_CHECK  17
#define IDEXIT  18
#define ID_RADIO1  19
#define ID_RADIO2 20
#define ID_RADIO3  21
#define ID_ABOUT 22
#define ID_FLOAT1 23
#define ID_FLOAT2 24
#define ID_FLOAT3 25
#define IDR_MENU1 31
#define IDR_MENU2 32



#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

我来回复

您尚未登录,请登录后再回复。点此登录或注册