TrackPopupMenu. Проблема полного отображения меню.
От: alexsvk  
Дата: 09.09.11 19:58
Оценка:
Приведу код:

...
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    HBRUSH shape_brush, old_brush;
    RECT rc;
    static HMENU main_menu; 
    static HMENU shape_contextmenu, colour_contextmenu;
    static BOOLEAN show_shape;
    static ShapeData shape_data;
    static TCHAR* idm_resize_value [] = { _T("Decrease!"), _T("Increase!") };
    static const int W = 200, H = 100;
    int x0, y0, x1, x2, y1, y2;
    std::basic_string<TCHAR> msg;
    int brightness;
    POINT pt[4]; // for rhomb
    POINT ptInScreen, ptInClient;

    switch(uMsg)
    {
    case WM_CREATE:
        main_menu = GetMenu(hWnd);
        shape_contextmenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_SHAPECONTEXT));
        //shape_contextmenu = GetSubMenu(shape_contextmenu, 0);
        colour_contextmenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_COLOURCONTEXT));
        //colour_contextmenu = GetSubMenu(colour_contextmenu, 0);

        SetMenuDefaultItem(GetSubMenu(main_menu, 0), IDM_OPEN, FALSE);
        CheckMenuRadioItem(GetSubMenu(main_menu, 1), IDM_SHOW, IDM_HIDE, IDM_SHOW, MF_BYCOMMAND);
        CheckMenuRadioItem(shape_contextmenu, ID_RECTANGLE, ID_RHOMB, ID_RECTANGLE, MF_BYCOMMAND);
        CheckMenuRadioItem(colour_contextmenu, ID_DARK, ID_LIGHT, ID_DARK, MF_BYCOMMAND);

        show_shape = TRUE;
        shape_data.id_shape = ID_RECTANGLE;
        shape_data.intensity = ID_DARK;
        shape_data.shapeSize = ShapeData::MIN;
        break;

    case WM_CONTEXTMENU:
        ptInScreen.x = LOWORD(lParam);
        ptInScreen.y = LOWORD(lParam);
        ptInClient = ptInScreen;
        ScreenToClient(hWnd, &ptInClient);
        GetClientRect(hWnd, &rc);

        if( ptInClient.x < rc.right / 2 )
            TrackPopupMenu(shape_contextmenu, 0, ptInScreen.x, ptInScreen.y, 0, hWnd, NULL);
        else
            TrackPopupMenu(colour_contextmenu, 0, ptInScreen.x, ptInScreen.y, 0, hWnd, NULL);
        break;
...


В результате отображается контекстное меню в виде прямоугольника (см. справа налево) шириной в несколько пикселей и длиной (высотой), соответствующей длине(высоте) при создании в редакторе меню. При этом пункты меню отрабатывают команды.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.