Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Перехват Подсветки меню


Автор: MAXIQ 20.3.2008, 15:23
    Внимание вопрос! Как перехватить подсветку меню и вывести свой bmp?. В меню bmp  загружен, а на подсветке он получается как негатив сам себе, но это не устраивает так как проитворечит первоначальному замыслу. На WM_MENUSELECT изображение в меню меняется на новый bmp. Но подсветка все равно остается негативом, но уже по отношению к новому bmp. Если кто знает как добраться до подсветки то HELP!!!!

Автор: BorisVorontsov 20.3.2008, 17:25
MF_OWNERDRAW

Автор: korian 21.3.2008, 03:23
Цитата(MAXIQ @  20.3.2008,  14:23 Найти цитируемый пост)
На WM_MENUSELECT изображение в меню меняется на новый bmp

или давать туда BMP в негативе  smile 

Автор: MAXIQ 23.3.2008, 15:00
Спасибо на добром слове...

Автор: MAXIQ 1.4.2008, 13:02
А вот теперь новый вопрос: менюга отрисовалась и работает как надо, однако стили подобраны на халяву и не факт что все будет нормально работать на других машинах и системах, может кто-нибудь может пояснить? См. Комментарий в коде.
Код

case WM_DRAWITEM:
        lpDrawItem = (LPDRAWITEMSTRUCT) lParam;
        if(lpDrawItem->itemID==IDM_Bitmap)
                {
                hDCMenu=lpDrawItem->hDC;
                hCompatibleBitmapDC=CreateCompatibleDC(hDCMenu);
               memset(&RectMenuButton,0,sizeof(RectMenuButton));
               //RectMenuButton=lpDrawItem->rcItem;
               if((lpDrawItem->itemState==257)||(lpDrawItem->itemState==320)) /*Вот стили, которые я обнаружил подсматривая в отладчике за меню которое было создано обычным способом и применил к своему, однако вот в чем беда, таких значений не определено, это что-то составное из нескольких стилей, но как я ни пробовал воспроизводить это значение путем комбинации различных объявленных стилей ничего не вышло может кто сумеет растолковать??*/
                        {
                        if(lpDrawItem->itemAction==ODA_SELECT)hOldMenuBitmap=SelectObject(hCompatibleBitmapDC,hMenuButtonPress);
                        else hOldMenuBitmap=SelectObject(hCompatibleBitmapDC,hMenuButtonSel);
                        }
                else hOldMenuBitmap=SelectObject(hCompatibleBitmapDC,hMenuButton);
                //
                memset(&RectMenuButton,0,sizeof(RectMenuButton));
                RectMenuButton=lpDrawItem->rcItem;
                SetBkMode(hDCMenu,TRANSPARENT);
                BitBlt(hDCMenu,RectMenuButton.left,RectMenuButton.top,RectMenuButton.right,RectMenuButton.bottom,hCompatibleBitmapDC,0,0,SRCCOPY);
                TextOut(hDCMenu,RectMenuButton.left+45,RectMenuButton.top+5,"Text",6);
                SelectObject(hOldMenuBitmap,hCompatibleBitmapDC);
                DeleteDC(hCompatibleBitmapDC);
                }
        break;

Автор: SeregaLBN 1.4.2008, 13:38
Ты, как я помню, не совсем верно пользуешся стилями...
Зачем использовать непонятные цифры 257, 230 ???
Ведь есть понятные дэфайны.
Я, для своего рисования, пользовался ими так:
Код

   DRAWITEMSTRUCT di;
///....
   bool isCheck  = !!(di.itemState & ODS_CHECKED); // отмечен ли пункт меню?
   bool isSelect    = !!(di.itemState & ODS_SELECTED);
   bool isGrayed    = !!(di.itemState & ODS_GRAYED);
// ну а далее - рисование... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)