Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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,"&#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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.042 c
3-1092632990
Mamed
2004-08-16 09:09
2004.09.12
Bag v AdODB i WebBrowser


14-1093297658
Akha
2004-08-24 01:47
2004.09.12
Задачка о спичках навеяла...


3-1092818243
nv_
2004-08-18 12:37
2004.09.12
ADOConnection: Как создать *.udl?


3-1092807632
WondeRu
2004-08-18 09:40
2004.09.12
======Распределенные СУБД===========


1-1093410172
TankMan1
2004-08-25 09:02
2004.09.12
Как запустить приложение с параметром? :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский