Din*_*ino 3 c# winforms-interop winforms
我认为问题很简单明确。下面的图像是我当前的进度。
如您所见,自定义版本是我扩展的DateTimePicker控件。控件根据“聚焦”值更改按钮和边框颜色。日历下拉列表是我接下来要设置的样式。
我只是不知道从哪里开始,因为什么都无法工作。我至少不会改变边框颜色,字体颜色等。
你有很少数的选择。下拉日历是MonthCalendar控件,当您单击下拉按钮时,DTP将动态创建该控件,当用户关闭它时,该按钮将再次销毁。MonthCalendar是Windows内置的常用控件之一,用C ++编写并存储在comctl32.dll中。您的应用程序使用v6.0版本,该版本存储在并行缓存(c:\ windows \ winsxs)中。.NET类只是一个包装器,它不会改变其外观或工作方式。
值得注意的是,它在Windows版本之间进行了很大的更改,这始终是您必须注意的地方,它在Windows中高度可见的位置使用。这是用户在安装Windows时曾经与之交互的第一个通用控件。并用于任务栏上的时钟。Windows 10是第一个不再使用的版本,Win8的外观和功能被冻结,不太可能再次更改。
如前所述,下拉列表是动态创建的。您可以通过发送DTM_GETMONTHCAL消息来获取MonthCalendar窗口的句柄,请在DropDown事件的事件处理程序中执行此操作。那时窗口句柄有效,但日历尚不可见,请适当调整它。
从那里您可以发送MCM消息以配置日历。如您所知,就样式而言,非常细小的选择。您可以使用MCM_SETCALENDARBORDER更改边框粗细,并使用MCM_SETCOLOR更改颜色。后者仅在禁用视觉样式渲染器时才起作用,而在您的应用程序中则不起作用。从技术上讲,您可以调用SetWindowTheme()禁用视觉样式渲染器,以便MCM_SETCOLOR可以再次工作。但这使时间回到了2000年,看起来非常恐龙化。
仅此而已,不足以使任何人感到高兴。考虑嵌入WPF DatePicker,以更好地控制样式。