Текущий архив: 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.49 MB
Время: 0.418 c