¿Cómo escribir una ventana de Windows en lenguaje C?
Se puede crear una ventana de Windows llamando a la función de ventana de la biblioteca de ventanas.
Debes utilizar un compilador de Windows, como VC, MS, etc.
Función RegisterClassEx:
Esta función registra la clase de ventana utilizada en llamadas posteriores a la función CreateWindow y a la función CreateWindowEx. La función RegisterClass ha sido reemplazada por la función RegisterClassEx, pero aún puede usar la función RegisterClass si no necesita establecer un objetivo pequeño para la clase.
Función CreateWindowEx:
Esta función crea una ventana en cascada, ventana emergente o subventana con un estilo extendido. Las demás son iguales que la función CreateWindow. Para obtener información sobre cómo crear una ventana y otros parámetros, consulte CreateWindow. Todavía se puede encontrar información específica en el msdn de Microsoft.
Función de procesamiento de mensajes WindowProc:
Esta función es una función definida por la aplicación. Maneja los mensajes enviados a la ventana. El tipo WINDPROC define un puntero a la función de devolución de llamada. WindowProc es un marcador de posición para funciones definidas por la aplicación.
Prototipo de función:
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
Parámetros:
hwnd: identificador que apunta a la ventana.
uMsg: Especifica el tipo de mensaje.
wParam: especifica la información restante específica del mensaje. El contenido de este parámetro está relacionado con el valor del parámetro UMsg.
IParam: especifica la información restante específica del mensaje. El contenido de este parámetro está relacionado con el valor del parámetro uMsg.
Valor de retorno: el valor de retorno es el resultado del procesamiento del mensaje, que está relacionado con el mensaje enviado.
El código para una ventana simple es el siguiente: #include?lt; Windows.hgt
#include?lt; ?WINAPI ?WinProc(HWND?hWnd, UINT?Msg, WPARAM?wParam, LPARAM?lParam);
int?WinMain(?
__in?HINSTANCE?hInstance,? p>
__in_opt?HINSTANCE?hPrevInstance,?
__in?LPSTR?lpCmdLine,?
__in?int?nShowCmd?
)
{
TCHAR?*szName?=?_T("miVentana");
WNDCLASSEX?wc?=?{0};
HWND? hWnd?=?NULL;
MSG?Msg?=?{0};
wc.cbClsExtra=?0;
wc.cbWndExtra= ?0 ;
wc.cbSize=?sizeof(WNDCLASSEX);
wc.hbrBackground?=?(HBRUSH)GetStockObject(WHITE_BRUSH); //Establece un fondo blanco a través de la función , Será interesante ver si lo configura en NULL aquí
wc.hCursor?=?NULL; //No lo configure
wc.hIcon?=?NULL; //No configurar
wc.hIconSm?=?NULL; //No configurar
wc.hInstance?=?hInstance; //El identificador del programa actual, hInstance es pasada por el sistema
p>
wc.lpfnWndProc?=?WinProc; //Función de devolución de llamada del proceso de procesamiento de ventanas.
wc.lpszClassName?=?szName; //El nombre de la clase de ventana.
wc.lpszMenuName=?NULL;?
wc.style?=?CS_HREDRAW?|?CS_VREDRAW;?
RegisterClassEx(amp;wc);/ /Registrarse en el sistema
hWnd?=?CreateWindowEx(WS_EX_CLIENTEDGE, szName, _T("Mi ventana me gusta"), WS_OVERLAPPEDWINDOW,
200, 100, 600, 400, NULL , NULL, hInstance, NULL); //Crea una ventana con el título "Mi ventana me gusta"
if(hWnd?==?NULL)
{ p >
MessageBox(NULL, _T("¿Hay?un?Error"), _T("¿Error?Título"), MB_ICONEXCLAMATION|MB_OK);
return?0;
}
ShowWindow(hWnd, nShowCmd); //Mostrar ventana
UpdateWindow(hWnd);
// El siguiente es el procesamiento en bucle de mensajes, No te preocupes por esto ahora, lo explicaré en detalle en la próxima clase
while(GetMessage(amp; Msg, NULL, 0, 0))
{ p>
TranslateMessage(amp;Msg); //Traducir mensaje
DispatchMessage(amp;Msg); //Enviar mensaje
}
return ?Msg.message ;
}
//Función de procesamiento de mensajes
LRESULT?WINAPI?WinProc(HWND?hWnd, UINT?Msg, WPARAM?wParam, LPARAM?lParam)
{
switch(Msg)//Procesando proceso de mensaje
{
case?WM_DESTROY://Respuesta hacer clic con el mouse para cerrar el evento del botón
PostQuitMessage(0); //Salir de la cola de mensajes
return?0 //Salir de la función
}
return ?DefWindowProc(hWnd, Msg, wParam, lParam
}
);