Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизКартинка в пункте меню Найти похожие ветки
← →
parovoZZ © (2004-07-23 19:33) [0]Делаю так:
procedure PopupMenu (H_Wnd : THandle);
var
Main_Menu, Popup_Menu : HMenu;
Point : TPoint;
Picture : HBitmap;
begin
Popup_Menu := LoadMenu (hInstance, "MainMenu");
Main_Menu := GetSubMenu (Popup_Menu, 0);
GetCursorPos (Point);
SetForegroundWindow (H_Wnd);
Picture := LoadBitmap (hInstance, "Select");
SetMenuItemBitmaps (Main_Menu, IDC_TOP_MENU, MF_BYCOMMAND, 0, Picture);
if Top then CheckMenuItem (Main_Menu, IDC_TOP_MENU, MF_CHECKED) else CheckMenuItem (Main_Menu, IDC_TOP_MENU, MF_UNCHECKED);
TrackPopupMenuEx (Main_Menu, TPM_RIGHTALIGN or TPM_LEFTBUTTON, Point.X, Point.Y, H_Wnd, nil);
PostMessage (H_Wnd, WM_NULL, 0, 0);
DestroyMenu (Popup_Menu);
DeleteObject (Picture);
end;
От балды взял кружок из оперы (тот, что в менюшке), но в моём варианте он не влез в пункт (обрезался) меню, хотя в опере он помещается. Собственно вопрос - есть ли другой способ отображения картинок в менюшках?
← →
grom (2004-07-23 21:50) [1]Картинки в popupmenu
http://micsoft.narod.ru/help.html
← →
parovoZZ © (2004-07-23 22:14) [2]Не то всё, на апях надо бы.
← →
Nick Denry © (2004-07-24 01:15) [3]Надо - держи:
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;
Код конечно *ужасный*, но разобраться можно...
← →
parovoZZ © (2004-07-24 21:20) [4]А как заполнять поля PDrawItemStruct и TPAINTSTRUCT?
← →
Piter © (2004-07-25 01:03) [5]Nick Denry © (24.07.04 1:15) [3]
хоть бы в конце кучу IF"ов заменил на case...
parovoZZ © (23.07.04 19:33)
если я тебя правильно понял - так ведь в Дельфи и так можно назначать картинку на пункт меню? У меня лично в D7 можно, у тебя тоже D7 - думаю, ты тоже можешь... у каждого пункта меню есть свойство BitMap (вроде так), ну и загружаешь там картинку какую надо - Дельфи сама все рисует... зачем самому извращаться?
← →
parovoZZ © (2004-07-25 04:13) [6]Дык, не влезает в пункт картинка, максимум 12х12 пикселей.
← →
Nick Denry © (2004-07-26 00:00) [7]2Piter © (25.07.04 01:03) [5]
Предупредил сразу - код ужасный - см. мой пост
2parovoZZ ©
Соотвествующие структуры заполнять не надо - их для тебя заполнит ядро, а насчет размера - в BitBlt в DrawMenuItem указываешь не 16, 16 а 12,12 - чистый АПИ. Более красивый и более функциональный код на АСМе:;Create menu pens and brushes for menu ***********************************************
CreateMenuPensAndBrushes proc
invoke CreatePen, PS_NULL,0,0
mov MNull_Pen, eax
RGB 128,128,255
invoke CreatePen, PS_SOLID,0,eax
mov MColor_Pen, eax
RGB 224,224,255
invoke CreateSolidBrush, eax
mov MColor_Brush, eax
RGB 255,255,255
invoke CreateSolidBrush, eax
mov MWhite_Menu_Brush, eax
invoke GetSysColor,COLOR_BTNFACE
push eax
invoke CreateSolidBrush, eax
mov mCOLOR_MENU_BRSH, eax
pop eax
invoke CreatePen,PS_SOLID,0,eax
mov MColor_Menu_Pen, eax
ret
CreateMenuPensAndBrushes endp
; Delete menu pens and brushes *****************************************
DeleteMenuPensAndBrushes proc
;Deleting Menu brushs and pens
invoke DeleteObject, MNull_Pen;
invoke DeleteObject, MColor_Pen
invoke DeleteObject, MColor_Menu_Pen
invoke DeleteObject, MColor_Brush;
invoke DeleteObject, MWhite_Menu_Brush;
invoke DeleteObject, mCOLOR_MENU_BRSH
ret
DeleteMenuPensAndBrushes endp
;Owner Draw menu functions *******************************************************************
;Function for drawing menu item (any one) *****************************************************
;This use as program core function. If you need to add some element into the your menu you ***********
;just need invoke this function in the WM_DRAWITEM message. Use the menu identificator ***********
DrawMenuItem proc MDRWITSTR : DRAWITEMSTRUCT
LOCAL TDC : HDC
LOCAL SelectedObj : HGDIOBJ;
LOCAL TextLen : DWORD
LOCAL need_jmp : BYTE
LOCAL TextToDraw : DWORD
push eax
invoke FillRect, MDRWITSTR.hdc,addr MDRWITSTR.rcItem, MWhite_Menu_Brush
;.if TIMER1 != 0
; invoke KillTimer, wnd, TIMER_ID1
; invoke ShowWindow, wnd, SW_HIDE
;.endif
mov need_jmp, 0
item_draw:
;Getting device contex ***********************************************
invoke CreateCompatibleDC, 0;
mov TDC, eax
.if need_jmp == 0
; invoke WindowFromDC,MDRWITSTR.hdc
; invoke GetClientRect,eax, addr CRect
invoke SelectObject,MDRWITSTR.hdc, MColor_Menu_Pen
invoke SelectObject, MDRWITSTR.hdc, mCOLOR_MENU_BRSH
dec MDRWITSTR.rcItem.left
invoke Rectangle, MDRWITSTR.hdc, MDRWITSTR.rcItem.left,MDRWITSTR.rcItem.top,20,MDRWITSTR.rcItem.bottom
inc MDRWITSTR.rcItem.left
.endif
.if MDRWITSTR.itemID > 2100
add MDRWITSTR.rcItem.top, 3
sub MDRWITSTR.rcItem.bottom, 3
add MDRWITSTR.rcItem.left, 20
invoke DrawEdge, MDRWITSTR.hdc, addr MDRWITSTR.rcItem, BDR_SUNKENOUTER , BF_RECT;
invoke DeleteDC, TDC
jmp gonext
.endif
;Get vitmap handle q ***********************************************
invoke SelectObject, TDC, MENUBMPH
;Biltig (Getting bitmaps) ************************************************
;Get menu position
mov ebx, MDRWITSTR.itemID
sub ebx, IDDM_PREVIOUS
;Gettting text for the menu
push ebx
mov ecx, ebx
mov eax, StrMaxSize
mul ecx
lea ebx, szMenuStr[eax]
mov TextToDraw, ebx
invoke lstrlen, TextToDraw
mov TextLen, eax
pop ebx
;Getting Bitmaps
.if MDRWITSTR.itemID == IDDM_HTENABLED
.if HtActive == FALSE
add ebx, 1
.endif
.endif
mov eax, 16
mul ebx
;tamerlan bitblt
push SRCCOPY
push NULL
push eax
push TDC
push side_bmp
push side_bmp
mov eax,MDRWITSTR.rcItem.top
inc eax
push eax
mov eax,MDRWITSTR.rcItem.left
add eax,2
push eax
push MDRWITSTR.hdc
call BitBlt
;Fill TextRect from the DrawItem structure rcItem ***********************************************
add MDRWITSTR.rcItem.left, 22
.if need_jmp == 0
RGB 255,255,255
invoke SetBkColor, MDRWITSTR.hdc, eax
.endif
;CheckSetColor.txt crosslink if needed
;In next line we draw the text ******************************************************************
invoke DrawText,MDRWITSTR.hdc, TextToDraw, TextLen , addr MDRWITSTR.rcItem,\
DT_SINGLELINE or DT_VCENTER or DT_LEFT;
;Restore rect
sub MDRWITSTR.rcItem.left, 22
;Release Device Context ******************************************************************
invoke DeleteDC, TDC
cmp need_jmp ,1
jz ret_back
;Change items state ******************************************************************
.if MDRWITSTR.itemAction==ODA_SELECT
invoke SelectObject,MDRWITSTR.hdc, MNull_Pen
mov eax, MDRWITSTR.itemState
mov edx, ODS_SELECTED
and eax, edx
.if eax != 0
invoke SetTextColor ,MDRWITSTR.hdc, 0
RGB 224,224,255
invoke SetBkColor, MDRWITSTR.hdc, eax
invoke SelectObject,MDRWITSTR.hdc, MColor_Pen
invoke SelectObject, MDRWITSTR.hdc,MColor_Brush
mov ebx, MDRWITSTR.rcItem.left
.else
invoke SelectObject,MDRWITSTR.hdc, MColor_Menu_Pen
invoke SelectObject, MDRWITSTR.hdc, mCOLOR_MENU_BRSH
invoke Rectangle, MDRWITSTR.hdc, MDRWITSTR.rcItem.left,\
MDRWITSTR.rcItem.top,20,MDRWITSTR.rcItem.bottom
RGB 255,255,255
invoke SetBkColor, MDRWITSTR.hdc, eax
invoke SelectObject,MDRWITSTR.hdc, MWhite_Menu_Brush
invoke SelectObject,MDRWITSTR.hdc, MNull_Pen
mov ebx, MDRWITSTR.rcItem.left
add ebx, 20
.endif
invoke Rectangle, MDRWITSTR.hdc, ebx, \
MDRWITSTR.rcItem.top,\
MDRWITSTR.rcItem.right,\
MDRWITSTR.rcItem.bottom
mov need_jmp, 1
jmp item_draw
ret_back:
.endif
gonext:
pop eax
ret
DrawMenuItem endp
***********************
.ELSEIF uMsg==WM_DRAWITEM
mov esi, lParam
lea edi, dis
mov ecx, sizeof dis
rep movsb
invoke DrawMenuItem, dis
.ELSEIF uMsg==WM_MEASUREITEM
mov edx, lParam ; Get pointer to MEASUREITEMSTRUCT
mov eax, (MEASUREITEMSTRUCT ptr [edx]).itemID
.if eax > 2100
mov (MEASUREITEMSTRUCT ptr [edx]).itemWidth, 130
mov (MEASUREITEMSTRUCT ptr [edx]).itemHeight, 7
ret
.endif
mov (MEASUREITEMSTRUCT ptr [edx]).itemWidth, 130
mov (MEASUREITEMSTRUCT ptr [edx]).itemHeight, 18
Если АСМ знаешь - то тут понятнее...
← →
parovoZZ © (2004-07-26 00:36) [8]Так вот меня и ломает, почему кружок 14х14 в опере помещается в пунктик, а на апях - нет.
-------------------------
Ну ясно, будем разбераться.
ГЫ)) ACM не знаю.
← →
parovoZZ © (2004-07-27 21:27) [9]Ну примерчик бы привели, а то не получается никак.
← →
parovoZZ © (2004-07-30 21:20) [10]Я тут подумал и придумал - а что такое АСМ? Первый раз слышу.
А где перехватывать сообщения WM_DRAWITEM, WM_MEASUREITEM и кто кому их посылает? Как не пытался, не перехватить мне эти мессаги.
← →
parovoZZ © (2004-07-31 21:12) [11]Ну, плиззз
← →
nikkie © (2004-08-01 17:25) [12]RTFM MFT_OWNERDRAW
← →
parovoZZ © (2004-08-01 20:07) [13]Что то всё загадками какими-то говорите.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.034 c