Это, вероятно, то, что делает код WinForms:
- Когда окно создано, используйте
SetWindowLongPtr (handle, GWL_USERDATA, value)
, чтобы сохранить ссылку на объект, владеющий окном. - Control :: FromHandle вызывает
GetWindowLongPtr (handle, GWL_USERDATA)
, чтобы получить ссылку на управляемый объект, с которой затем можно выполнять управляемые вещи (GetType () и т. Д.)
Чтобы сделать это на собственных Win32 и C ++, создайте интерфейсКласс, как:
class IControl
{
public:
virtual const string &GetTypeName () = 0;
};
, а затем получить элементы управления из него:
class TextBoxControl : public IControl
{
virtual const string &GetTypeName () { return "TextBox"; }
}
, а затем в конструкторе управления:
TextBoxControl::TextBoxControl ()
{
handle = CreateWindowEx (parameters to create a text box);
SetWindowLongPtr (handle, GWL_USERDATA, this);
}
и, наконец, с учетом окнаручка:
string GetWindowTypeName (HWND handle)
{
IControl *control = GetWindowLongPtr (handle, GWL_USERDATA);
return control->GetTypeName ();
}