0

我一直在尝试实现一个自定义控件,就像标准的 WinformDateTimePicker控件一样。只是我需要我的控件以英尺和英寸为单位显示建筑长度值。就像 9'-6".. 控件应该以这种方式工作..

  • 在控件的右侧应该可以看到一个上下旋转按钮。
  • 控件应该有 2 个子字段,一个用于英尺,一个用于英寸。这些字段不应TextBox具有自己边界的单个es。
  • 当没有与控件关联的值时,它应该以灰色“指定长度”显示一个幻影文本字符串。
  • 单击控件时应显示?'-?",如果用户在未输入任何长度的情况下单击离开,则应再次显示重影文本。
  • 单击时只有子字段应该是可选的..并且向上旋转按钮仅更改当前选择的子字段..
  • 英寸子字段应以 3 为单位递增和递减,并环绕其 0 到 11 的范围。

我认为所有功能都存在于标准控件中的某个地方(或可以被覆盖),DateTimePicker但幽灵文本要求除外。所以我可能应该问的是实际工作原理是什么?DateTimePicker我怎样才能复制它的外观和行为..?

我在 Google 和 stackoverflow 上看了很多,但没有遇到类似的问题或答案。


编辑 01:

我认为 updownbase 和 maskedtextbox 的组合可能是我需要使用的.. 但我不知道如何.. 对于一个.. maskedtextbox 在单击时不选择子字段.. 还有如何让 updownbase 与掩码文本框中当前选定的子字段..

4

1 回答 1

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 = None):

在此处输入图像描述

编译并将此控件放到您的主窗体上。运行您的应用程序 - 当您单击按钮时,ft/in 下拉菜单将出现在您的控制下方。就像任何弹出窗口一样(包括 的弹出窗口DateTimePicker),如果您单击其他任何位置,它将消失(Deactivate事件用于使其像这样工作)。这是一张图片,以说明其行为:

在此处输入图像描述

现在添加验证、格式化等。

于 2012-11-24T01:41:33.277 回答