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

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeView.cs

Хочу сделать свой Treeview чтоб он воткнулся в .Net-идеологию

Накатал вот так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Class MyTreeView
  Inherits Control

  Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
      Dim cp As CreateParams = MyBase.CreateParams
      cp.ClassName = WC_TREEVIEW
      cp.Style = WS_VISIBLE Or WS_CHILD Or WS_BORDER
      Return cp
    End Get
  End Property
...


Сдается мне что этого недостаточно чтоб он создался-отобразился вызовом New MyTreeview и Me.Controls.Add() и с ним можно было работать.
Т.е. TV даже не отображается, отображается пустой шаблон "Control".
А что дальше делать?
В какое место Source Code смотреть, чтоб сделать по аналогии и чтоб это был именно ".Net контрол"?

Я могу конечно отступить от идеологии и сделать как в коде ниже(что собственно поначалу и стал ваять),
но это стандартный API-метод,
он работает (функция Create, я Listview так в VB6 делал), но "Control" сам по себе, а m_hwndTV сам по себе: у меня вписанный m_hwndTV например не получает фокуса по TAB и полностью побороть это я не могу.

Код: 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.
Public Class MyTreeView
  Inherits Control

  Private m_hwndTV As IntPtr ' handle to tree-view control 

  Public Enum eBorderStyle
    None
    FixedSingle
    Fixed3D
  End Enum

  'local variable(s) to hold property value(s)
  Private m_borderStyle As eBorderStyle
  Private m_Scrollable As Boolean
  Private m_HideSelection As Boolean
  Private m_ShowLines As Boolean
  Private m_ShowPlusMinus As Boolean
  Private m_ShowRootLines As Boolean
  Private m_HotTracking As Boolean
  Private m_FullRowSelect As Boolean

  Private m_ExplorerStyle As Boolean

  Private m_FadeInOutExpandos As Boolean
  Private m_AutoHScroll As Boolean
  Private m_DoubleBuffer As Boolean
  Private m_RichTooltips As Boolean

  Private m_ItemHeight As Integer

  Public Sub New()
    m_borderStyle = eBorderStyle.Fixed3D
    m_Scrollable = True
    m_HideSelection = False
    m_ShowLines = False
    m_ShowPlusMinus = True
    m_ShowRootLines = False
    m_HotTracking = False
    m_FullRowSelect = False

    m_ExplorerStyle = False

    m_FadeInOutExpandos = False
    m_AutoHScroll = False
    m_DoubleBuffer = False
    m_RichTooltips = False

    m_ItemHeight = 16

  End Sub

  Public Sub Create()
    If m_hwndTV <> IntPtr.Zero Then Exit Sub
    Dim rcClient As RECT  ' dimensions of client area 

    ' Get the dimensions of the parent window's client area, and create 
    ' the tree-view control. 
    GetClientRect(Handle, rcClient)

    Dim tvStyle As Integer = WS_VISIBLE Or WS_CHILD
    If m_borderStyle = eBorderStyle.FixedSingle Then tvStyle = tvStyle Or WS_BORDER
    If m_Scrollable = False Then tvStyle = tvStyle Or TVS_NOHSCROLL
    If m_HideSelection = False Then tvStyle = tvStyle Or TVS_SHOWSELALWAYS
    If m_ShowLines Then tvStyle = tvStyle Or TVS_HASLINES
    If m_ShowPlusMinus Then tvStyle = tvStyle Or TVS_HASBUTTONS
    If m_ShowRootLines Then tvStyle = tvStyle Or TVS_LINESATROOT
    If m_HotTracking Then tvStyle = tvStyle Or TVS_TRACKSELECT
    If m_FullRowSelect Then tvStyle = tvStyle Or TVS_FULLROWSELECT

    Dim ExStyle As Integer = 0
    If m_borderStyle = eBorderStyle.Fixed3D Then ExStyle = ExStyle Or WS_EX_CLIENTEDGE

    m_hwndTV = CreateWindowEx(ExStyle,
                            WC_TREEVIEW,
                            vbNullString,
                            tvStyle,
                            0,
                            0,
                            rcClient.Right,
                            rcClient.Bottom,
                            Handle,
                            IntPtr.Zero,
                            System.Runtime.InteropServices.Marshal.GetHINSTANCE _
                            (System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)), _
                            Nothing) 'Or TVS_HASLINES Or WS_BORDER Or WS_TABSTOP

    If m_ItemHeight <> 16 Then SendMessage(m_hwndTV, TVM_SETITEMHEIGHT, m_ItemHeight, 0)

    If m_ExplorerStyle Then _
     SetWindowTheme(m_hwndTV, "explorer", vbNullString) 'стиль для Висты и выше

    If m_FadeInOutExpandos Or m_AutoHScroll Or m_DoubleBuffer Or m_RichTooltips Then 'надо установить доп. стили
      Dim tvExStyle As Integer = SendMessage(m_hwndTV, TVM_GETEXTENDEDSTYLE, 0, 0)
      If m_FadeInOutExpandos Then tvExStyle = tvExStyle Or TVS_EX_FADEINOUTEXPANDOS
      If m_AutoHScroll Then tvExStyle = tvExStyle Or TVS_EX_AUTOHSCROLL
      If m_DoubleBuffer Then tvExStyle = tvExStyle Or TVS_EX_DOUBLEBUFFER
      If m_RichTooltips Then tvExStyle = tvExStyle Or TVS_EX_RICHTOOLTIP
      Call SendMessage(m_hwndTV, TVM_SETEXTENDEDSTYLE, 0, tvExStyle)
    End If
  End Sub

  Public Sub Destroy()
    If m_hwndTV <> IntPtr.Zero Then
      DestroyWindow(m_hwndTV)
      m_hwndTV = IntPtr.Zero
    End If
  End Sub

  Public Sub SetImageList(ByVal hIml As IntPtr)
    SendMessage(m_hwndTV, TVM_SETIMAGELIST, TVSIL_NORMAL, hIml)
  End Sub

  Public Function AddItem(ByVal hParent As IntPtr, ByVal hInsertAfter As IntPtr, _
   ByVal strKey As String, ByVal strText As String, ByVal iImage As Integer, ByVal iSelectedImage As Integer) As IntPtr
    Dim tvi As New TVITEM
    With tvi
      .mask = TVIF_TEXT Or TVIF_IMAGE Or TVIF_SELECTEDIMAGE
      .pszText = strText
      .iImage = iImage
      .iSelectedImage = iSelectedImage
    End With
    Dim tvins As New TVINSERTSTRUCT
    With tvins
      .hParent = hParent
      .hInsertAfter = hInsertAfter
      .item = tvi
    End With
    Return SendMessage_TVINSERTSTRUCT(m_hwndTV, TVM_INSERTITEM, 0, tvins)
  End Function
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39279034
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А дальше надо сделать
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Public Sub New()
    MyBase.New()

    SetStyle(ControlStyles.UserPaint, False)
    SetStyle(ControlStyles.StandardClick, False)
    SetStyle(ControlStyles.UseTextForAccessibility, False)
  End Sub


И он появится.
Только сразу нарываюсь на проблему из-за которой начал сыр-бор, из-за которой не получается использовать TVS_EX_RICHTOOLTIP.
Примечания к итемам неродные.
Судя по всему кривая система ToolTip-ов наследуеся из "Controls".

Посему правильный путь таки тот "длинный код" что я привел в первом посте,
т.е. не делать cp.ClassName = WC_TREEVIEW,
а делать CreateWindowEx самому, это по крайней мере работает как хочется.

Но тогда остается не очень простой вопрос с получением фокуса по TAB для m_hwndTV, о чем пытался спросить в соседнем топике. WM_SETFOCUS/WM_KILLFOCUS играть конечно можно, но мне пока не удалось сымитировать правильное поведение.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39279043
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

сорцы winforms - доступны
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39279047
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

ну дык я в них и пытаюсь копаться если ты заметил.
Там только проблема с переопределением поведения Tooltip-ов похоже глубоко зарыта.
Получается не в Treeview.cs
Но в Controls.cs я тоже что-то не нашел.

Если с фокусом удастся побороться, то сделаю по своему.
Хотя правильнее б было побороться именно с Net-тултипом и оставить Net контрол, знать бы как.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39279149
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй поискать тултип в Inherits Control. тултип используется всеми контролами, поэтому логично искать его в базовом классе.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39279778
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyпопробуй поискать тултип в Inherits Control. тултип используется всеми контролами, поэтому логично искать его в базовом классе.
Не вижу я никаких намеков в Controls.cs, а даже если б они там и были не факт что удалось бы что-то поменять.

Здесь варианты какие:
1) действительно найти и восстановить родное поведение, при котором TVS_EX_RICHTOOLTIP применится к .Net контролу - ничего не получается
2) Нарисовать Treeview через API (код в первом посте), тогда TVS_EX_RICHTOOLTIP работает, но проблема с TABSTOP. Ее решить в принципе получается, но манипуляции с SetFocus (API), WM_SETFOCUS, WM_KILLFOCUS приводят к глюкам со стилем TVS_EX_FADEINOUTEXPANDOS (когда стрелочки на Treeview пропадают при переводе фокуса не мгновенно а как бы растворяются постепенно).
3) Вариант нарисовать свой подобный Tooltip по TTN_SHOW (ну в принципе я это умею делать), но высчитывать координаты TV-итема и накладывать картинку + текст тултипа точно на картинку + текст итема - это жесть. Плюс нафига я должен это делать когда есть задокументированный стиль.

Думаю проще таки на это все забить как я уже хотел сделать и оставить все как есть (с .Net -тултипами).
Обидно однако.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39280085
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Ёлы-палы, ты как смотришь?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Function WmShowToolTip(ByRef m As Message) As Boolean
	Dim ptr As __Pointer(Of NativeMethods.NMHDR) = CType((CType(m.LParam, __Pointer(Of Void))), __Pointer(Of NativeMethods.NMHDR))
	Dim hwndFrom As IntPtr = ptr.Dereference().hwndFrom
	Dim tV_HITTESTINFO As NativeMethods.TV_HITTESTINFO = New NativeMethods.TV_HITTESTINFO()
	Dim p As Point = Cursor.Position
	p = MyBase.PointToClientInternal(p)
	tV_HITTESTINFO.pt_x = p.X
	tV_HITTESTINFO.pt_y = p.Y
	Dim intPtr As IntPtr = UnsafeNativeMethods.SendMessage(New HandleRef(Me, MyBase.Handle), 4369, 0, tV_HITTESTINFO)
	If intPtr <> IntPtr.Zero AndAlso (tV_HITTESTINFO.flags And 70) <> 0 Then
		Dim treeNode As TreeNode = Me.NodeFromHandle(intPtr)
		If treeNode IsNot Nothing AndAlso Not Me.ShowNodeToolTips Then
			Dim bounds As Rectangle = treeNode.Bounds
			bounds.Location = MyBase.PointToScreen(bounds.Location)
			UnsafeNativeMethods.SendMessage(New HandleRef(Me, hwndFrom), 1055, 1, bounds)
			SafeNativeMethods.SetWindowPos(New HandleRef(Me, hwndFrom), NativeMethods.HWND_TOPMOST, bounds.Left, bounds.Top, 0, 0, 21)
			Return True
		End If
	End If
	Return False
End Function
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39280452
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВДмитрий77,
Ёлы-палы, ты как смотришь?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Function WmShowToolTip(ByRef m As Message) As Boolean
	Dim ptr As __Pointer(Of NativeMethods.NMHDR) = CType((CType(m.LParam, __Pointer(Of Void))), __Pointer(Of NativeMethods.NMHDR))
	Dim hwndFrom As IntPtr = ptr.Dereference().hwndFrom
	Dim tV_HITTESTINFO As NativeMethods.TV_HITTESTINFO = New NativeMethods.TV_HITTESTINFO()
	Dim p As Point = Cursor.Position
	p = MyBase.PointToClientInternal(p)
	tV_HITTESTINFO.pt_x = p.X
	tV_HITTESTINFO.pt_y = p.Y
	Dim intPtr As IntPtr = UnsafeNativeMethods.SendMessage(New HandleRef(Me, MyBase.Handle), 4369, 0, tV_HITTESTINFO)
	If intPtr <> IntPtr.Zero AndAlso (tV_HITTESTINFO.flags And 70) <> 0 Then
		Dim treeNode As TreeNode = Me.NodeFromHandle(intPtr)
		If treeNode IsNot Nothing AndAlso Not Me.ShowNodeToolTips Then
			Dim bounds As Rectangle = treeNode.Bounds
			bounds.Location = MyBase.PointToScreen(bounds.Location)
			UnsafeNativeMethods.SendMessage(New HandleRef(Me, hwndFrom), 1055, 1, bounds)
			SafeNativeMethods.SetWindowPos(New HandleRef(Me, hwndFrom), NativeMethods.HWND_TOPMOST, bounds.Left, bounds.Top, 0, 0, 21)
			Return True
		End If
	End If
	Return False
End Function



Ну и?
Видел я этот код, конкретно вчера даже игрался с ним.
Он никак не влияет на несъедание .Net-ом стиля TVS_EX_RICHTOOLTIP.
Он делает следующее:
Тултип, который TTN_SHOW выводится без этого кода "где попало", т.е. не на итеме а стандартно под мышкой (под местом где она сунулась в Node).
Смысл кода в том, что он высчитывает Handle node определяет RECT node через tV_HITTESTINFO и позиционирует Tooltip (handle которого берется из TTN_SHOW ) над node. При этом еще и ошибается на пару пикселей (Tooltip слазит чуть вверх и влево, перекрывая картинку итема). В родном Treeview тултип четко ложится на текст node без всяких корректирующих кодов (и картинка на картинку если TVS_EX_RICHTOOLTIP). Еще надо вернуть 1 в WndProc чтобы это работало (что и делается в Treeview.cs)

Или я чего-то еще не доглядел в этом коде? (насчет реанимации TVS_EX_RICHTOOLTIP?)

Ну собственно исходя из того что имеем, остается только брать этот кривой Tooltip (к которому относится упомянутый код), применять к нему этот код (с нек. модификациями), далее изменять размер Tooltip и пририсовывать на него картинку слева (через CustomDraw тупо на hdc тултипа), при этом еще перерисовывать текст (текст соответственно надо сместить вправо). Самое сложное там еще "закрасить" "оригинальный текст" тултипа (менять из WndProc нельзя, вызовет цепную реакцию из TTN_SHOW), но через сностый workaround это таки делается.
Я вчера это уже сделал, вроде все получилось.
Самопал, но выглядит как оригинал. Надо ж добить хоть как то.
Допилю, выложу. м.б. даже проект.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39281360
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Допилю, выложу. м.б. даже проект.
Все, доделал вчера.
По сути я этот стиль "нарисовал".
Единственное, я не буду Inherits TreeView, а просто использую свой SubclassHWND (как обычно делаю) для оригинального TreeView - оба варианта есть в приложенном тест-проекте
Код: 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.
Public Class TreeViewMy
  Inherits TreeView

  Protected Overrides Sub WndProc(ByRef m As Message)
    'Debug.Print(m.ToString)

    Static hwndTooltip As IntPtr 'Tooltip handle
    Static TooltipTextColor As Integer ' цвет текста Tooltip
    Static hNode As IntPtr 'TV Node handle
    Select Case m.Msg
      Case WM_NOTIFY
        If sys_WinVista And App_ThemesEnabled() Then
          Dim nmhdr As NMHDR = CType(Marshal.PtrToStructure(m.LParam, GetType(NMHDR)), NMHDR)
          Select Case nmhdr.code
            Case TTN_SHOW
              'Debug.Print("TTN_SHOW")
              hwndTooltip = nmhdr.hwndFrom
              Dim pos As POINTAPI
              pos.x = Cursor.Position.X
              pos.y = Cursor.Position.Y
              MapWindowPoints(IntPtr.Zero, Handle, pos, 1) 'приведение к координатам TreeView
              'Debug.Print(pos.x & " " & pos.y)

              'Вычисление итема (узла дерева)
              Dim tvhip As TVHITTESTINFO = New TVHITTESTINFO
              tvhip.pt = pos
              hNode = SendMessage_TVHITTESTINFO(Handle, TVM_HITTEST, 0, tvhip)
              'Debug.Print(hNode.ToString)
              If hNode <> IntPtr.Zero AndAlso ((tvhip.flags And TVHT_ONITEM) <> 0) Then
                'Вычисление границ итема (от начала текста)
                Dim rcNode As RECT
                If Is64bitProcess() Then
                  Dim rcNodeXX As RECT_XX
                  rcNodeXX.LeftX64 = hNode.ToInt64
                  rcNode.Left = rcNodeXX.Left : rcNode.Top = rcNodeXX.Top
                Else
                  rcNode.Left = hNode.ToInt32
                End If
                SendMessage_RECT(Handle, TVM_GETITEMRECT, True, rcNode)
                MapWindowPoints(Handle, IntPtr.Zero, rcNode, 2) 'приведение к координатам экрана
                'Debug.Print(rcNode.Left & " " & rcNode.Right & " " & rcNode.Top & " " & rcNode.Bottom)

                'изменение положения и размеров Tooltip
                Dim rcTooltip As RECT
                GetWindowRect(hwndTooltip, rcTooltip)
                'экспериментально: сдвигаем на 22px влево (2+16+4), увеличиваем ширину на 16px, высоту подгоняем под высоту Node
                SetWindowPos(hwndTooltip, IntPtr.Zero, rcNode.Left - 22, rcNode.Top, rcTooltip.Right - rcTooltip.Left + 16, rcNode.Bottom - rcNode.Top, SWP_NOACTIVATE Or SWP_NOZORDER)
                'насчет этой строчки, не уверен нужна ли она вообще
                SetWindowPos(hwndTooltip, HWND_TOPMOST, rcNode.Left - 22, rcNode.Top, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOZORDER)

                m.Result = 1 ' чтобы отменить "дефолтное" позиционирование
                Exit Sub 'чтобы отменить позиционирование из Treeview.cs
              End If
            Case NM_CUSTOMDRAW
              If nmhdr.hwndFrom = hwndTooltip Then
                'Debug.Print("NM_CUSTOMDRAW")
                Dim ttcd As NMTTCUSTOMDRAW = CType(Marshal.PtrToStructure(m.LParam, GetType(NMTTCUSTOMDRAW)), NMTTCUSTOMDRAW)
                Select Case ttcd.nmcd.dwDrawStage
                  ' ====================================================
                  'https://stevenengelhardt.com/2007/08/29/custom-drawn-win32-tooltips/
                  Case CD_DrawStage.CDDS_PREPAINT
                    'Debug.Print("CDDS_PREPAINT")
                    '!!!Workaround, придраться конечно можно но в целом текст замазывается даже при стилях
                    'с учетом того что на том же месте пишем новый текст, абсолютно незаметно
                    'убирать текст через TTM_UPDATETIPTEXT(напр. забить пробелом) из WndProc нельзя, 
                    ' т.к. это вызовет цепную реакцию из TTN_SHOW
                    'tooltip control will continue to draw the static text even if we are using custom draw.
                    'To get around this problem, we’ll have the tooltip control draw the text 
                    'in the same color as the background, effectively making it invisible
                    Dim clrBg As Integer = SendMessage(hwndTooltip, TTM_GETTIPBKCOLOR, 0, 0)
                    TooltipTextColor = SendMessage(hwndTooltip, TTM_GETTIPTEXTCOLOR, 0, 0)
                    SetTextColor(ttcd.nmcd.hdc, clrBg)
                    SetBkColor(ttcd.nmcd.hdc, clrBg)
                    m.Result = CD_ReturnFlags.CDRF_NOTIFYPOSTPAINT 'когда система дорисует пустой,пусть сообщит
                    Exit Sub
                  Case CD_DrawStage.CDDS_POSTPAINT 'теперь можно тупо рисовать содержимое
                    'Debug.Print("CDDS_POSTPAINT")
                    'вычисляем текст и номер картинки в ImageList для нашего Node
                    Dim tvi As New TVITEM
                    With tvi
                      .hItem = hNode
                      .mask = TVIF_TEXT Or TVIF_IMAGE
                      .pszText = Space(MAX_PATH)
                      .cchTextMax = MAX_PATH
                    End With
                    SendMessage_TVITEM(Handle, TVM_GETITEM, 0, tvi)

                    'Накладываем картинку на Tooltip (по горизонтали отступ 3px, по вертикали по центру итема)
                    Dim hIcon As IntPtr = CType(Me.ImageList.Images(tvi.iImage), Bitmap).GetHicon
                    DrawIconEx(ttcd.nmcd.hdc, _
                     3, _
                     (Me.ItemHeight - 16) / 2, _
                     hIcon, 16, 16, _
                     0, 0, DI_NORMAL)
                    DestroyIcon(hIcon)

                    'Рисуем текст Tooltip (с восстановлением цвета текста)
                    '(по горизонтали отступ 24px, по верт. по центру итема, по кр.мере для Segoe UI 9 так корректно при любой высоте итема)
                    SetTextColor(ttcd.nmcd.hdc, TooltipTextColor)
                    TextOut(ttcd.nmcd.hdc, 24, (Me.ItemHeight - 16) / 2, tvi.pszText, Strings.Len(tvi.pszText))
                  Case Else
                End Select
              End If
          End Select
        End If
    End Select

    MyBase.WndProc(m)

  End Sub


В общем теперь можно забить.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39281554
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77,

Честн говоря я не понимаю, зачем Вы создаете себе трудности, а потом их героически преодолеваете.
...
Рейтинг: 0 / 0
А как грамотно сделать свой контрол именно на базе Inherits Control
    #39281575
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

А че еще делать.
Есть прога, она типа продается, начинка давно написана, отточена и как это писалось тоже уже в целом забыто, стареем-тупеем, делать особо нечего.
Вышел Win 8, Win10, многие вещи, типа те же стили тулбаров, которые неплохо смотрелись на висте и 7-ке уже смотрятся похабно.
Ну имплементировал Риббон (ленту) - наконец-то, лет 5 вокруг него ходил, не знал с какого конца кусать.
Совсем другое дело, имеем теперь стиль Paint/Wordpad/Проводник.
Меняю иконки потихоньку.
Думаю что б еще сделать.
Увидел этот стиль тултипов в проводнике, понравилось. Сказал ХОЧУ.
И че его раньше не увидел, он уже на Висте был. Юзеры наверно тоже не замечают.
С ходу не получилось, но блин надо ж было сделать.

Трудность в чем? Что мозги чуть напряг и размялся.
Не, тырить/рисовать иконки и мувать их в свою прогу это конечно интересней, ну пойду дальше этим займусь.
Можно еще пойти бухнуть, тоже дело.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как грамотно сделать свой контрол именно на базе Inherits Control
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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