Если ToolProc не является статическим членом, вы не можете передать указатель на функцию-член в виде обратного вызова, если вы хотите, чтобы ToolProc был нестатической функцией, вы можете создать статическую функцию-член и использовать GetWindowLong / SetWindowLong и область GWL_USERDATA для хранения указателя на текущий объект (this) и статического обратного вызова для вызова функции обратного вызова отдельных объектов, которая может использовать элементы данных отдельных объектов.
Предполагая, что ToolProc не является статическим членом вашего класса OGLTOOLBAR, вы должны привязать указатель этого объекта к дескриптору окна, вы можете сделать это так:
void OGLTOOLBAR::SetObjectToHWnd( HWND hWnd, LPARAM lParam )
{
LPCREATESTRUCT cs = reinterpret_cast<LPCREATESTRUCT>(lParam);
OGLTOOLBAR *pWnd = reinterpret_cast<OGLTOOLBAR*>(cs->lpCreateParams);
SetLastError( 0 );
if( !SetWindowLong( hWnd, GWL_USERDATA, reinterpret_cast<long>(pWnd) )
&& GetLastError() )
//Do something about the error
}
OGLTOOLBAR *OGLTOOLBAR::GetObjectFromHWnd( HWND hWnd )
{
return reinterpret_cast<OGLTOOLBAR*>(GetWindowLong(hWnd,GWL_USERDATA));
}
И тогда у вас есть статическая функция-член WndProc (или ToolProc), подобная этой:
LRESULT OGLTOOLBAR::StaticToolProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( uMsg == WM_NCCREATE )
SetObjectToHwnd( hWnd, lParam );
Window *pWnd = GetObjectFromWnd( hWnd );
if( pWnd )
return pWnd->ToolProc( hWnd, uMsg, wParam, lParam );
else
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
И затем, когда вы вызываете функцию CreateWindow
в OGLTOOLBAR::create
, передайте reinterpret_cast<void*>(this)
в качестве аргумента lpParam
(последний).
И каждый объект OGLTOOLBAR будет иметь свой собственный ToolProc, вызываемый для каждого экземпляра через функцию StaticToolProc. Или, по крайней мере, я считаю, что это должно сработать.