Está en la página 1de 142

Programacin en Windows

y MFCs
Tema 6
TACC II
Grupo 46
11
TACC II
Curso 2008/09
Indice Indice
Programacin bajo Windows.
Introduccin Introduccin.
Hola mundo!.
El API de Windows.
Introduccin a las MFCs Introduccin a las MFCs.
Arquitectura Documento/Vista.
Aspectos avanzados de las MFCs.
Bibliografa.
22
g
Programacin Bajo Windows Programacin Bajo Windows
Proramacin orientada a eventos en contraste con la programacin Proramacin orientada a eventos, en contraste con la programacin
para MS-DOS, que es secuencial.
Evento: Algo que sucede en el sistema (click de ratn movimiento Evento: Algo que sucede en el sistema (click de ratn, movimiento
de ratn, pulsacin de una tecla, etc.)
Windows convierte estos eventos en mensajes (aaden informacin Windows convierte estos eventos en mensajes (aaden informacin
a los eventos). P.ej.: cuando se hace click con el ratn, el mensaje
incluye las coordenadas, la ventana sobre la que se puls, etc.
Windows pasa el mensaje a la parte interesada (ej. la ventana sobre
la que se hizo click).
La aplicacin puede obviar el mensaje, o puede tener cdigo que la
haga reaccionar.
33
Programacin Bajo Windows
Estructura genrica de una aplicacin windows:
Programacin Bajo Windows
Estructura genrica de una aplicacin windows:
1. Iniciar la aplicacin. p
Iniciar la aplicacin y la instancia.
En las versiones de 32 bits se inicializa la aplicacin cada vez que
se inicializa la instancia.
En las versiones de 16 bits slo con la 1 instancia (compartir
informacin, ahorro memoria).
Todas las aplicaciones tienen una o ms ventanas (hay
excepciones como los controladores de dispositivo) excepciones, como los controladores de dispositivo).
Clases (tipos) de ventanas definidas mediante parmetros. Registro
de la clase de ventana. Esto se hace al inicializar la aplicacin.
Al inicializar la instancia, se crea una ventana de la clase definida.
H d l b d l t d d Hay que dar el nombre de la ventana, sus coordenadas,
dimensiones, men, etc.
2. Esperar que llegue algn mensaje.
3 Reaccionar ante el mensaje recibido
44
3. Reaccionar ante el mensaje recibido.
4. Volver a 2.
Programacin Bajo Windows Programacin Bajo Windows
Estructura genrica de una aplicacin windows:
1. Iniciar la aplicacin.
2. Esperar que llegue algn mensaje.
Bucle de captura de mensajes.
Filtrar los mensajes que van a la aplicacin, adaptarlos y
h l ll l t di t hacerlos llegar a la ventana correspondiente.
Procedimiento de ventana, recibe mensaje y adopta uno u
otro comportamiento. otro comportamiento.
3. Reaccionar ante el mensaje recibido.
4. Volver a 2.
55
Hola Mundo! Hola Mundo!
#include "stdafx.h"
#include <windows.h>
// Crear un proyecto win32 application vaco (o Hello World en VC 6.0)
LRESULT CALLBACK G M j ( HANDLE hW d LRESULT CALLBACK GestorMensajes( HANDLE hWnd,
UINT mensaje,
WPARAM wParam,
LPARAM lParam)
{{
HDC hDc; // Device context
PAINTSTRUCT ps; // Estructura de dibujado
RECT rect; // Rectngulo cliente
switch (mensaje)
{
case WM_PAINT:
hD B i P i t((HWND)hW d & ) hDc =BeginPaint((HWND)hWnd, &ps);
GetClientRect((HWND)hWnd,&rect);
DrawText(hDc, TEXT("Hola Mundo!), -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint((HWND)hWnd, &ps);
b k break;
case WM_DESTROY:
PostQuitMessage(0);
break;
d f lt t D fWi d P ((HWND)hW d j P lP )
66
default: return DefWindowProc((HWND)hWnd,mensaje,wParam,lParam);
}
return (NULL);
}
Hola Mundo! Hola Mundo!
BOOL IniciaAplicacion (HINSTANCE hInstance)
{
C SS WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; //Estilo de la clase
wc lpfnWndProc =(WNDPROC)GestorMensajes; // Procedimiento gestor wc.lpfnWndProc (WNDPROC)GestorMensajes; // Procedimiento gestor
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
hI t hI t // I t i wc.hInstance = hInstance; // Instancia
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Icono de la ventana
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // cursor de la ventana
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE BRUSH); // Color de fondo wc.hbrBackground (HBRUSH)GetStockObject(WHITE_BRUSH); // Color de fondo
wc.lpszMenuName = NULL; // Nombre del men asociado
wc.lpszClassName = TEXT("ClaseVentana); // Nombre de la clase de la ventana
return (RegisterClass(&wc));
}
77
}
Hola Mundo! Hola Mundo!
BOOL IniciaInstancia(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd =CreateWindow(
TEXT("ClaseVentana), // Clase de ventana a la que pertenece (caract. UNICODE)
TEXT("TACC II, grupo 46, curso 2008/09),// Ttulo de la ventana
WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, // Estilo _ | _ | _
CW_USEDEFAULT, // Posicion X por defecto
CW_USEDEFAULT, // Posicion Y por defecto
CW_USEDEFAULT, // Anchura por defecto
CW_USEDEFAULT, // Altura por defecto
NULL, // Sin ventana padre
NULL, // Sin menu
hInstance, // Instancia
NULL); // Parametros
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow); // dice cmo mostrar la ventana
UpdateWindow(hWnd); // actualiza la ventana: genera un evento WM_PAINT
return TRUE;
88
}
Hola Mundo! Hola Mundo!
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG Mensaje;
BOOL bret;
if (!hPrevInstance){ if (!hPrevInstance){
if (!IniciaAplicacion(hInstance)) return FALSE;
}
if (!IniciaInstancia(hInstance, nCmdShow)) return FALSE;
while ((bret = GetMessage(&Mensaje, NULL, NULL, NULL)) != 0)
{{
TranslateMessage(&Mensaje); // traduce de teclas convencionales a WM_CHAR
DispatchMessage(&Mensaje); // hace llegar el mensaje al proc. de ventana
}
99
return (Mensaje.wParam);
}
La clase de Ventana La clase de Ventana
typedef struct { typedef struct {
UINT style; // combinacin de estilos de clase
WNDPROC lpfnWndProc; // Puntero al procedimiento de ventana
int cbClsExtra; // num. bytes extra a asignar seguidos a esta estructura
int cbWndExtra; // num. bytes extra a asignar seguidos a la instancia
HINSTANCE hInstance; // handle a la instancia que contiene el proc. ventana
HICON hIcon; // handle al icono de la clase (si NULL se da uno por def).
HCURSOR hCursor; // handle al cursor de la clase HCURSOR hCursor; // handle al cursor de la clase
HBRUSH hbrBackground; // handle a brocha para color de fondo, o un color
LPCTSTR lpszMenuName; // nombre del men asociado
LPCTSTR lpszClassName; // nombre de la clase de ventana
}WNDCLASS, *PWNDCLASS;
Tipos de clases de ventana: del sistema (ej.: BUTTON, COMBOBOX,
etc ) globales y locales de aplicacin etc.), globales y locales de aplicacin.
Algunos estilos: CS_HREDRAW, CS_VREDRAW (redibuja la venta
entera si hay un cambio de tamao horizontal), CS_NOCLOSE,.
La estructura WNDCLASSEX permite asociar un icono pequeo a la
10
La estructura WNDCLASSEX permite asociar un icono pequeo a la
ventana (RegisterClassEx).
Inicializacin de la Instancia Inicializacin de la Instancia
HWNDCreateWindow(
LPCTSTR lpClassName, // nombre registrado clase de ventana
LPCTSTR lpWindowName, // ttulo de la ventana
DWORDdwStyle, // estilo de la ventana
i t // i i h i t l d l t int x, // posicin horizontal de la ventana
int y, // posicin vertical de la ventana
int nWidth, // anchura de ventana
int nHeight // altura de ventana int nHeight, // altura de ventana
HWNDhWndParent, // handle de la ventana padre
HMENU hMenu, // handle del men de ventana
HINSTANCE hInstance // handle a la instancia de la aplicacin
C i d t d l i t d
HINSTANCE hInstance, // handle a la instancia de la aplicacin
LPVOIDlpParam ); // puntero a parmetros.
Creacin de una ventana de una clase registrada.
CreateWindowEx para estilos extendidos (ej.: layered
windows->ventanas no rectangulares o que cambian de
11
windows ventanas no rectangulares o que cambian de
forma)
Estilos de Ventana Estilos de Ventana
WS_BORDER: ventana con borde fino.
WS_CAPTION: ventana con barra de ttulo (incluye WS_BORDER).
WS CHILD WS CHILDWINDOW t hij ( d t i d WS_CHILD, WS_CHILDWINDOW : ventana hija (no puede tener men ni puede usarse con
WS_POPUP).
WS_CLIPCHILDREN: Excluye el rea ocupada por las ventanas hijas cuando se dibuja e la padre.
Se usa cuando se crea la ventana padre.
WS CLIPSIBLINGS: WS_CLIPSIBLINGS:
WS_DISABLED: crea una ventana deshabilitada.
WS_DLGFRAME: ventana con borde igual al de las cajas de dilogo.
WS_GROUP: Primer control de un grupo.
WS_HSCROLL: ventana con scrooll horizonta.
WS_ICONIC, WS_MINIMIZE: ventana inicialmente minimizada.
WS_MAXIMIZE: ventana inicialmente maximizada.
WS_MAXIMIZEBOX, WS_MINIMIZEBOX : ventana con botn de maximizar/minimizar. _ , _
WS_OVERLAPPED, WS_TILED; ventana con ttulo y borde.
WS_OVERLAPPEDWINDOW, WS_TILEDWINDOW: ventana con estilos: WS_OVERLAPPED,
WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, y
WS_MAXIMIZEBOX
WS_POPUP: ventana de pop-up.
WS_POPUPWINDOW: ventana de pop-up con WS_BORDER, WS_POPUP, y WS_SYSMENU
WS_SIZEBOX, WS_THICKFRAME: ventana con borde redimensionable.
WS SYSMENU: ventana con men de sistema.
12
S_S S U e ta a co e de s ste a
WS_TABSTOP: control que recibe el foco cuando se pulsa TAB.
WS_VISIBLE: ventana inicialmente visible.
WS_VSCROLL: ventana con barra de desplazamiento vertical.
Estilos de Ventana Estilos de Ventana
Men de sistema
Barra de ttulo
Botones minimizar/
maximizar/cerrar maximizar/cerrar
borde borde
Area cliente
Scroll horizontal Scroll vertical
13
Mensajes Mensajes
M j Mensajes:
typedef struct typedef struct
{
HWNDhwnd; // handle a la ventana que recibe el mensaje
UINT message; // identificador del mensaje UINT message; // identificador del mensaje
WPARAMwParam; // info adicional, dependiente del tipo de mensaje
LPARAMlParam; // info adicional, dependiente del tipo de mensaje
DWORDtime; // instante en el que el mensaje fue enviado ; q j
POINT pt; // posicin del cursor en coordenadas de pantalla
}MSG, *PMSG;
Todos los mensajes que enva windows empiezan
por WM XXX y estn definidos en wi ndows h
14 14
por WM_XXX y estn definidos en wi ndows. h
GetMessage GetMessage
GetMessage: Espera a que llegue un mensaje GetMessage: Espera a que llegue un mensaje.
BOOL GetMessage( LPMSG lpMsg, HWND hWnd,
lpMsg: Puntero a la estructura MSG que recibe el mensaje
UINT wMsgFilterMin, UINT wMsgFilterMax );
hWnd: Handle de la ventana que recibe los mensajes.
wMsgFilterMin: Menor valor entero del mensaje a recibir (ej.:
WM_KEYFIRST, WM_MOUSEFIRST o WM_INPUT)
wMsgFilterMax: Mayor valor entero del mensaje a recibir (ej.:
WM_KEYFIRST, WM_MOUSEFIRST o WM_INPUT)
Retorno:
Si se devuelve un mensaje distinto de WM_QUIT, el valor es distinto de cero.
Si el mensaje es WM_QUIT, el valor es cero.
Si hay un error el valor es -1. Por ejemplo, esto sucede si hWnd es un handle
de ventana invlida o lpWnd es un puntero invlido
15 15
de ventana invlida o lpWnd es un puntero invlido.
DispatchMessage
DispatchMessage
MSG

instancias de ventana
hwnd=h

hinstance=h1

hinstance=h2

hinstance=h
lpClassName =CN
hinstance=h1
lpClassName =CN
hinstance=h2
lpClassName =CN2
hinstance=h3
lpClassName=CN3

lpszClassName =CN

lpfnWndProc=proc

lpszClassName =CN2

lpfnWndProc=proc2

lpszClassName =CN3

lpfnWndProc=proc3
WNDCLASS
clases de ventana registradas
lpfnWndProc proc lpfnWndProc proc2 lpfnWndProc proc3
LRESULT CALLBACK proc (HANDLE LRESULT CALLBACK proc2 LRESULT CALLBACK proc3
16 16
LRESULT CALLBACK proc (HANDLE
hWnd, UINT mensaje, WPARAM
wParam, LPARAM lParam){..}
LRESULT CALLBACK proc2
(HANDLE hWnd, UINT
mensaje, WPARAM wParam,
LPARAM lParam){..}
LRESULT CALLBACK proc3
(HANDLE hWnd, UINT
mensaje, WPARAM wParam,
LPARAM lParam){..}
Handles Handles
Un identificador para los distintos objetos: ventanas Un identificador para los distintos objetos: ventanas,
controles (que son ventanas), ficheros, imgenes,
memoria, etc.
Similar a punteros: se obtienen y luego se destruyen.
17 17
Gestionar un nuevo evento Gestionar un nuevo evento
LRESULT CALLBACK GestorMensajes( HANDLE hWnd LRESULT CALLBACK GestorMensajes( HANDLE hWnd,
UINT mensaje,
WPARAM wParam,
LPARAM lParam)
{{
HDC hDc; // Device context
//
switch (mensaje) switch (mensaje)
{
case WM_LBUTTONDOWN:
MessageBox((HWND)hWnd, TEXT("Button click"), TEXT("dialogo"), MB_ICONHAND);
break; break;
default: return DefWindowProc((HWND)hWnd,mensaje,wParam,lParam);
}
return (NULL);
}}
18
Juegos de Caracteres Juegos de Caracteres
1890 BCDIC (6 bit 64 t ) ~1890: BCDIC (6 bits->64 caracteres).
~1950: ASCII (7 bits->128 caracteres). ( )
ASCII extendido (8 bits->256 caracteres).
pginas de cdigos regionales para los ltimos pginas de cdigos regionales para los ltimos
128.
DBCS: los primeros 128 bytes igual que DBCS: los primeros 128 bytes igual que
ASCII, los posteriores ocupan dos bytes.
U i d 16 bit (65536 t ) Unicode: 16 bits (65536 caracteres).
Sistema de doble anchura (wide char).
19
Caracteres Unicode Caracteres Unicode
Tipo de datos wchar_t.
Ej.: wchar_t nombre[50]=LBjarne Stroustrup. j _ [ ] j p
Mejor usar macros, que aseguran que el
programa funciona en Unicode o ASCII: programa funciona en Unicode o ASCII:
TCHAR * Nombre = TEXT(Hola);
20
La Notacin Hngara La Notacin Hngara
Convencin para los nombres de variables (uso de prefijos), de tal
manera que al leerlos sepamos su tipo.
Despus del prefijo se empieza por maysculas.
Ejemplo: Ejemplo:
hWnd es un handle (h) a una ventana.
lpfnWndProc es un puntero (p) largo (l) a una funcin (fn).
Tipo de Dato Prefijo
char c
Tipo de Dato Prefijo
DWORD(unsignedlong) dw char c
BYTE(unsigned char) by
short n
DWORD(unsigned long) dw
BOOL(int) o Flag b f
Handle h
int i
int cuando indica coordenadas x, y
int cuando indica dimensiones cx, cy
Puntero p
Funcin fn
Cadena s y
WORD (unsigned int) w
LONG (long) l
Cadena terminada en \0 sz
El API de Windows El API de Windows
Llamadas al sistema operativo almacenadas en DLLs Llamadas al sistema operativo, almacenadas en DLLs.
Win32, WinSock, WinInet, ODBC, etc.
Dentro de Win32 se engloban como extensiones el resto de las API
que se puedan aadir a Windows.
Win32 proprociona un entorno de programacin comn a la
plataforma Windows: 3.1 (win32s), 95/98, NT4.0, 2000, CE, XP,
Vista Vista.
En algunas plataformas el win32 (p. ej. CE) no est implementada
en su totalidad en su totalidad.
Win32: CreateWindow(), RegisterClass(), ShowWindow(),
UpdateWindow() DrawText() etc
22 22
UpdateWindow(), DrawText(), etc.
Win32 Win32
Varias categoras de funciones: Varias categoras de funciones:
Administracin de ventanas (en user32.dll)
Crear y administrar la GUI, despachar mensajes, administrar
ventanas DDE ventanas, DDE.
Ej.: CreateWindow(), RegisterClass(), ShowWindow()
Graphics Device Interface (GDI).
G lid di ti t di iti t ll i P j Generar salidas en distintos dispositivos: pantalla, impresora. P.ej.:
dibujar objetos.
Ej.: BeginPaint(), GetClientRect(), DrawText(), EndPaint().
M di C t l I t f (MCI) Media Control Interface (MCI).
Reproducir y Grabar Audio, uso de vdeo, control de dispositivos
multimedia.
S i i d l Si t Servicios del Sistema.
Administracin de memoria, archivos y procesos, funciones de trabajo
en red, informacin del sistema, IPC.
23 23
Remote Procedure Call (RPC).
Bibliotecas de Extensin Bibliotecas de Extensin
P i i i l li i Proporcionan servicios a las apliciones
fuera del mbito del Win32.
Controles comunes.
Cuadros de dilogo comunes.
Descompresin de datos.
Administracin de intercambio dinmico de
datos (DDE).
Instalacin de archivos.
Intercambio dinmico de datos sobre redes.
...
24 24
Indice Indice
Programacin bajo Windows.
Introduccin a las MFCs Introduccin a las MFCs.
Introduccin.
Ventana vaca sin el wizard Ventana vaca sin el wizard.
Uso del wizard.
Un vistazo a las clases de MFC Un vistazo a las clases de MFC.
Mapas de Mensajes.
Mens y Teclas Aceleradoras Mens y Teclas Aceleradoras.
Dilogos Comunes.
Controles. Controles.
Clases de utilidad
Arquitectura Documento/Vista.
25 25
Arquitectura Documento/Vista.
Aspectos avanzados de las MFCs.
Bibliografa.
Microsoft Foundation Classes Microsoft Foundation Classes
El API l i di d li i Wi d d El API para la programacin directa de aplicaciones Windows da
acceso total a la funcionalidad del sistema operativo, pero es de
bajo nivel.
MFC es un framework que ofrece una serie de funciones,
constantes tipos de datos y clases que simplifica la creacin de constantes, tipos de datos y clases que simplifica la creacin de
aplicaciones para las distintas plataformas Windows.
Es la respuesta de Microsoft a frameworks de otras compaias
como OWL de Borland.
Visual C++contiene un asistente (wizard) que facilita la creacin de
aplicaciones MFC (generacin de cdigo).
26 26
Clases Bsicas para la creacin de ventanas
27 27
Secuencia de Creacin de una Aplicacin
28 28
Creacin de una
#include "stdafx.h"
#i l d < f i h> // MFC d t d d t
Creacin de una
Ventana en Blanco sin
l i d
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
// proyecto con Shared DLL
#ifdef _DEBUG
#define newDEBUG NEW
el wizard
#define new DEBUG_NEW
#endif
class CMainFrame : public CFrameWnd {
public: p
CMainFrame() {Create(NULL, _T("Hellow World Application")); }// suele ir en OnCreate()
}; // se suele llamar a LoadFrame
class HelloWorldApp : public CWinApp {
public:
i t l BOOL I itI t () virtual BOOL InitInstance();
};
HelloWorldApp theApp; // Declarar un unico objecto CWinApp
BOOL HelloWorldApp::InitInstance()
{
CWinApp::InitInstance();
SetRegistryKey(_T("Hello World Application")); g y y(_ ( pp ))
CMainFrame* pFrame =new CMainFrame;
if (!pFrame) return FALSE;
m_pMainWnd =pFrame;
pFrame->ShowWindow(SW_SHOW);
F U d t Wi d ()
29 29
pFrame->UpdateWindow();
return TRUE;
}
//NOTA: El WinMain est dentro del framework MFCs
Uso del Asistente
Configuracin Inicial de la Aplicacin
File/new Project; seleccionar MFC Application
30 30
Uso del Asistente Uso del Asistente
Configuracin Inicial de la Aplicacin
Configurar el tipo de
aplicacin:
Single document
Sin soporte de
arquitectura
Documento/Vista Documento/Vista.
MFC en librera esttica
(incluye en el exe las
DLLs necesarias)
31 31
Uso del Asistente
Configurar el soporte para BBDD
Uso del Asistente
Configuracin Inicial de la Aplicacin
Configurar el soporte para BBDD
32 32
Uso del Asistente
Configurar la interfaz de usuario
Uso del Asistente
Configuracin Inicial de la Aplicacin
Configurar la interfaz de usuario
33 33
Uso del Asistente Uso del Asistente
Configuracin Inicial de la Aplicacin
Configurar nombre de las clases y de los ficheros que se van a generar Configurar nombre de las clases y de los ficheros que se van a generar
34 34
Uso del Asistente Uso del Asistente
Aplicacin Generada
35 35
Uso del Asistente Uso del Asistente
Qu ficheros se han generado?
D fi i i d b d l
Fichero de recursos (.rc y .rc2).
Definicin de nombres de los recursos, para
poder ser usados por la aplicacin.
( y )
ClaseAplicacin(hereda de CWinApp)
Clase de la ventana de trabajo (hereda de CWnd),
dentro de la ventana marco
Cabeceras precompiladas. stdafx.h incluye las
cabeceras comunes del sistema Se ha de incluir
Clase Aplicacin (hereda de CWinApp)
Clase de la ventana marco (hereda de CFrameWnd)
36 36
cabeceras comunes del sistema. Se ha de incluir
antes que cualquier otra
Uso del Asistente Uso del Asistente
Recursos de la Aplicacin
#define IDD_ABOUTBOX 100
#define IDP_OLE_INIT_FAILED 100
#define IDR MAINFRAME 128
Resource.h
#define IDR_MAINFRAME 128
#define IDR_HelloMFCsTYPE 129
37 37
Uso del Asistente
Wi M i ()
Uso del Asistente
Estructura de la Aplicacin
WinMain():
Dentro del framework.
Se llama a mtodos miembros del nico objeto de tipo CWinApp:
InitApplication(): Normalmente no hay que tocar este mtodo.
InitInstance(): Tareas generales de la aplicacin, ej: inicializar OLE.
Despus se crean las ventanas de la aplicacin, y se hacen visibles
(ShowWindow()) (ShowWindow())
Run(): Que implementa al bucle de mensajes hasta que llega WM_QUIT.
CWinApp: CWinApp:
Clase que hay que subclasificar, se debe crear un objeto nico global.
Procesa mensajes hasta que llega WM_QUIT, momento en el que
ejecuta ExitInstance() por defecto ejecuta ExitInstance() por defecto.
Si no hay mensajes, llama a onIdle(), vaca por defecto.
38 38
n

d
e

a
c
i

n
e

C
r
e

n
c
i
a

d
e
i
c
a
c
i

c
u
e
n
c
a

A
p
l
i
39 39
S
e
c
u
n
a
Uso del Asistente
Estructura de la Aplicacin: La clase ventana (CWnd)
C i t d l li i ti t Casi todas las aplicaciones tienen una o ms ventanas.
La clase base es CWnd.
Contiene un handle a la ventana fsica de Windows.
La ventana fsica se crea mediante Create(), se destruye con el
destructor de la subclase de CWnd. Parmetros de Create():
lpszClassName: nombre de la clase registrada con
AfxRegisterWindowClass() o NULL (atributos por defecto).
lpszWindowName: nombre de la ventana.
dwStyle: Estilo de la ventana a crear.
rect: Referencia a un objeto constante de tipo RECT, para indicar
posicin y tamao de la ventana.
pParentWindow: puntero al objecto CWnd padre de la ventana. No
d NULL Si l l i i l puede ser NULL. Si la ventana es la principal, usar
CreateWindowEx().
nId: Identificador de la ventana.
C t t P t bj t d ti CC t C t t
40 40
pContext: Puntero a un objeto de tipo CCreateContext, para
asociar vistas y documentos a la ventana, puede ser NULL.
Uso del Asistente
Estructura de la Aplicacin: La clase ventana (CWnd)
CW d i d li b t CWnd agrupa acciones que se podan realizar sobre ventanas.
Las hace ms accesibles y seguras.
Evita por ejemplo tener que pasar el handle como primer parmtero p j p q p p p
(almacenado en el atributo m_hWnd).
Ejemplo:
los mtodos de CWnd: los mtodos de CWnd:
voi d CWnd: : MoveWi ndow( i nt x, i nt y,
i nt nWi dt h, i nt nHei ght ,
BOOL bRepai nt = TRUE ) ;
voi d CWnd: : MoveWi ndow( LPCRECT l pRect ,
encapsulan la llamada a la API de Windows:
voi d CWnd: : MoveWi ndow( LPCRECT l pRect ,
BOOL bRepai nt = TRUE ) ;
BOOL MoveWi ndow( HWND hWnd, i nt X, i nt Y,
i nt nWi dt h, i nt nHei ght ,
BOOL bRepai nt ) ;
41 41
Uso del Asistente
Estructura de la Aplicacin: La clase CFrameWnd
H d d CW d tili d li i SDI Hereda de CWnd, es utilizado en aplicaciones SDI.
Tiene en su interior una ventana hija que normalmente ser la ventana
principal de la aplicacin.
La entana marco interacciona con el s ario cambiando el tamao La ventana marco interacciona con el usuario cambiando el tamao,
movindose, etc., y gestiona estos cambios provocando modificaciones en
la ventana hija.
Para crear una ventana marco: Para crear una ventana marco:
Create(),
LoadFrame(), que toma menos parmetros. Toma valores por defecto
de los recursos que se le pasan como parmetros: men ttulo icono y de los recursos que se le pasan como parmetros: men, ttulo, icono y
tabla de teclas acelaradoras.
vi r t ual BOOL LoadFr ame( UI NT nI DResour ce,
DWORD dwDef aul t St yl e = WS_OVERLAPPEDWI NDOW| FWS_ADDTOTI TLE,
Se destruye llamando a DestroyWindow().
Sus clases derivadas deben declarar DECLARE DYNCREATE() (gestin
CWnd* pPar ent Wnd = NULL, CCr eat eCont ext * pCont ext = NULL ) ;
42 42
Sus clases derivadas deben declarar DECLARE_DYNCREATE() (gestin
dinmica de clases) si se usa la arquitectura documento/vista, y poner
IMPLEMENT_DYNCREATE() en la implementacin.
Uso del Asistente
Handles
Las clases de la MFC ocultan los handles (CWnd::m_hWnd), para facilitar
su uso su uso.
Se pueden construir objetos a partir de elementos grficos ya construidos:
st at i c CWnd* PASCAL Fr omHandl e( HWND hWnd )
El objeto devuelto es temporal (eliminado en prxima llamada a OnIdle()).
st at i c CWnd* PASCAL Fr omHandl e( HWND hWnd ) ;
Clases que encapsulan handles a objetos grficos:
Elemento Grfico Clase de Objeto
HWND CWnd y derivadas
HDC CDC y derivadas
HMENU CMenu HMENU CMenu
HPEN, HBRUSH, HFONT, HBITMAP,
HPALETTE, HRGN
CGdiObject
43 43
HIMAGELIST CImageList
SOCKET CSocket
Uso del Asistente
Dnde est el bucle de eventos?
Tabla con los elementos a manejar: el mapa de mensajes.
Mediante Macros, normalmente insertadas por el asistente.
Declaracin del mapa de mensajes en la clase:
DECLARE MESSAGE MAP(). DECLARE_MESSAGE_MAP().
Declaramos tambin los mtodos que manejarn los mensajes
mediante afx_msg:
class CMainFrame : public CFrameWnd {
public: CMainFrame();
protected:
DECLARE DYNAMIC(CM i F ) DECLARE_DYNAMIC(CMainFrame)
// Funciones de asignacin de mensajes generadas
protected:
afx msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSetFocus(CWnd *pOldWnd);
DECLARE_MESSAGE_MAP()
};
44 44
}
Uso del Asistente
Dnde est el bucle de eventos?
Una vez declarado, hay que definir el mapa de mensajes, y enlazar , y q p j , y
cada mensaje con la funcin que la va a procesar.
En el fichero de implementacin (.cpp) se aade:
BEGIN_MESSAGE_MAP()
//{{AFX_MSG_MAP(CMainFrame)
Usado por versiones
anteriores de Visual C++
ON_WM_CREATE()
ON_WM_SETFOCUS()
//}}AFX MSG MAP
Mensajes que
se van a tratar
anteriores de Visual C
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
L j f i d l t bl l l Los mensajes no referenciados en la tabla se pasan a la clase
padre (o a la clase de la ventana contenedora), y as sucesivamente
hasta que se trate por algn ancestro.
45 45
Uso del Asistente Uso del Asistente
Cdigo Generado: HelloMFCs.h
// HelloMFCs h: archivo de encabezado principal para la aplicacinHelloMFCs // HelloMFCs.h: archivo de encabezado principal para la aplicacin HelloMFCs
#pragma once
#ifndef __AFXWIN_H__
#error "incluir 'stdafx h' antes de incluir este archivo para PCH" #error incluir stdafx.h antes de incluir este archivo para PCH
#endif
#include "resource.h" // Smbolos principales
class CHelloMFCsApp : public CWinApp {
public: CHelloMFCsApp();
// Reemplazos // Reemplazos
public:
virtual BOOL InitInstance();
// Implementacin // Implementacin
public:
afx_msg void OnAppAbout();
DECLARE MESSAGE MAP()
46 46
DECLARE_MESSAGE_MAP()
};
extern CHelloMFCsApp theApp;
#include "stdafx.h"
#include "HelloMFCs.h"
#include "MainFrm.h
#ifdef DEBUG
Uso del Asistente
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
BEGIN_MESSAGE_MAP(CHelloMFCsApp, CWinApp)
Uso del Asistente
Cdigo Generado: HelloMFCs.cpp (i)
ON_COMMAND(ID_APP_ABOUT, &CHelloMFCsApp::OnAppAbout)
END_MESSAGE_MAP()
CHelloMFCsApp::CHelloMFCsApp() {
// TODO: agregar aqu el cdigo de construccin, Colocar toda la inicializacinimportante en InitInstance } // TODO: agregar aqu el cdigo de construccin, Colocar toda la inicializacin importante en InitInstance }
CHelloMFCsApp theApp; // El nico objeto CHelloMFCsApp
// Inicializacin de CHelloMFCsApp
BOOL CHelloMFCsApp::InitInstance() {
INITCOMMONCONTROLSEX InitCtrls; INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize =sizeof(InitCtrls);
InitCtrls.dwICC =ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
if (!AfxOleInit()) {// Inicializar bibliotecas OLE
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE; }
AfxEnableControlContainer();
SetRegistryKey( T("Aplicaciones generadas con el Asistente para aplicaciones local")); g y y(_ ( p g p p ));
CMainFrame* pFrame =new CMainFrame;
if (!pFrame) return FALSE;
m_pMainWnd =pFrame;
// Crear y cargar el marco con sus recursos
pFrame >LoadFrame(IDR MAINFRAME WS OVERLAPPEDWINDOW| FWS ADDTOTITLE NULL NULL);
47 47
pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,NULL);
pFrame->ShowWindow(SW_SHOW); // Se ha inicializado la nica ventana; mostrarla y actualizarla
pFrame->UpdateWindow();
return TRUE;
}
// Cuadro de dilogo CAboutDlg utilizado
// para el comandoAcerca de
Uso del Asistente
// para el comando Acerca de
class CAboutDlg : public Cdialog {
public: CAboutDlg();
Cdigo Generado: HelloMFCs.cpp (ii)
// Datos del cuadro de dilogo
enum {IDD =IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV g ( g p ); p
// Implementacin
protected:
DECLARE_MESSAGE_MAP()
}; };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { g g ( g p ) {
CDialog::DoDataExchange(pDX);
}
BEGIN MESSAGE MAP(CAboutDlg, CDialog) _ _ ( g, g)
END_MESSAGE_MAP()
// Comando de la aplicacin para ejecutar el cuadro de dilogo
void CHelloMFCsApp::OnAppAbout() {
48 48
pp pp () {
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
#pragma once
#include "ChildViewh"
Uso del Asistente
Cdigo Generado: MainFrm.h (i)
#include ChildView.h
class CMainFrame : public CFrameWnd {
public: CMainFrame();
protected: DECLARE DYNAMIC(CMainFrame)
Cdigo Generado: MainFrm.h (i)
Permite acceder a informacin en tiempo de
ejecucin a la clase (puede usarse la macro
RUNTIME CLASS l it t
protected: DECLARE_DYNAMIC(CMainFrame)
// Reemplazos
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL OnCmdMsg(UINT nID int nCode void* pExtra AFX CMDHANDLERINFO* pHandlerInfo);
RUNTIME_CLASS en la arquitectura
documento/vista)
virtual BOOL OnCmdMsg(UINT nID, int nCode, void pExtra, AFX_CMDHANDLERINFO pHandlerInfo);
// Implementacin
public:
virtual ~CMainFrame();
#ifdef DEBUG #ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // Miembros incrustados de la barra de control
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CChildView m wndView; CChildView m_wndView;
// Funciones de asignacin de mensajes generadas
protected:
afx msgint OnCreate(LPCREATESTRUCT lpCreateStruct);
49 49
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSetFocus(CWnd *pOldWnd);
DECLARE_MESSAGE_MAP()
};
#include "stdafx.h"
#include "HelloMFCs.h
#include "MainFrm.h
#ifdef _DEBUG
#define newDEBUG NEW
Uso del Asistente
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
Cdigo Generado: MainFrm.cpp (i)
ON_WM_CREATE()
ON_WM_SETFOCUS()
END_MESSAGE_MAP()
static UINT indicators[] ={ID SEPARATOR, ID INDICATOR CAPS, ID INDICATOR NUM, ID INDICATOR SCRL, }; static UINT indicators[] {ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };
// Construccin y destruccin de CMainFrame
CMainFrame::CMainFrame() {// TODO: agregar aqu el cdigo de inicializacin de miembros }
CMainFrame::~CMainFrame() {}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) ==-1) return -1;
// Crear una vista para ocupar el rea de cliente del marco
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) {
TRACE0("No se pudo crear la ventana de vista\n");
return -1; }
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS GRIPPER | CBRS TOOLTIPS | CBRS FLYBY | CBRS SIZE DYNAMIC) || | _ | _ | _ | _ _ ) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
TRACE0("No se pudo crear la barra de herramientas\n"); return -1; /* no se pudo crear */ }
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))) {
TRACE0("No se pudo crear la barra de estado\n"); return -1; /* No se pudo crear */}
// TODO: eliminar estas tres lneas si no desea que la barra de herramientas se pueda acoplar
50 50
// TODO: eliminar estas tres lneas si no desea que la barra de herramientas se pueda acoplar
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0; }
Uso del Asistente
Cdigo Generado: MainFrm.cpp (ii)
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
// se llama por las MFCs antes de crear fsicamente la ventana. se devuelve !=0 si la creacin debe continuar, 0
en otro caso.
if( !CF W d P C Wi d ( ) ) FALSE
Cdigo Generado: MainFrm.cpp (ii)
if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;
// TODO: modificar aqu la clase Window o los estilos cambiando CREATESTRUCT cs
cs.dwExStyle &=~WS_EX_CLIENTEDGE;
l Cl Af R i t W dCl (0) cs.lpszClass =AfxRegisterWndClass(0);
return TRUE;
}
#ifd f DEBUG #ifdef _DEBUG
void CMainFrame::AssertValid() const {CFrameWnd::AssertValid();}
void CMainFrame::Dump(CDumpContext& dc) const {CFrameWnd::Dump(dc); }
#endif //_DEBUG
void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/) {
// enviar foco a la ventana de vista
m_wndView.SetFocus();
}}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) {
// Permitir que la vista se interrumpa primero en el comando
if ( dVi O C dM ( ID C d E t H dl I f )) t TRUE
51 51
if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
// De lo contrario, proceder con el control predeterminado
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
Uso del Asistente
// ChildViewh: interfaz de la clase CChildView
Cdigo Generado: ChildView.h
// ChildView.h: interfaz de la clase CChildView
//
#pragma once
// Ventana de CChildView
class CChildView : public CWnd {
// Construccin
public: CChildView();
// Atributos // Atributos
public:
// Operaciones
public:
// Reemplazos // Reemplazos
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
// Implementacin // Implementacin
public:
virtual ~CChildView();
// Funciones de asignacin de mensajes generadas
protected:
52 52
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
Uso del Asistente
#include "stdafx.h"
#include "HelloMFCs.h"
#include "ChildViewh"
Cdigo Generado: ChildView.cpp
#include ChildView.h
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CChildView::CChildView() {}
CChildView::~CChildView() {}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// Controladores de mensaje de CChildView // Controladores de mensaje de CChildView
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) {
if (!CWnd::PreCreateWindow(cs)) return FALSE;
cs.dwExStyle |=WS_EX_CLIENTEDGE; y | _ _
cs.style &=~WS_BORDER;
cs.lpszClass =AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
53 53
}
void CChildView::OnPaint() {}
Uso del Asistente Uso del Asistente
Modificando la aplicacin
void CChildView::OnPaint() ()
{
CPaintDC dc(this); // Contexto de dispositivo para dibujo
dc.Rectangle(200, 200, 300, 320); g ( , , , );
dc.DrawText( "Hola MFCs!", -1,
CRect( 200, 200, 300, 320),
DT_SINGLELINE|DT_CENTER|
DT VCENTER); _ );
}
54 54
Bucle de Mensajes Bucle de Mensajes
Las clases MFC Las clases MFC
Arbol jerrquico de clases, con raz CObject.
CObject permite persistencia (serialize()), chequeo de consistencia de
atributos (AssertValid()),
Gestin de excepciones: heredan de CException Gestin de excepciones: heredan de CException.
ReportError(): muestra la excepcin en una ventana.
GetErrorMessage(): descripcin del error.
Gestin de archivos: CFile.
Contextos de dispositivo: CDC e hijas:
A l l t d l t CWi d DC Acceso al rea completa de la ventana: CWindowDC.
Dibujo en funcin del evento WM_PAINT: CPaintDC.
Gestin de Objetos Grficos: CGdiObject. j j
Gestin de fuentes de letras: CFont.
Gestin de mapas de bits de colores: CBitmap.
Uso de Brochas: CBrush
56 56
Uso de Brochas: CBrush.
Manejo de plumas: CPen.
Las clases MFC Las clases MFC
CC dT t l b l i d j CCmdTarget: clase base para la gestin de mensajes.
Clases documento: CDocument, con hijas: COleDocument,
CHtmlEditDoc, etc. ,
Gestin de comunicaciones OLE: COleObjectFactory,
COleDataSource, COleDropTarget, etc.
CW d G ti d t CWnd: Gestin de ventanas.
CFrameWnd e hijas (ventana principal).
CSplitterWnd (paneles de ventana). p (p )
CControlBar (gestin de barras de control y estado): CToolBar,
CStateBar, CReBar, CDialogBar.
CDialog: gestin de ventanas de dilogo CColorDialog(seleccin CDialog: gestin de ventanas de dilogo. CColorDialog (seleccin
de colores), CPrintDialog (imprimir), CFileDialog (elegir un fichero),
CFontDialog (seleccin de fuentes).
57 57
Las clases MFC
Gestin de vistas en la arquitectura Documento/Vista:
Las clases MFC
q
CView.
CEditView: Edicin de textos.
CHtmlView: Visualizacin de pginas HTML.
Controles (heredan de CWnd):
(CS ) Texto esttico (CStatic).
Texto modificable (CEdit).
Listas de elementos: CListBox CCheckListBox CDrawListBox Listas de elementos: CListBox, CCheckListBox, CDrawListBox,
etc.
Clases que no heredan de CObject: Clases de soporte
(ej.: CWaitCursor), API servidor de Internet,
sincronizacin, etc.
58 58
Las clases MFC Las clases MFC
59 59
CCmdTarget CObject
Las
clases
MFC MFC
60 60
Las clases MFC
b
j
e
c
t
C
O
b
61 61
Mapas de Mensajes Mapas de Mensajes
Subclases de CCmdTarget.
Declaracin del mapa de mensajes: DECLARE_MESSAGE_MAP(),
que nos crea:
Un vector de mensajes privado ( messageEntries) Un vector de mensajes privado (_messageEntries).
Un puntero protegido al inicio del vector (messageMap).
Mtodo virtual GetMessageMap(), que devuelve el contenido de
M messageMap.
Declaracin de los mtodos que gestionarn los eventos (precederlos
de afx msg). _ g)
Definir la lista que relaciona eventos con las funciones que los
gestionan:
BEGIN MESSAGE MAP(clase claseBase) BEGIN_MESSAGE_MAP(clase,claseBase)
Sintaxis que depende del tipo de evento: comando, ventana o controles.
END_MESSAGE_MAP()
62 62
Mensajes de Ventana Mensajes de Ventana
110 tipos de mensajes, producidos por la ventana que
estamos gestionando.
E i WM XX ( t WM COMMAND) Empiezan por WM_XX (excepto WM_COMMAND).
Se definen en la lista con ON_+<nombre_mensaje>.
Ej l WM PAINT WM RBUTTON DOWN Ejemplo, para WM_PAINT, WM_RBUTTON_DOWN:
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON WM PAINT() ON_WM_PAINT()
ON_WM_RBUTTON_DOWN()
END_MESSAGE_MAP()
Se llama a OnPaint() y a OnRButtonDown(UINT, CPoint).
Podemos usar el asistente para gestionar esta lista.
63 63
Mensajes de Ventana Mensajes de Ventana
Ejemplo: Capturar el evento WM_LBUTTONDOWN
//ChildViewh //ChildView.h
class CChildView : public CWnd
{
public: public:
CChildView();
protected: p
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
CPoint lastClicked;
// Implementacin
public:
virtual ~CChildView();
// Funciones de asignacin de mensajes generadas
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
bli
64 64
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
Mensajes de Ventana
//ChildView.cpp
CChildView::CChildView() : lastClicked ( 1 1) {}
Ejemplo: Capturar el evento WM_LBUTTONDOWN
CChildView::CChildView() : lastClicked (-1, -1) {}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END MESSAGE MAP() END_MESSAGE_MAP()
void CChildView::OnPaint() {
CPaintDC dc(this); // Contexto de dispositivo para dibujo
dc.Rectangle(200, 200, 300, 320);
dc.DrawText( "Hola MFCs!", -1, CRect( 200, 200, 300, 320),
DT SINGLELINE|DT CENTER|DT VCENTER); DT_SINGLELINE|DT_CENTER|DT_VCENTER);
if (lastClicked.x>=0 && lastClicked.y>0)
dc.TextOut( lastClicked.x, lastClicked.y, "click");
}
void CChildView::OnLButtonDown(UINT nFlags, CPoint point) {
lastClicked=point;
InvalidateRect(NULL);
CW d O LB tt D ( Fl i t)
65 65
CWnd::OnLButtonDown(nFlags, point);
}
Mensajes de Ventana Mensajes de Ventana
Ejemplo: Capturar el evento WM_LBUTTONDOWN
66 66
Mensajes de Controles Mensajes de Controles
E t l l t hij l d l Eventos que lanza la ventana hija al padre que la
contiene.
Ejemplo: el control de edicin manda el mensaje Ejemplo: el control de edicin manda el mensaje
EN_CHANGE cuando se modifica el texto que contiene.
Tipos: p
ON_BN_XX: mensajes de botones.
ON_EN_XX: mensajes de editores.
ON CB XX j d b b ON_CB_XX: mensajes de combo-boxes.
ON_LBN_XX: mensajes de listas.
Se mandan mediante el mensaje WM COMMAND Se mandan mediante el mensaje WM_COMMAND.
WM_NOTIFY, ON_NOTIFY() para que la funcin que
gestiona el evento reciba parmetros.
67 67
Mensajes de Comando Mensajes de Comando
Provienen de mens, barras de herramientas,
teclas aceleradoras y botones.
Macro ON_COMMAND(evento,metodo).
BEGIN MESSAGE MAP(CH ll MFC A CWi A ) BEGIN_MESSAGE_MAP(CHelloMFCsApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CHelloMFCsApp::OnAppAbout)
END_MESSAGE_MAP()
68 68
Mensajes de Comando Mensajes de Comando
Ejemplo: Aadir un elemento de Men
69 69
Mensajes de Comando Mensajes de Comando
Ejemplo: Aadir el Gestor de Eventos
70 70
Mensajes de Comando
#pragma once
// Ventana de CChildView
Mensajes de Comando
Ejemplo: ChildView.h
class CChildView : public CWnd{
public:
CChildView();
protected: p
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
private:
const int numColores;
UINT * const CodigoColor; g
CPoint lastClicked;
int currentColor;
// Implementacin p
public:
virtual ~CChildView();
// Funciones de asignacin de mensajes generadas g j g
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
public:
71 71
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
public:
afx_msg void OnCambiacolor();
};
Mensajes de Comando
CChildView::CChildView() : numColores (4),
CodigoColor (new UINT[numColores]), currentColor(0) {
lastClicked =CPoint(-1, -1);
C di C l [0] RGB(0 0 0) // Bl k
Mensajes de Comando
Ejemplo: ChildView.cpp
CodigoColor[0] =RGB(0, 0, 0); // Black
CodigoColor[1] =RGB(255, 0, 0); // Red
CodigoColor[2] =RGB(0, 255, 0); // Green
CodigoColor[3] =RGB(0, 0, 255); // Blue
}}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON WM LBUTTONDOWN() ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_CAMBIACOLOR, &CChildView::OnCambiacolor)
END_MESSAGE_MAP()
idCChildVi O P i t() { void CChildView::OnPaint() {
CPaintDC dc(this); // Contexto de dispositivo para dibujo
dc.Rectangle(200, 200, 300, 320);
dc.DrawText( "Hola MFCs!", -1, CRect( 200, 200, 300, 320),DT_SINGLELINE|DT_CENTER|DT_VCENTER);
if (l tCli k d 0&&l tCli k d 0) { if (lastClicked.x>=0 && lastClicked.y>0) {
dc.SetTextColor(CodigoColor[currentColor]);
dc.DrawText( "Click", -1, CRect( lastClicked, CPoint(lastClicked.x+50, lastClicked.y+20)),
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}
72 72
}
}
void CChildView::OnCambiacolor() {currentColor =(currentColor +1) % numColores; }
Mensajes de Comando Mensajes de Comando
Resultado
CChildView::~CChildView()
{{
delete [ ] CodigoColor;
}
73 73
Aplicaciones basadas en dilogos Aplicaciones basadas en dilogos
Se pueden crear aplicaciones basadas en
dilogo.
Por defecto sin mens ni teclas aceleradoras.
Para implementar aplicaciones sencillas, Para implementar aplicaciones sencillas,
basadas en formularios de toma de datos.
La ventana principal hereda de CDialog o de La ventana principal hereda de CDialog, o de
CDHTMLDialog (para mostrar pginas en
HTML) HTML).
Mapas de Datos Mapas de Datos
I t bi d D t d Dil (DDX) Intercambio de Datos de Dilogo (DDX).
Asociar variables a controles del dilogo g
para intercambiar informacin.
Por valor (las variables contienen el valor Por valor (las variables contienen el valor
del control) o por referencia (control).
UpdateData(FALSE) actualiza los UpdateData(FALSE) actualiza los
controles a partir de las variables.
UpdateData(TRUE) actualiza las variables
a partir del contenido de los controles.
75 75
Mapas de Datos Mapas de Datos
Ejemplo
76 76
Mapas de Datos Mapas de Datos
Ejemplo
77 77
Mapas de Datos
#pragma once
// Cuadro de dilogo de CSimpleDlg
Mapas de Datos
CSimpleDlg.h
g p g
class CSimpleDlg : public Cdialog{
// Construccin
public:
CSimpleDlg(CWnd* pParent =NULL); // Constructor estndar p g( p );
// Datos del cuadro de dilogo
enum {IDD =IDD_SIMPLEDIALOGO_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV g ( g p ) p
// Implementacin
protected:
HICON m_hIcon;
// Funciones de asignacin de mensajes generadas g j g
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP() _ _ ()
private:
CString strUsrName; // Nombre del usuario
CString strSaludo; // Saludo
public:
78 78
afx_msg void OnEnChangeNombre();
afx_msg void OnBnClickedOk();
afx_msg void OnEnKillfocusNombre();
};
Mapas de Datos
CSi l Dl CSi l Dl (CW d* P t /* NULL*/)
Mapas de Datos
CSimpleDlg.cpp (i)
CSimpleDlg::CSimpleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSimpleDlg::IDD, pParent)
, strUsrName(_T(""))
, strSaludo(_T(""))
{{
m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
idCSi l Dl D D t E h (CD t E h * DX) void CSimpleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_NOMBRE, strUsrName);
DDV M Ch ( DX t U N 128) DDV_MaxChars(pDX, strUsrName, 128);
DDX_Text(pDX, IDC_SALUDO, strSaludo);
}
BEGIN MESSAGE MAP(CSi l Dl CDi l ) BEGIN_MESSAGE_MAP(CSimpleDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON EN CHANGE(IDC NOMBRE &CSi l Dl O E Ch N b )
79 79
ON_EN_CHANGE(IDC_NOMBRE, &CSimpleDlg::OnEnChangeNombre)
ON_BN_CLICKED(IDOK, &CSimpleDlg::OnBnClickedOk)
ON_EN_KILLFOCUS(IDC_NOMBRE, &CSimpleDlg::OnEnKillfocusNombre)
END_MESSAGE_MAP()
Mapas de Datos Mapas de Datos
CSimpleDlg.cpp (i)
void CSimpleDlg::OnBnClickedOk()
{{
// TODO: Add your control notification handler code here
//OnOK();
UpdateData(TRUE); p ( );
strSaludo = "Hola "+strUsrName+"!";
UpdateData(FALSE);
}
void CSimpleDlg::OnEnKillfocusNombre()
{// si ponemos este cdigo en EN_CHANGE, se actualiza en tiempo de ejecucin
UpdateData(TRUE);
strSaludo = "Hola "+strUsrName+"!";
UpdateData(FALSE);
}
80 80
}
Mens Mens
Se pueden crear en el editor de recursos Se pueden crear en el editor de recursos.
El asistente crea un men esttico en la ventana marco (mismo
identificador que la tabla aceleradora y el icono).
Se cargan todos los recursos en InitInstance(): Se cargan todos los recursos en InitInstance():
pFr ame- >LoadFr ame( I DR_MAI NFRAME,
WS OVERLAPPEDWI NDOW| FWS ADDTOTI TLE, NULL, NULL) ; _ | _ , , ) ;
Elementos del men de dos tipos:
pop-up (abren otros mens).
activos, que generan un mensaje de comando a la aplicacin.
Normalmente a travs del asistente.
D j COMMAND UPDATE COMMAND UI Dos mensajes: COMMAND y UPDATE_COMMAND_UI.
El ltimo permite cambiar el aspecto del item de men (cambiar
texto, aadir un check, etc.)
81 81
Mens Mens
Ejemplo
CChildView::CChildView() : numColores (4), CodigoColor (new UINT[numColores]),
currentColor(0), NombreColor(new CString[numColores]) {
lastClicked =CPoint(-1, -1);
CodigoColor[0] =RGB(0, 0, 0); // Black
//
NombreColor[0] ="Negro";
//
}
CChildView::~CChildView() {
delete [] CodigoColor;
delete [] NombreColor;
}}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON WM LBUTTONDOWN() ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_CAMBIACOLOR, &CChildView::OnCambiacolor)
ON_UPDATE_COMMAND_UI(ID_CAMBIACOLOR, &CChildView::OnUpdateCambiacolor)
END_MESSAGE_MAP()
82 82
void CChildView::OnUpdateCambiacolor(CCmdUI *pCmdUI) {
pCmdUI->SetText("Cambia Color a "+NombreColor[(currentColor+1)%numColores]);
}
CMenu CMenu
Para cambiar entre distintos mens, o cargar
uno dinmicamente se usa la clase CMenu.
Enmascara un HMENU (en m_hMenu).
Asignacin a la ventana con SetMenu(). Asignacin a la ventana con SetMenu().
Algunas funciones miembro:
LoadMenu(): carga un men creado como un recurso LoadMenu(): carga un men creado como un recurso.
CreateMenu(), CreatePopupMenu(): crea un men
vaco (normal y emergente). vaco (normal y emergente).
Attach(): Asocia un CMenu a un recurso identificado por
su HMENU.
83 83
Mens Mens
Ejemplo: Aadir un Men a un Dilogo
11
22
3
84 84
Mens Mens
Ejemplo: Aadir un Men a un Dilogo
1 Crear el men en el editor de recursos 1. Crear el men en el editor de recursos
(ID=IDR_SIMPLEDIALOG).
2 A di t ib t d ti CM l l CSi l Dl 2. Aadir un atributo de tipo CMenu a la clase CSimpleDlg,
gestin de items de men.
class CSimpleDlg: public CDialog { class CSimpleDlg : public CDialog {

private:
CMenu menu; CMenu menu;
CListBox fileListBox; // DDX, control
public:
afx msg void OnFicheroSeleccionar(); // gestin de items de men _ g (); g
afx_msg void OnFicheroSalir();
};
85 85
CSimpleDlg::CSimpleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSimpleDlg::IDD, pParent), strUsrName(_T("")), strSaludo(_T("")), menu() {
m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
Mens
}
void CSimpleDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_NOMBRE, strUsrName);
Mens
CSimpleDlg.cpp
_ (p _ )
DDV_MaxChars(pDX, strUsrName, 12);
DDX_Text(pDX, IDC_SALUDO, strSaludo);
DDX_Control(pDX, IDC_FICHEROS, fileListBox);
}}
BEGIN_MESSAGE_MAP(CSimpleDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON() ()
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_NOMBRE, &CSimpleDlg::OnEnChangeNombre)
ON_BN_CLICKED(IDOK, &CSimpleDlg::OnBnClickedOk)
ON_EN_KILLFOCUS(IDC_NOMBRE, &CSimpleDlg::OnEnKillfocusNombre)
ON_COMMAND(ID_FICHERO_SELECCIONAR, &CSimpleDlg::OnFicheroSeleccionar)
ON_COMMAND(ID_FICHERO_SALIR, &CSimpleDlg::OnFicheroSalir)
END_MESSAGE_MAP()
BOOL CSimpleDlg::OnInitDialog() {
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Establecer icono grande
SetIcon(m_hIcon, FALSE); // Establecer icono pequeo
86 86
menu.LoadMenu(IDR_SIMPLEDIALOGO);
SetMenu(&menu);
return TRUE; // Devuelve TRUE a menos que establezca el foco en un control
}
Mens Mens
CSimpleDlg.cpp
void CSimpleDlg::OnFicheroSeleccionar()
{
C S C C (* )|* | (* *)|* *|| LPCTSTR szCppFilters= "C++ Files (*.cpp)|*.cpp|All Files (*.*)|*.*||";
CFileDialog fd(TRUE, "Cpp", "*.cpp",
OFN FILEMUSTEXIST| OFN HIDEREADONLY szCppFilters this); OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szCppFilters, this);
if( fd.DoModal ()==IDOK ) {
CString pathName = fd.GetPathName();
UpdateData(TRUE);
fil Li tB AddSt i ( thN ) fileListBox.AddString(pathName);
UpdateData(FALSE);
}
}}
void CSimpleDlg::OnFicheroSalir() {
PostMessage(WM_QUIT);
}
87 87
}
Mens Mens
Ejemplo: Aadir un Men Emergente Dinmico
class CSimpleDlg: public CDialog class CSimpleDlg : public CDialog
{
private:
// //
CMenu pmenu;
public:
afx msg void OnRButtonDown(UINT nFlags, CPoint point); //con asistente
88 88
_ g ( g , p );
afx_msg void OnItem1(); // a mano
};
CSimpleDlg::CSimpleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSimpleDlg::IDD, pParent)
Mens
, strUsrName(_T("")) , strSaludo(_T("")) , menu(), pmenu() {
m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
BEGIN MESSAGE MAP(CSimpleDlg, CDialog)
Mens
CSimpleDlg.cpp
_ _ ( p g, g)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
// //
ON_COMMAND(ID_FICHERO_SELECCIONAR, &CSimpleDlg::OnFicheroSeleccionar)
ON_COMMAND(ID_FICHERO_SALIR, &CSimpleDlg::OnFicheroSalir)
ON_COMMAND(ID_FICHERO_SALIR+1, &CSimpleDlg::OnItem1)
ON WM RBUTTONDOWN() ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
BOOL CSimpleDlg::OnInitDialog() {
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Establecer icono grande
SetIcon(m_hIcon, FALSE); // Establecer icono pequeo
menu.LoadMenu(IDR SIMPLEDIALOGO); ( _ );
SetMenu(&menu);
pmenu.CreatePopupMenu();
pmenu.AppendMenu(MF_STRING, ID_FICHERO_SALIR+1, "Item 1");
pmenu AppendMenu(MF STRING ID FICHERO SELECCIONAR "Seleccionar Fichero");
89 89
pmenu.AppendMenu(MF_STRING, ID_FICHERO_SELECCIONAR, Seleccionar Fichero );
pmenu.AppendMenu(MF_STRING, ID_FICHERO_SALIR, "Salir");
return TRUE; // Devuelve TRUE a menos que establezca el foco en un control
}
Mens Mens
CSimpleDlg.cpp
void CSimpleDlg::OnFicheroSalir()
{
// TODO Add d h dl d h // TODO: Add your command handler code here
PostMessage(WM_QUIT);
}
void CSimpleDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
ClientToScreen(&point); ClientToScreen(&point);
pmenu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
void CSimpleDlg::OnItem1()
{
AfxMessageBox("Item1");
90 90
AfxMessageBox( Item 1 );
}
Mens Mens
Ejemplo: Aadir un Men Emergente Dinmico
En realidad lo que hemos hecho es un men
contextual.
P ll b t t l j Para ello basta con capturar el mensaje
WM_CONTEXTMENU.
id CSi l Dl O C t tM (CW d* W d CP i t i t) void CSimpleDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
pmenu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point. y, this);
}
Si no mostramos un men, debemos llamar a
CWnd::OnContextMenu(pWnd point) antes de salir
}
CWnd::OnContextMenu(pWnd, point) antes de salir.
91 91
Teclas Aceleradoras Teclas Aceleradoras
Asociar una combinacin de teclas a un comando.
Si se usa el asistente, la definicin de teclas
l d l t l aceleradoras se carga en la ventana marco con la
llamada a LoadFrame().
92 92
Teclas Aceleradoras Teclas Aceleradoras
Las tablas aceleradoras no funcionan con aplicaciones
basadas en dilogo, ya que su bucle de mensajes no
llama a TranslateAccelerator() llama a TranslateAccelerator().
class CSimpleApp: public CWinApp class CSimpleApp : public CWinApp
{
private:
HACCEL m_haccel; // aadir handle a tabla aceleradora
bli public:
CSimpleApp();
// Reemplazos // Reemplazos
public:
virtual BOOL InitInstance();
BOOL ProcessMessageFilter(int code, LPMSG lpMsg); // sobreescribir
DECLARE MESSAGE MAP()
93 93
DECLARE_MESSAGE_MAP()
};
BOOL CSimpleApp::InitInstance() {
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize =sizeof(InitCtrls);
Teclas Aceleradoras
InitCtrls.dwSize sizeof(InitCtrls);
InitCtrls.dwICC =ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
Teclas Aceleradoras
();
SetRegistryKey(_T("Aplicaciones generadas con el Asistente para aplicaciones local"));
m_haccel=::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
CSimpleDlg dlg;
m pMainWnd =&dlg; _p g;
INT_PTR nResponse =dlg.DoModal();
if (nResponse ==IDOK) {
// TODO: insertar aqu el cdigo para controlar cundo se descarta el cuadro de dilogo con Aceptar
}}
else if (nResponse ==IDCANCEL) {
// TODO: insertar aqu el cdigo para controlar cundo se descarta el cuadro de dilogo con Cancelar
}
return FALSE;;
}
BOOL CSimpleApp::ProcessMessageFilter(int code, LPMSG lpMsg) {
if (code <0) CWinApp::ProcessMessageFilter(code, lpMsg); ( ) pp g ( , p g);
if(m_haccel)
{
if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg))
return(TRUE);
94 94
( );
}
return CWinApp::ProcessMessageFilter(code, lpMsg);
}
Teclas Aceleradoras
Este podra ser un bucle de mensajes con llamada a las
t l l d
Teclas Aceleradoras
teclas aceleradoras:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) {
MSG MSG msg;
BOOL bRet;
//
while ( (bRet =GetMessage(&msg, (HWND) NULL, 0, 0)) !=0) {
if (bR t 1) { if (bRet ==-1) {
// handle the error and possibly exit
}
else {// Check for accelerator keystrokes.
if (!TranslateAccelerator( if (!TranslateAccelerator(
hwndMain, // handle to receiving window
haccel, // handle to active accelerator table
&msg)) // message data
{{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
95 95
}
}
//
}
Dilogos Dilogos
Las MFCs contienen dilogos preconstruidos
que pueden ser usados directamente por el
usuario.
Para crear un dilogo: g
Se usa el editor de recursos.
DoModal() muestra el dilogo de manera modal. () g
Devuelve un UINT con la razn por la que se cerr
(ej.: IDCANCEL o IDOK).
Los no modales se crean como si fueran una ventana
(Create()).
96 96
Ejemplo: Aadir un Dilogo Ejemplo: Aadir un Dilogo
Creado usando el
editor de recursos.
S l Se crea una clase que
herede de CDialog
con el asistente con el asistente.
class CDialogoEjemplo : public CDialog {
DECLARE_DYNAMIC(CDialogoEjemplo)
public:
CDialogoEjemplo(CWnd* pParent =NULL);
Se aade un nuevo elemento al men
y a la tabla aceleradora
CDialogoEjemplo(CWnd pParent =NULL);
virtual ~CDialogoEjemplo();
enum {IDD =IDD_DIALOG1 };
protected:
virtual void
void CSimpleDlg::OnFicheroDialogo() {
CDialogoEjemplo dlg(this);
dlg DoModal();
97 97
virtual void
DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
};
dlg.DoModal();
}
Dilogos Predefinidos
CC l Di l i l i
Dilogos Predefinidos
CColorDialog: permite seleccionar un
color.
CFileDialog: permite seleccionar
ficheros.
CFindReplaceDialog: permite realizar
bsqueda o buscar/reemplazar (no
98
bsqueda o buscar/reemplazar (no
modal, se crea con Create()).
98
Dilogos Predefinidos
CFontDialog: permite elegir una
fuente.
CPrintDialog: permite imprimir y
configurar la impresin.
CPageSetupDialog: permite
imprimir y
99 99
Controles Controles
Las MFC ponen a nuestra disposicin un
gran nmero de controles que simplifican g q p
la creacin de aplicaciones.
Los controles mandan notificaciones a la Los controles mandan notificaciones a la
ventana padre (ej.: el control de edicin
C G manda EN_CHANGE cuando cambia el
texto). )
100 100
Controles predefinidos MFC Controles predefinidos MFC
CAnimateCtrl: public CWnd: Permite
mostrar un vdeo en formato AVI.
void CAboutDlg::OnBnClickedButton1()
{
avi_player.Open(IDR_AVI1);
avi player Play(0 -1 -1); avi_player.Play(0, -1, -1);
}
101
Controles predefinidos MFC
CButton: permite gestionar botones.
Eventos: BN CLICKED, BN DOUBLECLICKED. Eventos: BN_CLICKED, BN_DOUBLECLICKED.
Mtodos: GetState(), SetState(), SetCursor(), GetCursor().
void CAboutDlg::OnBnClickedMessage()
{
anim.Stop();
AfxMessageBox("Stop!");
}}
102
Controles predefinidos MFC
CBit B tt S b t l l
Controles predefinidos MFC
CBitmapButton: Se crea un botn normal en el
editor de recursos y:
se selecciona OwnerDraw=true se selecciona OwnerDraw true.
en el caption se pone una descripcin (ej: BOTON).
Se crean de 1 a 4 bitmaps:
ID=BOTONU, bitmap normal.
ID=BOTONF, bitmap foco de teclado.
ID=BOTONX, bitmap botn desactivado. , p
ID=BOTOND, bitmap botn pulsado.
Se crea un objeto de la clase CBitmapButton como
miembro del dilogo miembro del dilogo.
En la inicializacin del dilogo (OnInitDialog()) se llama
a AutoLoad().
103
Ejemplo
class CAboutDlg : public CDialog {
Ejemplo
CBitmapButton
public:
CAboutDlg();
//
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
// Implementacin
protected:
DECLARE_MESSAGE_MAP()
i t private:
CAnimateCtrl anim;
CBitmapButton BClose;
public:
f id O B Cli k dSt t() afx_msg void OnBnClickedStart();
afx_msg void OnBnClickedMessage();
public:
BOOL OnInitDialog();
}};
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_ANIMATE1, anim);
DDX C t l( DX IDMESSAGE BCl ) DDX_Control(pDX, IDMESSAGE, BClose);
}
//
BOOL CAboutDlg::OnInitDialog() {
BCl A t L d(IDMESSAGE thi )
104
BClose.AutoLoad(IDMESSAGE, this);
CDialog::OnInitDialog();
return FALSE;
}
Controles predefinidos MFC Controles predefinidos MFC
CListBox:
Listas
Datos iniciales (en OnInitDialog)
Seleccin simple o mltiple
Mtodos:
i nt Get Cur Sel ( ) ;
Ejemplo
i nt Set Cur Sel ( i nt nSel ect ) ;
i nt AddSt r i ng( LPCTSTR l pszI t em) ;
i nt I nser t St r i ng( i nt nI ndex,
LPCTSTR l pszI t em) ;
void CSimpleDlg::OnLbnKillfocusList1()
{
int sel =nameListBox.GetCurSel();
Ejemplo
LPCTSTR l pszI t em) ;
int sel nameListBox.GetCurSel();
if (sel>-1) {
CString str;
nameListBox.GetText(sel,str);
Af M B ("S l t dIt " t )
105
AfxMessageBox("Selected Item: "+str);
}
}
Controles predefinidos MFC Controles predefinidos MFC
CC b B CComboBox:
Simple (lista siempre visible), Drop-down (permite editar), Drop-
Down List.
Mtodos:
GetCount(): nmero de elementos que tiene la lista.
GetCurSel()/SetCurSel(): obtiene/establece el nmero de orden del GetCurSel()/SetCurSel(): obtiene/establece el nmero de orden del
elemento seleccionado.
SetItemData()/GetItemData(): lee el valor asignado a un
determinado elemento de la lisa.
AddString()/DeleteString()/InsertString(). Tambin se pueden cargar
valores estticos en el campo Data del editor de recursos
(separados mediante ;)
Dir().
CComboBoxEx: permite introducir imgenes en los
106
CComboBoxEx: permite introducir imgenes en los
elementos a seleccionar, entre otras mejoras.
Controles predefinidos MFC
CD t Ti Ct l
Controles predefinidos MFC
CDataTimeCtrl.
CEdit.
CHeaderCtrl CHeaderCtrl.
CHotKeyCtrl.
CIpAddressCtrl CIpAddressCtrl.
CCheckListBox.
CDragListBox CDragListBox.
CListCtrl.
CMonthCalCtrl.
COleControl.
CProgressCtrl.
107
Controles predefinidos MFC
CR B Ct l
Controles predefinidos MFC
CReBarCtrl.
CRichEditCtrl.
CScrollBar CScrollBar.
CSliderCtrl.
CSpinButtonCtrl CSpinButtonCtrl.
CStatic.
CStatusBarCtrl CStatusBarCtrl.
CTabCtrl.
CToolBarCtrl CToolBarCtrl.
CToolTipCtrl.
CTreeCtrl
108
CTreeCtrl.
Clases de Utilidad Clases de Utilidad
Cadenas de caracteres
CString CString.
Caracteres unicode vs. ascii.
Definiciones de un const char*
t ypedef wchar t WCHAR; t ypedef wchar _t WCHAR;
/ / wchar _t es un char Uni code ( 2 byt es)
/ / o ANSI ( 1 byt e) dependi endo de
/ / l a opci n seal ada par a el pr oyect o / / l a opci n seal ada par a el pr oyect o
t ypedef __nul l t er mi nat ed CONST WCHAR *LPCWSTR;
t ypedef LPCWSTR LPCTSTR;
Conversiones. Ejemplo: j p
LPCTSTR t ;
/ / si t enemos opci n Uni code es un er r or : t =" abc" ;
CSt r i ng c1( " abc" ) ;
1 " d f " c1=" def " ;
t =c1;
/ / cor r ect o ya que hace un cast i ng i mpl ci t o
/ / y est def i ni do un oper ador de cast i ng
109
/ / y p g
Clases de Utilidad
/ / sobr ecar ga de + et c
Clases de Utilidad
Cadenas de caracteres
/ / sobr ecar ga de =, +=, et c
CSt r i ng s;
s=" Hol a; s= Hol a ;
s+= soy yo;
cout << Sal udo: << s; cout << Sal udo: << s;
/ / conver si n CSt r i ng a char *
/ / No i mpr i me en pant al l a / / p p
/ / Par a mensaj es, i mpr i mi r en cont r ol es
/ / o con MessageBox
st r i ng s2=s;
110
Clases de Utilidad Clases de Utilidad
Contenedores
Similares a los contenedores de la STL.
Definiciones en afxtempl.h (que debemos incluir en
td f h) stdafx.h).
Los templates admiten dos parmetros: el tipo de dato, y
el tipo para referirse a l (quiz una referencia) el tipo para referirse a l (quiz una referencia).
Contenedor Clase Puntero
Vectores CArray CTypedPtrArray
Listas CList CTypedPtrList
Diccionario CMap CTypedPtrMap Diccionario CMap CTypedPtrMap
Clases de Utilidad
Si il t d l STL
Clases de Utilidad
Contenedores: CArray
Similar a vector de la STL.
template < class TYPE, class ARG_TYPE =
const TYPE& > class CArray : public
CObject
Ej l
CObject
ARG_TYPE es el tipo que se usa para
acceder a los elementos almacenados.
Tamao:
CArray<CPoint,CPoint> myArray;
// Add elements to the array
Ejemplo
Tamao:
GetCount(), GetSize(), GetUpperBound(),
IsEmpty(), SetSize().
Operaciones:
// Add elements to the array.
for (int i=0;i < 10;i++)
myArray.Add( CPoint(i, 2*i) );
p
FreeExtra(), RemoveAll(), RelocateElements().
Aumentando el Array:
Add(), Append(), Copy(), SetAtGrow().
// Modify all the points in the array.
for (i=0;i <=
myArray.GetUpperBound();i++) {
myArray[i] x =0;
(), pp (), py(), ()
Insercin/eliminacin:
InsertAt(), RemoveAt()
Operadores:
myArray[i].x = 0;
}
Operadores:
Acceso/modificacin con el operador [].
Clases de Utilidad
t l t l TYPE l ARG TYPE t TYPE& l CLi t bli CObj t
Clases de Utilidad
Contenedores: CList
template<class TYPE, class ARG_TYPE=const TYPE&> class CList : public CObject
Iteracin:
CList<CMiClase, CMiClase&> myList; , y ;
POSITION pos = myList.GetHeadPosition();
while( pos != NULL ) {
CMiClase& clase = myList.GetNext( pos );
//
I i Li t I tAft ( Li t G tT ilP iti () l )
//...
}
Insercin: myList.InsertAfter(myList.GetTailPosition(), elem);
Eliminacin: myList RemoveAt(pos); Eliminacin: myList.RemoveAt(pos);
113
Clases de Utilidad
l l KEY l
Clases de Utilidad
Contenedores: CMap
CM i t i t CP i t CP i t M
Ejemplo
template< class KEY, class
ARG_KEY, class VALUE, class
ARG_VALUE >class CMap : public
CMap<int,int,CPoint,CPoint>myMap;
int i;
myMap.InitHashTable( 257 );
Ejemplo
CObject
Operaciones:
GetHashTableSize()
// Add 10 elements to the map.
for (i=0;i <200;i++)
myMap[i] =CPoint(i, i);
GetHashTableSize(),
GetNextAssoc(), PGetNextAssoc(),
GetStartPosition(), PGetFirstAssoc(),
InitHashTable() Lookup()
// Remove the elements with even
// key values.
CPoint pt;
f (i 0 M L k ( i t ) i+ 2)
InitHashTable(), Lookup(),
PLookup(), operator[], RemoveAll(),
RemoveKey(), SetAt().
Estado:
for (i=0; myMap.Lookup( i, pt ) ;i+=2)
{
myMap.RemoveKey( i );
}
Estado:
GetCount(), GetSize(), IsEmpty().
Miembros de Datos:
CMap::CPair
Clases de Utilidad
Si queremos tener listas de objetos heterogeneos
Clases de Utilidad
Contenedores de punteros
Si queremos tener listas de objetos heterogeneos.
No podemos usar los contenedores anteriores, ya que si
queremos serializar una lista a disco, se copiaran los q p
punteros, y no los objetos.
Por ello, MFC duplica los contenedores para la gestin de
punteros punteros.
template< class BASE_CLASS, class TYPE > class
CTypedPtrList : public BASE_CLASS
BASE CLASS ti d l h d t i l BASE_CLASS: tipo del que se hereda para construir el
template.
CObList si los elementos heredan de CObject (se pueden serializar).
CPtrList en otro caso CPtrList en otro caso.
TYPE: tipo de los elementos que insertamos.
Similar para arrays.
Clases de Utilidad Clases de Utilidad
Contenedores de punteros, ejemplo
//=====================
// h CM Obj t i d fi db th f ll i fil
typedef CTypedPtrList<CObList, CMyObject*> CMyList;
CMyList ml;
CMyObject* pMyObject =new CMyObject();
//where CMyObject is defined by the following files:
//CMyObject.h
class CMyObject : public Cobject {
bli
y j y j y j ()
ml.AddTail(pMyObject);
CFileException e;
CFile myFile;
public:
int i;
void Serialize(CArchive& ar);
CMyObject() {i =9876;}
t t d
myFile.Open("MyFile.txt",
CFile::modeCreate|CFile::modeWrite, &e);
CArchive ar(&myFile, CArchive::store);
ml.Serialize(ar);
protected:
DECLARE_SERIAL(CMyObject)
};
//CM Obj t
ar.Close();
myFile.Close();
//CMyObject.cpp
#include "stdafx.h"
#include "CMyObject.h"
IMPLEMENT SERIAL(CM Obj t CObj t 0)
while (!ml.IsEmpty())
{
delete ml.GetHead();
ml.RemoveHead();
IMPLEMENT_SERIAL(CMyObject, CObject, 0)
void CMyObject::Serialize(CArchive& ar) {
CObject::Serialize( ar );
if( ar.IsStoring() )
<<i
}
ar <<i;
else
ar >>i;
}
Clases de Utilidad
t l t < l BASE CLASS l KEY l VALUE > l
Clases de Utilidad
Contenedores de punteros: CTypedPtrMap
template< class BASE_CLASS, class KEY, class VALUE > class
CTypedPtrMap : public BASE_CLASS
BASE_CLASS: clase base del diccionario, puede ser, en funcin de
l ti d l l l t l los tipos de la clave y elementos a almacenar:
CMapPtrToPtr,
CMapPtrToWord,
CMapWordToPtr,
CMapStringToPtr
CMapStringToString p g g
CMapWordToOb
CMapWordToPtr
KEY: tipo de la clave KEY: tipo de la clave.
VALUE: tipo de los elementos a almacenar (suele ser un
puntero).
Ej.: typedef CTypedPtrMap<CMapStringToOb, CString,
CMiObjeto*> MapaAMiObjeto;
Indice Indice
P i b j Wi d Programacin bajo Windows.
Introduccin a las MFCs.
A it t D t /Vi t Arquitectura Documento/Vista.
Introduccin.
SDI y MDI.
Plantillas de documento Plantillas de documento.
Ejemplo.
D t i li i Documento, serializacin.
Bibliografa.
118 118
Arquitectura Documento Vista
S l i li i ( i ) d l d (d )
Arquitectura Documento Vista
Separar la visualizacin (vista) de los datos (documento).
Similar al patrn Model-View-Controler.
El asistente genera clases que heredan de: CFrameWnd CViewy El asistente genera clases que heredan de: CFrameWnd, CViewy
CDocument.
CViewes abstracta. Otra posibilidad es usar como base una vista
d fi id predefinida:
CEditView(edicin de texto bsica). Esta se puede usar directamente.
CRichEditView(permite formateo de texto).
CScrollView(scroll vertical y horizontal).
CListView(listas de elementos).
CTreeView(rbol de elementos) CTreeView(rbol de elementos).
CFormView(similar a un cuadro de dilogo).
CDaoRecordView(similar a cuadro de dilogo pero para control de
BBDD)
119
BBDD).
CCtrolView(se pueden incluir otras vistas dentro).
SDI y MDI SDI y MDI
Single Document Interface: Un solo tipo de documento Single Document Interface: Un solo tipo de documento.
Multiple Document Interface: Varios tipos de documento.
120 120
Una aplicacin SDI Una aplicacin MDI
Las plantillas de documento Las plantillas de documento
El documento, el marco y la vista se relacionan usando plantillas de
documento, que heredan de CDocTemplate.
CSingleDocTemplate y CMultiDocTemplate para SDI y MDI.
BOOL CSDI2A I itI t () { BOOL CSDI2App::InitInstance() {
//
pDocTemplate =new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME CLASS(CSDI2D ) RUNTIME_CLASS(CSDI2Doc),
RUNTIME_CLASS(CMainFrame), // Ventana de marco SDI principal
RUNTIME_CLASS(CSDI2View));
if (!pDocTemplate) return FALSE;
AddD T l t ( D T l t ) AddDocTemplate(pDocTemplate);
EnableShellOpen();
RegisterShellFileTypes(TRUE);
//
}
RUNTIME_CLASS devuelve un struct CRuntimeClass *.
Nota: Slo se puede obtener esta informacin de subclases de CObject que
}
121
hayan sido declaradas DECLARE_DYNAMIC, DECLARE_DYNCREATE o
DECLARE_SERIAL.
121
Las plantillas de documento Las plantillas de documento
Una plantilla de documento por cada tipo de documento
soportado, y es responsable de crear y gestionar los
documentos de ese tipo documentos de ese tipo.
La plantilla contiene el ID con los recursos (men, icono,
tablas aceleradoras) tablas aceleradoras).
Contiene tambin strings con el nombre del tipo de
documento, la extensin de sus ficheros, etc. docu e o, a e e s de sus c e os, e c
EnableShellOpen(): permite abrir ficheros de datos
haciendo doble click en ellos en el explorador. p
RegisterShellFileTypes(cCompat): Registra los tipos de
documentos en el explorador. Si bCompat==TRUE
122
entonces se pueden imprimir los ficheros desde el
explorador.
122
Arquitectura Documento Vista
Ejemplo
123
Arquitectura Documento Vista
Ejemplo
Vista derivada de CFormView.
Se crea tambin un dilogo vaco
en el editor de recursos:
St i i d l li i IDR MAINFRAME
en el editor de recursos:
String asociado a la aplicacin IDR_MAINFRAME
7 pedazos:
124 124
El Documento El Documento
Encargado de gestionar los datos, incluido su grabacin y Encargado de gestionar los datos, incluido su grabacin y
recuperacin del disco.
vi r t ual BOOL OnNewDocument ( ) ; se llama cuando se va a
crear un nuevo fichero (sobreescribirlo permite chequear si crear un nuevo fichero (sobreescribirlo permite chequear si
queremos dejar crearlo o no).
vi r t ual BOOL OnOpenDocument ( LPCTSTR l pszPat hName) ;
se llama cuando se va a abrir un fichero.
vi r t ual voi d OnCl oseDocument ( ) ; se llama cuando se va a
cerrar un fichero cerrar un fichero.
vi r t ual BOOL OnSaveDocument ( LPCTSTR l pszPat hName) ;
se llama cuando se va a salvar un documento.
voi d Set Modi f i edFl ag( BOOL bModi f i ed = TRUE) ; marca
el documento como cambiado.
BOOL I sModi f i ed( ) ; comprueba si un documento est
125
BOOL I sModi f i ed( ) ; comprueba si un documento est
modificado.
125
Colaboracin de Objetos en la
Aplicacin
A bj t d d t Acceso a unos objetos desde otros:
Obj M d Objeto Mtodo
Documento GetFirstViewPosition()/GetNextView()
Documento GetDocTemplate()
Vista GetDocument()
Vista GetParentFrame()
Ventana marco del documento GetActiveView()
Ventana marco del documento GetActiveDocument()
Ventana principal (MDI) MDIGetActive()
Ventana marco GetActiveFrame()
Colaboracin de Objetos en la
Aplicacin
CWinApp pp
1
CFrameWnd
m_pMainWnd 1
1
getActiveView();
getParent();
1
1
CView
g ();
{POSITION p=GetFirstViewPosition(); 1..*
GetNextView(p);}
getDocument(); 1
CDocument
g ();
Arquitectura Documento Vista
G d /l l d d di
Serializacin
Guardar/leer los datos de disco.
virtual void Serialize(CArchive& ar); provisto por CObject.
Sirve para leer y escribir Sirve para leer y escribir.
Se usan los operadores << y >> sobre el CArchive.
voidCSDI2Doc::Serialize(CArchive&ar) { void CSDI2Doc::Serialize(CArchive& ar) {
POSITION pos =GetFirstViewPosition(); // m_viewList contiene lista punteros a vistas
CSDI2View* pView =dynamic_cast<CSDI2View*>(GetNextView(pos));
if (ar.IsStoring()){
pView->UpdateData(TRUE); pView>UpdateData(TRUE);
ar <<pView->nombre;
ar <<pView->direccion;
ar <<pView->edad;
}}
else {
ar >>pView->nombre;
ar >>pView->direccion;
ar >>pView->edad;
128 128
ar >>pView>edad;
pView->UpdateData(FALSE);
}
}
Arquitectura Documento Vista
Serializacin
class CSDI2Doc : public CDocument {
//..
private:
Serializacin
p
CSDI2View* pView;
CSDI2View* getView();
//
};
inline CSDI2View* CSDI2Doc::getView(){
if (!pView) {
POSITION pos =GetFirstViewPosition(); p ();
pView =dynamic_cast<CSDI2View*>(GetNextView(pos));
}
return pView;
}}
void CSDI2Doc::Serialize(CArchive& ar){
getView();
if (ar.IsStoring()) {
pView->UpdateData(TRUE); p p ( )
ar <<pView->nombre <<pView->direccion <<pView->edad;
}
else {
ar >>pView->nombre >>pView->direccion >>pView->edad;
129 129
pView->UpdateData(FALSE);
}
}
// el evento salvar llama por defecto a la serializacin del documento
Arquitectura Documento Vista q
Creacin de un nuevo documento
BOOL CSDI2Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
t FALSE return FALSE;
// TODO: agregar aqu cdigo de reinicio
// (los documentos SDI volvern a utilizar este documento) // (los documentos SDI volvern a utilizar este documento)
getView()->nombre="";
pView->direccion="";
pView>edad=0; pView->edad=0;
pView->UpdateData(FALSE);
return TRUE;
}}
130
Ejemplo Ejemplo
Indice Indice
Programacin bajo Windows. g j
Introduccin a las MFCs.
Arquitectura Documento/Vista Arquitectura Documento/Vista.
Aspectos avanzados de las MFCs.
Dilogos no modales.
Creacin dinmica de widgets Creacin dinmica de widgets.
Registro.
Otros aspectos de las MFCs.
Bibliografa
132 132
Bibliografa.
Dilogos No Modales Dilogos No Modales
P j t dil f l d l Para ejecutar dilogos en formal modal,
simplemente hay que llamar al mtodo
DoModal(). DoModal().
Para crear un dilogo no modal, hay que
hacerlo como si fuera una ventana cualquiera,
mediante Create().
Esto crea el dilogo y contina la ejecucin.
Por tanto el dilogo se debe crear usando memoria Por tanto el dilogo se debe crear usando memoria
dinmica!
Liberacin de la memoria en OnNcDestroy() del y()
dilogo. Aqu se pueden pasar datos a la
ventana principal.
133
Dilogos No Modales
Ejemplo: About No Modal
void CGraficosSDIApp::OnAppAbout() {
if (!pAboutDlg) {
Ejemplo: About No Modal
if (!pAboutDlg) {
pAboutDlg =new CAboutDlg(); // puntero miembro
pAboutDlg->Create( MAKEINTRESOURCE(CAboutDlg::IDD), // string con ID
CWnd::GetDesktopWindow()); // puntero al escritorio,
// evita que el dilogo est siempre encima // evita que el dilogo est siempre encima
pAboutDlg->ShowWindow(SW_SHOW);
}
else pAboutDlg->SetForegroundWindow(); // el dilogo ya exista, llevarlo al frente
}}
void CGraficosSDIApp::CloseDialog() {// acciones al cerrar el dilogo
pAboutDlg =0; // simplemente apunta a NULL g
}
void CAboutDlg::OnNcDestroy() {// ltimo mensaje que se recibe antes de cerrar
CDialog::OnNcDestroy();
((CGraficosSDIApp*)AfxGetApp())->CloseDialog(); // avisar a la aplicacin, podramos avisar a la ventana padre
// otra posibilidad es mandarle un mensaje definido por el
// usuario con GetParent()->PostMessage(WM_USR,0,0)
delete this; // importante: borramos la memoria dinmica
}
void CAboutDlg::OnOK() { // importante sobreescribir si se tiene un IDOK, ya que por defecto MFC llama a
// EndDialog(), que slo vale para DoModal()
if(UpdateData(true))
DestroyWindow();
}
Creacin dinmica de widgets Creacin dinmica de widgets
void CSDI2View::OnBnClickedButton1() void CSDI2View::OnBnClickedButton1()
{
CButton* pButton=new CButton;
pButton->Create("Submit", pButton Create( Submit ,
WS_CHILD | WS_VISIBLE,
CRect(170, 120, 270, 143),
this, ,
0x302); // un ID
}
135
Registro Registro
La mayora de las aplicaciones dejan cierto grado de customizacin al La mayora de las aplicaciones dejan cierto grado de customizacin al
usuario.
Por ejemplo: posicin y tamao de la ventana posicin de las barras Por ejemplo: posicin y tamao de la ventana, posicin de las barras
de controles, etc.
Guardar esta informacin de configuracin en el registro (hasta Guardar esta informacin de configuracin en el registro (hasta
windows 3.11, esta informacin se guardaba en ficheros INI).
En InitInstance() se llama a SetRegistryKey() para establecer una En InitInstance() se llama a SetRegistryKey(), para establecer una
clave (se crea debajo de HKEY_CURRENT_USER/software).
SetRegistryKey() asigna valor al atributo m_pszRegistryKey de la clase
CWinApp. pp
El resto de llamadas del API (GetProfileString(), GetProfileInt(),
WriteProfileString(), WriteProfileInt()) utilizan dichos mtodos. g() ())
Registro Registro
BOOL CGraficosSDIApp::InitInstance()
{{
//
SetRegistryKey(_T("GraficosSDI"));
LoadStdProfileSettings(4); // Cargar opciones de archivo INI estndar
Normalmente se leer la informacin del registro en
// (incluidas las de la lista MRU)
//
}
Normalmente se leer la informacin del registro en
OnCreate() de la ventana marco.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
WINDOWPLACEMENT PosVen;
if (LeePosicionVentana(&PosVen)) SetWindowPlacement(&PosVen);
//
}
Registro Registro
bool CMainFrame::LeePosicionVentana(LPWINDOWPLACEMENT pPosVen)
{
CString strClave =AfxGetApp()->GetProfileString(_T("Arranque"), _T("Posicion"));
if (strClave.IsEmpty()) return false;
int numDatos =sscanf_s(strClave, "%u,%u,%d,%d,%d,%d,%d,%d,%d,%d",
&pPosVen->flags, &pPosVen->showCmd, &pPosVen->ptMinPosition.x,
&pPosVen->ptMinPosition.y, &pPosVen->ptMaxPosition.x, &pPosVen->ptMaxPosition.y,
&pPosVen->rcNormalPosition.left, &pPosVen->rcNormalPosition.top,
&pPosVen->rcNormalPosition.right, &pPosVen->rcNormalPosition.bottom);
if (numDatos !=10) return false;
pPosVen->length=sizeof(pPosVen);
return true;
}
Registro
idCM i F O Cl ()
Registro
void CMainFrame::OnClose()
{
WINDOWPLACEMENT PosVen;
PosVen.length=sizeof(PosVen);
if (G tWi d Pl t(&P V )) if (GetWindowPlacement(&PosVen))
{
if (PosVen.showCmd!=SW_SHOWMINIMIZED)
EscribirPosicionVentana(&PosVen);
}}
CFrameWnd::OnClose();
}
void CMainFrame::EscribirPosicionVentana(LPWINDOWPLACEMENT pPosVen)
{
TCHAR szBuffer[8*6+2*5+9+1];
i tf( B ff "% % %d %d %d %d %d %d %d %d" wsprintf(szBuffer, "%u,%u,%d,%d,%d,%d,%d,%d,%d,%d",
pPosVen->flags, pPosVen->showCmd, pPosVen->ptMinPosition.x,
pPosVen->ptMinPosition.y, pPosVen->ptMaxPosition.x, pPosVen->ptMaxPosition.y,
pPosVen->rcNormalPosition.left, pPosVen->rcNormalPosition.top,
P V > N lP iti i ht P V > N lP iti b tt ) pPosVen->rcNormalPosition.right, pPosVen->rcNormalPosition.bottom);
AfxGetApp()->WriteProfileString(_T("Arranque"), _T("Posicion"), szBuffer);
}
Otros aspectos de las MFCs Otros aspectos de las MFCs
Bases de datos
Sincronizacin Sincronizacin
Windows sockets
Servicios Internet
140
Indice Indice
Programacin bajo Windows.
Introduccin a las MFCs Introduccin a las MFCs.
Arquitectura Documento/Vista.
Aspectos avanzados de las MFCs.
Bibliografa Bibliografa.
141 141
Bibliografa Bibliografa
MSDN (ayuda en lnea) MSDN (ayuda en lnea).
Programacin Avanzada en Windows 2000 con Visual
C++ y MFC. Pascual, J ., Charte, F., Segarra, M. J ., de y g
Antonio, A., Clavijo, J . A. McGraw Hill. 2000.
MFC:
http://wwwfunctionx com/visualc/ http://www.functionx.com/visualc/
http://www.dcp.com.ar/mfc/indice.htm
http://www.uta.fi/~jl/pguibook/
http://wwwsamspublishing com/library/library asp?b Visual C http://www.samspublishing.com/library/library.asp?b=Visual_C_
PlusPlus&rl=1 (libro Visual C++ Unleashed)
Documentacin MFC al estilo de javadoc:
http://wwwcppdoc com/example/mfc/mfc html http://www.cppdoc.com/example/mfc/mfc.html
Controles
http://www.functionx.com/visualc/controls/
142 142

También podría gustarte