Programación General > C/C++
Problema Winapi
Radger:
Buenas
Tengo un codigo que en teoria deberia cambiar el texto de un boton pero no hay manera, creo que el problema esta en el bhwnd ya que si uso un HWND creado en el procedimiento funciona pero si uso un HWND miembro de la clase no.
--- Código: C++ --- #include <windows.h> class aaa{public: aaa() { MSG msg ; WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = aaa::DialogP; wc.hInstance = GetModuleHandle(NULL); wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpszClassName = "DialogClass"; RegisterClassEx(&wc); CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, "DialogClass", "Dialog Box", WS_VISIBLE | WS_SYSMENU | WS_CAPTION , 100, 100, 200, 150, NULL, NULL, GetModuleHandle(NULL), NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } static LRESULT CALLBACK DialogP( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { aaa *bb = (aaa*)GetWindowLong(hwnd, GWL_USERDATA); return bb->DialogProc(hwnd, msg, wParam, lParam); } LRESULT CALLBACK DialogProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch(msg) { case WM_CREATE: { bhwnd = CreateWindow("BUTTON", "AAA", WS_VISIBLE | WS_CHILD , 50, 50, 80, 25, hwnd, (HMENU) 1, NULL, NULL); SetWindowText(bhwnd, "DDD"); } break; case WM_COMMAND: DestroyWindow(hwnd); PostQuitMessage(0); break; case WM_CLOSE: DestroyWindow(hwnd); PostQuitMessage(0); break; } return DefWindowProc(hwnd, msg, wParam, lParam); }private: HWND bhwnd;}; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ aaa *nn = new aaa(); delete nn; return 0;}
Saludos
Eternal Idol:
Claro, estas usando GetWindowLong sin SetWindowLong primero ;)
Radger:
Lo se hace dias que lo arregle, tambien el fallo era que no enviaba un puntero nulo con la instancia de la clase al llamar a Createwindowex.
Aunque una duda que me quedo, es porque el HWND que devuelve la funcion CreateWindowEx es distinto del que luego recibe el procedimiento ?, es mas el HWND que devuelve CreateWindowEx es valido hasta que empieza el bucle de mensajes, es algo que no termino de enterderlo.
Gracias por contestar.
Saludos
Eternal Idol:
Me imagino que sera el mismo cuando los mensajes sean del dialogo pero cuando sean de los controles del mismo, como el boton, no deberia serlo.
Radger:
No, no es el mismo el HWND que almaceno en la clase deja de ser valido, si lo intento usar para crear un boton por ej. el boton no se crea.La teoria que tengo es que una vez empieza el buble de mensajes, windows internamente crea un nuevo HWND para la ventana y el que tenia almacenado, que fue devuelto por CreateWindowEx deja de ser valido.
Saludos
Navegación
[#] Página Siguiente
Ir a la versión completa