#oop #winapi #api #friend #wndproc
#ооп #winapi #API #друг #wndproc
Вопрос:
я в основном сосредоточен на том, как в этом примере используется wndproc в качестве друга… я немного запутался, как это работает, и я просто пытаюсь выяснить, будет ли это работать с несколькими окнами и как это будет работать
Комментарии:
1. Пожалуйста, прочитайте tinyurl.com/so-hints
2. Версия Microsoft: msdn.microsoft.com/en-us/library/windows/desktop/ff485838.aspx
Ответ №1:
Да, он будет работать с несколькими окнами, потому что он хранит указатель на объект C с соответствующим HWND:
Window *wPtr;
...
SetWindowLongPtr(hWnd, 0, (LONG_PTR) wPtr);
и затем global WndProc
извлекает этот указатель и вызывает методы объекта через него:
wPtr = (Window*) ::GetWindowLongPtr(hWnd, 0);
wPtr->WndProc(message, wParam, lParam);
(Обратите внимание, что исходный код использует SetWindowLong
и, следовательно, не будет работать в 64-разрядной программе — я изменил приведенный выше код для использования SetWindowLongPtr
.)
Комментарии:
1. Пожалуйста, измените на SetWindowLongPtr — он работает для 32-и 64-разрядных приложений. Документы SetWindowLong подскажут вам, что нужно изменить.
2. @Boofhead: Я дословно цитировал код, на который указал @gizmo. Но вы правы, код здесь, в StackOverflow, должен быть правильным, поэтому я изменил его.