• Sábado 14 de Diciembre de 2024, 17:29

Autor Tema:  Problema Winapi  (Leído 1659 veces)

Radger

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Problema Winapi
« en: Martes 3 de Agosto de 2010, 16:41 »
0
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++
  1.  
  2. #include <windows.h>
  3.  
  4. class aaa
  5. {
  6. public:
  7.     aaa()
  8.     {
  9.         MSG  msg ;    
  10.  
  11.         WNDCLASSEX wc = {0};
  12.         wc.cbSize           = sizeof(WNDCLASSEX);
  13.         wc.lpfnWndProc      = aaa::DialogP;
  14.         wc.hInstance        = GetModuleHandle(NULL);
  15.         wc.hbrBackground    = GetSysColorBrush(COLOR_3DFACE);
  16.         wc.lpszClassName    = "DialogClass";
  17.         RegisterClassEx(&wc);
  18.  
  19.         CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, "DialogClass",
  20.             "Dialog Box", WS_VISIBLE | WS_SYSMENU | WS_CAPTION ,
  21.             100, 100, 200, 150, NULL, NULL, GetModuleHandle(NULL),  NULL);
  22.  
  23.         while(GetMessage(&msg, NULL, 0, 0))
  24.         {
  25.             TranslateMessage(&msg);
  26.             DispatchMessage(&msg);
  27.         }
  28.     }
  29.     static LRESULT CALLBACK DialogP( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
  30.     {
  31.         aaa *bb = (aaa*)GetWindowLong(hwnd, GWL_USERDATA);
  32.         return bb->DialogProc(hwnd, msg, wParam, lParam);
  33.     }
  34.     LRESULT CALLBACK DialogProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
  35.     {
  36.         switch(msg)  
  37.         {
  38.         case WM_CREATE:
  39.         {
  40.             bhwnd = CreateWindow("BUTTON", "AAA",    
  41.                 WS_VISIBLE | WS_CHILD ,
  42.                 50, 50, 80, 25,        
  43.                 hwnd, (HMENU) 1, NULL, NULL);  
  44.             SetWindowText(bhwnd, "DDD");
  45.         }
  46.         break;
  47.  
  48.         case WM_COMMAND:
  49.             DestroyWindow(hwnd);
  50.             PostQuitMessage(0);
  51.             break;
  52.  
  53.         case WM_CLOSE:
  54.             DestroyWindow(hwnd);
  55.             PostQuitMessage(0);
  56.             break;      
  57.  
  58.       }
  59.       return DefWindowProc(hwnd, msg, wParam, lParam);
  60.     }
  61. private:
  62.     HWND bhwnd;
  63. };
  64.  
  65. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  66. {
  67.     aaa *nn = new aaa();
  68.     delete nn;
  69.  
  70.     return 0;
  71. }
  72.  
  73.  

Saludos

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Winapi
« Respuesta #1 en: Jueves 5 de Agosto de 2010, 17:19 »
0
Claro, estas usando GetWindowLong sin SetWindowLong primero  ;)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Radger

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problema Winapi
« Respuesta #2 en: Sábado 7 de Agosto de 2010, 05:02 »
0
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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Winapi
« Respuesta #3 en: Martes 10 de Agosto de 2010, 15:53 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Radger

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problema Winapi
« Respuesta #4 en: Miércoles 11 de Agosto de 2010, 13:13 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Winapi
« Respuesta #5 en: Miércoles 11 de Agosto de 2010, 15:32 »
0
Lo dudo muchisimo, seguramente es algun otro problema en el codigo, te recomiendo depurarlo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.