Я изучал, как расширить элементы управления .net, чтобы иметь больше свободы делать то же, что вы можете делать с обычным Windows API в C ++ в программе VB. Например, если вы хотите добавить номера недель в элемент управления календаря, вам придется вручную импортировать 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 изменяется путем ее повторной компиляции.