powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Combobox popup
8 сообщений из 8, страница 1 из 1
Combobox popup
    #39071810
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток,

Есть ли возможность обойти стандартное поведение combobox на нажатие правой кнопки мыши в поле ввода комбобокса winforms?

Есть юзер контрол наследующий тип combobox.
Необходимо отключить всплывающий popup и заменить его создание некоторым другим поведением.

Пока в интернетах определенного ответа не нашел. Наткнулся на предложение что то вида подмены стандартной WndProc для дочернего контрола popup, на при событии MouseDown дочерних элеметов у combobox я не вижу.

Мб кто сталкивался с такой задачей?
...
Рейтинг: 0 / 0
Combobox popup
    #39071895
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел решение вида:

Код: vbnet
1.
2.
3.
  Sub New()
        Me.ContextMenu = New ContextMenu()
  End Sub



не самое изящное конечно :/
...
Рейтинг: 0 / 0
Combobox popup
    #39071947
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://support.microsoft.com/en-us/kb/191670

а вот такие вот извращения не пашут, интересно почему?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
        MyBase.OnMouseDown(e)
        If ModifierKeys = Keys.Control Then
            If e.Button = Windows.Forms.MouseButtons.Right Then
                LockWindowUpdate(Me.Handle)
                Me.Enabled = False
                Application.DoEvents()
                Me.Enabled = True
                LockWindowUpdate(0&)

                ControlClicks += 1
            Else
                ControlClicks = 0
            End If

            If ControlClicks > 1 Then
                ControlClicks = 0
                MsgBox("Control:" & Me.Handle.ToString())

            End If
        End If

    End Sub

 Private Declare Auto Function LockWindowUpdate Lib "User32" (ByVal hwndLock As IntPtr) As Long
...
Рейтинг: 0 / 0
Combobox popup
    #39072285
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, поигрался с winapi

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    Public Declare Auto Function GetWindow Lib "User32.dll" (ByVal hwnd As IntPtr, ByVal nIndex As Integer) As Integer
    Public Declare Auto Function GetClassName Lib "User32.dll" (ByVal hwnd As IntPtr, <Out()> ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    Public Declare Auto Function LockWindowUpdate Lib "User32.dll" (ByVal hwndLock As IntPtr) As Long

 Public Function FindEditChild(ByVal hWnd As IntPtr) As Long
        Const GW_CHILD = 5
        Const GW_HWNDNEXT = 2
        Dim child_hwnd As Long = 0

        child_hwnd = GetWindow(hWnd, GW_CHILD)
        Do While child_hwnd <> 0
            If GetWindowClassName(child_hwnd) = "Edit" Then
                Return child_hwnd
            End If

            child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
        Loop

        Return 0
    End Function

    Public Function GetWindowClassName(hWnd As IntPtr) As String
        Dim buffer As New System.Text.StringBuilder(128)
        GetClassName(hWnd, buffer, buffer.Capacity)

        Return buffer.ToString
    End Function

 Public Sub New()
     Dim childEdit = FindEditChild(Me.Handle)
        If childEdit > 0 Then
            MsgBox("получен объект Edit:" & childEdit.ToString)
            LockWindowUpdate(childEdit)
        End If
 End Sub



хендл Edit в комбобокс он получает, а вот вырубить обработку рисовки не хочет.
или я неправильно понимаю логику LockWindowUpdate
...
Рейтинг: 0 / 0
Combobox popup
    #39072429
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
felix_ff,

Я так думаю, что с Вашим упорством Вы найдете решение и ознакомите с ним форум.
Удачи! Так держать!
Только с winapi не балуйтесь - тупиковый путь.

Проверьте возможность не использовать комбобокс, а вместо него рисовать похожий usercontrol
...
Рейтинг: 0 / 0
Combobox popup
    #39072433
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Похожий внешне. ТекстБокс и рядом кнопка с глифом.
Не наследуемый от комбобокса
...
Рейтинг: 0 / 0
Combobox popup
    #39072442
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2felix_ff,

Я так думаю, что с Вашим упорством Вы найдете решение и ознакомите с ним форум.
Удачи! Так держать!
Только с winapi не балуйтесь - тупиковый путь.

Проверьте возможность не использовать комбобокс, а вместо него рисовать похожий usercontrol

Вообщем пока не нашел ничего лучше чем придумать костыль на ContextMenu
простыня
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
Imports System
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Design
Imports System.Runtime.InteropServices
Imports System.Data.SqlClient
Imports System.Windows.Controls.Primitives


Public Class usr_SQLComboBox
    Inherits ComboBox

    'Закрытые поля
    Private Property ControlClicks As Integer = 0
    Private _Query As String = ""
    Private plug As New ContextMenu()

    'Открытые поля
    Public Property QueryLines As String()
    <Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design", GetType(UITypeEditor))> _
    <Localizable(True)> _
    Public Property Query As String
        Get
            If QueryLines.Count > 0 Then
                Return Join(QueryLines, vbNewLine)
            Else
                Return _Query
            End If
        End Get
        Set(value As String)
            QueryLines = Split(value, vbNewLine)
            _Query = value
        End Set
    End Property
    Public Property QueryType As CommandType
    Public Property UseMainConnection As Boolean

    'Конструкторы
    Sub New()
        QueryType = CommandType.Text
        Query = "SELECT 0 AS ID, '' AS Value"
        'ControlClicks = 0
        ValueMember = "ID"
        DisplayMember = "Value"
    End Sub

    'Внешние функции
    Public Declare Auto Function GetWindow Lib "User32.dll" (ByVal hwnd As IntPtr, ByVal nIndex As Integer) As Integer
    Public Declare Auto Function GetClassName Lib "User32.dll" (ByVal hwnd As IntPtr, <Out()> ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    Public Declare Auto Function LockWindowUpdate Lib "User32.dll" (ByVal hwndLock As IntPtr) As Long
    Public Declare Auto Function GetLastActivePopup Lib "User32.dll" (ByVal hWnd As IntPtr) As IntPtr
    Public Declare Auto Function CloseWindow Lib "User32.dll" (ByVal hWnd As IntPtr) As Boolean
    Public Declare Auto Function ShowOwnedPopups Lib "User32.dll" (ByVal hWnd As IntPtr, ByVal fShow As Boolean) As Boolean

    'Функции
    Public Function FindEditChild(ByVal hWnd As IntPtr) As Long
        Const GW_CHILD = 5
        Const GW_HWNDNEXT = 2
        Dim child_hwnd As Long = 0

        child_hwnd = GetWindow(hWnd, GW_CHILD)
        Do While child_hwnd <> 0
            If GetWindowClassName(child_hwnd) = "Edit" Then
                Return child_hwnd
            End If

            child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
        Loop

        Return 0
    End Function
    Public Function GetWindowClassName(hWnd As IntPtr) As String
        Dim buffer As New System.Text.StringBuilder(128)
        GetClassName(hWnd, buffer, buffer.Capacity)

        Return buffer.ToString
    End Function

    'Методы
    Protected Overrides Sub OnDropDown(e As EventArgs)
        If String.IsNullOrEmpty(Query) Then GoTo _BaseSub
        Using cn As New SqlConnection("Data Source=gormskdias3.gorod.int; Initial Catalog=work; Trusted_connection=true;")
            Try
                cn.Open()
                Dim da = New SqlDataAdapter(Query, cn)

                Dim ds = New DataSet()
                da.Fill(ds, "TBL")

                If ds.Tables("TBL").Rows.Count > 0 AndAlso ds.Tables("TBL").Columns.Contains(Me.DisplayMember) Then

                    Me.DataSource = ds.Tables("TBL")
                    'Me.DisplayMember = "TBL"

                End If

            Catch ex As Exception
                MsgBox(ex.Message)
                Return
            End Try
        End Using
_BaseSub:
        MyBase.OnDropDown(e)

    End Sub
    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
        If ModifierKeys = Keys.Control Then
            Me.ContextMenu = plug

            If e.Button = Windows.Forms.MouseButtons.Right Then
                ControlClicks += 1
            Else
                ControlClicks = 0
            End If

            If ControlClicks > 1 Then
                ControlClicks = 0
                'MsgBox("clicks")
                SqlPropertyChanger.ShowPropertyDialog(Me)
                OnMouseUp(New MouseEventArgs(Windows.Forms.MouseButtons.Right, 1, 0, 0, 0))
            End If

        ElseIf ControlClicks > 0 Then
            ControlClicks = 0
        End If

        MyBase.OnMouseDown(e)
    End Sub
    Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
        If Not Me.ContextMenu Is Nothing AndAlso Me.ContextMenu.Equals(plug) Then Me.ContextMenu = Nothing
        MyBase.OnMouseUp(e)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        ' If m.Msg = WM_RBUTTONDOWN Then
        ' Dim childEdit = FindEditChild(m.HWnd)
        ' LockWindowUpdate(childEdit)
        ' MyBase.WndProc(m)
        ' LockWindowUpdate(0&)
        ' Dim frm As New Form()
        '  Dim lst As New ListBox()
        '  lst.Items.AddRange(LogLst.ToArray)
        '  frm.Controls.Add(lst)
        '  lst.Dock = DockStyle.Fill
        '  frm.Text = Guid.NewGuid.ToString()
        '  frm.ShowDialog()
        '  frm.Dispose()
        ' Else
        MyBase.WndProc(m)
        ' End If

_Base:
        'MyBase.WndProc(m)
    End Sub


    Private Class SqlPropertyChanger
        Inherits Form

        Private Owner As usr_SQLComboBox = Nothing
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            fld_SqlText = New System.Windows.Forms.RichTextBox()
            btn_OK = New System.Windows.Forms.Button()
            btn_Cancel = New System.Windows.Forms.Button()
            Me.SuspendLayout()
            '
            'fld_SqlText
            '
            fld_SqlText.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            fld_SqlText.Location = New System.Drawing.Point(2, 2)
            fld_SqlText.Name = "RichTextBox1"
            fld_SqlText.Size = New System.Drawing.Size(330, 179)
            fld_SqlText.TabIndex = 0
            fld_SqlText.Text = ""
            '
            'btn_OK
            '
            btn_OK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            btn_OK.DialogResult = Windows.Forms.DialogResult.OK
            btn_OK.Location = New System.Drawing.Point(176, 187)
            btn_OK.Name = "btn_OK"
            btn_OK.Size = New System.Drawing.Size(75, 23)
            btn_OK.TabIndex = 1
            btn_OK.Text = "OK"
            btn_OK.UseVisualStyleBackColor = True
            '
            'btn_Cancel
            '
            btn_Cancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            btn_Cancel.DialogResult = Windows.Forms.DialogResult.Cancel
            btn_Cancel.Location = New System.Drawing.Point(257, 187)
            btn_Cancel.Name = "Button2"
            btn_Cancel.Size = New System.Drawing.Size(75, 23)
            btn_Cancel.TabIndex = 2
            btn_Cancel.Text = "Cancel"
            btn_Cancel.UseVisualStyleBackColor = True
            '
            'Form
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(334, 212)
            Me.AcceptButton = btn_OK
            Me.CancelButton = btn_Cancel
            Me.Controls.Add(btn_Cancel)
            Me.Controls.Add(btn_OK)
            Me.Controls.Add(fld_SqlText)
            Me.Name = "frm_SqlProperty"
            Me.Text = "Свойства модуля данных"
            Me.ResumeLayout(False)
        End Sub      

        Sub New()
            InitializeComponent()
        End Sub

        Private Sub LoadSqlText()
            fld_SqlText.Text = Owner.Query
        End Sub

        Private Sub SaveSqlText() Handles btn_OK.Click
            Owner.Query = fld_SqlText.Text
        End Sub


        Shared Function ShowPropertyDialog(ByVal owner As usr_SQLComboBox) As DialogResult
            Dim obj As New SqlPropertyChanger()
            obj.Owner = owner
            obj.LoadSqlText()
            'obj.InitializeComponent()
            Return obj.ShowDialog()
        End Function

        Friend WithEvents fld_SqlText As System.Windows.Forms.RichTextBox
        Friend WithEvents btn_OK As System.Windows.Forms.Button
        Friend WithEvents btn_Cancel As System.Windows.Forms.Button
    End Class

End Class



собственно если кому пригодиться, код данного класса позволяет вызывать окошко изменения некоторого поля по ctrl+2*ПКМ на элементе

много кода написано не очень элегантно, буду искать возможные другие пути. найду - дам знать
...
Рейтинг: 0 / 0
Combobox popup
    #39072445
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и кстати посмотрел код стандартного combobox, с виду все бы было кошерно если функция ChildWndProc была бы не закрытой
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Combobox popup
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]