Español
Foro

ChoiceBox Kontextmenü

 

Detlef
Jagolski
¡Hola,

una ChoiceBox con el Stil 3 editierbar y sortiert kommt auch una Kontextmenü.

Dieses Kontextmenü möchte Yo Subclassen como una Editar.

Aber en ChoiceBox kommt una WM_CONTEXTMENU oder WM_LBUTTONDOWN Message no a.

Gibt lo una otro Message en ChoiceBox? Oder ha uno una otro Concepto?

Gru0

Detlef
KompilierenMarcaSeparación
 $H WINDOWS.PH
 $H MESSAGES.PH
Struct lpdis = CtlType&, CtlID&, itemID&, itemAction&, itemState&, hwndItem&, hDC&, Rect#(16), itemData#(4)
Struct lpmis = CtlType&, CtlID&, itemID&, itemWidth&, itemHeight&, itemData&
Struct  point = X&,Y&
Struct  rect  = Left&,Top&,Right&,Bottom&
Struct  MENUINFO = cbSize&,fMask&,dwStyle&,cyMax&,hbrBack&,dwContextHelpID&,dwMenuData&
Declare lpmis#
Dim lpmis#,lpmis
Declare lpdis#
Dim lpdis#,lpdis
Declare IsTrack&
Var Indent& = 20
Var PopFlag& = 0
Var ID& = 0
Var PopID& = 0
Var S_TrackBkColor& = $FDFDE1
Var S_MenuBkColor& = $ADFDE1
Var TrackBkColor& = $FBFABC
Var MenuBkColor& = $1BFABC
Var S_BkColor& = 0
Var BkColor& = 0
################################
Var Ende& = 0
cls
Fenstermenu()
Var Edit& = Create(ChoiceBox,%hwnd,3,10,10,120,24)
SubClass Edit&,1     Für die Anzeige des neuen Kontext-Menüs
SubClass %hWnd,1     Für die Menübotschaften
Decimals 0

Whilenot Ende&

    Waitinput

    If MenuItem(1001)

        Popflag& = 1
        PopMenu()
        Popflag& = 0

        select %Menuitem

            CaseOf 100,101,102,103

            SetText Edit&,Eintrag +str$(%menuitem-99)

        Endselect

    Elseif Menuitem(203)

        Ende& = 1

    Endif

EndWhile

Dispose lpdis#
Dispose lpmis#
End
################################

SubClassProc

    If SubClassMessage(Edit&, ~WM_CONTEXTMENU)

        SetMenuItem 1001
        Set(WinProc, 0)

    ElseIf SubClassMessage(%hwnd, ~WM_DRAWITEM)

        DrawProc(&slparam)
        Set(WinProc, 0)

    ElseIf SubClassMessage(%hwnd, ~WM_MEASUREITEM)

        MeasureProc(&slparam)
        Set(WinProc, 0)

    ElseIf SubClassMessage(%hwnd, ~WM_ENTERIDLE)

        Hier wird das Problem von 2 verwschiedenen Ownerdrawmenüs behandelt
        Hat das Fenster nämlich auch ein Menü, haut das nicht mehr hin !
        Also muss das erste Menü erst wieder verschwinden !

        If &sWparam = ~MSGF_MENU

            If popflag&

                Declare p#
                Dim p#,point
                ~GetCursorPos(p#)
                id& = ~WindowFromPoint(p#.X&,p#.Y&)

                If id&=%hwnd

                    popflag&=0
                    popid&=&slParam
                    ~DestroyWindow(popid&)

                EndIf

            EndIf

            Set(WinProc, 0)

        Endif

    ElseIf SubClassMessage(%hwnd, ~WM_INITMENU)

        If ~GetMenu(%hwnd) = &hMenu

            BKColor& = MenuBkColor&
            S_BKColor& = S_MenuBkColor&

        Else

            BKColor& = TrackBkColor&
            S_BKColor& = S_TrackBkColor&

        Endif

        Set(WinProc, 0)

    Elseif SubClassMessage(%hwnd,~WM_EXITMENULOOP)

        Set(WinProc, 0)

    EndIf

EndProc

Proc Fenstermenu

    PopUp &Datei
    AppendMenu 200,Laden
    AppendMenu 201,Speichern
    AppendMenu 202,Speichern als
    AppendMenu 203,Ende
    ~ModifyMenu(&hMenu,200,~MF_BYCOMMAND | ~MF_OWNERDRAW,200,0)
    ~ModifyMenu(&hMenu,201,~MF_BYCOMMAND | ~MF_OWNERDRAW,201,0)
    ~ModifyMenu(&hMenu,202,~MF_BYCOMMAND | ~MF_OWNERDRAW,202,0)
    ~ModifyMenu(&hMenu,203,~MF_BYCOMMAND | ~MF_OWNERDRAW,203,0)
    ~ModifyMenu(&hMenu,1040,~MF_BYCOMMAND | ~MF_OWNERDRAW,1040,0)
    Declare m#
    Dim m#,MENUINFO
    M#.cbSize&=SizeOf(m#)
    M#.hbrBack&=~CreateSolidBrush(365255)
    M#.fMask&=~MIM_BACKGROUND | ~MIM_STYLE
    M#.dwStyle&=~MNS_AUTODISMISS | ~MNS_MODELESS
    ~SetMenuInfo(&hMenu,M#)
    ~DrawMenubar(%hwnd)
    Dispose m#

EndProc

Proc GetMenuIDName

    Parameters Menu&,ItemID&
    Declare mii#,dwTypeData#,ItemName$
    Dim dwTypeData#,1024
    Dim mii#,44
    Long mii#,0 = 44
    Long mii#,4 = ~MIIM_STRING
    Long mii#,36 = dwTypeData#
    Long mii#,40 = 1024

    If ~GetMenuItemInfo(Menu&,itemID&,0,mii#)

        ItemName$ = Trim$(String$(dwTypeData#,0))

    EndIf

    Dispose mii#
    Dispose dwTypeData#
    Return ItemName$

EndProc

Proc MeasureProc

    Parameters par&
    Declare Point#,Itemtext$
    Dim Point#,point
    lpmis# = Par&
    Itemtext$ = GetMenuIDName(&hMenu,lpmis#.itemid&)
    ~GetTextExtentPoint32(%hdc,Addr(Itemtext$),Len(Itemtext$),Point#)
    lpmis#.itemwidth&  = Point#.X&+indent&
    lpmis#.itemheight& = Point#.Y&
    Dispose Point#

EndProc

Proc DrawProc

    Parameters Par&
    Declare Itemtext$
    Declare Rect#
    Dim Rect#,rect
    lpdis# = Par&
    Long Rect#,0= Long(lpdis#,28),Long(lpdis#,32),Long(lpdis#,36),Long(lpdis#,40)
    Itemtext$ = GetMenuIDName(&hMenu,lpdis#.itemid&)

    If lpdis#.itemstate& & ~ODS_SELECTED

        ~SetBkColor(lpdis#.hdc&,S_BKColor&)
        ~SetTextColor(lpdis#.hdc&,$000000)

    Else

        ~SetBkColor(lpdis#.hdc&,BKColor&)
        ~SetTextColor(lpdis#.hdc&,$000000)

    EndIf

    Var Brush& = ~CreatesolidBrush(rgb(255,0,0))
    ~Fillrect(lpdis#.hdc&,rect#,Brush&)
    Long Rect#,0= Long(lpdis#,28)+indent&,Long(lpdis#,32),Long(lpdis#,36),Long(lpdis#,40)
    ~ExtTextOut(lpdis#.hdc&,rect#.left&,Rect#.top&,~ETO_OPAQUE,Rect#,Addr(Itemtext$) ,len(itemtext$),0)
    Dispose Rect#
    ~DeleteObject(Brush&)

EndProc

Proc CreatePopup

    CreateMenu
    AppendMenu 100,Eintrag 1
    AppendMenu 101,Eintrag 2
    AppendMenu 102,Eintrag 3
    AppendMenu 103,Eintrag 4
    menupunkte auf ownwerdraw setzen
    ~ModifyMenu(&hMenu,100,~MF_BYCOMMAND | ~MF_OWNERDRAW,100,0)
    ~ModifyMenu(&hMenu,101,~MF_BYCOMMAND | ~MF_OWNERDRAW,101,0)
    ~ModifyMenu(&hMenu,102,~MF_BYCOMMAND | ~MF_OWNERDRAW,102,0)
    ~ModifyMenu(&hMenu,103,~MF_BYCOMMAND | ~MF_OWNERDRAW,103,0)
    Return GetMenuHeight(&hMenu)

EndProc

Proc PopMenu

    Declare X&,Y&
    CreatePopup()
    Declare Rect#
    Dim Rect#,Rect
    ~GetWindowRect(Edit&,Rect#)
    ~SetCursorpos(rect#.left&+width(Edit&)+16,rect#.top&+8)
    ~MapWindowPoints(0,Edit&,Rect#,2)
    Trackmenu Rect#.Right&+
>12,Rect#.Top&+12 Disponer Rect# ENDPROC

Saludo

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



Bitte Thema korrekten Titel geben, z.B. Contextmenü de Choicebox, con Nochmal kann später keiner qué anfangen.
 
12.06.2008  
 




Andreas
Miethe


Detlef Jagolski
¡Hola,

una ChoiceBox con el Stil 3 editierbar y sortiert kommt auch una Kontextmenü.

Dieses Kontextmenü möchte Yo Subclassen como una Editar.

Aber en ChoiceBox kommt una WM_CONTEXTMENU oder WM_LBUTTONDOWN Message no a.

Gibt lo una otro Message en ChoiceBox? Oder ha uno una otro Concepto?

Gru0

Detlef



El Meldungen kommen en el Editar-Control el Choicebox a. Usted musst also el Handle des Edits ermitteln.

Gruss
Andreas
KompilierenMarcaSeparación
 $H windows.ph
 $H messages.ph
Struct CI = cbSize&,rcItem#(16),rcButton#(16),stateButton&,hwndCombo&,hwndItem&,hwndList&
Def &False 0
Def &True 1
Declare hWin&, hCombo&, Quit&
CLS
hCombo& = @Create(ChoiceBox, %hwnd, 3, 10, 10, 280, 150)

WhileLoop 1, 10, 1

    AddChoice(hCombo&, Test  + @Str$(&Loop))

EndWhile

Quit& = &False
Declare ci#
Dim ci#,CI
ci#.cbSize& = SizeOf(ci#)
~GetComboBoxInfo(hCombo&,ci#)
Var edit& = ci#.hwndItem&
Set(SubClassMode, 1)
SubClass Edit&,1
SubClass %hwnd,1

Repeat

    WaitInput

    If %Key = 2

        Quit& = &True

    EndIf

Until Quit& = &True

End

Proc PopMenu

    CreateMenu
    AppendMenu 100,Eintrag 1
    AppendMenu 101,Eintrag 2
    AppendMenu 102,Eintrag 3
    AppendMenu 103,Eintrag 4
    Return TrackMenu()

ENDPROC

SubClassProc

    If SubClassMessage(Edit&, ~WM_CONTEXTMENU)

        select PopMenu()

            CaseOf 100

            SetText Edit&,Eintrag 1

            CaseOf 101

            SetText Edit&,Eintrag 2

            CaseOf 102

            SetText Edit&,Eintrag 3

            CaseOf 103

            SetText Edit&,Eintrag 4

        Endselect

        Set(WinProc, 0)

    ElseIf SubClassMessage(%hWnd, ~WM_DRAWITEM)

        Print Draw
        Set(WinProc, 0)

    ElseIf SubClassMessage(%hWnd, ~WM_MEASUREITEM)

        Print Measure
        Set(WinProc, 0)

    ENDPROC

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
13.06.2008  
 




Detlef
Jagolski
Gracias Andreas, Usted a una richtiger Profi.
 
XProfan X4, PRFellow, Profan2Cpp - Version 2.0c-pre5, Windows 11
13.06.2008  
 



Andreas es el profigste Profi el me en genau solchen Problemen De todos modos como erstes einfällt!

Wir debería ihn bajo irgend una Vorwand öfter hier her locken.
 
13.06.2008  
 




Andreas
Miethe


Kein Profi . Ist sólo una schönes Hobby.
Posesiones beruflich rein gar nichts así a tun.
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
13.06.2008  
 




Detlef
Jagolski
Ob Beruf oder Hobby, en jedenfall Profi.

Saludo

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




Andreas
Miethe


Detlef Jagolski
Ob Beruf oder Hobby, en jedenfall Profi.

Saludo

Detlef


Zitat :
Ein Profi, Kurzwort de veraltend Professionist, es alguien, el en el Gegensatz para Amateur oder Dilettanten una Tätigkeit beruflich oder para Erwerb des eigenen Lebensunterhalts como Erwerbstätigkeit ausübt. :
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
13.06.2008  
 



Sí, el übliche Erklärung, el, Yo finde, en Grund dessen el el Lingua lebt, no mehr wirklich zutrifft. Zumindest se el Wort Profi imho deutlich weiträumiger genutzt - z.B. abgetrennt de beruflich oder Erwerbstätigkeit - also se Profi más para Fachmann genutzt como Fachmann.

Por ejemplo es alguien como Usted para mich una bastante exzellenter Api-Profi - y no sólo una Api-Fachmann -, auch si tal vez Bademeister de Beruf bist y/aber erwerbstätig como Schraubensortierer Brillenetuis zusammensetzt.
 
13.06.2008  
 




Andreas
Miethe


IF
Sí, el übliche Erklärung, el, Yo finde, en Grund dessen el el Lingua lebt, no mehr wirklich zutrifft. Zumindest se el Wort Profi imho deutlich weiträumiger genutzt - z.B. abgetrennt de beruflich oder Erwerbstätigkeit - also se Profi más para Fachmann genutzt como Fachmann.

Por ejemplo es alguien como Usted para mich una bastante exzellenter Api-Profi - y no sólo una Api-Fachmann -, auch si tal vez Bademeister de Beruf bist y/aber erwerbstätig como Schraubensortierer Brillenetuis zusammensetzt.


Gracias !

Yo saber mich bastante bien de, belassen wirs esta.

Woher weisst Usted el Yo Bademeister bin ?
Geraten oder gewusst ?

Beruf : siehe Avatar
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
13.06.2008  
 



Geraten, machst Usted Zähne heile? Gug veces - mi son schön y todos todavía como:
 
13.06.2008  
 




Frank
Abbing
Schau dir Andreas Avatar a...

An dieser passenden Punto auch veces una Lob de me a Andreas. Wann siempre uno ihn en Ayuda bittet, es siempre bereit a helfen! Und muy kompetent dazu.
 
13.06.2008  
 




Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

1.278 Views

Untitledvor 0 min.
RudiB.09.03.2020
Peter Max Müller01.11.2019
Georg Teles10.07.2019
Erasmus.Herold10.07.2019
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie