none
Проблема с меню RRS feed

  • Вопрос

  • Проблема с учебной программой,цель которой вывести меню,возникают проблемы линковщика  в двух функциях и меня смущает в одном месте приведение битмапа к типу LPCSTR

    #include

    <Windows.h>


    #include

    <CommCtrl.h>



    #define

    IDM_Enable_Disable 0


    #define

    IDM_Exit 1


    #define

    IDM_About 2


    #define

    IDM_File 3


    #define

    IDM_Help 4


    #define

    IDM_Bitmap 5

    WCHAR* Messages[] = {L

    "Enable or disable exit",

    L

    "Exit from the program",

    L

    "About this program",

    L

    "File operations",

    L

    "Help operations",

    L

    "Menu example",

    L

    "System Menu"};

     

    LRESULT CALLBACK MenuDemoWndProc(HWND,UINT,WPARAM,LPARAM);

    HWND hStatusWindow;

    UINT wId;

    HMENU hMenu,hFileMenu,hHelpMenu;

    HINSTANCE hInst;



    int

    APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

    LPSTR lpszCmdParam,

    intnCmdShow)

    {

    HWND hWnd;

    WNDCLASS WndClass;

    MSG Msg;

    hInst = hInstance;

    WndClass.style = CS_VREDRAW | CS_HREDRAW;

    WndClass.lpfnWndProc = (WNDPROC)MenuDemoWndProc;

    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 = L

    "MenuExample";

    if(!RegisterClass(&WndClass))

    {

    MessageBox(NULL,L

    "Cannot register window's class",L"Error",MB_OK);

    return0;

    }

    hWnd = CreateWindow(L

    "MenuExample",L"Programm 2",

    WS_OVERLAPPEDWINDOW,

    CW_USEDEFAULT,CW_USEDEFAULT,

    CW_USEDEFAULT,CW_USEDEFAULT,

    NULL,NULL,

    hInstance,NULL);

    if(!hWnd)

    {

    MessageBox(NULL,L

    "Cannot create window",L"Error",MB_OK);

    return0;

    }

    InitCommonControls();

    hStatusWindow = CreateStatusWindow((WS_CHILD | WS_VISIBLE),

    L

    "Menu sample",hWnd,wId);

    if(!hStatusWindow)

    {

    MessageBox(NULL,L

    "Cannot create status window",L"Error",MB_OK);

    return0;

    }

    //create menu


    AppendMenu((hFileMenu = CreatePopupMenu()),MF_ENABLED | MF_STRING,

    IDM_Enable_Disable,L

    "&Enable exit");

    AppendMenu(hFileMenu,MF_GRAYED | MF_STRING,IDM_Exit,L

    "E&xit");

    AppendMenu((hHelpMenu = CreatePopupMenu()),MF_DISABLED | MF_STRING,IDM_About,L

    "&About");

    hMenu = CreateMenu();

    AppendMenu(hMenu,MF_ENABLED | MF_POPUP,(UINT)hFileMenu,L

    "&File");

    AppendMenu(hMenu,MF_ENABLED | MF_POPUP,(UINT)hHelpMenu,L

    "&Help");

    SetMenu(hWnd,hMenu);

    ShowWindow(hWnd,nCmdShow);

    UpdateWindow(hWnd);

    DrawMenuBar(hWnd);

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

    {

    TranslateMessage(&Msg);

    DispatchMessage(&Msg);

    }

    returnMsg.wParam;

    }

    LRESULT CALLBACK MenuDemoWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)

    {

    RECT Rect;

    staticUINT nFlag = MF_ENABLED;

    WCHAR* Content[] = {L

    "Enable exit",L"Disable exit"};

    staticUINT nIndex = 0;

    staticHBITMAP hBitmap;

    intnDimension;

    switch(Message)

    {

    caseWM_CREATE:

    nDimension = GetSystemMetrics(SM_CYMENU);

    hBitmap = (HBITMAP)LoadImage(hInst,L

    "C:\\Russian.bmp",IMAGE_BITMAP,

    nDimension*2,nDimension,LR_LOADFROMFILE);

    AppendMenu(GetMenu(hWnd),MF_BITMAP,IDM_Bitmap,(LPCWSTR)hBitmap);//здесь происходит приведение,о котором я говорил

    break;

    caseWM_COMMAND:

    switch(wParam)

    {

    caseIDM_Enable_Disable:

    EnableMenuItem(hFileMenu,IDM_Exit,MF_BYCOMMAND | nFlag);

    nFlag = (nFlag == MF_ENABLED) ? MF_GRAYED : MF_ENABLED;

    nIndex = (nIndex == 0) ? 1 : 0;

    ModifyMenu(hFileMenu,IDM_Enable_Disable,MF_BYCOMMAND |

    MF_STRING,IDM_Enable_Disable,Content[nIndex]);

    break;

    caseIDM_Exit:

    SendMessage(hWnd,WM_CLOSE,NULL,NULL);

    break;

    }

    caseWM_SIZE:

    SendMessage(hStatusWindow,WM_SIZE,wParam,lParam);

    GetClientRect(hWnd,&Rect);

    return0;

    caseWM_MENUSELECT:

    if( ( (UINT)HIWORD(wParam) == 0xffff) && ( (HMENU)lParam == 0) )

    {

    SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,(LPARAM)Messages[5]);

    return0;

    }

    if( (UINT)HIWORD(wParam) && MF_SYSMENU )

    {

    SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,(LPARAM)Messages[6]);

    return0;

    }

    if( (UINT)HIWORD(wParam) && MF_POPUP )

    {

    SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,

    (LPARAM)Messages[3 + LOWORD(wParam)]);

    return0;

    }

    SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,

    (LPARAM)Messages[LOWORD(wParam)]);

    return0;

    caseWM_DESTROY:

    DeleteObject(hBitmap);

    PostQuitMessage(0);

    return0;

    }

    returnDefWindowProc(hWnd,Message,wParam,lParam);

    }

    15 апреля 2012 г. 10:06

Ответы

  • Здравствуйте.

    Ошибки линковщика скорее всего связаны с тем, что вы забыли подключить библиотеку Comctl32.lib, в которая нужна для функций InitCommonControls и CreateStatusWindow. Подключите данную либу в свойсвах проекта или через директиву:

    #pragma comment(lib,"Comctl32.lib")

    Это должно устранить ошибки

    Для связи [mail]


    • Предложено в качестве ответа ulcer 17 апреля 2012 г. 5:51
    • Помечено в качестве ответа Abolmasov Dmitry 17 апреля 2012 г. 6:19
    • Изменено Abolmasov Dmitry 17 апреля 2012 г. 6:19
    16 апреля 2012 г. 12:29

Все ответы

  • Приведение к LPCSTR - это нормально, особенность WinAPI.

    Приведите точные ошибки линковщика, по коду их не видно.

    16 апреля 2012 г. 11:16
  • Здравствуйте.

    Ошибки линковщика скорее всего связаны с тем, что вы забыли подключить библиотеку Comctl32.lib, в которая нужна для функций InitCommonControls и CreateStatusWindow. Подключите данную либу в свойсвах проекта или через директиву:

    #pragma comment(lib,"Comctl32.lib")

    Это должно устранить ошибки

    Для связи [mail]


    • Предложено в качестве ответа ulcer 17 апреля 2012 г. 5:51
    • Помечено в качестве ответа Abolmasov Dmitry 17 апреля 2012 г. 6:19
    • Изменено Abolmasov Dmitry 17 апреля 2012 г. 6:19
    16 апреля 2012 г. 12:29
  • спасибо,это помогло решить проблему

    17 апреля 2012 г. 2:18