Guys --
somebody have a sample ?
I mean exactly first level ("File", "Edit" ?)
------------------
E-MAIL: [email protected]
somebody have a sample ?
I mean exactly first level ("File", "Edit" ?)
------------------
E-MAIL: [email protected]
ModifyMenu hMnu, 0, %MF_BYPOSITION OR %MF_STRING OR %MF_OWNERDRAW, %NEWID, BYVAL %NULL
Dim mii As Static MENUITEMINFO mii.cbsize = Len(MENUITEMINFO) mii.fMask = %MIIM_ID Or %MIIM_SUBMENU Or %MIIM_TYPE mii.fType = %MFT_OWNERDRAW mii.wID = k * 100 + 10 mii.hSubMenu = hMenuPopup(k) InsertMenuItem hMenu, mii.wID, %FALSE, mii
ModifyMenu hMnu, 0, %MF_BYPOSITION OR %MF_STRING OR %MF_OWNERDRAW, %IDMENUFILE, BYVAL %NULL
CASE %WM_MEASUREITEM 'Get menu item size IF wParam = 0 THEN 'a menu is calling LOCAL hDC AS LONG, hFont AS LONG, lpmis AS MEASUREITEMSTRUCT PTR, sz AS SIZEL lpmis = lParam 'Copy pointer into our structure hDC = GetDC(hWnd) hFont = SelectObject(hDC, GetStockObject(%DEFAULT_GUI_FONT)) GetMenuString hMnu, @lpmis.itemID, zText, SIZEOF(zText), 0 GetTextExtentPoint32 hDC, zText, LEN(zText), sz @lpmis.itemWidth = 30 + sz.cx 'bitmap is 16 wide + some space = 30, + text width.. @lpmis.itemHeight = Max&(20, sz.cy + 2) 'bitmap is 15 heigh, plus frames, so use minimun 20 SelectObject hDC, hFont ReleaseDC hWnd, hDC Function = %TRUE: Exit Function END IF
#Compile Exe #Register None #Dim All #Include "WIN32API.INC" Function mDrawMenu(ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Local lpmis As MEASUREITEMSTRUCT Ptr Local lpdis As DRAWITEMSTRUCT Ptr Local hdc As Long Local SizeA As SizeL Local Txt As Asciiz * 255 Select Case wMsg Case %WM_MEASUREITEM lpmis = lparam If @lpmis.itemId = 110 Then SetWindowText hWnd, "MEASUREITEM" hdc = GetDC(hWnd) Txt = "Id"+ Str$(@lpmis.itemId) GetTextExtentPoint32 hdc, Txt, Len(Txt), SizeA @lpmis.itemWidth = 8 + sizeA.cx @lpmis.itemHeight = sizeA.cy ReleaseDC hWnd, hdc Case %WM_DRAWITEM lpdis = lparam ' If @lpdis.itemId = 110 Then SetWindowText hWnd, "DRAWITEM" Txt = "Id=" + Str$(@lpdis.itemId) If (@lpdis.itemState And %ODS_SELECTED) Then FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_HIGHLIGHT) SetTextColor @lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHTTEXT) Else FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_MENU) SetTextColor @lpdis.hDC, GetSysColor(%COLOR_MENUTEXT) End If SetBkMode @lpdis.hDC, %TRANSPARENT TextOut @lpdis.hDC, 8 + @lpdis.rcItem.nleft, @lpdis.rcItem.nTop, Txt, Len(Txt) ', ByVal 0 End Select End Function CallBack Function DlgProc Dim hMenuPopup(5) As Long Static hmenu As Long Local i As Long, k As Long Select Case CbMsg Case %WM_INITDIALOG hMenu = CreateMenu For k = 1 To 5 hMenuPopup(k) = CreateMenu For i = 0 To 5 InsertMenu hMenuPopup(k), %MF_BYCOMMAND, %MF_STRING, k * 100 + i, "" ModifyMenu hmenuPopup(k), k * 100 + i, %MF_BYCOMMAND Or %MF_OWNERDRAW, k * 100 + i, ByVal 0 Next Dim mii As Static MENUITEMINFO mii.cbsize = Len(MENUITEMINFO) mii.fMask = %MIIM_ID Or %MIIM_TYPE Or %MIIM_SUBMENU mii.fType = %MFT_OWNERDRAW mii.wID = k * 100 + 10 mii.hSubMenu = hMenuPopup(k) InsertMenuItem hMenu, mii.wID, %FALSE, mii Next SetMenu CbHndl, hMenu Case %WM_MEASUREITEM, %WM_DRAWITEM mDrawMenu CbHndl, CbMsg, CbWparam, CbLparam Function = 1 End Select End Function Function PbMain Local hDlg As Long Dialog New 0, "Test", , , 400, 200, %WS_CAPTION Or %WS_OVERLAPPEDWINDOW To hDlg Dialog Show Modal hDlg Call DlgProc End Function
Case %WM_INITDIALOG LOCAL zText AS ASCIIZ * 10 Dim mii As Static MENUITEMINFO mii.cbsize = Len(MENUITEMINFO) mii.fMask = %MIIM_ID Or %MIIM_TYPE Or %MIIM_SUBMENU mii.fType = %MFT_STRING hMenu = CreateMenu zText = "" For k = 1 To 5 hMenuPopup(k) = CreateMenu For i = 0 To 5 InsertMenu hMenuPopup(k), %MF_BYCOMMAND, %MF_STRING, k * 100 + i, "" ModifyMenu hmenuPopup(k), k * 100 + i, %MF_BYCOMMAND Or %MF_OWNERDRAW, k * 100 + i, ByVal 0 Next mii.wID = k * 100 + 10 mii.hSubMenu = hMenuPopup(k) mii.dwTypeData = VARPTR(zText) mii.cch = LEN(zText) InsertMenuItem hMenu, mii.wID, %FALSE, mii Next SetMenu CbHndl, hMenu For k = 1 To 5 ModifyMenu hMenu, k - 1, %MF_BYPOSITION Or %MF_OWNERDRAW, k * 100 + 10, ByVal 0 NEXT
#Compile Exe #Register None #Dim All #Include "WIN32API.INC" Function mDrawMenu(ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Local lpmis As MEASUREITEMSTRUCT Ptr Local lpdis As DRAWITEMSTRUCT Ptr LOCAL MMI AS MENUITEMINFO Local hdc As Long, hIcon AS LONG Local SizeA As SizeL Local Txt As Asciiz * 255 Select Case wMsg Case %WM_MEASUREITEM lpmis = lparam MMI.cbSize = LEN(MMI) MMI.fMask = %MF_STRING OR %MIIM_TYPE MMI.cch = SIZEOF(Txt) MMI.dwTypeData = VARPTR(Txt) CALL GetMenuItemInfo(GetMenu(hWnd), @lpmis.itemId, 0&, BYVAL VARPTR(MMI)) hdc = GetDC(hWnd) GetTextExtentPoint32 hdc, Txt, Len(Txt), SizeA @lpmis.itemWidth = sizeA.cx + 16 @lpmis.itemHeight = sizeA.cy + 2 ReleaseDC hWnd, hdc Case %WM_DRAWITEM lpdis = lparam MMI.cbSize = LEN(MMI) MMI.fMask = %MF_STRING OR %MIIM_TYPE MMI.cch = SIZEOF(Txt) MMI.dwTypeData = VARPTR(Txt) CALL GetMenuItemInfo(GetMenu(hWnd), @lpdis.itemId, 0&, BYVAL VARPTR(MMI)) If (@lpdis.itemState And %ODS_SELECTED) Then FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_INFOBK) SetTextColor @lpdis.hDC, GetSysColor(%COLOR_INFOTEXT) Else FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_MENU) SetTextColor @lpdis.hDC, GetSysColor(%COLOR_MENUTEXT) End If SetBkMode @lpdis.hDC, %TRANSPARENT TextOut @lpdis.hDC, @lpdis.rcItem.nleft + 22, @lpdis.rcItem.nTop, Txt, Len(Txt) ', ByVal 0 Select Case @lpdis.itemID CASE 105 : hIcon = LoadIcon(0, BYVAL %IDI_HAND) 'sub-menu item.. CASE 110 : hIcon = LoadIcon(0, BYVAL %IDI_APPLICATION) 'top-menu items.. CASE 210 : hIcon = LoadIcon(0, BYVAL %IDI_ASTERISK) CASE 310 : hIcon = LoadIcon(0, BYVAL %IDI_EXCLAMATION) CASE 410 : hIcon = LoadIcon(0, BYVAL %IDI_QUESTION) CASE 510 : hIcon = LoadIcon(0, BYVAL %IDI_WINLOGO) CASE ELSE : EXIT FUNCTION END SELECT DrawIconEx @lpdis.hDC, @lpdis.rcItem.nleft + 2, @lpdis.rcItem.nTop + 1, _ hIcon, 16, 16, 0, ByVal 0, %DI_NORMAL End Select End Function CallBack Function DlgProc Dim hMenuPopup(5) As Long Static hmenu As Long Local i As Long, k As Long Select Case CbMsg Case %WM_INITDIALOG LOCAL zText AS ASCIIZ * 100 Dim mii As Static MENUITEMINFO hMenu = CreateMenu zText = "" For k = 1 To 5 '--- SUB-MENUS ---------------------- hMenuPopup(k) = CreateMenu For i = 0 To 5 IF k = 3 THEN zText = "Long sub-menu string, id "+ Str$(k * 100 + i) ELSE zText = "Id "+ Str$(k * 100 + i) END IF InsertMenu hMenuPopup(k), %MF_BYCOMMAND, %MF_STRING, k * 100 + i, zText ModifyMenu hmenuPopup(k), k * 100 + i, %MF_BYCOMMAND Or %MF_OWNERDRAW, k * 100 + i, ByVal 0 Next '--- TOP-LEVEL MENUS ---------------------- mii.cbsize = Len(MENUITEMINFO) mii.fMask = %MIIM_ID Or %MIIM_TYPE Or %MIIM_SUBMENU mii.fType = %MFT_STRING mii.wID = k * 100 + 10 mii.hSubMenu = hMenuPopup(k) If k = 2 Then zText = "Long menu string, id "+ Str$(k * 100 + 10) ELSE zText = "Id "+ Str$(k * 100 + 10) END IF mii.dwTypeData = VARPTR(zText) mii.cch = LEN(zText) InsertMenuItem hMenu, mii.wID, %FALSE, mii Next SetMenu CbHndl, hMenu For k = 1 To 5 ModifyMenu hMenu, k * 100 + 10, %MF_OWNERDRAW, k * 100 + 10, ByVal 0 NEXT Case %WM_MEASUREITEM, %WM_DRAWITEM mDrawMenu CbHndl, CbMsg, CbWparam, CbLparam Function = 1 End Select End Function Function PbMain Local hDlg As Long Dialog New 0, "Test", , , 400, 200, %WS_OVERLAPPEDWINDOW To hDlg Dialog Show Modal hDlg Call DlgProc End Function
SetMenu CbHndl, hMenu For k = 1 To 5 ModifyMenu hMenu, k * 100 + 10, %MF_OWNERDRAW, k * 100 + 10, ByVal 0 Next
We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, and to analyze site activity. For additional details, refer to our Privacy Policy.
By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.
Comment