Principales respuestas
Error al intentar abrir un Dialog

Pregunta
-
Estimados, estoy armando un formulario con un archivo de recursos.
Realizo lo siguiente:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance,(LPCTSTR)IDD_FRM_MAIN, NULL, (DLGPROC)WindowProcedure, NULL);
}Cuando creo un Dialog en la ficha de Recursos y le pongo el ID correspondiente en la función DialogBox funciona perfecto. Me abre el formulario sin problemas.
Por ejemplo:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1, NULL, (DLGPROC)WindowProcedure, NULL);
}Pero cuando al Dialog le empiezo a cargar controles, no me funciona. Me fije las propiedades del dialog y son las mismas que las de un dialog de cero. Yo probe que si le cambiaba el estilo al dialog ya no funcionaba, pero el estilo es identico al de un dialog de cero.
No se que pueda ser... Por otro lado no podría crear un formulario distinto que no sea necesariamente un Dialog y abrirlo con un "WindowBox" para que pueda darle mas formato como la redimensión u otras caracteristicas de un formulario normal de Windows?
Muchas gracias!
Slds,
Nof
- Nof
Respuestas
-
Debes linkar con Comctl32.lib
En las propiedades del proyecto, prop.de config/vinculador/entrada -> dependencias adicionales, agregas el nombre de la lib
- Marcado como respuesta Nicolás Ben lunes, 23 de abril de 2012 18:48
-
Lo más sencillo es agregar la siguiente línea al archivo .cpp:
#pragma comment (lib, "comctl32.lib")
Jose R. MCP
- Marcado como respuesta Nicolás Ben lunes, 23 de abril de 2012 18:48
Todas las respuestas
-
-
-
-
-
-
-
Debes linkar con Comctl32.lib
En las propiedades del proyecto, prop.de config/vinculador/entrada -> dependencias adicionales, agregas el nombre de la lib
- Marcado como respuesta Nicolás Ben lunes, 23 de abril de 2012 18:48
-
-
Lo más sencillo es agregar la siguiente línea al archivo .cpp:
#pragma comment (lib, "comctl32.lib")
Jose R. MCP
- Marcado como respuesta Nicolás Ben lunes, 23 de abril de 2012 18:48
-
También le hago notar que su uso de casts es excesivo. El 90% de las veces, si uno ocupa un cast es porque está haciendo algo mal.
En la línea return DialogBox(hInstance,(LPCTSTR)IDD_FRM_MAIN, NULL, (DLGPROC)WindowProcedure, NULL); vemos 2 casts. El primero debería cambiarse por MAKEINTRESOURCE(IDD_FRM_MAIN), y el segundo no debería necesitarse del todo. En cambio, su función WindowProcedure() debería cumplir al 100% con la especificación de los que es DLGPROC, o sea, debería tener un prototipo como este: INT_PTR CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM). Lea http://msdn.microsoft.com/en-us/library/windows/desktop/ms645452(v=vs.85).aspx para más información.
Jose R. MCP
-
-
También le hago notar que su uso de casts es excesivo. El 90% de las veces, si uno ocupa un cast es porque está haciendo algo mal.
Jose R. MCP
Una puntualización sobre esto. Dado el maremagnum de Win32, el moldeo es más que necesario porque hay muchísimas redefiniciones y contradicciones en las declaraciones de las funciones, con parámetros completamente equivalentes pero con diferente nomenclatura. Unas veces el tema viene por herencia de funciones antiguas a las que no les han actualizado la firma, y las más de las veces simplemente porque lo hacen mal.
Otra cosa es usar moldeos en tu propio programa y tu propio código. Ahí sí, ahí sí que denota un código de mala calidad. Y por extensión, las firmas de las funciones de Win32 llevan implícita esa mala calidad por la excesiva necesidad de moldeos.
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/