0% encontró este documento útil (0 votos)
41 vistas113 páginas

5 WinAPI

Cargado por

patooo12345678
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
41 vistas113 páginas

5 WinAPI

Cargado por

patooo12345678
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 113

WinAPI

Windows Application Programming Interface

Interfaz de programación de aplicaciones de Windows

Es creada para los lenguajes de C y C++.


WinAPI nos permite presentarle al usuario el
programa de una manera gráfica que sea mas
Es la manera más directa de crear aplicaciones
entendible e intuitiva.
de Windows.
Ventanas Eventos Controles
Todo lo que se produzca
dentro de la aplicacion:
movimiento del mouse, pulsar Forma en que las aplicaciones
Parte gráfica en que se le una tecla, dar clic en un botón, intercambian datos con el
presenta al usuario la cerrar o abrir una ventana, etc. usuario y el usuario interactua
aplicación e interactua con ella con la aplicación.
por me dio de los controles. Botones, listas, menús,
entradas de texto, etc.
Crear proyecto WinAPI
VS 2019
 Crear un proyecto.
Crear proyecto WinAPI

 Plantillas > Proyecto


vacío C++
Crear el cpp

 Explorador de
soluciones > Archivos
de origen
 Agregar > Nuevo
elemento
 Archivo C++ (.cpp)
Configurar que sea Windows

 Proyecto > Propiedades


 Propiedades de configuración >
Enlazador > Sistema
 Subsistema -> Windows
Configurar a multibyte

 Proyecto > Propiedades


 Propiedades de configuración >
Avanzado
 Donde esté en negritas Unicode
cambiar a Multibyte
Punto de entrada
consola winapi
int main(){ #include <windows.h>

cout<<“bye world, see you soon”; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
cout<<“…maybe?” PSTR cmdline, int cmdshow){

return MessageBox(NULL, “See you son… Maybe?”, “Bye world”,0);


return 0;
} }
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)

int: tipo de retorno. WINAPI: Indica la convención de llamada, ayuda a indicar WinMain: Nombre de la función principal
específicamente en qué lugar adecuado se va a almacenar en para un programa creado en WinApi. (Como
memoria para las funciones de WinAPI (optimizar memoria). el main en consola)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)

HINSTANCE: Puntero que tiene la dirección de la instancia, o sea, toda la aplicación que estamos ejecutando. Todo lo que compone el
programa como las ventanas y controles.
hInst: Puntero que hace referencia a la aplicación actual cuando se ejecuta.
hInstPrev: Al momento de ejecutar, nos dice si la instancia de la aplicación ya se había creado, o sea, la aplicación ya se
ejecutó y esto nos ayuda para evitar que se abra mas de 1 vez el programa al mismo tiempo.
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)

PSTR: Puntero a string. Es una línea de comandos que se cmdshow: Código que el SO nos devuelve para indicarnos cómo se
ejecutan en el cmd y que el sistema operativo dice si algo debe mostrar la ventana. Ponerla en frente o detrás de otra ventana,
se necesita antes de ejecutar el programar. Como crear en pantalla completa o minimizada, etc.
carpetas, archivos, movernos de carpeta,etc.
Valores que puede tener el cmdshow

SW_SHOWDEFAULT SW_HIDE
10 0

SW_SHOWMAXIMIZED SW_SHOWMINIMIZED
3 2

https://conclase.net/winapi/curso/wincte/nCmdShow
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-
showwindow
Todos los códigos para cmdShow y lo que hace cada uno.
Nosotros no le pasamos valores a esta función.
int WINAPI WinMain(HINSTANCE hInst,
Como es la primera función que se va a ejecutar al momento de
HINSTANCE hInstPrev, PSTR
abrir el programa, quien le va a asignar los valores que necesita, es
cmdline, la maquina, el sistema operativo.
int cmdshow)

Para utilizar las herramientas/funciones de WinAPI, hay que incluir


la librería Windows.h al inicio del código.

De no incluirla, saldrán errores como funciones o variables no


#include <windows.h>
definidas.
Proceso básico para crear una ventana

Registrar la Crear la
ventana ventana

Fin del Procesar Mostrar la


programa mensajes ventana
Ventana modal Ventana no modal
Las ventanas modales no permiten interactuar Las ventanas no modales sí permiten interactuar
con las demás ventanas que están abiertas hasta con las demás ventanas que están abiertas.
que ésta ventana se cierre.
Registrar ventanas

 Explorador de soluciones > Archivos


de origen
 Agregar > Recurso
 Dialog
 Nuevo

De ésta misma manera podemos crear un menú.


resource.h
Hay que agregar este archivo al inició del código del programa.
#include "resource.h"

En este archivo de encabezado, se definen los ID de los dialog,


menús y controles que vamos creando/agregando y que utilizamos
en todo el programa. Que estos a su vez, podemos referenciarlos
por medio de un número o código.

Hay que tener cuidado de que éstos números no se repitan, ya que


puede saltar un error o agarrar otro elemento que no es.

Los IDs se pueden cambiar por otro nombre que podamos


identificar más fácilmente, pero hay que cambiarlos en las
propiedades del elemento y en el archivo resource.h
 Explorador de soluciones > Archivos de
encabezado > resource.h
Propiedades de las ventanas
 Botón derecho sobre la ventana >
Propiedades

En esta pestaña, podemos modificar ciertas propiedades de la


ventana como:
• Si acepta o no menú y/o cuál menú.
• Cambiar el titulo que aparece en la ventana.
• Si la ventana va a tener o no borde.
Si se muestran los botones de minimizar y maximizar.
Si aparecer en el centro o no.
• El ID por el cual se va a identificar la ventana.
• Etc.
Vista de recursos
En las opciones del menú de VS
 Ver > Otras ventanas > Vista de recursos

En esta pestaña, al desglosar las flechitas podemos encontrar todas


las ventanas y menús creados.
Nuevos tipos de dato

HWND WPARAM UINT LPARAM

A lo largo del código, veremos estas palabras y otras más. Estas


palabras son tipos de datos que WinAPI utiliza y nos serán útiles.
Nuevo tipo de dato

> HWND
Handler de Window.

Es un puntero en WinAPI que ayuda al manejo de la


memoria o a hacer referencia a algo.

Todo aquello que empieze con H, significa que es un


puntero. Como HINSTANCE.
Crear la ventana
Función para crear una ventana
CreateDialog( HINSTANCE hInstance, LPCTSTR lpName, HWND
hWndParent,
Crea ventana noDLGPROC
modal lpDialogFunc);

HINSTANCE: Handle de la instancia de la aplicación.

LPCTSTR: Identificación (ID) del nombre de la plantilla de la ventana a utilizar.

HWND: Handler/puntero de la ventana padre, en caso de que esta ventana sea hijo.

DLGPROC: Procedimiento de la ventana a mostrar. CALLBACK

MAKEINTRESOURCE: Convierte un valor entero a un valor compatible con las funciones de WinAPI. Hacer
un recurso utilizando un entero.
Función para mostrar una ventana
ShowWindow( HWND hwnd, int nCmdShow);

HWND: Handle de la ventana a mostrar.

int: Cómo se va a mostrar la ventana.


Este código el SO se lo asigna o nosotros podemos forzarlo y decirle de qué manera mostrarla. Es
mejor que el SO lo asigne.

https://conclase.net/winapi/curso/wincte/
nCmdShow
https://docs.microsoft.com/en-us/windows/
win32/api/winuser/nf-winuser-showwindow
Nuevo tipo de dato
> MSG
MESSAGE – Mensaje

Las variables de este tipo de dato, van a estar Cuando el sistema operativo debe informar de un
escuchando todos los mensajes que se reciban de la evento, lo que hace es enviar un mensaje para
aplicación cuando suceda un evento. comunicar que ha pasado dicho evento.

MSG es una estructura que contiene variables donde se


guardan los mensajes.
ZeroMemory
ZeroMemory ( PVOID destination, DWORD size);
Esta función permite rellenar con 0 o valores default
todas variables de la clase.

PVOID: Puntero o dirección donde va a rellenar con 0s.

DWORD: Cuántos bytes va a rellenar con 0s.

PVOID: Puntero de cualquier tipo.


DWORD: DoubleWord. Windows 3 era un SO de 16 bits, y una
palabra era de 16 bits (2bytes). Un Double Word es de 32 bits (4bytes)
o sea, lo que es un int, un número.
Ciclo que escuche los mensajes
while (GetMessage(&Mensaje, 0,0,0)){ TranslateMessage( LPMSG );
DispatchMessage( LPMSG );

GetMessage ( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT


wMsgFilterMax);
Esta función recupera un mensaje de la lista de mensajes de la aplicación. Puede recuperar mensajes
de una ventana concreta o cualquier ventana durante la ejecucion del mismo programa.

Esta función retorna False si el mensaje es WM_QUIT (cerrar el programa) y TRUE cualquier otro
mensaje.
Ciclo que escuche los mensajes
while (GetMEssage(&Mensaje, 0,0,0)){
if(HWND == 0 || !IsDialogMessage(HWND, LPMSG){
TranslateMessage( LPMSG );
DispatchMessage( LPMSG );
}
}

GetMessage ( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT


wMsgFilterMax);
LPMSG: Dirección de una estructura con mensaje.
HWND: Handle de la ventana a escuchar sus mensajes. Si es 0, la función recibirá mensajes de cualquier
ventana del programa.
UINT: Especifica qué eventos escuchar. Si es 0, decimos que escuche todos los mensajes.
Ciclo que escuche los mensajes
while (GetMEssage(&Mensaje, 0,0,0)){
TranslateMessage( LPMSG );
DispatchMessage( LPMSG );
}

TranslateMessage ( CONST MSG *lpmsg);


Esta función traduce los mensajes a sus equivalentes en mensajes de carácter, de tal forma que
podamos entender y saber qué evento fue.

Const MSG *: Puntero o dirección de una estructura MSG que contiene los mensajes.
Ciclo que escuche los mensajes
while (GetMEssage(&Mensaje, 0,0,0)){
TranslateMessage( LPMSG );
DispatchMessage( LPMSG );
}

DispatchMessage ( CONST MSG *lpmsg);


Esta función envía el mensaje a la ventana correspondiente, que fue donde se realizó ese evento.

Const MSG *: Puntero o dirección de una estructura MSG que contiene los mensajes.
return mensaje.wparam;

La función WinMain regresa un int. Cuando el programa se cierra por completo, es porque se hizo el
evento de WM_QUIT (terminar el programa) y regresó 0, entonces, ese 0 es el que regresamos antes
de finalizar la función WinMain, diciendo que el programa se cerró/finalizó.
Procedimiento de
ventana
Windows Procedure

BOOL CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM


wParam, LPARAM lParam);
Procedimiento de ventana
Esta función se encarga de procesar todos los mensajes de una ventana en específico. O sea, en esta
función se define el comportamiento de acuerdo a lo que el usuario haya realizao en la ventana.
Windows Procedure

BOOL CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM


wParam, LPARAM lParam);
BOOL: Valor de retorno.

CALLBACK: Es una función que se puede pasar como parámetro en otra función. Cuando esta
función termina de ejecutarse, llama a la función callback.

WndProc: Nombre de la función.


Windows Procedure

BOOL CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM


wParam, LPARAM lParam);
HWND: Handle de la ventana a la que pertenece la función.
MSG: Mensaje a procesar.
wParam: ID del control o recurso que es parte del mensaje.
lParam: Información adicional del mensaje.
Windows Procedure
Dentro de esta función hay un switch muy grande donde dependiendo del mensaje, es al case que va a
entrar y cada case es un WindowsMessage.

BOOL CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_INITDIALOG:{

}break;
case WM_COMMAND:{

}break;
case WM_DESTROY:{

}break;
}
return false;
}
Mensajes
WM – Windows Message

Los mensajes, una vez traducidos, tienen una nomenclatura base que
es WM_ seguido del nombre del mensaje. Con esto sabemos que es
un mensaje y qué tipo de mensaje es, para dependiendo del mensaje,
saber qué hacer.
WM_CLOSE
> Este mensaje se envía cuando se recibe un comando de cerrar, o sea, el usuario quiere salir de la
aplicación, ya sea por menú o el icono de X en la esquina de la ventana.
> Aquí el cierre se puede cancelar preguntandole al usuario si está seguro de querer salir de la
aplicación o guardar datos antes de enviar el mensaje de cerrar la aplicación o destruir la ventana.
WM_CLOSE

case WM_CLOSE:{
int opc = MessageBox(0,“¿Seguro que desea salir?”,“AVISO”,MB_YESNO|MB_ICONQUESTION);
switch(opc){
case IDYES:
DestroyWindow(hwnd);
break;
}break;
}break;

DestroyWindow (HWND hWnd);


Esta función envía un mensaje WM_DESTROY a la ventana que va a ser destruída/eliminada.
WM_DESTROY
> Aquí se destruye/elimina la ventana.
> Se eliminan/liberar todos los recursos que se utilizaron.
> Se manda llamar la función PostQuitMessage, que este envía un mensaje WM_QUIT que hará que
se cierre por completo la aplicación.

case WM_DESTROY:{
PostQuitMessage(0);
}break;
WM_CREATE
> Aquí se crean los controles, menús u otro elemento en la ventana manualmente.

case WM_CREATE:{
HMENU hMenu1;
hMenu1 = CreateMenu();
AppendMenu(hMenu1,MF_STRING|MF_POPUP,(UINT)hMenu2,“&Principal”);
SetMenu(hWnd, hMenu1);
}break;
WM_INITDIALOG
> En este mensaje se inicializan ciertos controles como
combobox, listbox.
> Habilitar o deshabilitar controles.
case WM_INITDIALOG:{
for (int a = 0; a < 31; a++){ SendMessage(GetDlgItem(hAGALUMNO,IDC_COMBO2CB_INSERTSTRING,(WPARAM)a,
(LPARAM)combodias[a]);
}
}break;
WM_COMMAND
> Este mensaje es enviado cuando el usuario case WM_COMMAND:{
selecciona una opción de un menú, cuando switch(LOWORD(wParam)){
interactua con un controlador (como al dar clic case ID_CANCEL:
DestroyWindow(hwnd);
en un botón).
break;
}
}break;
WM_COMMAND
> Dentro de este mensaje, hay otro switch donde cada case es el case WM_COMMAND:{
ID correspondiente al control o menú. switch((LOWORD(wParam)){
case ID_CANCEL:
LOWORD: Extrae la palabra de la variable wParam que es un DestroyWindow(hwnd);
número. break;
}break;
}break;
Controles
Controles

Los controles nos ayudan a que el usuario interactue con el programa.


Con ellos el usuario puede introducir información o el programa
mostrarle también información que el usuario solicite o le sea útil.
Edit
Edit

> Es un espacio rectangular que


permite al usuario introducir y editar
texto desde el teclado.
Obtener texto de un control

GetDlgItemText ( HWND hWnd, INT iDItem, LPTSTR lpString, int size);


Esta función obtiene el texto de un control.

hDlg: Handle de la ventana donde está el control.


iDItem: ID del control de donde se quiere obtener el texto.
lpString: Variable donde se va a guardar el texto.
size: Cantidad de bytes a guardar/obtener.

GetDlgItemText(hwnd, IDC_EDIT1, varNombre, 20);


Obtener número de un control

GetDlgItemInt ( HWND hWnd, INT iDItem, BOOL *flag, int signed);


Esta función obtiene el texto de un control.

hDlg: Handle de la ventana donde está el control.


iDItem: ID del control de donde se quiere obtener el texto.
*flag: Apunta a una variable booleana que recibirá TRUE si la conversión fue exitosa o FALSE si hubo un error.
Es opcional, también puede ir NULL.
signed: True número con signo, False número sin signo.

BOOL numOK;
int num;

num = GetDlgItemInt(hwnd, IDC_EDIT1, &numOK, FALSE);


::Poner un límite de caracteres a introducir::

case WM_INITDIALOG:{
SendDlgItemMessage(hWnd,IDC_ENOMBRE,EM_LIMITTEXT,5,0);
}
}break;

::Poner texto default en el edit::

case WM_INITDIALOG:{
SetDlgItemText(hWnd,IDC_ENOMBRE,”Nombre”);
}
}break;
Enviar un mensaje

SendDlgItemMessage ( HWND hWnd, int idControl, UINT Msg WPARAM


wParam, LPARAM lParam);
Esta función envía un mensaje al control específicado de una ventana.

hDlg: Handle del control.


idControl: Id del control
Msg: Mensaje a enviar.
wParam/lParam: Información adicional del mensaje.
Poner texto en un control

SetDlgItemText ( HWND hDlg, int idDlgItem, LPCSTR lpString);


Esta función pone texto en un control.

hDlg: Handle de la ventana.


idDlgItem: ID del control a poner el texto.
lpString: Texto a poner en el control.

SetDlgItemText(hwnd, IDC_EDIT1, “Aquí va el nombre”);


Poner números en un control

SetDlgItemInt ( HWND hDlg, int idDlgItem, UINT valorNum, BOOL signed);


Esta función pone un número en un control.

hDlg: Handle de la ventana.


idDlgItem: ID del control a poner el texto.
valorNum: Valor numérico.
signed: True número con signo, False número sin signo.

SetDlgItemInt(hWnd, IDC_EMATRICULA, (UINT)user->matricula, FALSE);


Habilitar/deshabilitar un control

EnableWindow ( HWND hWnd, BOOL enable);


Esta función habilita o deshabilita la entrada del ratón y teclado para la ventana o control
especificado.
hWnd: Handle de la ventana o el control.
enable: true: se habilita, false: se deshabilita.

EnableWindow(GetDlgItem(hwnd, IDC_EDIT1), false);


Obtner el handle de un control

GetDlgItem ( HWND hDlg, int idControl);


Esta función regresa el handle del control.

hDlg: Hande de la ventana donde está el control.


idControl: ID del control.
Button
Cambiar texto de un botón
SendMessage ( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM
lParam);
Esta función envía el mensaje especificado a una o varias ventanas a su respectivo control.

hDlg: Handle del control.


Msg: Mensaje a enviar.
wParam/lParam: Información adicional del mensaje.
Mensaje a enviar para agregar texto al botón:
WM_SETTEXT

SendMessage(GetDlgItem(hWnd, ID_BOK), 0, (LPARAM) “NuevoTexto”);


DateTimePicker
DateTimePicker

> Es un control de selección de


fecha y hora para que el usuario
pueda seleccionar una fecha
deseada.
> Para utilizar el DateTimePicker
hay que agregar la siguiente libreria:

#include <Commctrl.h>
::Obtener la fecha seleccionada::
SYSTEMTIME st;
SendDlgItemMessage(hWnd, IDC_DATETIMEPICKER, DTM_GETSYSTEMTIME, 0, (LPARAM) &st;

* Hay que crear una variable del tipo SYSTEMTIME donde se va a guardar la fecha que el usuario seleccionó.
Este tipo de dato es una estructura que contiene las siguientes variables:
st.wYear
st.wMonth
st.wDay
st.wHour
st.wMinute
st.wSecond
st.wMilliseconds

* El mensaje DTM_GETSYSTEMTIME, indica que queremos obtener la fecha selccionada.


::Poner una fecha por default::
SYSTEMTIME st;
st.wYear = 1996;
st.wMonth = 10;
st.wDay = 2;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;

SendDlgItemMessage(hWnd, IDC_DATETIMEPICKER, DTM_SETSYSTEMTIME,(WPARAM)GDT_VALID, (LPARAM) &st);

* Hay que crear una variable del tipo SYSTEMTIME que tendrá la fecha y hora a poner en el date time picker.

* El mensaje DTM_SETSYSTEMTIME, indica que queremos colocar la fecha y hora que tiene st.

* GDT_VALID indica que es una fech/hora valida.


RadioButton
RadioButton

> Solo pueden tomar dos valores,


encendido y apagado.
> Solo se puede quedar uno
seleccionado.
::Definir que esté seleccionado un radio por default::

case WM_INITDIALOG:{
SendDlgItemMessage(hWnd, IDC_IDC_RO, BM_SETCHECK, (WPARAM)BST_CHECKED,0);
}
}break;

::Quitar la selección de un radio::

case WM_INITDIALOG:{
SendDlgItemMessage(hWnd, IDC_IDC_RO, BM_SETCHECK, (WPARAM)BST_UNCHECKED,0);
}
}break;
Obtener radio seleccionado

IsDlgButtonChecked ( HWND hWnd, INT iDItem);


Esta función determina si un botón está marcado o no.

hDlg: Handle de la ventana donde está el control.


iDItem: ID del control de donde se checar si está marcado o no.

IsDlgButtonChecked(hWnd, IDC_RadioButton);

Regresa BST_CHECKED si el radio está seleccionado.


Regresa BST_UNCHECKED si el radio no está seleccionado.
Combobox
Combobox

> Muestra una lista de opciones o


datos, los cuales se pueden contraer
y expandir para ocultarlos o
mostrarlos.
Llenar combobox

char meses[12][11] = “Enero”, “Febrero”, “Marzo”, “Abril”, “Mayo”, “Junio”, “Julio”, “Agosto”, “Septiembre”, “Octubre”,
“Noviembre”, “Diciembre”};

case WM_INITDIALOG:{
for( int a = 0; a < 12; a++){
SendMessage(GetDlgItem(hWnd,IDC_COMBO1),CB_INSERTSTRING,(WPARAM)a,(LPARAM)meses[a];

//Otra Manera
SendDlgItemMessage(hWnd,IDC_COMBO1,CB_INSERTSTRING,(WPARAM)a,(LPARAM)meses[a]);
}
}break;
Obtener texto o índice de combobox

//Obtener texto
char mesTexto[13] = {};

GetDlgItemText(hWnd, IDC_COMBO1, mesTexto, 13);

//Otra manera
SendDlgItemMessage(hWnd, ID_COMBO1, WM_GETTEXT, 128, (LPARAM)mesTexto);

//Obtener índice
int índice = 0;
indice = SendMessage(GetDlgItem(hwnd, IDC_COMBO1), CB_GETCURSEL, 0, 0);
SendDlgItemMessage(hWnd, ID_COMBO1, WM_GETTEXT, 128, (LPARAM)mesTexto);
Obtner el handle de un control

GetDlgItem ( HWND hDlg, int idControl);


Esta función regresa el handle del control.

hDlg: Hande de la ventana donde está el control.


idControl: ID del control.
Enviar un mensaje

SendMessage ( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM


lParam);
Esta función envía el mensaje especificado a una o varias ventanas a su respectivo control.

hDlg: Handle del control.


Msg: Mensaje a enviar.
wParam/lParam: Información adicional del mensaje.

Mensaje a enviar para agregar texto al combobox:


CB_INSERTSTRING
Enviar un mensaje (Otra manera)

SendDlgItemMessage ( HWND hWnd, int idControl, UINT Msg, WPARAM


wParam, LPARAM lParam);
Esta función envía un mensaje al control específicado de una ventana.

hDlg: Handle de la ventana.


idControl: Id del control
Msg: Mensaje a enviar.
wParam/lParam: Información adicional del mensaje.

Mensaje a enviar para agregar texto al combobox:


CB_INSERTSTRING
Obtener texto de un control

GetDlgItemText ( HWND hWnd, INT iDItem, LPTSTR lpString, int size);


Esta función obtiene el texto de un control.

hDlg: Handle de la ventana donde está el control.


iDItem: ID del control de donde se quiere obtener el texto.
lpString: Variable donde se va a guardar el texto.
size: Cantidad de bytes a guardar/obtener.
::Seleccionar una opción por default por índice::
SendMessage(GetDlgItem(hwnd, IDC_COMBO1), CB_SETCURSEL, (WPARAM)1, 0);

::Seleccionar una opción por default por texto::


SendMessage(GetDlgItem(hwnd, IDC_COMBO1), CB_SELECTSTRING, 0, (LPARAM)”PISO 3”);
::Vaciar/resetear combobox por completo::
SendMessage(GetDlgItem(hwnd, IDC_COMBO1), CB_RESETCONTENT, 0, 0);

::Eliminar un elemento del combobox::


int indice = 3;
SendMessage(GetDlgItem(hwnd, IDC_COMBO1), CB_DELETESTRING, (WPARAM)indice, 0);

indice: número del índice del elemento a eliminar.


Picture Control
Picture Control

> Usa mapas de bits que es un


rectángulo de pixeles que en
conjunto forman una imagen.

Después de agregar el control, hay


que cambiar la propiedad Tipo a
Bitmap.
Poner una imagen desde archivo
HBITMAP bmp; //1

bmp = (HBITMAP)LoadImage(NULL, “is.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //2

SendDlgItemMessage(hWnd, IDC_PCINICIO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp); //3

1 Creamos el handle que apuntará al bitmap.


2 Cargamos la imagen con la función LoadImage.
3 Mandamos el mensaje a la ventana de poner una imagen tipo bitmap en el picture control.
LoadImage

LoadImage ( HINSTANCE hinst, LPCTSTR lpszName, UINT uType, int cx, int
cy, UINT fuLoad, );
Esta función carga un icono, cursor o un mapa de bits y regresa el handle de la imagen
cargada.
hinst: Instancia que contiene la imagen a cargar. En este caso ponemos NULL.
lpszName: Dirección/path de la imagen a cargar.
uType: Tipo de imagen a cargar. IMAGE_BITMAP
cx/cy: Anchura y altura en pixeles de la imagen a mostrar.
fuLoad: LR_LOADFROMFILE y/o LR_MONOCHROME
Listbox
ListBox

> Consiste en un espacio con una


lista de cadenas/texto entre las
cuales el usuario puede escoger una
o varias.
Llenar listbox

char meses[12][11] = {“Enero”, “Febrero”, “Marzo”, “Abril”, “Mayo”, “Junio”, “Julio”, “Agosto”, “Septiembre”, “Octubre”,
“Noviembre”, “Diciembre”};

case WM_INITDIALOG:{
for( int a = 0; a < 12; a++){
//Manera 1
SendMessage(GetDlgItem(hWnd,IDC_LIST1),LB_INSERTSTRING, a ,(LPARAM)meses[a]);
//Manera 2
SendMessage(GetDlgItem(hWnd,IDC_LIST1),LB_ADDSTRING,0,(LPARAM)meses[a]);
}
}break;
Obtener datos de listbox
char textoList[20];
int índice = 0;

SendDlgItemMessage(hWnd, ID_LISTA1, LB_GETTEXT, 3, (LPARAM)textoList);

índice = SendDlgItemMessage(hWnd, ID_LISTA1, LB_GETCURSEL, 0, 0);


SendDlgItemMessage(hWnd, ID_LISTA1, LB_GETTEXT, índice, (LPARAM)textoList);

LB_GETTEXT: Con este mensaje, obtenemos el texto que está en el índice indicado en el 4to parámetro
(WPARAM).
LB_GETCURSEL : Con este mensaje, obtenemos el índice del texto seleccionado.
Clic o doble clic en la lista
Para detectar estos movimientos, dentro del case del ID del LISTBOX en el COMMAND, agregamos otro
switch, pero ahora lo que vamos a “valorar” es el HIWORD del wParam.

LBN_DBLCLK LBN_SELCHANGE
case ID_LIST1:{ case ID_LIST1:{
switch(HIWORD(wParam)){ switch(HIWORD(wParam)){
case LBN_DBLCLK:{ case LBN_SELCHANGE:{

}break; }break;
} }
}break; }break;
::Vaciar/resetear listbox por completo::
SendMessage(GetDlgItem(hwnd, IDC_IDC_LIST3), LB_RESETCONTENT, 0, 0);

::Eliminar un elemento del listbox::


int indice = 3;
SendMessage(GetDlgItem(hwnd, IDC_COMBO1), LB_DELETESTRING, (WPARAM)indice, 0);
indice: número del índice del elemento a eliminar.

::Buscar y seleccionar un elemento del listbox::


SendDlgItemMessage(hWnd, IDC_LIST3, LB_SELECTSTRING, -1, (LPARAM)textoList);
-1: Desde dónde empieza a buscar en la lista. (-1 desde el inicio)
textoList: texto a buscar en la lista.
::Buscar un elemento del listbox::
indice = SendDlgItemMessage(hWnd, IDC_LIST3, LB_FINDSTRING, -1, (LPARAM)textoList);
-1: Desde dónde empieza a buscar en la lista. (-1 desde el inicio)
textoList: texto a buscar en la lista.
Retorna el indice donde se encuentre el texto a buscar.
Menú
Crear menú

 Explorador de soluciones > Archivos


de origen
 Agregar > Recurso
 Menu
 Nuevo
Crear menú

 Para agregar las opciones del menú y


submenú, basta con dar clic en donde
dice Escriba aquí.
Agregar menú a ventana

 Nos vamos a la ventana a la que


queremos agregar el menú.
 Abrimos la pestaña de Propiedades
 En la propiedad Menú, que está debajo
del ID, desplegamos el combo y
seleccionamos el ID del menú que
queremos poner en esa ventana.
Abrir ventana desde
botón o menú
Desde botón
 Creamos el case en el WM_COMMAND con el nombre del botón que al hacer clic, va a abrir la ventana.
 Y dentro del case, utilizamos la función DialogBox para abrir la ventana.

case WM_COMMAND:{
switch(LOWORD(wParam)){
case ID_BotonAbrir:{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_AGREGAR), 0, vRegistrar);
}break;
}

}break;
DialogBox
DialogBox ( HINSTANCE hInstance, LPCTSTR idVentana, HWND
hWndParent,
Ventana modal DLGPROC dlgProcFunc);
Crea una cuadro de diálogo modal a partir de un recurso de plantilla.

hInstance: Instancia del programa.


idVentana: ID de la plantilla de la ventana a abrir.
hWndParent: Handle de la ventana padre.
dlgProcFunc: Procedimiento de la ventana a abrir.

DialogBox(hInstance, MAKEINTRESOURCE(IDD_AGREGAR), 0, vRegistrar);


Desde menú
 Creamos el case en el WM_COMMAND con el nombre de la opción del menú que al hacer clic, va a abrir la
ventana.
 Y dentro del case, utilizamos la función DialogBox para abrir la ventana.

case WM_COMMAND:{
switch(LOWORD(wParam)){
case ID_ALUMNOS_REGISTRAR:{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_AGREGAR), 0, vRegistrar);
}break;
}

}break;
Cerrar ventana
DestroyWindow
DestroyWindow(HWND hWnd);
Destruye/cierra una ventana creada con la funcion CreateDialog.

hWnd: Handle de la ventana a cerrar.

DestroyWindow(hV1);

Cuando usamos la funcion DestroyWindow, se manda el mensaje de WM_DESTROY, entonces lo que haya en ese mensaje en la
función de la ventana a cerrar, es lo que pasará.
EndDialog
EndDialog ( HWND hWnd, int nReturn);
Destruye/cierra una cuadro de dialogo modal, creado con la funcion DialogBox.

hWnd: Handle de la ventana a cerrar.


nReturn: Valor que devolverá la función de la ventana.

EndDialog(hWnd, 0);
La X de las ventanas
case WM_CLOSE:{

int opc = MessageBox(0, “Seguro que desea salir?”, Cuando el usuario le da clic a la X de la
“AVISO”, MB_YESNO | MB_ICONQUESTION); ventana, se manda el mensaje de
WM_CLOSE.
if(opc == IDYES){
DestroyWindow(hWnd);
PostQuitMessage(0); En la CALLBACK/función de la
} ventana se pone lo que queremos que
suceda cuando el usuario le de clic:
}break; > Cerrar la ventana actual y abrir otra.
> Cerrar por completo el programa/dejar
case WM_CLOSE:{
de ejecutar.
DialogBox(hInstGlobal,
MAKEINTRESOURCE(IDD_LISTAS), NULL,
vListas);

}break;
Quitar la X
Para quitar la X de la ventana que aparece
en la esquina superior derecha hay que ir a
las Propiedades de la ventana y en la
propiedad Menú del Sistema y de valor de
dejamos en False.
Cerrar por completo el
programa
case WM_CLOSE:{
La función para cerrar completamente el
int opc = MessageBox(0, “Seguro que desea salir?”,
programa o dejar de ejecutarlo es la
“AVISO”, MB_YESNO | MB_ICONQUESTION);
función:
if(opc == IDYES){
DestroyWindow(hWnd);
PostQuitMessage(0); PostQuitMessage(0);
}
Esta función manda el mensaje
}break;
WM_QUIT que en el while de los
mensajes, la función GetMessage(); case ID_SALIR:{
obtentrá un 0 o false, y por lo tanto,
dejará de escuchar los mensjes y se sale PostQuitMessage(0);
del programa.
}break;
MessageBox
MessageBox
MessageBox(HWND hWnd, LPCTSTR text, LPCTSTR caption, UINT uType);
Crea, muestra y ejecuta una cuadro de mensaje. Contiene un mensaje definido y un título, combinación
de iconos y botones predefinidos.

hWnd: Handle de la ventana propietaria del mensaje.


text: Mensaje a mostrar.
caption: Título de la ventana.
uType: Iconos o botones a mostrar.

MessageBox(hWnd, “Usuario no encontrado”, “AVISO”, MB_OK | MB_ICONERROR);


MB_ICONASTERISK Igual que MB_ICONINFORMATION.

MB_ICONERROR Windows 95: igual que MB_ICONHAND.

MB_ICONEXCLAMATION Se mostrará un icono de exclamación.


MB_ICONHAND Lo mismo que MB_ICONSTOP.
Valores de retorno
Se mostrará un icono que consiste en
MB_ICONINFORMATION
una 'i' minúscula en in bocadillo Valor Significado
Se mostrará un icono con una IDABORT Se seleccionó el botón de Anular.
MB_ICONQUESTION
interrogación.
IDCANCEL Se seleccionó el botón de Cancelar.
Se mostrará un icono con un signo de
MB_ICONSTOP IDIGNORE Se seleccionó el botón de Omitir.
stop.
Windows 95: igual que IDNO Se seleccionó el botón de No.
MB_ICONWARNING
MB_ICONEXCLAMATION. IDOK Se seleccionó el botón de Aceptar.
El cuadro de mensaje contiene un único IDRETRY Se seleccionó el botón de Reintentar.
MB_OK
botón de Aceptar.
IDYES Se seleccionó el botón de Sí.
El cuadro de mensaje contiene dos
MB_OKCANCEL
botones: Aceptar y Cancelar.
El cuadro de mensaje contiene dos
MB_RETRYCANCEL
botones: Reintentar y Cancelar.
El cuadro de mensaje contiene dos
MB_YESNO
botones: Sí y No.
El cuadro de mensaje contiene tres
MB_YESNOCANCEL
botones: Sí, No y Cancelar.
OPEN FILE NAME
OpenFileName

> Este diálogo es predefinido por el


sistema y puede ser usado para
permitir al usuario seleccionar el
nombre de un archivo.

Para usarlo hay que agregar la


libreria:

#include <CommDlg.h>
OPENFILENAME ofn;

char zFile[MAX_PATH]; //260 caracteres

ZeroMemory(&ofn, sizeof(ofn));

ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = “ALL\0*.*\0Bitmaps\0*.bmp\0”;
ofn.lpstrFile = zFile;
ofn.lpstrFile[0] = ‘\0’;
ofn.nMaxFile = sizeof(zFile);
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.nFilterIndex = 2;

If(GetOpenFileName(&ofn) == TRUE){
//Si el usuario seleccionó una imagen, qué se debe de hacer?
}else{
//Si el usuario no seleccionó una imagen, qué se debe de hacer?
}

La función GetOpenFileName crea y abre un diálogo que deja al usuario específicar el disco, el directorio
y el nombre de un archivo o conjunto de archivos a abrir.
GetOpenFileName
GetOpenFileName ( OPENFILENAME &ofn);
La función GetOpenFileName crea y abre un diálogo que deja al usuario específicar el disco, el directorio
y el nombre de un archivo o conjunto de archivos a abrir.

ofn: Un puntero a una estructura de tipo OPENFILENAME que contiene la información usada para inicializar el
diálogo.

Valor de retorno
True: Si el usuario seleccionó un archivo y dio clic en el botón OK. La variable lpstrFile de ofn contendrá
la dirección/path completa y el nombre del archivo especificado.
False: Si el usuario cancela o cierra la ventana o un error ocurre.

También podría gustarte