我一直在尝试实现一个自定义控件,就像标准的Winform DateTimePicker
控件一样..只是我需要我的控件来显示以英尺和英寸为单位的架构长度值...就像9'-6“。控件应该以这种方式工作..
TextBox
.. 我认为所有功能都存在于标准DateTimePicker
控件中的某个地方(或者可以被覆盖),但鬼文本要求除外..所以我应该问的是究竟是怎么回事? DateTimePicker
实际上有效吗?我怎样才能复制它的外观和行为..
我已经浏览过Google和stackoverflow很多但没有遇到类似的问题或答案..
编辑01:
我认为updownbase和maskedtextbox的组合可能是我需要使用的...但是我不知道如何......对于一个.. maskedtextbox在点击时不选择子字段..还有如何获取updownbase到使用maskedtextbox中当前选定的子字段..
答案 0 :(得分:4)
我会尝试发布一些有助于您入门的信息,即使它没有直接解决您的所有问题。首先,您可以获得免费的dotpeek反编译器,执行CTRL + T,查找DateTimePicker
类型并了解其工作原理。准备好看很多winapi电话。除非你确信你能够理解所有的东西并重新编写它以满足你的需要,否则不要走这条路。
更简单的方法是创建自定义控件。它可能看起来不太好,但至少你可以让它更快地工作。例如,创建一个UserControl1
,其中包含一个TextBox +一个Button:
Public Class UserControl1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim frm As New Form2
Dim p = frm.PointToScreen(New Point(Me.Left, Me.Bottom))
frm.Location = New Point(Me.ParentForm.Left, Me.ParentForm.Top + 40) + p
frm.Show()
End Sub
End Class
免责声明:执行+40是一个糟糕的编码标准,但这是我在努力将坐标转换为屏幕/客户端后所能想到的最佳标准。如果您找到更好的方法 - 请在评论中提出建议。
无论如何,在设计时它看起来像这样:
Form2
是你的弹出窗口,如果焦点丢失会关闭,模仿真正的弹出行为:
Public Class Form2
Private Sub Form2_Deactivate(sender As Object, e As System.EventArgs) Handles Me.Deactivate
Me.Close()
End Sub
End Class
在设计时它看起来像这样(FormBorderStyle =无):
将此控件编译并放到主窗体上。运行您的应用程序 - 当您单击按钮时,ft / in下拉列表将显示在您的控件下方。正如任何弹出窗口所做的那样(包括DateTimePicker
的弹出窗口),如果你点击其他地方它会消失(Deactivate
事件被用来让它像这样工作)。这是一张图片,用于说明其行为:
现在添加验证,格式化等。