[C con Clase] Mostrar datos de MySql con Win Api

Robertti robertti en lecturedes.com
Sab Abr 7 12:13:46 CEST 2012


Hola Salvador,
primeramente quiero agradecerte que me contestaras tan rapidamente. Pero, debo confesarte que me he perdido, he probado de todas las formas posibles como yo lo entiendo, pero no soy capaz de estructurar una consulta a mi MySql y luego imprimirlo en pantalla. Te pido, si no es mucha molestia, y si puede ser, me escribar los códigos en las zonas de este que te envío donde deben ir cada declaración, por favor...
-----------------------
#include <windows.h>
#include <mysql/mysql.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
struct DATOS {
       MYSQL *myData;
       HINSTANCE hInst;
};

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
     /* dtos de conexion*/
    char *host = "localhost";
    char *user = "root";
    char *pass = "Tokage2008";
    char *db = "test";
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
DATOS datos;


    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx(
           0,                   /* Posibilidades de variación */
           "CLASE_NUESTRA",     /* Nombre de la clase */
           "Titulo",            /* Texto del título */
           WS_OVERLAPPEDWINDOW &
           ~WS_THICKFRAME &
           ~WS_MAXIMIZEBOX,     /* Tipo por defecto */
           CW_USEDEFAULT,       /* Windows decide la posición */
           CW_USEDEFAULT,       /* donde se coloca la ventana */
           504,                 /* Ancho */
           355,                 /* Alto en pixels */
           HWND_DESKTOP,        /* La ventana es hija del escritorio */
           NULL,                /* Sin menú */
           hThisInstance,       /* Manipulador de instancia */
           (void*)&datos        /* Datos de creación de ventana */
    );


    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static DATOS* datos;
        PMYDLGDATA pMyDlgdata;

    switch (message)                  /* handle the messages */
    {
           case WM_CREATE:
           pMyDlgdata = (PMYDLGDATA)(((LPCREATESTRUCT) lParam)->lpCreateParams);
           datos = &pMyDlgdata->myData;
           break;
           
           case WM_COMMAND:
           switch(LOWORD(wParam)) {
              case CM_DIALOGO:
                 DialogBoxParam(GetModuleHandle(0), "Dialogo",
                             hwnd, DlgProcedure, (LPARAM)datos);
                 break;
           }

        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
BOOL CALLBACK DlgProcedure(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static DATOS* datos;

    switch (msg)                  /* manipulador del mensaje */
    {
        case WM_INITDIALOG:
           datos = (DATOS *)lParam;
return TRUE;
    }
    return FALSE;
}

-----------------------

Gracias.

Robertti

El pasado 2012-04-03 20:52:58, Salvador Pozo escribió:
 
SP> El pasado 2012-04-03 18:32:28, Robertti escribió:
SP>  
SP> R> Hola, 
SP> R> tengo una duda que no se resolver. Resulta que tengo unos datos en una base de datos de MySql, y los puedo sacar y ver sin problemas en modo consola de C++ (estoy empezando con Dev-C++), pero soy incapaz de verlo con Windows Aplication... Sobre todo no se en que parte del código que envío abajo debo escribir los parámetros de conexión a la base de datos y cómo lo debo poner para que se imprima en pantalla...
SP> R> Espero me podáis echar una mano.
SP> Hola:
SP> Yo, lo que suelo hacer en estos casos es crear una estructura como esta:
SP> ----8<------
SP> struct DATOS {
SP>     MYSQL *myData;
SP>     HINSTANCE hInst;
SP> };
SP> ----8<------
SP> En esa estructura voy añadiendo campos para almacenar variables que necesitaré en toda la aplicación, como es el caso de la conexión con la base de datos.
SP> Luego, en la función main creo una variable de tipo DATOS, que durante el programa puedo pasar a los procedimientos de ventana y de diálogo.
SP> En el caso del procedimiento de ventana paso la dirección de la estructura en la llamada a CreateWindowEx, en el último parámetro:
SP> ----8<------
SP>     DATOS datos;
SP>     CreateWindowEx(
SP>            0,                   /* Posibilidades de variación */
SP>            "CLASE_NUESTRA",     /* Nombre de la clase */
SP>            "Titulo",            /* Texto del título */
SP>            WS_OVERLAPPEDWINDOW &
SP>            ~WS_THICKFRAME &
SP>            ~WS_MAXIMIZEBOX,     /* Tipo por defecto */
SP>            CW_USEDEFAULT,       /* Windows decide la posición */
SP>            CW_USEDEFAULT,       /* donde se coloca la ventana */
SP>            504,                 /* Ancho */
SP>            355,                 /* Alto en pixels */
SP>            HWND_DESKTOP,        /* La ventana es hija del escritorio */
SP>            NULL,                /* Sin menú */
SP>            hThisInstance,       /* Manipulador de instancia */
SP>            (void*)&datos        /* Datos de creación de ventana */
SP>     );
SP> ----8<------
SP> En el procedimiento de ventana podemos recuperar los datos, y asignarlo a una variable estática:
SP> ----8<------
SP> LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SP> {
SP>     static DATOS* datos;
SP>     PMYDLGDATA pMyDlgdata;
SP>     switch (message)                  /* handle the messages */
SP>     {
SP>         case WM_CREATE:
SP>            pMyDlgdata = (PMYDLGDATA)(((LPCREATESTRUCT) lParam)->lpCreateParams);
SP>            datos = &pMyDlgdata->myData;
SP>            break;
SP> ...
SP> ----8<------
SP> Lo normal es abrir la conexión en main o al procesar WM_CREATE, y cerrarla al finalizar main o al procesar el mensae WM_DESTROY.
SP> En los procedimientos de diálogo hacemos algo similar, pero pasamos el puntero en el lParam:
SP> ----8<------
SP>               DialogBoxParam(GetModuleHandle(0), "Dialogo",
SP>                              hwnd, DlgProcedure, (LPARAM)datos);
SP> ----8<------
SP> Y en el procedimiento de diálogo lo recuperamos de una forma parecida:
SP> ----8<------
SP> BOOL CALLBACK DlgProcedure(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
SP> {
SP>     static DATOS* datos;
SP>     switch (msg)                  /* manipulador del mensaje */
SP>     {
SP>         case WM_INITDIALOG:
SP>            datos = (DATOS *)lParam;
SP> ...
SP> ----8<------
SP> Y eso es todo, a grandes rasgos.
SP> Para cualquier aclaración, pregunta de nuevo. :)
SP> Hasta pronto.
SP> -- 
SP> Salvador Pozo (Administrador)
SP> mailto:salvador en conclase.net
SP> _______________________________________________
SP> Lista de correo Cconclase Cconclase en listas.conclase.net
SP> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SP> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase