我一直在研究如何扩展 .net 控件,以便在 VB 程序中使用 C++ 中的常规 Windows API 可以更自由地执行相同的操作。例如,如果要将星期数添加到日历控件,则必须手动导入 DLL 并扩展控件的类,调用内部窗口函数。
我发现了关于人们如何处理这个问题的各种主题,我对“规范方法”不太满意。老实说,我认为这是一个非常糟糕的范例。
这些内部窗口函数使用指针来设置魔法属性。
首先,我觉得很奇怪,一个指针,其值大小取决于系统,被滥用来保存不是内存位置而是值的东西,但除此之外:这些指针还用于设置哪个属性是被设置。
例如,(省略链接代码所需的所有样板),将一周的第一天更改为星期二将使用以下代码:
Private Const MCM_FIRST As Int32 = &H1000
Private Const DTM_FIRST As Int32 = &H1000
Private Const DTM_GETMONTHCAL As Int32 = (DTM_FIRST + 8)
Private Const MCM_SETFIRSTDAYOFWEEK As Int32 = (MCM_FIRST + 15)
Dim hMonthView As IntPtr =
SendMessage(Me.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero)
Call SendMessage(hMonthView, MCM_SETFIRSTDAYOFWEEK, 0&, 1&)
所以 和 的神奇价值0x1008是0x1015我在这段代码中的问题。
首先,这是一种相当奇怪的工作方式:据我所知,除了示例之外,这些值没有记录在任何地方。如果我需要一个到目前为止碰巧没有互联网教程的房产怎么办?我在哪里/如何找到MCM_<ARBITRARY_VALUE_HERE>一般的价值?
注意:我指的是广义上的后一个问题:不仅适用于示例所涉及的特定日历控件,还适用于任何 Windows 控件。我已经可以按名称搜索特定的 C++ 头文件(例如,对于它在中定义的示例Commctrl.h:如果我不知道如何从将 C++ 头文件放入 VB 代码中。
其次......这些值是在某个地方的标题中定义的。是否无法从正确的标头导入值?这样,程序将在通过重新编译更改 DLL 的情况下(诚然不太可能)继续工作。