我一直在研究如何扩展.net控件,使其有更大的自由来执行与VB程序中C ++中的常规Windows API相同的操作。例如,如果要将周数添加到日历控件中,则必须手动导入DLL并扩展控件的类,并调用内部Windows函数。
我发现了许多有关人们如何处理此问题的主题,我对“规范方法”不满意。老实说,我认为这是一个非常糟糕的范例。
这些内部Windows函数使用指针设置魔术属性。
首先,我感到很奇怪的是,滥用了一个指针,该指针的大小取决于系统,该指针的大小取决于系统的值,该指针不是存储位置而是值,而是放在一边:这些指针也用于设置正在设置哪个属性。
例如,(省去了链接代码所需的所有样板),将一周的第一天更改为星期二将使用以下代码:
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的)情况下(绝对不可能)继续工作。
答案 0 :(得分:1)
为VB6提供支持的一种方法是准备一个TLB
文件,其中包含Win32 API的常量,函数声明等,然后在VB6程序中引用该文件。 TLB
没有提供COM对象,这只是一种方便的方式,可以将所有声明打包在一起,就好像它们在程序集中一样(我们现在认为是)。
据我所知,这种方法今天在.NET中通过“ COM”互操作仍然可以很好地工作。您可以轻松地在C#或VB项目中引用TLB,从而访问其内容。
Hardcore Visual Basic by Bruce McKinney书中包含一个为此目的而准备好的TLB磁盘,并且今天看来仍然可用:
http://vb.mvps.org/hardweb/mckinney2a.htm
我不知道当时的全面程度,也不知道它是否仍然是最新的。至少对于如何为这种方法准备TLB似乎很有启发性。
下一页还提供了有关此方法的说明,并提供了一些示例附加说明(太长,无法在此处复制)。
http://www.brainbell.com/tutors/Visual_Basic/newfile156.html