У меня есть этот main.cpp код:
#include <windows.h>
#include <commctrl.h>
#include <process.h>
#include <stdio.h>
void click(){printf("button clicked\n");}
struct WindowData
{
void (*PF)();
WindowData():PF(NULL){}
};
LRESULT CALLBACK dialog_procedure(HWND h,UINT u,WPARAM w,LPARAM l)
{
WindowData *wp=(WindowData*)GetWindowLongPtr(h,GWL_USERDATA);
switch(u)
{
case WM_COMMAND:
if(LOWORD(w)==BN_CLICKED)
if(wp && wp->PF)wp->PF();
break;
}
return DefWindowProc(h,u,w,l);
}
int main()
{
WindowData * windowdata=new WindowData();
windowdata->PF=click; //bind function
HWND window=CreateWindow(WC_DIALOG,"App",WS_VISIBLE|WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,0,0,300,300,0,0,0,windowdata);
HWND button=CreateWindow(WC_BUTTON,"Click",WS_VISIBLE|WS_CHILD,0,0,100,30,0,0,0,0);
SetWindowLongPtr(window,GWL_WNDPROC,(LONG_PTR)dialog_procedure);MSG msg;
while(GetMessage(&msg,NULL,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
Теперь я собираю все с: c ++ main.cpp -lcomctl32
Запустите исполняемый файл
но когда я нажимаю кнопку «Нажми», PF никогда не вызывается …
вызов windowdata-> PF () после привязки работает;
вызов click () в любом месте в dialog_procedure работает;
вызов wp-> PF () в любом месте dialog_procedure приводит к сбою приложения;
где я не прав?
Добавить эту строку в main
функция:
SetWindowLongPtr(window,GWL_USERDATA,(LONG_PTR)windowdata);
Других решений пока нет …