Конференция "WinAPI" » Как на Delphi посредством WIN32API создать MainMenu [D7, WinXP]
 
  • chak_xakep (21.03.08 16:42) [0]
    Здравствуйте мастера программирования помогите со следующими проблемами:
    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 © (21.03.08 16:49) [1]

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


    Ты не на 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;
  • chak_xakep (21.03.08 16:53) [2]
    tesseract это Сишный код, а пример есть???
  • tesseract © (21.03.08 16:59) [3]
    ну вот твоя структура на 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 (21.03.08 17:03) [4]
    О, догнал в эту сторону рыть??? tesseract FOREVER!!!

    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>
  • {RASkov} © (21.03.08 17:13) [5]
    > tesseract FOREVER!!!

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


    > tesseract ©

    О как... подфорсило :)
  • tesseract © (21.03.08 17:18) [6]

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


    Бывает :-) хорошо что на MFC под delphi не пишут :-)
 
Конференция "WinAPI" » Как на Delphi посредством WIN32API создать MainMenu [D7, WinXP]
Есть новые Нет новых   [134431   +16][b:0][p:0.002]