Windows API Cuadros de Dialogo

Los cuadros de dialogo como su nombre lo indica son ventanas que nos permiten comunicarnos con la aplicación, por ejemplo, la aplicación podría pedirnos la ubicación donde deseamos almacenar un archivo, el color que deseamos para pintar, cual es el archivo de video que queremos reproducir, etc., existen muchos cuadros de dialogo definidos para distintas tareas, veremos algunos de ellos.

Seleccionar color en cuadro de dialogo

ChooseColor: cuadro de dialogo para seleccionar color.

Es usado cuando deseamos pedirle al usuario de la aplicación que seleccione o indique un color, este cuadro de dialogo lo creamos con la función ChooseColor, esta función hace uso de la estructura CHOOSECOLOR para configurar el cuadro de dialogo de color, además no dará acceso al color seleccionado.

VOID OnChooseColor(HWND hwnd) 
{
    CHOOSECOLOR cc;                 // common dialog box structure 
    static COLORREF acrCustClr[16]; // array of custom colors    

    ZeroMemory(&cc, sizeof(cc));
    cc.lStructSize = sizeof(cc);
    cc.hwndOwner = hwnd;                   // ventana principal
    cc.lpCustColors = (LPDWORD)acrCustClr; // colores personalidados
    cc.rgbResult = RGB(0, 255, 0);         // color inicial
    cc.Flags = CC_FULLOPEN | CC_RGBINIT;   // mostrar el cuadro completo y seleccionar el color inicial

    if (ChooseColor(&cc) == TRUE)
    {
        // crear una brocha con el color seleccionado
        hbrush = CreateSolidBrush(cc.rgbResult);
        // volver a pintar la ventana
        InvalidateRect(hwnd, NULL, TRUE);
    }
}

Esta función nos devuelve TRUE si el usuario selecciono un color, obtendremos un valor distinto en caso contrario.

Cambiar fuente en Win32

image

Este cuadro de los utilizaremos para seleccionar una fuente, se mostraran todas las fuentes instaladas en el sistema, el usuario podrá seleccionar la fuente, modificar el estilo y tamaño de la misma, entre otras cosas.

VOID onChooseFont(HWND hwnd)
{
    CHOOSEFONT cf;            // common dialog box structure
    LOGFONT lf;               // logical font structure

    // Initialize CHOOSEFONT
    ZeroMemory(&cf, sizeof(cf));
    cf.lStructSize = sizeof(cf);
    cf.hwndOwner = hwnd;
    cf.lpLogFont = &lf;
    cf.rgbColors = RGB(0, 0, 255);
    cf.Flags = CF_SCREENFONTS | CF_EFFECTS;

    if (ChooseFont(&cf) == TRUE)
    {
        // crear la fuente a partir de la seleccion
        hfont = CreateFontIndirect(cf.lpLogFont);

        // guargar el color de texto
        tcolor = cf.rgbColors;

        // volver a pintar la ventana
        InvalidateRect(hwnd, NULL, TRUE);
    }
}

Para cambiar la fuente en una aplicación Win32 usamos la función ChooseFont la cual inicializamos mediante la estructura CHOOSEFONT que obtenemos con cf.lpLogFont, la información de la fuente seleccionada se almacena en la estructura LOGFONT, algo que también nos interesa es que el usuario puede seleccionar un color para el texto, accedemos a el en cf.rgbColors.

Abrir y Guardar Archivos en Windows API

image

Los cuadros de dialogo usados para abrir un archivo o para seleccionar donde crear o guardar el archivo son los siguientes: GetOpenFileName y GetSaveFileName el primero para abrir un archivo el segundo para guardarlo.

VOID OnOpenFile(HWND hwnd)
{
    OPENFILENAME ofn;       // common dialog box structure
    TCHAR szFile[260];      // buffer for file name
    HANDLE hf;              // file handle

    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    // Display the Open dialog box. 
    if (GetOpenFileName(&ofn) == TRUE) {
        MessageBox(hwnd, szFile, L"Abrir archivo:",  MB_OK);
    }
}

Este cuadro lo configuramos con la estructura OPENFILENAME con ofn.lpstrFile indicamos el buffer donde se almacenara la ruta del archivo seleccionado, ofn.lpstrFilter nos permite establecer el filtro de búsqueda, esta función nos devuelve TRUE si el usuario selecciono correctamente el archivo, en este ejemplo no hay acción, lo normal seria abrir el archivo y leer su contenido, pero eso es otro tema.

image

La función GetSaveFileName funciona prácticamente igual, salvo que la ruta del archivo devuelto será usado para guardar, el código de ejemplo completo contiene ejemplos de estas dos funciones.

GitHub: Windows API Cuadros de Dialogo

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Acceso a la webcam con OpenCV

JavaFx 8 Administrar ventanas

Analizador Léxico