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

Вниз

Картинка в пункте меню   Найти похожие ветки 

 
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,"&#208;&#243;&#241;&#241;&#234;&#232;&#233 ;");
       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 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1093360476
appendix
2004-08-24 19:14
2004.09.12
синхронизация stringgrid


6-1089194918
Аноним
2004-07-07 14:08
2004.09.12
Indy (idTCPServer) + синхронизация с VCL thread


1-1093442096
Anderson
2004-08-25 17:54
2004.09.12
Изменение глубины цвета у TIcon...ПОМОГИТЕ


14-1093276002
dimonf
2004-08-23 19:46
2004.09.12
Народ, может кто знает конторы которые пишут софт для железа?


4-1091031843
Slaga
2004-07-28 20:24
2004.09.12
Работа с WinAPI