Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Как добавить иконку во всплывающее меню?   Найти похожие ветки 

 
Piter ©   (2006-03-05 02:18) [0]

Не понимаю я... Что InsertMenuItem, что InsertMenu - у них есть флаги или MFT_BITMAP, или MFT_STRING. Последний параметр дата соответственно указывает на  картинку или на строку.

А если я хочу и картинку, и строку? В общем, стандартный пункт всплывающего окна, когда слева иконка, а потом текст...


 
n0name   (2006-03-05 07:38) [1]

MFT_BITMAP
Displays the menu item using a bitmap. The low-order word of the dwTypeData member is the bitmap handle, and the cch member is ignored.
Windows 98/Me, Windows 2000/XP: MFT_BITMAP is replaced by MIIM_BITMAP and hbmpItem.

MIIM_BITMAP
Microsoft Windows 98/Windows Millennium Edition (Windows Me), Windows 2000/Windows XP: Retrieves or sets the hbmpItem member.

hbmpItem
Windows 98/Me, Windows 2000/XP: Handle to the bitmap to be displayed, or it can be one of the values in the following table. It is used when the MIIM_BITMAP flag is set in the fMask member.
HBMMENU_CALLBACK
A bitmap that is drawn by the window that owns the menu. The application must process the WM_MEASUREITEM and WM_DRAWITEM messages.
HBMMENU_MBAR_CLOSE
Close button for the menu bar.
HBMMENU_MBAR_CLOSE_D
Disabled close button for the menu bar.
HBMMENU_MBAR_MINIMIZE
Minimize button for the menu bar.
HBMMENU_MBAR_MINIMIZE_D
Disabled minimize button for the menu bar.
HBMMENU_MBAR_RESTORE
Restore button for the menu bar.
HBMMENU_POPUP_CLOSE
Close button for the submenu.
HBMMENU_POPUP_MAXIMIZE
Maximize button for the submenu.
HBMMENU_POPUP_MINIMIZE
Minimize button for the submenu.
HBMMENU_POPUP_RESTORE
Restore button for the submenu.
HBMMENU_SYSTEM
Windows icon or the icon of the window specified in dwItemData.


 
Handle   (2006-03-05 11:47) [2]

procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
TheBitmap:     TBitmap;
TheIcon:       TIcon;
NewItem:       TMenuItem;
begin
TheBitmap:= TBitmap.Create;
TheIcon:= TIcon.Create;
TheBitmap.Height := TheIcon.Height;
TheBitmap.Width := TheIcon.Width;
TheIcon.Handle := Image1.Picture.Icon.Handle;
TheBitmap.Canvas.Draw(0, 0, TheIcon);
NewItem := TMenuItem.Create(PopupMenu1);
NewItem.Caption := "ТЕКСТ";
NewItem.Bitmap:= TheBitmap;
PopupMenu1.Items.Insert(0{номер строки в PopupMenu},NewItem);
end;


 
Piter ©   (2006-03-05 13:00) [3]

Handle   (05.03.06 11:47) [2]
NewItem := TMenuItem.Create(PopupMenu1);
NewItem.Caption := "ТЕКСТ";
NewItem.Bitmap:= TheBitmap;
PopupMenu1.Items.Insert(0{номер строки в PopupMenu},NewItem);


это конференция WinApi, а не VCL.

n0name   (05.03.06 7:38) [1]

и к чему ты мне этот раздел справки процитировал?
Ты мое сообщение читал?


 
begin...end ©   (2006-03-05 13:34) [4]

> Piter ©   (05.03.06 13:00) [3]
> и к чему ты мне этот раздел справки процитировал?

Вероятно, к тому, чтобы ты его всё-таки прочитал.


 
Handle   (2006-03-05 13:39) [5]


> Piter ©   (05.03.06 13:00) [3]
> это конференция WinApi, а не VCL.


Тогда зачем задаёшь такие вопросы?
Не понимаю я... Что InsertMenuItem, что InsertMenu


 
Handle   (2006-03-05 13:42) [6]


>  Piter ©   (05.03.06 13:00) [3]
> это конференция WinApi, а не VCL.

Я всего лишь хотел тебе помочь.


 
Piter ©   (2006-03-05 14:21) [7]

begin...end ©   (05.03.06 13:34) [4]
Вероятно, к тому, чтобы ты его всё-таки прочитал.


может ты прояснишь тогда для ламеров о чем там ведется речь?

n0name   (05.03.06 7:38) [1]
MFT_BITMAP
Displays the menu item using a bitmap. The low-order word of the dwTypeData member is the bitmap handle, and the cch member is ignored


и вообще я писал проблему:

Piter ©   (05.03.06 2:18)
Последний параметр дата соответственно указывает на  картинку или на строку.

А если я хочу и картинку, и строку?


Handle   (05.03.06 13:39) [5]
Тогда зачем задаёшь такие вопросы?
Не понимаю я... Что InsertMenuItem, что InsertMenu


InsertMenuItem и InsertMenu - это WinApi функции.


 
n0name   (2006-03-05 14:52) [8]

HBMMENU_CALLBACK
A bitmap that is drawn by the window that owns the menu. The application must process the WM_MEASUREITEM and WM_DRAWITEM messages.

Делай меню ownerdrraw и делай что хочешь.


 
Piter ©   (2006-03-05 15:27) [9]

n0name   (05.03.06 14:52) [8]
Делай меню ownerdrraw и делай что хочешь.


это понятно, но рисовать вручную не хочется...
Имелось в виду - есть стандартный способ прилепить иконку?

P.S. Или может есть у кого простенький пример рисования пунктов меню на WinApi? В VCL не посылать, там замучаешься выдирать...

И еще почему не хочется связываться - судя по VCL, там столько условностей, учет какой Windows, немного разный код даже для Win98 и ME, какие-то условности...


 
kaZaNoVa ©   (2006-03-05 15:59) [10]

Piter ©   (05.03.06 2:18)

а что за задача то? свой WinRAR пишешь?


 
Piter ©   (2006-03-05 16:22) [11]

kaZaNoVa ©   (05.03.06 15:59) [10]
а что за задача то?


задача описана в сабже.


 
kaZaNoVa ©   (2006-03-05 16:43) [12]

Piter ©   (05.03.06 16:22) [11]
а чем VCL  не устраивает? хочется программу поменьше размером?))


 
Piter ©   (2006-03-05 17:23) [13]

kaZaNoVa ©   (05.03.06 16:43) [12]

программка является COM-сервером, DLL. Там не совсем свое меню строится, там добавляются пункты к уже существующему меню по известному HMENU.


 
begin...end ©   (2006-03-05 17:49) [14]

> Piter ©   (05.03.06 14:21) [7]

> может ты прояснишь тогда для ламеров о чем там ведется речь?

Это -- всегда пожалуйста.

Итак, читаем [1]. Оттуда следует, что для отображения битмапа в пункте меню нужно в структуре, описывающей его (которая используется, например, функцией InsertMenuItem), заполнить поле hbmpItem (hbmpItem -- handle to the bitmap to be displayed -- цитата!) и уведомить систему, что на это поле нужно обращать внимание при создании пункта, т.е. добавить в поле fMask значение MIIM_BITMAP (it is used when the MIIM_BITMAP flag is set in the fMask member -- цитата!).

Соответственно этому пишем код:

var
 Item: TMenuItemInfo;
 hBmp: HBITMAP;
begin
 hBmp := LoadBitmap(0, PChar(OBM_CHECK)); // стандартный битмап
 with Item do
 begin
   cbSize := sizeof(Item);
   fMask := MIIM_STRING or MIIM_BITMAP;
   dwTypeData := "Check";
   hbmpItem := hBmp;
 end;
 InsertMenuItem(PopupMenuHandle, 0, True, Item);
 TrackPopupMenu(PopupMenuHandle, ...);
end


и получаем именно то, что и было нужно: в пункте меню отображается как строка, так и картинка. В этом примере в hbmpItem был помещён дескриптор стандартного битмапа, но ничего не мешает использовать и нестандартный.

Вывод: перед тем, как упрекать отвечающих в невнимательности, иногда лучше всё же разобраться в том, что именно они (отвечающие) советуют.


 
n0name   (2006-03-05 18:46) [15]


> P.S. Или может есть у кого простенький пример рисования
> пунктов меню на WinApi? В VCL не посылать, там замучаешься
> выдирать...

В общем писал для ListBox"a, но для Menu тоже пойдет после некоторых изменений.

function ListBoxOnDraw(hListBox: HWND; lParam, wParam: Integer): boolean;
var
DWI: PDrawItemStruct;
Text: PChar;
rcItem: TRect;

crOldTextColor: COLORREF;
crOldBkColor: COLORREF;
hBrush: THandle;
begin
result:=true;

DWI:=PDrawItemStruct(lParam);
if DWI^.CtlType<>ODT_LISTBOX then exit;
Text:=PChar(DWI^.itemData);
if Text=nil then exit;

crOldTextColor:=GetTextColor(DWI^.hDC);
crOldBkColor:=GetBkColor(DWI^.hDC);

if (DWI^.itemAction or ODA_SELECT=ODA_SELECT) and (DWI^.itemState and ODS_SELECTED=ODS_SELECTED) then
 begin
  SetTextColor(DWI^.hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
  SetBkColor(DWI^.hDC, GetSysColor(COLOR_HIGHLIGHT));
  FillRect(DWI^.hDC, DWI^.rcItem, GetSysColor(COLOR_HIGHLIGHT));
 end
else
 FillRect(DWI^.hDC, DWI^.rcItem, crOldBkColor);

if (DWI^.itemAction or ODA_FOCUS=ODA_FOCUS) and (DWI^.itemState and ODS_FOCUS=ODS_FOCUS) then
 begin
  hBrush:=CreateSolidBrush(RGB(0, 0, 0));
  FrameRect(DWI^.hDC, DWI^.rcItem, hBrush);
  DeleteObject(hBrush);
 end;

rcItem:=DWI^.rcItem;
DrawText(DWI^.hDC, Text, length(Text), rcItem, DT_SINGLELINE or DT_VCENTER);

SetTextColor(DWI^.hDC, crOldTextColor);
SetBkColor(DWI^.hDC, crOldBkColor);
end;

function ListBoxOnMeasure(hListBox: HWND; lParam, wParam: Integer): boolean;
var
hDC: THandle;
MIS: PMEASUREITEMSTRUCT;
Text: PChar;
sz: TSize;
begin
result:=false;
MIS:=PMEASUREITEMSTRUCT(lParam);
if MIS^.CtlID<>ODT_LISTBOX then exit;
Text:=PChar(MIS^.itemData);
if Text=nil then exit;
hDC:=GetDC(hListBox);
GetTextExtentPoint32(hDC, Text, length(Text), sz);
ReleaseDC(hListBox, hDC);
MIS^.itemHeight:=sz.cy*2;
result:=true;
end;

>>begin...end ©   (05.03.06 17:49) [14]
Согласен, но лучше всегда предложить несколько вариантов реализации :))


 
Piter ©   (2006-03-05 19:36) [16]

begin...end ©   (05.03.06 17:49) [14]

извиняюсь, я просто не понял. У меня в справке по D отсутствует описание hbmpItem:

typedef struct tagMENUITEMINFO {    UINT    cbSize;  
   UINT    fMask;
   UINT    fType;
   UINT    fState;
   UINT    wID;
   HMENU   hSubMenu;
   HBITMAP hbmpChecked;
   HBITMAP hbmpUnchecked;
   DWORD   dwItemData;
   LPTSTR  dwTypeData;
   UINT    cch;
} MENUITEMINFO, FAR *LPMENUITEMINFO;


Также как среди флагов fMask отсутствует MIIM_BITMAP.

Видимо, n0name из MSDN цитировал, а мне так навскидку показалось, что из справки WinApi по D, которую я и так читал, и там нету нужных мне вариантов работы :)

Сори.


 
Piter ©   (2006-03-05 19:38) [17]

Видимо, справка D еще во времена Win95 была составлена и не менялась. И там соответственно отсутствуют новвоведения, начиная с Win98...
Лоханулся.


 
Eraser ©   (2006-03-05 19:40) [18]


> Piter ©

почти оффтоп:
очень советую соотв. компонент из JEDI VCL, единственный который корректно работает после RecreateWindow.


 
Eraser ©   (2006-03-05 19:41) [19]

ага, не сразу заметил [13]... предыдущий пост не читать )


 
n0name   (2006-03-06 10:08) [20]

>>Видимо, n0name из MSDN цитировал
Apr 2005



Страницы: 1 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.013 c
2-1147186661
XiAndr
2006-05-09 18:57
2006.05.28
Монопольный запуск


2-1147257446
Dyakon_Frost
2006-05-10 14:37
2006.05.28
Запись в файл в три столбца!


15-1146657828
alxx
2006-05-03 16:03
2006.05.28
Нужен программист в СПб на неполный (удаленка) рабочий день


2-1147343034
Призрак
2006-05-11 14:23
2006.05.28
TOverlapped


15-1146302203
Iv95
2006-04-29 13:16
2006.05.28
Почему программы грузятся медленнее...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский