Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

Owner-Draw Меню   Найти похожие ветки 

 
Comp ©   (2004-10-16 17:07) [0]

Здравствуйте, уважаемые мастера. Разрешите задать вам вопрос, с которым бьюсь уже 3-й день. Есть у меня в ресурсе меню. Загружаю. Но надо бы итемы самому рисовать, т.е. поставить как-то стиль MFT_OWNERDRAW   :

1)Такой стиль можно легко поставить, если делаешь AppendMenu. Но как поменять его на существующих итемах, которые загружены из ресурса?

2)Как этот стиль работает с субменю? Поставлю я его на итем, допустим номер2, с которым связано некое субменю. Это субменю будет иметь стиль, который у итема номер 2 или еще свой старый?

3) Пожалуйста, приведите пример использования GetMenuItemInfo и SetMenuItemInfo

Буду искренне благодарен за ответы!


 
Nick Denry ©   (2004-10-17 00:22) [1]

Не идеально, но пример рабочий:


{Функция отрисовки элемента меню}
Function DrawMenuItem(PDrwItStruct: PDrawItemStruct;PaintStruct:TPAINTSTRUCT;
HDrawBitmap,HDrawBitmapH: HBITMAP;TextToDraw: string):bool;
var Tdc: hdc;
TempBMP:HBITMAP;
TextRect : TRect;
{brush:hbrush;}
PixRef:TcolorRef;
x,y:word;

Begin
tdc:=CreateCompatibleDC(PaintStruct.hdc);
SelectObject(tdc,HDrawBitmap);
for x:=0 to 16 do begin
for y:=0 to 16 do begin
PixRef:=GetPixel(tdc,x,y);
if PixRef=RGB(200,200,200) then begin
setpixel(tDC,x,y,GetSysColor(COLOR_MENU));
end;
end;
end;
BitBlt(PDrwItStruct^.hDC,PDrwItStruct^.rcItem.Left+2,PDrwItStruct^.rcItem.Top+1,16,
16,tdc,0,0,SrcCopy);
TextRect:=PDrwItStruct^.rcItem;
TextRect.Left:=TextRect.Left+22;
DrawText(PDrwItStruct^.hDC,PChar(TextToDraw),Length(TextToDraw),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_LEFT);
deletedc(tdc);
if PDrwItStruct^.itemAction=ODA_SELECT then
begin
{  MNull_Pen,
 MColor_Pen,
 MColor_Menu_Pen     : HPEN;

 MColor_Brush,
 MCOlor_menu_Brush   : HBRUSH;}

DeleteObject(SelectObject(PDrwItStruct^.hdc, MNull_Pen));

    if (PDrwItStruct^.itemState and ODS_SELECTED) <> 0  then begin
    {SetBkColor(PDrwItStruct^.HDC, GetSysColor(COLOR_HIGHLIGHT));
    DeleteObject(SelectObject(PDrwItStruct^.HDC,GetSysColorBrush(COLOR_HIGHLIGHT)));
    DeleteObject(SelectObject(PDrwItStruct^.hDC,CreatePen(PS_SOLID ,0,GetSysColor(COLOR_MENUTEXT))));}
    SetTextColor(PDrwItStruct^.HDC, RGB(0,0,0));
    SetBkColor(PDrwItStruct^.HDC, RGB(192,192,255));

    DeleteObject(SelectObject(PDrwItStruct^.HDC,MColor_Brush));
    DeleteObject(SelectObject(PDrwItStruct^.hDC,MColor_Pen));

    {swapBitmaps}
    TempBMP:=HDrawBitmapH;
    HDrawBitmapH:=HDrawBitmap;
    HDrawBitmap:=TempBMP;

  end else begin

DeleteObject(SelectObject(PDrwItStruct^.HDC, MColor_menu_Brush));
DeleteObject(SelectObject(PDrwItStruct^.hdc,   MColor_Menu_Pen));
end;

Rectangle(PDrwItStruct^.HDC, PDrwItStruct^.rcItem.Left,
PDrwItStruct^.rcItem.Top
,PDrwItStruct^.rcItem.Right,
PDrwItStruct^.rcItem.Bottom);
tdc:=CreateCompatibleDC(PaintStruct.hdc);
SelectObject(tdc,HDrawBitmap);

{for x:=0 to 16 do begin
for y:=0 to 16 do begin
PixRef:=GetPixel(tDC,x,y);
if PixRef=RGB(200,200,200) then begin
setpixel(tDC,x,y,GetSysColor(COLOR_MENU));
end;
end;
end;}
BitBlt(PDrwItStruct^.hDC,PDrwItStruct^.rcItem.Left+2,PDrwItStruct^.rcItem.Top+1,16,
16,tdc,0,0,SrcCopy);
TextRect:=PDrwItStruct^.rcitem;
TextRect.Left:=TextRect.Left+22;
DrawText(PDrwItStruct^.hDC,PChar(TextToDraw),Length(TextToDraw),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_LEFT);
deletedc(tdc);
end;
Result:=True;
End;

WM_MEASUREITEM:
     begin
    if PMeasureItemStruct(lparam).CtlType<>odt_menu then halt;
       PMeasureItemStruct(lparam).itemWidth:=78;
       PMeasureItemStruct(lparam).itemHeight:=18;

      end;

   WM_DRAWITEM:
     begin

       if PDrawItemStruct(lparam).hwndItem=button1 then begin

       DrawButton(PDrawItemStruct(lparam),btn_pstr,bmpBTNExit,bmpBTNExitP,32);
       End;

       if PDrawItemStruct(lparam).hwndItem=button2 then begin
       DrawButton(PDrawItemStruct(lparam),btn_pstr,bmpBTNHide,bmpBTNHideP,32);
       End;

       if PDrawItemStruct(lparam).hwndItem=button3 then begin
       DrawButton(PDrawItemStruct(lparam),btn_pstr,bmpBTNSave,bmpBTNSaveP,32);
       End;

       if PDrawItemStruct(lparam).hwndItem=button4 then begin
       DrawButton(PDrawItemStruct(lparam),btn_pstr,bmpBTNHelp,bmpBTNHelpP,16);
       End;

       if PDrawItemStruct(lparam).itemID=ID_OPENCD then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOpenCD,bmpMenuOpenCDH,menu_opencd);
       end;

       if PDrawItemStruct(lparam).itemID=ID_CloseCD then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuCloseCD,bmpMenuCloseCDH,menu_closecd);
       end;

       if PDrawItemStruct(lparam).itemID=ID_OPTIONS then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOptions,bmpMenuOptionsH,menu_settings);
       end;

       if PDrawItemStruct(lparam).itemID=ID_HIDE then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuHide,bmpMenuHideH,menu_hide);
       end;

       if PDrawItemStruct(lparam).itemID=ID_HELP then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuHelp,bmpMenuHelpH,menu_help);
       end;

       if PDrawItemStruct(lparam).itemID=ID_EXIT then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuExit,bmpMenuExitH,menu_exit);
       end;

       if PDrawItemStruct(lparam).itemID=ID_RUSSIAN then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLangRus,bmpMenuLangRusH,"Русский");
       end;

       if PDrawItemStruct(lparam).itemID=ID_ENGLISH then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLangEng,bmpMenuLangEngH,"English");
       end;

       if PDrawItemStruct(lparam).itemID=ID_LANGUAGE then begin
       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLang,bmpMenuLangH,  menu_langauge);
       end;

     end;


 
Comp ©   (2004-10-17 13:41) [2]


>  [1] Nick Denry ©   (17.10.04 00:22)


Спасибо большое!!!


 
Nick Denry ©   (2004-10-17 13:50) [3]

2Comp ©   (17.10.04 13:41) [2]

На здоровье :)


 
Comp ©   (2004-10-17 15:22) [4]


>  [3] Nick Denry ©   (17.10.04 13:50)


На здоровье кушать предлагают...
 
А ты чё, уже в Read Only побывал?


 
Comp ©   (2004-10-17 15:48) [5]

Мужики, я прошарил.

Точнее, понял, что я человек ленивый и невнимательный.

А проблема была вот в чем.

Я соизволил изменять пункт меню,к которому даже не обратился, т.е. не получил на него указатель.

Получал хендл главного меню, того, который МенюБар, и тщетно пытался изменить какой-то пункт.
А нужно было вставить еще одну нужную строчку - что у этого МенюБара есть субменюшки, которые как раз и выпадают, когда мы выбираем нужную позицию МенюБара. Вот как раз хендлы этих субменю надо было указывать в ф-ях GetMenuItemInfo и SetMenuItemInfo...

Всем спасибо за внимание, модераторам прошу извинить за бесцельную ветку.


 
Nick Denry ©   (2004-10-17 22:58) [6]

Comp ©   (17.10.04 15:22) [4]

А ты чё, уже в Read Only побывал?

Если ты о сайте моем - то это шутка - пока не довелось... :)

(Спасибо И.Ш. :))

На здоровье кушать предлагают...

Нет, просто поверье есть, если сказать человеку "На здоровье" вместо "Пожалуйста", то он типа болеть не будет. :)


 
Comp ©   (2004-10-18 16:05) [7]


>  [6] Nick Denry ©   (17.10.04 22:58)


Ясно. Значит спасибо большое.

Да, зашел на твой сайт просто ради интереса. Как всегда. Иногда бывает и на статейку интересную нарвешся на каком-нить сайте... Не говоря о готовых примерах... :)


 
Nick Denry ©   (2004-10-18 20:15) [8]

Comp ©   (18.10.04 16:05) [7]

Не дошло пока до этого, есть несколько интересных проектов, но в связи с отсутствием свободного времени, они заморожены, хотя есть одна идея, если интересно, могу на мыло написать...


 
Comp ©   (2004-10-18 20:25) [9]

Дане, спасибо. Я ща пока с меню разбираюсь.
 Вообще начал программирование на API не с лучшей позиции - изучаю интерфейс. Тут своих заморочек предостаточно - хочу, чтобы так было легко, как на VCL. (хотя оно и так не сложно). Но все равно, с непривычки...



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.055 c
8-1094074341
zero-g
2004-09-02 01:32
2004.11.28
Строка состояния в видео проигрывателе


1-1099653949
clampo
2004-11-05 14:25
2004.11.28
Шрифт из папки


14-1100239466
WondeRu
2004-11-12 09:04
2004.11.28
Подскажите, чем можно мониторить запросы браузера...


14-1100179508
}|{yk
2004-11-11 16:25
2004.11.28
А как подключиться к инету через встроенный модем телефона?


3-1098919357
Wital
2004-10-28 03:22
2004.11.28
Change ADO Langdriver Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский