Ver Mensaje Individual
  #13 (permalink)  
Antiguo 28/10/2006, 14:29
Nivel7
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 1 mes
Puntos: 2
En cuanto a que puede consumir tiempo y recursos, es cierto, es por eso que no se tiene que usar continuamente.(Generalmente es el SO quien la usa).


esta funcion es exclusiva de los SO Windows de 32 bits, por tanto no funciona en Windows anteriores y la liberacion de memoria al minimizar la ventana tampoco se contempla(supongo), es por eso que ShowWindow con SW_SHOWMINIMIZED no libera memoria, pero si lo hace con SW_MINIMIZE..

aqui dejo una pequena aplicacion en la que pongo a prueba estas funciones:

Código:
#include <windows.h>

#define IDB_CLOSE 100
#define IDB_MINIMIZE 200
#define IDB_MIN_NO_FREE 300
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  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;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           328,                 /* The programs width */
           100,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* 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)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            CreateWindow("Button", "Cerrar", BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,
                         10, 10, 100, 23, hwnd, (HMENU)IDB_CLOSE, GetModuleHandle(NULL), NULL);
            CreateWindow("Button", "MinSiLibera", BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,
                         110, 10, 100, 23, hwnd, (HMENU)IDB_MINIMIZE, GetModuleHandle(NULL), NULL);
            CreateWindow("Button", "MinNoLibera", BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,
                         210, 10, 100, 23, hwnd, (HMENU)IDB_MIN_NO_FREE, GetModuleHandle(NULL), NULL);
            break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDB_CLOSE:
                    CloseWindow(hwnd);
                    break;
                case IDB_MINIMIZE:
                    ShowWindow(hwnd, SW_MINIMIZE);
                    break;
                case IDB_MIN_NO_FREE:
                    ShowWindow(hwnd, SW_SHOWMINIMIZED);
                    break;
            }
            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;
}
Es verdad que no libera realmente ya que esto es imposible, todo proceso requiere de una determinada cantidad de memoria para funcionar. pero quitar de la RAM una aplicacion qe no se esta utilizando ya es algo.
Segun veo el proposito es hacer una mejor precentacion de su aplicacion, usando Closewindow(), conseguiría minimizar las demas ventanas, pero minimizando con SW_MINIMIZE, ademas de lograr ese proposito, despejaria un poco la RAM.

Aproposito ¿como obtendría el HWND?.

Saludos.

Última edición por Nivel7; 28/10/2006 a las 14:53