2

我试图创建一个可为空的 DateTimePicker,当控件被标记为具有空日期时,它可以选择性地显示一些提示文本。为了实现这一点,我从 DateTimePicker 继承并添加了一个带有提示文本的 Label 控件,该控件在控件时覆盖了文本部分被标记为具有空日期.. 问题是如果 DateTimePicker 设置为显示通常的日历图标,则此按钮的宽度是 VARIABLE..

下面的图像显示了具有不同大小的相同 DateTimePicker 控件。一旦日历图标按钮开始与文本重叠,它就会更改为更小、更简单的下拉图标按钮。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我可以尝试使用反射来读/写私有字段,但我不知道要读什么..

我的问题..我如何正确找出 DateTimePicker 控件中显示的日历图标的宽度..

4

2 回答 2

2

我自己找到了一种方法.. =)..DateTimePicker当控件比显示的文本宽时显示日历图标按钮.. 当按钮开始剪辑文本时,控件会自动回退到显示较小的下拉按钮(可见在原始问题中图像的第二行)..所以我们找出文本的宽度、日历图标按钮、下拉按钮和控件本身..接下来的数学很简单..

const int C_BUTTONICON_WIDTH = 34;
const int C_BUTTONARROW_WIDTH = 17;

protected int GetLabelWidth()
{
    int iControlW = this.Width;
    int iTextW = TextRenderer.MeasureString(this.Text, this.Font).Width;

    int iLabelW = 0;
    if (iTextW <= iControlW - C_BUTTONICON_WIDTH)
    {
        iLabelW = iControlW - C_BUTTONICON_WIDTH;
    }
    else
    {
        iLabelW = iControlW - C_BUTTONARROW_WIDTH;
    }
    return iLabelW;
}

您可能需要根据Label自身的位置调整几个像素.. =).. 达到我的目的.. =)

于 2012-11-26T05:30:32.130 回答
0

无需重新发明轮子。看一下这个:

CodeProject 上的可为空的 DateTimePicker

和这个:

另一个可为空的 DateTimePicker 控件

在此处输入图像描述

于 2012-11-26T00:20:49.430 回答