Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как на Delphi посредством WIN32API создать MainMenu [D7, WinXP]


chak_xakep ©   (2008-03-21 16:42:00) 

Здравствуйте мастера программирования помогите со следующими проблемами:
1.Следует создать MainMenu; - сделал
2.Загрузить в каждый из подпунктов меню Изображение HBITMAP
Ниже приведен мой исходный код главного окна, с процедурой обработки сообщений окна разобрался:

procedure CreateMainWindow;
var
 AMessage: TMsg;
 AWindowClassEx: TWndClassEx;
begin
 MainMenu := CreateMenu;
 AWindowClassEx.cbSize:= sizeOf(TWndClassEx);
 AWindowClassEx.lpszClassName:= WINDOW_CLASS_NAME;
 AWindowClassEx.style:= CS_VREDRAW or CS_HREDRAW;
 AWindowClassEx.hInstance:= HInstance;
 AWindowClassEx.lpfnWndProc:= @HandlerToMainWindow;
 AWindowClassEx.cbClsExtra:= 0;
 AWindowClassEx.cbWndExtra:= 0;
 AWindowClassEx.hIcon:= LoadIcon(hInstance, MakeIntResource('MAINICON'));
 AWindowClassEx.hIconSm:= LoadIcon(hInstance, MakeIntResource('MAINICON'));
 AWindowClassEx.hCursor:= LoadCursor(0, idc_Arrow);
 AWindowClassEx.hbrBackground:= 16;
 AWindowClassEx.lpszMenuName:= nil;
 if RegisterClassEx(AWindowClassEx) = 0
 then
   PostQuitMessage(0)
 else
 begin
   MenuFile:= CreatePopupMenu;
   MenuAbout:= CreatePopupMenu;
   AWindowHandle:= CreateWindowEx(0,
                                  AWindowClassEx.lpszClassName,
                                  WINDOW_TITLE,
                                  DS_MODALFRAME or
                                  WS_MINIMIZEBOX or
                                  WS_CAPTION or
                                  WS_SYSMENU,
                                  ALeft, ATop,
                                  WINDOW_WIDTH, WINDOW_HEIGHT,
                                  0,
                                  MainMenu,
                                  HInstance,
                                  nil);
   CreateMenuItem(MainMenu, MenuFile, 'Файл', 0, MENU_FILE, False);
   CreateMenuItem(MenuFile, 0, 'Выход', 0, SUBMENU_EXIT, False);
   CreateMenuItem(MainMenu, MenuAbout, 'Справка', 0, MENU_ABOUT, False);
   CreateMenuItem(MenuAbout, 0, 'О программе...', 0, SUBMENU_ABOUT, False);
   DrawMenuBar(AWindowHandle);
   CreateControls;
   RegisterHotkey(AWindowHandle, 1, MOD_ALT,ord('A'));
   if AWindowHandle = 0
   then
     PostQuitMessage(0)
   else
   begin
     ShowWindow(AWindowHandle, SW_SHOWNORMAL);
     while GetMessage(AMessage, 0, 0, 0) do
     begin
       TranslateMessage(AMessage);
       DispatchMessage(AMessage);
     end; {while}
   end; {else}
 end; {else}
end;

Вопрос, как загрузить картинки на каждый пункт меню??? Пожалуйста дайте хотя бы ссылки на счет этой темы!!!


tesseract   (2008-03-21 17:18:00) [1]


> О как... подфорсило :)


Бывает :-) хорошо что на MFC под delphi не пишут :-)


{RASkov}   (2008-03-21 17:13:00) [2]

> tesseract FOREVER!!!

> tesseract УВАЖУХА!!!


> tesseract ©

О как... подфорсило :)


chak_xakep   (2008-03-21 17:03:00) [3]

О, догнал в эту сторону рыть??? tesseractFOREVER!!!

function CreateMenuItem(hMenu, SubMenu: HMENU; Cap: PChar;
                       _uID, _wID: UINT; Sep: Boolean): Boolean;
var
 Mi: MENUITEMINFO;
begin
 with Mi do
   begin
     cbSize:= SizeOf(Mi);
     fMask:= MIIM_STATE or MIIM_TYPE or MIIM_SUBMENU or MIIM_ID;
     if not Sep
       then fType:= MFT_STRING
       else fType:= MFT_SEPARATOR;
     fState:= MFS_ENABLED;
     wID:= _wID;
     hSubMenu:= SubMenu;
     dwItemData:= 0;
     dwTypeData:= Cap;
     cch:= SizeOf(Cap);
   end;
 Result:= InsertMenuItem(hMenu, _uID, false, Mi);
end;

tesseractУВАЖУХА!!! <br>


tesseract   (2008-03-21 16:59:00) [4]

ну вот твоя структура на pascal.

 tagMENUITEMINFOA = packed record
   cbSize: UINT;
   fMask: UINT;
   fType: UINT;             { used if MIIM_TYPE}
   fState: UINT;            { used if MIIM_STATE}
   wID: UINT;               { used if MIIM_ID}
   hSubMenu: HMENU;         { used if MIIM_SUBMENU}
   hbmpChecked: HBITMAP;    { used if MIIM_CHECKMARKS}
   hbmpUnchecked: HBITMAP;  { used if MIIM_CHECKMARKS}
   dwItemData: DWORD;       { used if MIIM_DATA}
   dwTypeData: PAnsiChar;      { used if MIIM_TYPE}
   cch: UINT;               { used if MIIM_TYPE}
   hbmpItem: HBITMAP;       { used if MIIM_BITMAP}
 end;

Если не понял зачем это, возвращайся на VCL или к чтению документации. Потому, как пойдут вопросы про HBITMAP и тп.

ЗЫ: VCL не зря писали.


chak_xakep   (2008-03-21 16:53:00) [5]

tesseractэто Сишный код, а пример есть???


tesseract   (2008-03-21 16:49:00) [6]


> Вопрос, как загрузить картинки на каждый пункт меню??? Пожалуйста
> дайте хотя бы ссылки на счет этой темы!!!


Ты не на API программируешь. А на чём-то странном. На API делаеться через CreateMenu / InsertMenuItem и там есть структура MENUITEMINFO

typedef struct tagMENUITEMINFO {
 UINT    cbSize;
 UINT    fMask;
 UINT    fType;
 UINT    fState;
 UINT    wID;
 HMENU   hSubMenu;
 HBITMAP hbmpChecked;     <-- раз
 HBITMAP hbmpUnchecked;  <-- два
 ULONG_PTR dwItemData;
 LPTSTR  dwTypeData;
 UINT    cch;
 HBITMAP hbmpItem;    
} MENUITEMINFO, *LPMENUITEMINFO;


Наверх

Титульная страница Поиск, карта сайта Написать письмо