none
Error al intentar abrir un Dialog RRS feed

  • 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

    lunes, 23 de abril de 2012 12:55

Respuestas

Todas las respuestas

  • El error que me da es el siguiente: The thread 0xB40 has exited with code -1 (0xFFFFFFFF).

    - Nof

    lunes, 23 de abril de 2012 12:57
  • Arme otro formulario y note que en realidad, yo al Dialog puedo ponerle lo que quiera, el tema es cuando le agrego un control tipo DateTimePicker o ListView, ahi no me levanta mas el dialog.... Ayuda por favor! Nof

    - Nof

    lunes, 23 de abril de 2012 14:49
  • Aparentemente se debería agregar codigo a la definición del ListView para que funcione... ni idea, sigo chusmeando.

    Slds,

    Nof


    - Nof

    lunes, 23 de abril de 2012 15:19
  • Debes llamar a InitCommonControls() antes de usar cualquier control de la biblioteca de controles comunes. La versión Ex te permite una sintonía más fina de los controles que vas a usar.
    lunes, 23 de abril de 2012 16:02
  • Ah ok, voy a probar con eso. En que archivo de cabecera esta la definición de InitCommonControls?

    Muchas gracias,

    Nof


    - Nof

    lunes, 23 de abril de 2012 16:51
  • Probe lo indicado y tengo este error:

    Windows.obj : error LNK2001: unresolved external symbol __imp__InitCommonControls@0

    El archivo de cabecera que encontre es "commctrl.h", y esta la definición de InitCommonControls...

    Muchas gracias!

    Nof


    - Nof

    lunes, 23 de abril de 2012 16:55
  • 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
    lunes, 23 de abril de 2012 17:15
  • Agregue el nombre de la libreria pero me da el mismo error...

    Project -> Setting -> Link -> Input -> Additional library path

    Y aca pongo el nombre de la lib: Comctl32.lib

    Muchas gracias,

    Nof


    - Nof

    lunes, 23 de abril de 2012 17:24
  • 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
    lunes, 23 de abril de 2012 18:27
    Moderador
  • 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

    lunes, 23 de abril de 2012 18:30
    Moderador
  • Ah ok muchas gracias Jose, el ejemplo lo había visto en internet y pense que era así nomas. Voy a tener el cuenta el tema de los casts. Muchas gracias por la ayuda!

    Slds,

    Nof


    - Nof

    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.

    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/

    miércoles, 25 de abril de 2012 12:20
    Moderador