Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Внизстиль MF_OWNERDRAW в PopUp меню - как при появлении перерисовать? Найти похожие ветки
← →
VirEx © (2006-01-28 13:30) [0]обычный код как всегда:
HandlePopUp:=CreatePopupMenu;
InsertMenu(HandlePopUp,MF_BYPOSITION,MF_STRING or MF_OWNERDRAW ,1,PChar("item1");
InsertMenu(HandlePopUp,MF_BYPOSITION,MF_STRING or MF_OWNERDRAW ,2,PChar("item2");
TrackPopupMenu(HandlePopUp,TPM_LEFTALIGN, p.X, p.Y,0,wnd,nil);
при появлении мне нужно перерисовать все элементы - item"ы при появлении меню, потому-что при появлении меню, оное является "чистым", кроме конечно первого item1, т.к. он по умолчанию выделяется, т.е. главное окно wnd получает WM_DRAWITEM для первого элемента (где я его и рисую)
WM_INITMENUPOPUP и WM_INITMENU вызываются до появления меню, т.е. дескриптора контекста рисования ещё нет.
как решить данный сабжжж?
← →
VirEx © (2006-01-28 16:04) [1]Удалено модератором
Примечание: Создание пустых сообщений
← →
Nick Denry © (2006-01-29 01:44) [2]Не совсем корректный код, писался очень давно.
.............
{Функция отрисовки элемента меню}
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;
............
{ОКОННАЯ ПРОЦЕДУРА ГЛАВНОГО ОКНА}
Function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
Begin
case msg of
..................
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).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;
.................
Соответственно, за if вместо case также не пинать, но пример достаточен, для того, что бы понять суть работы
← →
VirEx © (2006-01-29 16:35) [3]
> [2] Nick Denry © (29.01.06 01:44)
сенкс посмотрю :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c