Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2011, 00:17   #1
xdozorx
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 15
По умолчанию Значок в меню

Подскажите как сделать значок в меню.
xdozorx вне форума Ответить с цитированием
Старый 19.11.2011, 16:39   #2
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию

Если интересует именно средствами WinAPI, то вот два варианта.
Код:
Global hMenu.l,MenuFont.l 
Global SelFrontColor.l, SelBkColor.l 

Structure MyItem 
hFont.l 
Text.s 
hIco.l 
EndStructure 

;Je nach Anzahl der Menьeintrдge dimensionieren 
Global Dim pmyitem.MyItem(3) 


Procedure wcb(wnd, msg, wParam, lParam) 
    fSelected = #False 
    
    If msg = #WM_MEASUREITEM 
        hdc = GetDC_(wnd) 
        *lpmis.MEASUREITEMSTRUCT = lParam 
        *lmyitem.MyItem = *lpmis\itemData 
        hFontOld = SelectObject_(hdc,*lmyitem\hFont) 
        GetTextExtentPoint32_(hdc,*lmyitem\Text,Len(*lmyitem\Text),@size.SIZE); 
        *lpmis\itemWidth = size\cx 
        *lpmis\itemHeight = size\cy 
        SelectObject_(hdc,hOldFont) 
        ReleaseDC_(wnd,hdc) 
        ProcedureReturn  #True 
        
    ElseIf msg = #WM_DRAWITEM 
        *lpdis.DRAWITEMSTRUCT = lParam 
        *llmyitem.MyItem = *lpdis\itemData 
        hOldFont = SelectObject_(*lpdis\hdc,*llmyitem\hFont) 
        If *lpdis\itemState & #ODS_SELECTED 
            SetTextColor_(*lpdis\hDC,SelFrontColor) 
            SetBkColor_(*lpdis\hDC,SelBkColor) 
            fSelected = #True 
            dwCheckXY = GetMenuCheckMarkDimensions_() 
            wCheckX = (dwCheckXY >> 16 & $FFFF) + 10 
            nTextX = wCheckX + *lpdis\rcItem\left 
            nTextY = *lpdis\rcItem\top 
            ExtTextOut_(*lpdis\hDC,nTextX,nTextY,#ETO_OPAQUE,*lpdis\rcItem,*llmyitem\Text,Len(*llmyitem\Text),0) 
            DrawIconEx_(*lpdis\hDC,*lpdis\rcItem\left,*lpdis\rcItem\top,*llmyitem\hIco,14,14,0,0,3) 
            SelectObject_(*lpdis\hDC,hOldFont) 
        Else 
            dwCheckXY = GetMenuCheckMarkDimensions_() 
            wCheckX = (dwCheckXY >> 16 & $FFFF) + 10 
            nTextX = wCheckX + *lpdis\rcItem\left 
            nTextY = *lpdis\rcItem\top 
            ExtTextOut_(*lpdis\hDC,nTextX,nTextY,#ETO_OPAQUE,*lpdis\rcItem,*llmyitem\Text,Len(*llmyitem\Text),0) 
            DrawIconEx_(*lpdis\hDC,*lpdis\rcItem\left,*lpdis\rcItem\top,*llmyitem\hIco,14,14,0,0,3) 
            SelectObject_(*lpdis\hDC,hOldFont) 
        EndIf 
        
        ProcedureReturn  #True 
        
    ElseIf msg = #WM_DESTROY 
        For i = 0 To 3 
            DeleteObject_(pmyitem(i)\hFont) 
            DeleteObject_(pmyitem(i)\hIco) 
        Next i 
        FreeFont(0) 
        PostQuitMessage_(0) 
        
    Else 
        ProcedureReturn #PB_ProcessPureBasicEvents 
        
    EndIf 
EndProcedure 

If OpenWindow(0, 100, 150, 195, 260, "PureBasic - OwnMenu", #PB_Window_SystemMenu) 
    
    ;Menu anlegen 
    If CreateMenu(0, WindowID(0)) 
        MenuTitle("File") 
        MenuItem( 1, "") 
        MenuItem( 2, "") 
        MenuItem( 3, "") 
        MenuBar() 
        MenuItem( 4, "") 
    EndIf 
    
    ;Menu mopdufizieren 
    hMenu = GetMenu_(WindowID(0)) 
    ModifyMenu_(hMenu,1,#MF_BYCOMMAND|#MF_OWNERDRAW,1,pmyitem(0)) 
    ModifyMenu_(hMenu,2,#MF_BYCOMMAND|#MF_OWNERDRAW,2,pmyitem(1)) 
    ModifyMenu_(hMenu,3,#MF_BYCOMMAND|#MF_OWNERDRAW,3,pmyitem(2)) 
    ModifyMenu_(hMenu,4,#MF_BYCOMMAND|#MF_OWNERDRAW,4,pmyitem(3)) 
    
    ;ItemArray mit Text,Font und Icon fuellen 
    MenuFont = LoadFont(0,"Ms Sans Serif",10) 
    
    pmyitem(0)\hFont = MenuFont 
    pmyitem(0)\Text = "Load" + Space(5) 
    ExtractIconEx_("shell32.dll",4,0,@s,1) 
    pmyitem(0)\hIco = s 
    
    pmyitem(1)\hFont = MenuFont 
    pmyitem(1)\Text = "Save" + Space(5) 
    ExtractIconEx_("shell32.dll",0,0,@s,1) 
    pmyitem(1)\hIco = s 
    
    pmyitem(2)\hFont = MenuFont 
    pmyitem(2)\Text = "Save As...." + Space(5) 
    ExtractIconEx_("shell32.dll",2,0,@s,1) 
    pmyitem(2)\hIco = s 
    
    pmyitem(3)\hFont = MenuFont 
    pmyitem(3)\Text = "Quit" + Space(5) 
    ExtractIconEx_("shell32.dll",31,0,@s,1) 
    pmyitem(3)\hIco = s 
    
    ;Farben setzen 
    SelFrontColor = $00FFFF;Textfarbe selektiert 
    SelBkColor = $010101;Hintergrundfarbe selektiert 
    
    
    SetWindowCallback(@wcb()) 
    Repeat 
        Select WaitWindowEvent() 
        Case #PB_Event_Menu 
            Select EventMenu() 
            Case 4 ; Quit 
                Quit = 1 
                Default 
                MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0) 
            EndSelect 
        Case #WM_CLOSE 
            Quit = 1 
        EndSelect 
    Until Quit = 1 
EndIf 
End

Это чуть посложнее, но и возможностей побольше - полная прорисовка меню. Исходник не уместился, поэтому прикрепил к сообщению.
Вложения
Тип файла: rar Иконка в меню.rar (42.5 Кб, 18 просмотров)

Последний раз редактировалось *PB*; 19.11.2011 в 16:47.
*PB* вне форума Ответить с цитированием
Старый 19.11.2011, 16:46   #3
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию

(Продолжение предыдущего поста, т. к. ограничение в 5000 символов).

Но код будет намного компактнее, если иконку добавлять в меню с помощью встроенных функций библиотек среды.
Код:
If OpenWindow(0, 200, 200, 200, 100, "Image menu Example")
  If CreateImageMenu(0, WindowID(0))    ; menu creation starts....
    MenuTitle("Project")
    MenuItem(1, "Open"   +Chr(9)+"Ctrl+O", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 46))
    MenuItem(2, "Save"   +Chr(9)+"Ctrl+S", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 23))
    MenuItem(3, "Save as"+Chr(9)+"Ctrl+A", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 3))
    MenuItem(4, "Close"  +Chr(9)+"Ctrl+C", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 12))
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
*PB* вне форума Ответить с цитированием
Старый 19.11.2011, 16:56   #4
xdozorx
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 15
По умолчанию

спасибо за пример.Пробывал делать, не получилось, вот что намудрил
Код:
case WM_CREATE:
        SetMenuItemBitmaps(hMenu,ID_CUT,MF_BYCOMMAND,(HBITMAP)LoadImage(NULL,"icon1.ico",IMAGE_BITMAP,16,16,LR_LOADFROMFILE),0);
                 break;
 
 case WM_CONTEXTMENU:
         hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU2));            
         hMenuTrackPopup=GetSubMenu(hMenu, 0);
                 TrackPopupMenu(hMenuTrackPopup,TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
         LOWORD(lParam), HIWORD(lParam),0,hWnd,NULL);
            break;
xdozorx вне форума Ответить с цитированием
Старый 19.11.2011, 17:17   #5
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию

Устанавливать значок нужно после загрузки меню.
Код:
 case WM_CONTEXTMENU:
         hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU2)); 
        SetMenuItemBitmaps(hMenu,ID_CUT,MF_BYCOMMAND,(HBITMAP)LoadImage(NULL,"icon1.ico",IMAGE_BITMAP,16,16,LR_LOADFROMFILE),0);           
         hMenuTrackPopup=GetSubMenu(hMenu, 0);
                 TrackPopupMenu(hMenuTrackPopup,TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
         LOWORD(lParam), HIWORD(lParam),0,hWnd,NULL);
            break;
*PB* вне форума Ответить с цитированием
Старый 19.11.2011, 17:42   #6
xdozorx
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 15
По умолчанию

всеравно не работает, я наверно установку значка не правильно делаю
xdozorx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значок misher Общие вопросы Delphi 4 16.06.2010 13:10
Значок в трей doniyor Общие вопросы Delphi 6 25.01.2010 02:02
значок репутации OCTAGRAM О форуме и сайтах клуба 1 26.04.2009 18:53
значок программы DeDoK Общие вопросы Delphi 2 22.11.2007 22:37
Значок ехе! KORT Общие вопросы Delphi 3 19.07.2007 13:14