NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Tutorial WinAPI C++ 3.4 (Creación del ObjetoButton)

06 de Noviembre del 2010 por Josep Antoni Bover, 0 visitas, 0 comentarios, 0 votos
Categorías : Windows, Programación, C y C++.
La web está en segundo plano, animación en pausa.
Cargando animación...
Tutorial WinAPI C++ 3.4 (Creación del ObjetoButton)

En este tutorial veremos el funcionamiento del control BUTTON de windows. Para ello lo encapsularemos en una clase que tendrá de nombre ObjetoButton, y que heredara de ObjetoControlEstandar (La clase ObjetoControlEstandar se describe en el tutorial 3.3 Creación del ObjetoEditBox).

Tambien veremos como responder cuando el usuario presiona encima del boton mediante el mensaje WM_COMMAND, y como decirle que fuente debe utilizar (si no deseamos la fuente estandar de windows) mediante el mensaje WM_SETFONT.

Veamos su declaración :

Archivo : ObjetoButton.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Clase que hereda ObjetoControlEstandar y se centra en las funciones del listbox
class ObjetoButton : public ObjetoControlEstandar {
public : //// Miembros publicos
// -Constructor
ObjetoButton(void);
// -Destructor
~ObjetoButton(void);
// -Función para crear el Button
void CrearButton( HWND hWndParent, const UINT nEstilos, const TCHAR *nTexto,
const int cX, const int cY, const int cAncho, const int cAlto,
const UINT nID );
// -Función para asignar el texto del Button
BOOL AsignarTexto(const TCHAR *Texto);
// -Función para obtener el texto del Button
UINT ObtenerTexto(TCHAR *Texto, const UINT TamTexto);
protected :
HFONT _Fuente;
};

Como podemos ver, esta clase tiene un miembro para crear el botón, un mimebro para asignar su texto, un miembro para obtener su texto, y un miembro privado que tendrá la funete del botón cargada en memoria.

Veamos la función CrearButton :

Archivo : ObjetoButton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Función para crear el Button
void ObjetoButton::CrearButton(HWND hWndParent, const UINT nEstilos,
const TCHAR *nTexto, const int cX, const int cY,
const int cAncho, const int cAlto, const UINT nID ) {
ObjetoIniciarCommonControls::Iniciar();
// Creo el boton y lo enlazo a esta clase
_hWnd = CreateWindowEx(NULL, TEXT("BUTTON"), nTexto, nEstilos, cX, cY, cAncho,
cAlto, hWndParent, reinterpret_cast<HMENU>(IntToPtr(nID)),
GetModuleHandle(NULL), NULL );
_ConectarControl();
// Asigno una nueva fuente para el texto
_Fuente = CreateFont(13, 0, 0, 0, FW_NORMAL, false, false, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
FF_ROMAN, TEXT("Tahoma") );
SendMessage(_hWnd, WM_SETFONT, (WPARAM)_Fuente , 0);
}

Lo primero que se hace es llamar a la función ObjetoIniciarCommonControls::Iniciar. Esta función llama a la API InitCommonControlsEx para iniciar los controles estándar de windows para nuestra aplicación. Antiguamente en VC6 esto era necesario si queríamos trabajar con controles estándar, pero ahora mismo a decir verdad ya no se si es necesario, porque en mi maquina me funcionan igual los ejemplos tanto si llamo a InitCommonControlsEx como si no… y en la MSDN no dice nada.. Por lo que prefiero mantener este codigo por si las moscas.

Lo segundo que se hace es llamar a la API CreateWindowEx con el segundo parámetro “BUTTON” (que es el nombre de la clase). Esto hace que el control creado se convierta en un BUTTON. Para ver más nombres de control mira este enlace de la MSDN : CreateWindow (Casi al final hay una tabla que muestra los nombres de classe mas comunes)

Lo siguiente es llamar a la función _ConectarControl, que re-emplazara el WindowProcedure del Button por el nuestro.

Y por último creamos una fuente con la API CreateFont para el button, y le mandamos el mensaje WM_SETFONT al button con la API SendMessage, cosa que le dirá al button que debe usar esa fuente.

Ya solo nos queda ver las funciones ObtenerTexto y AsignarTexto :

Archivo : ObjetoButton.cpp
1
2
3
4
5
6
7
8
9
// Función para obtener el texto del Button
UINT ObjetoButton::ObtenerTexto(TCHAR *nTxt, const UINT TamTxt) {
return GetDlgItemText(GetParent(_hWnd), GetWindowLongPtr(_hWnd, GWL_ID), nTxt, TamTxt);
}
// Función para asignar el texto del Button
BOOL ObjetoButton::AsignarTexto(const TCHAR *nTxt) {
return SetDlgItemText(GetParent(_hWnd), GetWindowLongPtr(_hWnd, GWL_ID), nTxt);
}

Para obtener el texto del button utilizamos la API GetDlgItemText, y para asignarlo utilizamos la API SetDlgItemText. Además utilizamos la API GetWindowLongPtr para obtener la ID del button que necesitamos a la hora de asignar / obtener su texto.

Ahora solo nos falta saber como responder cuando el usuario presione el boton. Para ello normalmente se tiene que mirar el mensaje WM_COMMAND, o en este caso como lo tenemos encapsulado lo recibiremos por Evento_Comando de su ventana padre. Observad el siguiente ejemplo :

Archivo : 3.4 Tutorial crear ObjetoButton.cpp
1
2
3
4
5
// Función que recibe cuando se presiona el BUTTON
LRESULT MiVentana::Evento_Comando(const UINT nID, const UINT nNotificacion, HWND hWndControl) {
if (nID == ID_BUTTON_CERRAR) Evento_Cerrar();
return 0;
}

Como podeis ver, comparamos la ID con ID_BUTTON_CERRAR, y en caso de que la comparación sea positiva llamamos al Evento_Cerrar, que en esta ventana terminara la aplicación de ejemplo.

Para mas información referente al control Button consulta el siguiente enlace de la MSDN : Button Control.

Siguiente tutorial : 3.5 Creación del ObjetoComboBox.