Italia
Foro

MDI Anwendung

 

Detlef
Jagolski
Ciao,

Frage an unsere Experten:

Eine Anwendung übergibt die Botschaft WM_MDISETMENU, um das Menü des MDI-Rahmenfensters (Multidokumentschnittstelle), das Pop-up-Menü des Fensters oder beide auszutauschen.
Ist es possibile das Menü als Owner Draw festzulegen. Alle anderen Menüpunkte sind Owner Draw.
Ich habe bisher keine API Funktion gefunden.

...und wenn ja, wie geht das...
Saluto

Detlef
KompilierenMarkierenSeparieren
Proc MDIChildProc

    Parameters Wnd&, Message&, wParam&, lParam&

    If Message& = ~WM_CREATE

    EndIf

    If Message& = ~WM_MDIACTIVATE

        If wParam& = &FALSE

            hChildMenu& = ~GetSubMenu(hMenu&,1)
            hNewChildMenu& =                 MakeLong(hChildMenu&,~GetSubMenu(~GetMenu(Wnd&),1))
            SendMessage(hWndClient&,~WM_MDISETMENU,0,hNewChildMenu&)
            ~DrawMenuBar(hNewChildMenu&)
            ………………………………………………..

        EndIf

    ElseIf Message& = ~WM_CLOSE

        SendMessage(hWndClient&,~WM_MDIDESTROY,Wnd&,0)
        cc& = cc& - 1

    Else

        Return ~DefMDIChildProc(Wnd&, Message&, wParam&, lParam&)

    EndIf

EndProc

 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
24.08.2005  
 



Ich glaube ich habe die Frage nicht wirklich verstanden.

Salve, iF.

PS: Bitte Codes mit dem
KompilierenMarkierenSeparieren umfassen.

Salve, iF.
 
24.08.2005  
 




Detlef
Jagolski
Hallo IF,

Also ich möchte alle Menüpunkte als Owner Draw mit Icon darstellen, nicht das Standard Menü. Da aber das Menü per die MDI Fenster vom System erstellt wird, kann ich diese Menüpunkte nicht ändern.

Saluto

Detlef
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
24.08.2005  
 



Ok - das habe ich verstanden.

Frage1: Muß es gleich OD sein - weil schöne Icons bekommst Du auch ohne OD in die Menüpunkte...
Frage2: Hast Du schon ein OD-Menü entwickelt?

Salve, iF.
 
24.08.2005  
 




Detlef
Jagolski
Hallo iF,

Frage1: Das soll es schon sein.
Frage2: OD-Menu habe ich entwickelt.
KompilierenMarkierenSeparieren
Struct MenuItemInfo = cbSize&, fMask&, fType&, fState&, wID&, hSubMenu&, hbmpChecked&, hbmpUnchecked&, dwItemData&, dwTypeData&, cch&
Struct MeasureItemStruct = ~MEASUREITEMSTRUCT
Struct DrawItemStruct = ~DRAWITEMSTRUCT
Struct Rect = ~RECT
Struct Size = ~SIZE
Struct MenuData = MenuText$(255), IconIndex&, MenuPopUp&, MenuFont&, fType&
Struct ICONINFO = ~ICONINFO
Struct BITMAP = ~BITMAP
Declare MenuItemInfo#
Declare lpmis#
Declare lpdis#
Declare Rect#
Declare TRect#
Declare GRect#
Declare Size#
Declare MenuData#[150]
Declare MyMenuData#
Declare MenuText#
Declare IconName$
Declare hImagelist&
Declare hImagelist2&
Declare CheckedImage&
Declare hIcon&
Declare hIconGray&
Declare hDll&
Declare hBitmapDll&
Declare BitmapFile$
Declare Iczz%
Declare Iccnt%
Declare Menu%
Declare MenuDC&
Declare MenuIcon&
Declare dwCheckXY&
Declare nTextWidth&
Declare nTextHeight&
Declare nImageWidth&
Declare nImageHeight&
Declare wCheckX&
Declare Bitmap$
Declare XMbgBMP&
Declare XMBrush&
Declare ItemText$
Declare MenuPen&
Declare MenuFont&
Declare OldMenuPen&
Declare hOldFont&
Declare LeftItext$
Declare RightItext$
Declare Color_IconBack&
Declare Color_Line&
Declare Color_Selected&
Declare Color_FrameRect&
Declare S#
Declare ToolBar&
Declare ToolinfoButton#
Declare t#
Declare Text#
Declare TipControl&
Dim MenuItemInfo#,MenuItemInfo
Dim lpmis#,24
Dim lpdis#,DrawItemStruct
Dim Rect#,Rect
Dim TRect#,Rect
Dim GRect#,Rect
Dim Size#,Size
Dim MenuData#[],MenuData
Dim MyMenuData#,MenuData
Dim MenuText#,255
Menu% = 0

Proc CreateGrayscaleIcon

    Parameters hIcon&
    Declare IconInfo#
    Declare IconInfo2#
    Declare Bitmap#
    Declare bRetValue&
    Declare hMainDC&
    Declare hMemDC1&
    Declare hMemDC2&
    Declare dwWidth&
    Declare dwHeight&
    Declare hOldBmp1&
    Declare hOldBmp2&
    Declare dwLoopY&
    Declare dwLoopX&
    Declare crPixel&
    Declare byNewPixel&
    Declare hGrayIcon&
    Dim IconInfo#,ICONINFO
    Dim IconInfo2#,ICONINFO
    Dim Bitmap#,BITMAP
    bRetValue& = ~GetIconInfo(hIcon&,IconInfo#)
    Case bRetValue& = 0: Return 0
    hMainDC& = ~GetDC(0)
    hMemDC1& = ~CreateCompatibleDC(hMainDC&)
    hMemDC2& = ~CreateCompatibleDC(hMainDC&)
    ~GetObject(IconInfo#.hbmColor&, SizeOf(Bitmap#), Bitmap#)
    dwWidth&  = IconInfo#.xHotspot& * 2
    dwHeight& = IconInfo#.yHotspot& * 2
    IconInfo2#.hbmColor& = ~CreateBitmap(dwWidth&, dwHeight&, Bitmap#.bmPlanes%,Bitmap#.bmBitsPixel%,0)
    hOldBmp1& = ~SelectObject(hMemDC1&, IconInfo#.hbmColor&)
    hOldBmp2& = ~SelectObject(hMemDC2&, IconInfo2#.hbmColor&)
    ~BitBlt(hMemDC2&,0,0,dwWidth&,dwHeight&,hMemDC1&,0,0,~SRCCOPY)
    crPixel& = 0
    byNewPixel& = 0
    dwLoopY& = 0

    Whileloop dwHeight&

        dwLoopX& = 0

        Whileloop dwWidth&

            crPixel& = ~GetPixel(hMemDC1&,dwLoopX&,dwLoopY&)
            byNewPixel& = (GetRValue(crPixel&) + GetGValue(crPixel&) + GetBValue(crPixel&)) / 3
            ~SetPixel(hMemDC2&,dwLoopX&,dwLoopY&,RGB(byNewPixel&,byNewPixel&,byNewPixel&))
            Inc dwLoopX&

        EndWhile

        Inc dwLoopY&

    EndWhile

    ~SelectObject(hMemDC1&, hOldBmp1&)
    ~SelectObject(hMemDC2&, hOldBmp2&)
    IconInfo2#.hbmMask& = IconInfo#.hbmMask&
    IconInfo2#.fIcon& = 1
    hGrayIcon& = ~CreateIconIndirect(IconInfo2#)
    ~DeleteObject(IconInfo2#.hbmColor&)
    ~DeleteObject(IconInfo2#.hbmMask&)
    ~DeleteObject(IconInfo#.hbmColor&)
    ~DeleteObject(IconInfo#.hbmMask&)
    ~DeleteDC(hMemDC1&)
    ~DeleteDC(hMemDC2&)
    ~ReleaseDC(0,hMainDC&)
    Dispose IconInfo#
    Dispose IconInfo2#
    Dispose Bitmap#
    Return hGrayIcon&

EndProc

Proc MeasureItem

    MenuDC& = ~GetDC(Wnd&)
    lpmis# = lParam&

    If Long(lpmis#,0) = ~ODT_MENU

        MyMenuData#             = Long(lParam&,20)
        dwCheckXY&              = ~GetMenuCheckMarkDimensions()
        nImageWidth&            = HiWord(dwCheckXY&)
        nImageHeight&           = LoWord(dwCheckXY&)
        wCheckX&                = HiWord(dwCheckXY&)+ 10
        ItemText$               = MyMenuData#.MenuText$
        MenuFont&               = MyMenuData#.MenuFont&
        hOldFont&               = ~SelectObject(MenuDC&,MenuFont&)
        ~GetTextExtentPoint32(MenuDC&,Addr(ItemText$),Len(ItemText$),Size#)

        If MyMenuData#.fType& = ~MFT_SEPARATOR

            Case Int(Val($WinVer)) = 4: Long lpmis#,12 = Size#.cx& + wCheckX& + nImageWidth& + 45
            Case Int(Val($WinVer)) = 4: Long lpmis#,16 = Size#.cy& + 10
            Case Int(Val($WinVer)) = 5: Long lpmis#,12 = Size#.cx&
            Case Int(Val($WinVer)) = 5: Long lpmis#,16 = Size#.cy& - 5

        Else

            Long lpmis#,12  = Size#.cx& + wCheckX& + nImageWidth& + 45
            Long lpmis#,16 = Size#.cy& + 10
            ~SelectObject(%HDC,hOldFont&)

        EndIf

        Return 1

    EndIf

EndProc

Proc DrawItem

    lpdis# = lParam&

    If Long(lpdis#,0) = ~ODT_MENU

        MyMenuData#     = Long(lpdis#,44)
        nTextWidth&     = wCheckX& + Long(lpdis#,28)
        nTextHeight&    = Long(lpdis#,32)
        MenuIcon&       = MyMenuData#.IconIndex&
        ItemText$       = MyMenuData#.MenuText$
        MenuFont&       = MyMenuData#.MenuFont&
        Long Rect#,0    = Long(lpdis#,28)
        Long Rect#,4    = Long(lpdis#,32)
        Long Rect#,8    = Long(lpdis#,36)
        Long Rect#,12   = Long(lpdis#,40)
        Long GRect#,0   = Long(lpdis#,28)
        Long GRect#,4   = Long(lpdis#,32)
        Long GRect#,8   = Long(lpdis#,36) - Long(Rect#,8) + 25
        Long GRect#,12  = Long(lpdis#,40)
        Long TRect#,0   = Long(lpdis#,28) + wCheckX& + 8
        Long TRect#,4   = Long(lpdis#,32) + 4
        Long TRect#,8   = Long(lpdis#,36) - 1
        Long TRect#,12  = Long(lpdis#,40)
        ~FillRect(lpdis#.HDC&,GRect#,~CreateSolidBrush(Color_IconBack&))

        If XMBrush&

            ~SelectObject(lpdis#.HDC&,XMBrush&)
            ~PatBlt(lpdis#.hdc&,nImageWidth& + 12,Long(lpdis#,32),Long(lpdis#,36),Long(lpdis#,40) - Long(lpdis#,32),~PATCOPY)

        EndIf

        If MyMenuData#.fType& = ~MFT_SEPARATOR

            MenuPen& = ~CreatePen(~PS_SOLID,1,Color_Line&)
            OldMenuPen& = ~SelectObject(lpdis#.HDC&,MenuPen&)
            ~MoveToEx(lpdis#.HDC&,Long(TRect#,0),Long(TRect#,4),0)
            ~LineTo(lpdis#.HDC&,Long(TRect#,8),Long(TRect#,4))
            ~SelectObject(lpdis#.HDC&,OldMenuPen&)

        EndIf

        If Long(lParam&,16) & ~ODS_GRAYED

            ~ImageList_Draw(hImagelist2&,MenuIcon&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)
            ~SetTextColor(lpdis#.HDC&,~GetSysColor(~COLOR_GRAYTEXT))

        Else

            If Long(lParam&,16) & ~ODS_SELECTED

                ~FillRect(lpdis#.HDC&,Rect#,~CreateSolidBrush(Color_Selected&))
                ~FrameRect(lpdis#.HDC&,Rect#,~CreateSolidBrush(Color_FrameRect&))
                ~SetBkColor(lpdis#.HDC&,RGB(128,128,255))
                ~ImageList_Draw(hImagelist&,MenuIcon&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)

            Else

                If XMBrush&

                    ~SelectObject(lpdis#.HDC&,XMBrush&)
                    ~PatBlt(lpdis#.hdc&,nImageWidth& + 12,Long(lpdis#,32),Long(lpdis#,36),Long(lpdis#,40) - Long(lpdis#,32),~PATCOPY)

                Else

                    ~FillRect(lpdis#.HDC&,Rect#,~GetSysColorBrush(~COLOR_MENU))
                    ~FillRect(lpdis#.HDC&,GRect#,~CreateSolidBrush(Color_IconBack&))

                EndIf

                ~ImageList_Draw(hImagelist&,MenuIcon&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)

            EndIf

        EndIf

        If Long(lParam&,16) & ~ODS_DISABLED

            ~ImageList_Draw(hImagelist2&,MenuIcon&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)
            ~SetTextColor(lpdis#.HDC&,~GetSysColor(~COLOR_GRAYTEXT))

        Else

            ~ImageList_Draw(hImagelist&,MenuIcon&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)
            ~SetTextColor(lpdis#.HDC&,~GetSysColor(~COLOR_MENUTEXT))

        EndIf

        If Long(lParam&,16) & ~ODS_CHECKED

            ~ImageList_Draw(hImagelist&,CheckedImage&,lpdis#.HDC&,Long(lpdis#,28)+4,Long(lpdis#,32)+4,~ILD_TRANSPARENT)

        EndIf

        hOldFont& = ~SelectObject(lpdis#.HDC&,MenuFont&)
        ~SetBkMode(lpdis#.HDC&,~TRANSPARENT)

        IfNot MyMenuData#.fType& = ~MFT_SEPARATOR

            LeftItext$ = Substr$(Itemtext$,1,"	") + "   "
            RightItext$ = Trim$(Substr$(Itemtext$,2,"	")) + "    "
            ~DrawText(lpdis#.HDC&,Addr(LeftItext$),Len(LeftItext$),TRect#,~DT_LEFT)

            IfNot RightItext$ = "  "

                ~DrawText(lpdis#.HDC&,Addr(RightItext$),Len(RightItext$),TRect#,~DT_RIGHT)

            EndIf

            ~SelectObject(lpdis#.HDC&,hOldFont&)

        EndIf

    EndIf

EndProc

Proc CreateImageList

    Parameters IconFile$
    IconFile$ = Upper$(IconFile$)
    hDll&     = UseDll(IconFile$)
    Iccnt%    = IconCount(IconFile$) + 1
    hImagelist& = ~ImageList_Create(16,16,~ILC_COLOR32 | ~ILC_MASK,500,500)
    hImagelist2& = ~ImageList_Create(16,16,~ILC_COLOR32 | ~ILC_MASK,500,500)
    Clear Iczz%

    WhileNot Iczz% = Iccnt%

        IconName$ = "#" + Trim$(Str$(Iczz%))
        hIcon& = ~LoadIcon(hDll&,Addr(IconName$))
        ~ImageList_AddIcon(hImagelist&,hIcon&)
        CreateGrayscaleIcon hIcon&
        hIconGray& = @&(0)
        ~ImageList_AddIcon(hImagelist2&,hIconGray&)
        Inc Iczz%

    Wend

    FreeDLL hDll&

EndProc

Proc ChangeMenuItem

    Parameters hMenu&, pMenu&, Index&, Font&

    with MenuItemInfo#

        .cbSize&          = SizeOf(MenuItemInfo#)
        .fMask&           = ~MIIM_DATA | ~MIIM_TYPE | ~MIIM_ID
        .dwTypeData&      = MenuText#
        .cch&             = SizeOf(MenuText#)

    endwith

    ~GetMenuItemInfo(hMenu&,pMenu&,~MF_BYPOSITION,MenuItemInfo#)

    with MenuData#[Menu%]

        .MenuText$        = String$(MenuText#,0)
        .IconIndex&       = Index&
        .MenuPopUp&       = ~GetSubMenu(hMenu&,pMenu&)
        .MenuFont&        = Font&
        .fType&           = MenuItemInfo#.fType&

    endwith

    If MenuItemInfo#.fType& = ~MFT_SEPARATOR

        with MenuItemInfo#

            .fType&           = ~MFT_OWNERDRAW
            .fMask&           = ~MIIM_DATA | ~MIIM_TYPE
            .dwItemData&      = MenuData#[Menu%]

        endwith

        ~SetMenuItemInfo(hMenu&,pMenu&,~MF_BYPOSITION,MenuItemInfo#)

    Else

        with MenuItemInfo#

            .fType&           = ~MFT_OWNERDRAW
            .fMask&           = ~MIIM_DATA | ~MIIM_TYPE
            .dwItemData&      = MenuData#[Menu%]
            .dwTypeData&      = MenuText#

        endwith

        ~SetMenuItemInfo(hMenu&,pMenu&,~MF_BYPOSITION,MenuItemInfo#)

    EndIf

    Inc Menu%

EndProc

Proc SetCheckedImage

    Parameters Checked&
    CheckedImage& = Checked&

EndProc

Proc SetMenuColors

    Parameters IconBackColor&, LineColor&, SelectedColor&, FrameRectColor&
    Color_IconBack&  = IconBackColor&
    Color_Line&      = LineColor&
    Color_Selected&  = SelectedColor&
    Color_FrameRect& = FrameRectColor&

EndProc

Proc SetMenuStandardColors

    Color_IconBack&  = RGB(212,208,200)
    Color_Line&      = RGB(212,208,200)
    Color_Selected&  = RGB(128,128,255)
    Color_FrameRect& = RGB(0,0,255)

EndProc

Proc SetMenuBitmap

    Parameters BitmapFile$, Bitmap$
    hBitmapDll&     = UseDll(BitmapFile$)

    If Bitmap$ <> ""

        Case XMbgBmp& : ~DeleteObject(XMbgBmp&)
        Case XMBrush& : ~DeleteObject(XMBrush&)
        XMbgBMP& = Create("hPic",hBitmapDll&,Bitmap$)
        XMBrush& = ~CreatePatternBrush(XMbgBmp&)
        FreeDLL hBitmapDll&

    EndIf

EndProc

Proc DisposeXPMenu

    Dispose MenuItemInfo#
    Dispose MenuText#
    Dispose MenuData#[]
    Dispose MyMenuData#
    Dispose lpdis#
    Dispose lpmis#
    Dispose Rect#
    Dispose GRect#
    Dispose TRect#
    Dispose Size#
    ~ImageList_Destroy(hImagelist&)
    ~ImageList_Destroy(hImagelist2&)
    ~DeleteDC(MenuDC&)
    ~DeleteObject(MenuPen&)
    ~DeleteObject(OldMenuPen&)

EndProc

 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
24.08.2005  
 



Lol - jetzt hat es Klick bei mir gemacht.

Ich weiß zwar wonach Du suchst - Du möchtest so wie ich es verstanden habe Dein ODMenü als _default setzen - quasi einen Handletausch durchführen - ob dies so gedacht ist weiß ich leider nicht , aber...

Normalerweise sollte man ja das Menü refreshen nachdem die Message ankommt - nutze doch einfach diese Message als Indikator dafür das Du das Menü selbst austauscht...
 
25.08.2005  
 




Detlef
Jagolski
Ciao,

habe noch keine Lösung, brauche noch einen Tipp.

Gute Nacht
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
25.08.2005  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

1.214 Views

Untitledvor 0 min.
Normann Strübli08.10.2020
Ernst11.01.2015
Edmund Coenen28.05.2013
iF07.05.2013

Themeninformationen

Dieses Thema hat 2 subscriber:

Detlef Jagolski (4x)
iF (3x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie