Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
14-1100022933
SniZ
2004-11-09 20:55
2004.11.28
Пример работы с ed2k


1-1100452965
dolphin
2004-11-14 20:22
2004.11.28
список имен файлов и папок


1-1100141359
Rat
2004-11-11 05:49
2004.11.28
как "открыть с помощью..."?


8-1094032671
X-Disa
2004-09-01 13:57
2004.11.28
Скроллбары в TImgView32


1-1100660988
Bechard
2004-11-17 06:09
2004.11.28
RTL update 2 for Delphi 6 Ent