Está en la página 1de 92

UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE INGENIERIA MECANICA

CURSO PROGRAMACION ORIENTADA A OBJETOS CDIGO MB545

Tema: Las Clases MFC y DEVICE CONTEX 2009_II 2era parte


1 Ing. Daniel Osorio Maldonado

Los Controles y sus aplicaciones


Las li L aplicaciones estarn enmarcadas con el uso de recursos. i t d l d El usuario podr utilizarlos en sus aplicaciones profesionales. El control Static Text Aa: usados cuando se trata de colocar titulos o cadenas en un cuadro de dialogo. El control Group Box :rene en un espacio limitado un grupo de limitado, controles pe radios, cheks,etc. Check Box seleccionado ya sea individual o en grupo Box: Edit Box: crea un rectngulo interactivo Radio Button:circulo pequeo que generalmente va en grupo solo grupo, se permite activar uno. Button :permite el acceso a la aplicacin ejecutora p p j List Box:permite elegir un item de varios. Ficha (Tab):el usuario usa diferentes paginas dentro del C Dialogo Image:coloca en un rectangulo una imagen de un mapa de bits
Ing. Daniel Osorio Maldonado 2

La Funcion DoDataExchange
ClassWizard aade una f Cl Wi d d funcion miembro ll i i b llamada D D E h d DoDataExchange al archivo .cpp l hi del dialog de clase. La funcin contiene todas las llamadas a las f f m funciones de intercambio y m validacin de datos que necesita el dialogo. Para un solo control de edicin que acepte un numero entero desde 1 hasta 99. Ejemplo ClassWizard escribe una funcion DoDataExchange que funciona as
void CdemoDlg::DoDataExchang e(CdataExchange *pDX) { Cdialog::DoDataExchange(p DX); //{AFX_DATA_MAP(CdemoG lg) DDX_Text(pDX,IDC_EDIT,m _nEditval); DDV_MinMaxInt(pDX,m:nEd itVal,1,99); //}}AFX_DATA_MAP}

Se dice que es una funcin completa, mas no un cdigo matriz al que deba aadirle otros cdigos. cdigos Si se invoca al DoDatExchange, cuando el dialogo empieza y termina, es a veces conveniente aadir inicializacin y eliminar cdigo para ello, de lo contrario puede olvidar que la funcin existe. Si elimina una variable en la pestaa Member Variables, ClassWizard elimina cualquier cualquier invocacin de intercambio y validacin de datos para la variable en la funcin DoDataExchange. DoDataExchange
Ing. Daniel Osorio Maldonado 3

Para un control Edit que acepte solo nmeros enteros simple de base decimal(en lugar de base Hexadecimal), p ( g ) seleccione el cuadro de comprobacin Number en la pestaa Style del dialogo Edit Properties.
Si un cuadro de combinacin o cuadro de lista acepta slo datos numricos formados libremente, acceda al dialogo de control properties y desactive la opcin de clasificacin. Para un cuadro de combinacin y p cuadro de lista normal, desactive el cuadro comprobacin Sort en la pestaa Style. Si el caso es crear un grupo de botones radio, ajuste la propiedad auto l d b di j l i d d para cada botn en el grupo, se excluirn mutuamente. Ajuste la propiedad Group solo para el primer botn de radio de un grupo, los dems botones del grupo deben seguir el orden de fabulacin secuencial. Tambin instale la propiedad Group para el control que sigue inmediatamente al ultimo boton de radio de un grupo. Indicar el final del grupo anterior y el principio de otro otro. La Funcion UpdateData de la clase CWnd permite iniciar los controles 4 Ing. Daniel Osorio Maldonado

Aplicando un Cuadro de Texto


En esta aplicacin se utilizara un cuadro de texto de edicin, lo que se pretende es que mientras el usuario escribe algo en el cuadro de edicin, de manera simultanea se escribir lo l d d di i d i lt ibi l mismo en el titulo de la ventana de dialogo.

Ing. Daniel Osorio Maldonado

Edit

Agregue un cuadro de edicin en la pantalla, tal como se muestra. t Haciendo clic con el botn derecho active properties y d h ti ti modifique el ID Ing. Daniel Osorio Maldonado

El siguiente paso es unir el cdigo a los objetos, para ello usaremos la MFC ClassWizar Como lo que se quiere es que al momento de estar escribiendo cada carcter ibi d d del texto que se ingresa en el cuadro de edicion, se debera mostrar en la barra de titulo de la ventana. El objeto IDE EDIT1 bj t IDE_EDIT1 utilizara como mensaje EN_CHANGE, y adicione AddFunction, que pasara a formar parte de la lista Member Functions.
Ing. Daniel Osorio Maldonado 7

Una vez que ha adicionado la funcin deber apreciarse la f i d b i l siguiente ventana En ella escribir el siguiente cdigo:
void CTexto_en_CuadroDlg::OnChangeEdit1( ) { CTexto en CuadroDlg::OnChangeEdit1( CEdit *edTexto;//La variable edTexto es declarada como un puntero de la clase Cedit
miembro de CEdit y hace uso de las funciones

CString strDato;//Se declara una variable


ingresando

strDato del tipo Cstring para almacenar los caracteres que se van

edTexto=(CEdit*)GetDlgItem(IDE_EDIT1);//La funcion GetDlgItem pasa el ID del objeto a asociar con la ( ) g ( )


variable; el problema es que GetDlgItem retorna un puntero a CWnd y uno a Cedit, por eso usa el operador (Cedit*) que permite realizar la conversin al tipo deseado.
Ing. Daniel Osorio Maldonado 8

edTexto->GetWindowText(strDato);//Obtiene el cuadro del de texto de


edicin con GetWindowText a la cual se le pasa como p p parmetro la variable Cstring. A la funcin se le llama con el operador -> pues la variable es un puntero a CEdit.

SetWindowText(strDato);}// Se establece el titulo del cuadro de dialogo por


medio de la funcin SetWindowText a la cual se le pasa la variable Cstring que desde la lnea anterior viene cargada con el contenido del cuadro de edicin.

Ing. Daniel Osorio Maldonado

Debe quedar en claro que es posible manipular, mediante un cdigo, cdigo los datos contenidos en un control, con la control idea que despus se pueden volver a volcar al control. Agregar un control button a la aplicacin anterior, cambie anterior su propiedad caption a Regresar, el ID a IDB_Regresar . Crear una variable miembro para el cuadro de Edicin para ello ir al ClasWizard, seleccionando la pestaa Member Variables Variables Pulse el botn Add Variable, el nombre a crearse ser m_strDato, m strDato Category Value y Variable Type Cstring Cstring. Pulse la opcion OK (acepte) de la ventana y tambin de la ventana del ClassWizard
Ing. Daniel Osorio Maldonado 10

Ing. Daniel Osorio Maldonado

11

Ing. Daniel Osorio Maldonado

12

Ahora actuaremos sobre el botn Regresar, ir al g , ClasWizard Seleccione de la pestaa M t Message Map el Object Ids IDB_REGRESAR. Message BN_CLIKED. Add F Function ti

Ing. Daniel Osorio Maldonado

13

Agregue el g g siguiente cdigo dentro del botn en la funcin creada.

void CTexto_en_CuadroDlg::OnRegresar() { d d l () UpdateData(TRUE); if(m_strDato.IsEmpty() FALSE) if(m strDato.IsEmpty()==FALSE) { MessageBox("Ahora se invertira:"+m_strDato); m_strDato.MakeReverse(); UpdateData(FALSE); } }
Ing. Daniel Osorio Maldonado 14

Ing. Daniel Osorio Maldonado

15

Ing. Daniel Osorio Maldonado

16

La Clase CListBox
La clase Base MFC CListBox define l controles llamados Listas l B F B d f los l ll d Un Control lista es una ventana hija, rectangular, que visualiza una lista de elementos elementos. El usuario puede aadir o suprimir elementos de la lista, los cuales forman una columna desplazable dentro del rectngulo.

CObject CCmdTarget CWnd CW d CListBox

Un objeto de la clase CListBox se puede crear desde una plantilla de dialogo o directamente con cdigo cdigo. El siguiente paso es colocar cadenas de texto. Se usa la funcin miembro AddString esto cuando la lista esta clasificada o bien la funcin InsertString. La c ntid d de l m nt s se bti n con L cantidad d elementos s obtiene c n GetCount.

Al seleccionar un elemento de la lista se utiliza la funcin miembro SetCursel o la f l funcin miembro SelectString. En cualquier elemento, la funcin G b l E l l l f GetCurSel l devuelve el ndice del elemento seleccionado (el primer elemento tiene ndice 0)
Ing. Daniel Osorio Maldonado 17

Un elemento de la lista se puede copiar en un buffer utilizando la funcin miembro GetText y se puede borrar utilizando la funcin miembro DeleteString. Para crear una lista, primero se construye un objeto de la clase CListBox o de la clase derivada y despus se llama a la funcin Create Create.

Clase CListBox
La clase CListBox define controles llamados listas. Un control lista es una ventana hija, rectangular, que visualiza una lista de elementos. elementos Un control lista muestra una lista de elementos, que el usuario puede ver y seleccionar. En un control lista con seleccin simple, el usuario puede seleccionar solamente un elemento. Si hay seleccin mltiple, un rango de elementos puede ser seleccionado. Al seleccionar un elemento este es iluminado y el control lista manda un mensaje de notificacin hacia la ventana padre.
Ing. Daniel Osorio Maldonado 18

Una aplicacin con Listas


Crear la aplicacin, para ello use la MFC basada en dialogo, tal como ya se crearon otras aplicaciones.

Ing. Daniel Osorio Maldonado

19

Ing. Daniel Osorio Maldonado

20

Ing. Daniel Osorio Maldonado

21

En la lista de la derecha desmarque la opcin Sort. En Extended Style marque Modal Frame Seleccione la lista de la Izquierda y presione Ctrl W(ClassWizard). En Member V i bl E M b Variables marque IDL_NUMEROS y presione Add Variable. IDL NUMEROS i V i bl En Name m_lstNumeros, en Category seleccione Control y Tipo CLIstBox. CLIstBox

Ing. Daniel Osorio Maldonado

22

Propiedades de la lista de la derecha: El ID debe tener . En Style desmarque Sort. En Extended

Ing. Daniel Osorio Maldonado

23

Nuevamente como en la lista anterior active Ctrl+W p , q _ Ir a la solapa Member Variables, marque IDL_PARES

Ing. Daniel Osorio Maldonado

24

Active ahora el botn >> cambie las propiedades

Active ahora el botn > de abajo y modifique las propiedades. i d d s

Ing. Daniel Osorio Maldonado

25

Ahora ir a la ventanita del cuadro de edicion Edit. _ Escriba el ID IDE_CANT. Cree una variable miembro para el cuadro de Edicion de tipo int Category value y de nombre m_Cant, vea la secuencia. g y ,

Ing. Daniel Osorio Maldonado

26

Introduciendo El Cdigo de la Aplicacin Modifique el Botn OK(Aceptar) M difi l B OK(A )

Clic para agregar cdigo

Encontrara la siguiente funcin, donde agregara cdigo


void CControl_ListaDlg::OnOk() {if(MessageBox("Desea salir?, "Salir",MB_ICONQUESTION+MB "Salir" MB ICONQUESTION+MB _YESNO)==IDYES) CDialog::OnOK();}
Ing. Daniel Osorio Maldonado 27

Active el botn Cargar luego acceda al ClassWizard. Seleccione Message Box, luego en Objects IDs marcar g , g j IDB_CARGAR. En Message marcar BN_CLIKED y entonces presione Ad Function luego edit Code l dit C d

Ing. Daniel Osorio Maldonado

28

Al editar la Funcin se aprecia el siguiente cdigo, esta cdigo lista para agregar la rutina. void CControl_ListaDlg::OnCargar() CControl ListaDlg::OnCargar() {
CString c; int i; p UpdateData(TRUE); m_listNumeros.ResetContent(); for(i=1;i<=m_Cant;i++) for(i=1;i<=m Cant;i++) { c.Format("%s%i",c,i);//formatea i como String m_listNumeros.AddString(c);//Se agrega a la lista c=" ";} }
Ing. Daniel Osorio Maldonado 29

Acceda a lista nuevamente Ctrl +W luego Messge Maps con IDL_NUMEROS En Object ID`s Seleccione LBN_SELCHANGE en Message. Pulse Add Function y luego Edit Code Escriba el siguiente cdigo

Ing. Daniel Osorio Maldonado

30

Clic en Edit Code y agregue el siguiente g g g cdigo

void CControl_ListaDlg OnSelchangeNumeros() { CControl ListaDlg::OnSelchangeNumeros()


// TODO: Add your control notification handler code here CString strTexto; g ; m_listNumeroos.GetText(m_listNumeros.GetCurSel(),strTexto); g ( ) MessageBox(strTexto); }
Ing. Daniel Osorio Maldonado 31

El cdigo del Botn >> (IDC_PASAPARES)

Ing. Daniel Osorio Maldonado

32

void CControl_ListaDlg::OnPasapares() { CControl ListaDlg::OnPasapares()


int i,n,ce;

CString strC; ce=m_listNumeros.GetCount(); if(ce>0) for(i=0;i<ce;i++){ m_listNumeros. GetText(i,strC);//obtiene el elemento n=atoi(strC);// convierte a numrico if(n%2==0) //ver si es par m_listPares.AddString(strC); //;pasa a la otra lista}
}
Ing. Daniel Osorio Maldonado 33

Activar el boton de > (pasa1) Crear una funcin OnPasa1 y agregue el cdigo

void CControl_ListaDlg::OnPasa1() { CControl ListaDlg::OnPasa1()


int n; CString strC; m_listNumeros.GetText(m_listNumeros.GetCurSe l(),strC); n=atoi(strC); if(n%2==0) m_listPares.AddString(strC);
Ing. Daniel Osorio Maldonado } 34

Ing. Daniel Osorio Maldonado

35

Una aplicacin que utiliza a una lista para seleccionar un elemento y enviarlo a un cuadro de texto Elegir MFC AppWizard(exe) y como nombre del proyecto ListaPaises

Colocar un control List Box en la Ventana de Dialogo C l t l Li t B l V t d Di l Principal y otro control Edit Box

Ing. Daniel Osorio Maldonado

36

Agregar variable a Add Member Variable debe quedar tal t l como se observa b

Ing. Daniel Osorio Maldonado

37

Agregar una variable para el control IDE_LISTAPAISES, IDE LISTAPAISES tal como se aprecia aprecia.

Ing. Daniel Osorio Maldonado

38

Adicione elementos a la lista es decir los pases, para ello debe ir a class view, luego a la clase CListaPaisesDlg y view activar OnInitDialog(), luego Edit Code y agregar los items
// TODO: Add extra initialization here

m_ListaPaises.AddString( Italia ); m ListaPaises AddString("Italia"); m_ListaPaises.AddString("Grecia"); m_ListaPaises.AddString("Egipto"); m_ListaPaises.AddString("Portugal"); m_ListaPaises.AddString("Canada"); m_ListaPaises.AddString( Peru ); m ListaPaises AddString("Peru"); m_ListaPaises.AddString("Colombia"); m_ListaPaises.AddString("Bolivia"); m_ListaPaises.AddString("Alemania"); m_ListaPaises.AddString("Japon"); m_ListaPaises.AddString( China ); m ListaPaises AddString("China");
Ing. Daniel Osorio Maldonado 39

Se Trata de Transferir un elemento hacia un Edit Box. Dar doble clic dentro de la lista

Cambie el nombre a OnDblclkList

Ing. Daniel Osorio Maldonado

40

void CListaPaisesDlg::OnDblclkList() { UpdateData(TRUE); m_ListaPaises.GetText(m_ListaPaises.Ge tCurSel(),m_ListResult); UpdateData(FALSE)


}

Transfiere el contenido d un Edi T fi l id de Edit Box a un List Box Adicione un botn Comand, sobre la m , Ventana principal. Seleccione un Ventana de Edicin

Ing. Daniel Osorio Maldonado

41

Debe crearse un variable en la caja de Edicin

Aprecie las variables creadas de los controles

Ing. Daniel Osorio Maldonado

42

Aadir cdigo al boton >> , tal como se muestra, muestra pruebe la aplicacin

void CListaPaisesDlg::OnTransfer() {
UpdateData(TRUE); m_ListaPaises.GetText(m_ListaPaises.GetCu rSel(),m_Transfer); UpdateData(FALSE); }
Ing. Daniel Osorio Maldonado 43

Agregar el Contenido de un Edit Box a un List Box Adicione sobre la ventana principal un control button button. Adicione una Ventana Edit Text

Ing. Daniel Osorio Maldonado

44

Adicione la variable m_Add, tal como se _ , aprecia.

Ing. Daniel Osorio Maldonado

45

Active el botn Add con Ctrl +W para agregar el cdigo


void CListaPaisesDlg::OnAddToList() { id CLi t P i Dl O AddT Li t()
UpdateData(TRUE); m_ListaPaises.AddString(m_Add); UpdateData(FALSE);} Pruebe la Aplicacin y debe tener la misma ventana. No olvide hacer doble clic sobre uno de los elementos de la lista de la izquierda. izquierda Hacer clic sobre el botn >> deber aparecer el pas por ejem Egipto. p p p j gp Escriba un nombre de Pas en la ventanita de Edicin , luego clic en <<Add debiendo d bi d aparecer el pas en l li t l la lista.pe Panam.
46

Ing. Daniel Osorio Maldonado

Agregando un Elemento en una posicin especifica dentro de la lista


Agregue un control button sobre la ventana de Dialogo. Agregue una ventanita de Edicin a la derecha del button. g g Observe el obj creado y en Mamber Var deber adicionar la variable a usar

Ing. Daniel Osorio Maldonado

47

Adicione la variable y debe quedar tal como se observa en la figura g

Observe la variable creada y t bi el d tambin l resto de variables. Agregaremos cdigo al g g g button Insertar, Ctrl+W

Ing. Daniel Osorio Maldonado

48

Si todo sale bien debe tener la funcion creada OnInsert3 y en la MFC ClassWizard el detalle

Ing. Daniel Osorio Maldonado

49

UNA SIMPLE APLICACION


Aplicaremos una sencilla pero significativa aplicacin con un grafico. A li ill i ifi i li i fi Para ello haremos uso de proyecto basado en dialogo, suponemos que el usuario ya conoce la mecnica y estamos en el paso 2/4 del asistente asistente.

Ing. Daniel Osorio Maldonado

50

Una Aplicacin con Combobox


Podramos decir que el control ComboBox combina las caractersticas de un control TextBox y un control ListBox. Los usuarios pueden introducir informacin en la parte del cuadro de texto o seleccionar un elemento en la parte de cuadro de lista del d l control. l En la programacin con Visual C++, se programa desde el work space en la pestaa class view cuando sea el caso, el resto se realiza caso tal como si se tratara de un control mas. En la siguiente aplicacin har u de control ComboBox y gu n p n uso n m mostrar las principales funciones y propiedades. Cree una aplicacin basada en dialogo Debera crear 06 etiquetas,02 cajas de texto,01 cuadro desplegable,01 casilla de verificacion, y 01 boton de comando.
Ing. Daniel Osorio Maldonado 51

Ing. Daniel Osorio Maldonado

52

Ing. Daniel Osorio Maldonado

53

Ing. Daniel Osorio Maldonado

54

Agregue los controles.

Agregue las variables. variables Para el comboBox como si se tratase de una lista. lista
Ing. Daniel Osorio Maldonado 55

Procedemos a llenar de datos al comboBox desde la funcion OnInitDialog(), haciendo doble clic en ella,se puede ver desde la pestaa class view. BOOL CApp13Dlg::OnInitDialog() { CDialog::OnInitDialog(); g g(); // Set the icon for this dialog. // The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon //Cambiar el estilo OEM convert //Aadimos los siguientes elementos m_Combo.AddString("Visual Basic 6.0"); m_Combo.AddString("Visual FoxPro 6.0"); m_Combo.AddString("Visual C 6 0") C b AddSt i ("Vi l C++ 6.0"); m_Combo.AddString("Visual Java 6.0"); m_Combo.AddString("Visual InterDev 6.0"); GetDlgItem(IDC_NUEVO_ELEMENTO)->SetFocus(); G tDl It (IDC NUEVO ELEMENTO) >S tF () return FALSE; }

Ing. Daniel Osorio Maldonado

56

Vamos ahora a trabajar con el control ComboBox, para ello haga clic botn derecho en el control ComboBox se apreciara la siguiente ventanita, ubique la opcin Events.

Ing. Daniel Osorio Maldonado

57

Seleccione CBN_SELCHANGE y presiones el botn Add Handler. Puede apreciar la ventanita creada. Observe la funcin creada

Ing. Daniel Osorio Maldonado

58

Agregaremos ahora el siguiente codigo a la funcion ::OnSelchangeCombo() {


//Cadena auxiliar CString cadena; //Capturar el ndice del elemento seleccionado char indice[10]; int i = m_Combo.GetCurSel(); itoa(i, indice, 10); cadena = indice; SetDlgItemText(IDC_INDICE, ndice SetDlgItemText(IDC INDICE, "ndice seleccionado: \"" + cadena + "\""); \ \ ); //Capturar el texto del elemento seleccionado CString elemento; m_Combo.GetLBText(m_Combo.GetCurSel(), elemento); SetDlgItemText(IDC_ELEMENTO, Elemento SetDlgItemText(IDC ELEMENTO,"Elemento seleccionado: \"" + elemento + "\""); \ \ ); //Capturar la longitud del elemento seleccionado int lon = m_Combo.GetLBTextLen(i); char longitud[10]; itoa(lon, longitud, 10); cadena = longitud; SetDlgItemText(IDC_LONGITUD, "Longitud del elemento seleccionado: \"" + cadena + "\""); //Recuperamos el nmero de elementos int num = m_Combo.GetCount(); m Combo.GetCount(); char numElementos[10]; itoa(num, numElementos, 10); cadena = numElementos; SetDlgItemText(IDC_NUM_ELEMENTOS, Nmero SetDlgItemText(IDC NUM ELEMENTOS, "Nmero Total de elementos: \"" + cadena + "\""); \ \ ); }
Ing. Daniel Osorio Maldonado 59

En esta aplicacin agregaremos un grafico. El usuario debe ingresar con la clave correcta. El botn aceptar generar el b t t l evento clic creando la funcin OnAceptar. El cdigo deber es el siguiente
void CPASWORDDlg::OnAceptar() { // TODO: Add your control notification handler code here UpdateData(TRUE); CString pasw ="SUERTE"; if(strcmp(m_password,pasw)==0) MessageBox( Ingrese MessageBox("Ingrese al Sistema ","Usuario Confirmado ,MB_OK); Usuario Confirmado" MB OK); else MessageBox("Error al Ingresar ","Error Usuario No Confirmado",MB_ICONSTOP); UpdateData(FALSE);}
Ing. Daniel Osorio Maldonado 60

GRAFICOS
Para dibujar grficos,Windows utiliza las funciones incluidas en el modulo GDI.EXE, las cuales e encargan de llamar a las rutinas de los distintos gestores de dispositivo(drivers: video,de impresora, y de trazadores grficos), que son los que directamente actan sobre el t d fi ) l di t t t b l dispositivo. Por P consiguiente el modulo GDI.EXE proporciona una interfaz para i i t l d l GDI EXE i i t f dibujar sobre dispositivos graficos(GDI). EL CONTEXTO DE DISPOSITIVO: es una abstraccin que utiliza Windows para el acceso al Hardware de visualizacin o de impresin, y que ya q directamente no lo puede hacer,por consiguiente esta p ,p g abstraccin recibe el nombre de contexto de dispositivo(device contex-DC). Por consiguiente cuando se quiera dibujar en un dispositivo grafico como una pantalla o una impresora, primero hay que obtener un handle de un contexto de dispositivo que represente al dispositivo fsico y que delimite el rea donde se puede pintar.
Ing. Daniel Osorio Maldonado 61

Se puede obtener un contexto de dispositivo para la pantalla entera, para el rea del usuario de una ventana, para la ventana ,p ,p entera o para una impresora. Tambin se puede crear un contexto de dispositivo no referido a un dispositivo real; pe un contexto de dispositivo de memoria; para este caso, el contexto de dispositivo de memoria siempre se crea compatible con un contexto de dispositivo existente. Otras veces no necesitaremos pintar sino solo obtener Ot it i t i l bt informacin de un dispositivo, pe de la pantalla o de la impresora; en estos casos, se puede obtener un handle de un p p contexto de informacin. Un DC es una estructura de datos que contiene los atributos necesarios para pintar el grfico o el texto texto. Windows utiliza estos atributos con las funciones de la GDI para determinar como se pinta el grafico o el texto. Esto E t permite que l f it las funciones GDI i l i incluyan solo el handle del l l h dl d l DC, las coordenadas iniciales y el tamao si es preciso, tanto del destino como del origen, sin que para pintar sea necesario especificar otros atributos como el color de fondo, el color del primer plano, el tipo deDaniel Osorio Maldonado 62 Ing. letra, el espaciado entre caracteres, etc.

Pe, en la aplicacin de Bienvenida dibujado en una pantalla, llamamos a la funcin DrawText, donde solo indicaremos el , contexto de dispositivo, el texto y las coordenadas donde se quiere pintar. MFC Y CONTEXTO DE DISPOSITIVO
La librera MFC incluye varias clases que nos proporcionan distintos contextos de dispositivo asi como la funcionalidad necesaria para trabajar sobre ellos. De todas ellas, la clase base CDC provee de todas las funciones miembros que se necesitan para dibujar. Las clases derivadas, como heredan sta funcionalidad, solo aportan su constructor y destructor. p Para crear un contexto de dispositivo para la ventana sobre la pantalla, construiremos un objeto de la clase CClientDC, contexto p , j , de dispositivo asociado con el area de usuario de la ventana
Ing. Daniel Osorio Maldonado 63

Para crear un contexto de dispositivo asociado con toda la pantalla construiremos un objeto de la clase CWindwDC. Para crear un contexto de dispositivo para otros dispositivos, tales como la impresora o la memoria construiremos un objeto de la clase CDC. La clase CPaintDC slo se utilizar cuando sea necesario sobre escribir la funcin miembro OnPaint con un cdigo especifico para pintar la pantalla. Por defecto OnPaint llama a O D P d f t O P i t ll OnDraw con un contexto d t t de dispositivo de pantalla adecuado. Por lo t t P l tanto, ser en O D OnDraw d d normalmente coloquemos el donde l t l l cdigo especifico para pintar textos o grficos. El Numero de contextos de dispositivos creados simultneamente N d t t d di iti d i lt t esta limitado por Windows, por eso cuando un contexto de dispositivo no se necesite, se debe destruir. Si el objeto es local a p , j una funcin, ste quedar destruido automticamente cuando 64 Ing. Daniel Osorio Maldonado finalice la funcin.

Tambin se puede obtener un puntero a un contexto de dispositivo utilizando la funcin miembro CWnd En este CWnd. caso, para destruir el contexto de dispositivo referenciado p por el puntero hay que llamar a la funcin miembro p yq ReleaseDC. Un contexto de dispositivo cuando se crea tiene ciertos atributos por defecto. Estos atributos y otros pueden ser asignados por medio de las funciones miembro de la clase CDC. Los atributos a los q que nos referimos componen el estado del contexto de p dispositivo e incluye objetos tales como plumas, pinceles y fuentes, o detalles de cmo alinear un texto o rellenar un polgono. l

Ing. Daniel Osorio Maldonado

65

Ing. Daniel Osorio Maldonado

66

Por consiguiente podemos afirmar entonces que: g p q DC de Pantalla para acceder a los objetos existentes en pantalla, y que existen 02 funciones para crear: BeginPaint() y GetDC(); existiendo otras 02 funciones complementarias para la liberacin: EndPaint() y Release(); DC de Impresora o printer Device Contex es el DC que se utiliza para d I i t D i C t l tili acceder a cualquier tipo de dispositivo que funcione como impresora, matricial, inyect, lasesr o vectorial. DC Memoria o Memory Context crean maps de bits compatibles con un determinado hardware, se hace necesario la funcin hardware CreateCompatibleDC() cuya definicin es HDC CreateCompatible(HDC hdc). DC de Informacin una aplicacin puede obtener rpidamente informacin acerca de los valores por defecto del dispositivo en cuestin.
Ing. Daniel Osorio Maldonado 67

CpaintDC

Para dibujar dentro de un mtodo en respuesta al mensaje WM_PAINT

CClientDC CWindowDC CMetafileDC

Para dibujar en el rea cliente de forma sincrnica j

dibuja dib j en toda la ventana(no solo en el rea del cliente de forma sincrona t d l t ( l l d l li t d f i

Para dibujar sobre un archivo.

No olvide que para crear un DC, primero se crea un objeto de la clase base CDC y luego se llama las funciones miembros que usan contextos dispositivos.

Dibujar Lneas
BOOL LineTo(int x, int y); BOOL LineTo(POINT point);
La funcin CDC::LineTo pinta una Lnea desde la posicin actual de la pluma hasta el punto lgico especificado por los argumentos x e y por el argumento punto.
Ing. Daniel Osorio Maldonado 68

La Clase CRect
La clase CRect es similar a la estructura RECT de Windows. La estructura RECT esta definida en windows.h y es de forma siguiente:

Typedef struct tagRECT{ ypede s uc g C { Int left; Int top; Int right; Int bottom; }RECT; Los miembros left y top son las coordenadas(x,y) de la esquina superior izquierda del rectngulo q define una estructura y los miembros right q g que g y bottom son las coodenadas(x,y) de la esquina inferior derecha.Algunas funciones de windows requieren objetos de esta clase como parmetro. Un objeto Crect puede ser pasado como parametro a una funcin donde quiera que se utilice RECT o LPRECT. La funcionalidad es soportada por varios conjuntosde funciones miembros: Un constructor; operadoresIng. Daniel Osorio Maldonado sobrecargados:(LPCRECT,LPRECT,=,... 69

La Clase CPoint
La clase CPiont es similar a la estructura POINT de Windows. La estructura POINT esta definida en Windows.h y es de la forma siguiente Typedef struct tagPoint{ int x; int y; } POINT; La clase Cpoint define las coordenadas(x,y) de un punto y p p proporciona para manipularlos los operadores sobrecargados p p p g operator ==operator: =operator+operator=operator+y operator -, la funcin miembro Offset y el constructor CPOINT

Ing. Daniel Osorio Maldonado

70

DIBUJO DE UNA ELIPSE BOOL Ellipse(int x1,int y1,int x2,int y2); La Funcion CDC::Ellipse se utiliza para Dibujar una elipse o circulo. La forma general circulo es: (x1,y1) y (x2,y2) El centro de la elipse tambien es el centro de un t d l li t bi l t d Rectangulo imaginario descrito p los p g g por puntos (x1,y1) y (x2,y2), tal como se muestra.
Ing. Daniel Osorio Maldonado 71

DIBUJO DE UNA CUERDA


BOOL Chord(int x1,int y1,int x2,int y2,int x3,int y3, int x4,int y4); , y );
(X1,Y1)

(X3,Y3)

(X4,Y4) (X2,Y2)

La funcion CDC::Chord dibuja una figura cerrada con una lnea entre dos puntos del arco (x3,y3) y (x4,y4)
Ing. Daniel Osorio Maldonado 72

DIBUJO DE UN SECTOR CIRCULAR


BOOL Pie(int x1,int y1,int x2,int y2,int x3,int x4,int y4); La funcin CDC::Pie dib j sectores circulares. El L f i CDC Pi dibuja t i l centro del arco elptico es tambin el centro de un rectngulo imaginario descrito por los puntos (x1 y1) y (x1,y1) (x2,y2).

DIBUJO DE UN RECTANGULO
La Funcin CDC::Rectangle dibuja un rectngulo o cuadro descrito por (x1,y1) y (x2,y2).

Ing. Daniel Osorio Maldonado

73

Clase CPen
La clase Cpen permite definir la pluma a utilizar con las funciones de dibujo. Esta herramienta afecta la forma en la que son dibujadas Las lineas puede se lineas s das lineas d sco t uas, as eas pueden ser eas slidas eas discontinuas, etc, tambin puede afectar los bordes de las figuras cerradas ya sean rectngulos, elipses,etc. y g , p ,

Miembros Principales de la Clase CPen


Constructor : Cpen // crea un Objeto Cpen Incializacion : CreatePen //Crea una Pluma Logica geomtrica con estilo especifico ancho y especifico, atributos de pincel y une todo esto al objeto CPen. CPen
Ing. Daniel Osorio Maldonado 74

Operaciones: FromHandle //Retorna un puntero a un Objeto CPen cuando es dado un handle a un j Objeto HPEN

La Clase CPaintDC
La Clase CPaintDC se utiliza con la funcion OnPaint y permite visualizar texto o grficos en el area de trabajo de una ventana en repuesta a un mensaje WN_PAINT. Constructor: CPaintDC //crea un objeto Cpaint conectado al
CWnd.

Ing. Daniel Osorio Maldonado

75

Sistema de Coordenadas
Escala MM_TEXT MM_TWIPS MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH MM_HIENGLISH MM_ISOTROPIC MM_ANISOTROPIC Unidad logica p 1pixcel 1twip 0.1 mm 0.01mm 0.01pulgadas 0.0001pulgadas 0.001pulgadas(X=Y) Arbitrario (X=!Y) Eje x Los valores La derecha La derecha La derecha La derecha La derecha La derecha Seleccionable Seleccionable Ejej y aumentan hacia abajo j arriba Arriba Arriba Arriba arriba Seleccionable Seleccionable

Ing. Daniel Osorio Maldonado

76

La Clase CBrush
La clase Cbrush permite definir el pincel a utilizar con las funciones de dibujo. Esta herramienta afecta a la forma en la que es pintado el interior de las figuras cerradas. Cuando se crea un contexto de dispositivo, existe un pincel por defecto que pinta de blanco el interior de las figuras cerradas para cambiar el pincel actual puede elegir un pincel de los que Windows tiene en stock o puede crear un pincel y Seleccionarlo para el contexto de dispositivo CPaintDC PintarDC(this); PintarDC.SelectStockObject(LTGRAY-BRUSH); La funcionalidad de esta clase esta soportada por varios conjuntos de funciones miembros: Un constructor Un Funciones de inicializacin(CreateBrushIndirect, CreatePateernBrush, La funcin FromHandle
Ing. Daniel Osorio Maldonado 77

APLICACIONES

Ing. Daniel Osorio Maldonado

78

Ing. Daniel Osorio Maldonado

79

Se aprecia en la pestaa FileView, los archivos Source Files, Headers File H d Fil En la Pestaa ClassView aprecie las clases. Hacer clic en la funcin OnDraw

Ing. Daniel Osorio Maldonado

80

Digitar dentro de la funcion OnDraw(CDC *pDC)


pDC>TextOut(200,200,"H ola Mundo que tal con Visual C++?");

Ing. Daniel Osorio Maldonado

81

Ing. Daniel Osorio Maldonado

82

GRAFICANDO LINEAS
Para dibujar Lneas haremos uso de la aplicacin anterior y agregaremos l siguientes la i i t lineas, en la funcion OnDraw(CDC* Pdc) contenido en la clase CHolaView //Dibuje una Linea Diagonal pDC->LineTo(100,100); pDC->TextOut(60,20,<-Linea Diagonal); D l)

Ing. Daniel Osorio Maldonado

83

Ing. Daniel Osorio Maldonado

84

Una elipse la dibujaremos en la funcion OnDraw:


pDC->Ellipse(200,10,300,70); pDC >Ellips (200 10 300 70); pDC->TextOut(310,20, Elipse);

Dibujando una Elipse, una Cuerda, un Sector Circular y un R t n l S t Ci l n Rectangulo

Una C U Cuerda la dibujamos en l funcion O D d l dib j la f i OnDraw:


pDC->Chord(10,100,100,200,20,125,120,175); pDC->TextOut(70,130, Cuerda);

//Un Sector Circular :


PDC->Pie(200,100,300,200,200,150,250,100); PDC->TextOut(300,130, Sector );

//Un Rectangulo
p pDC->Rectangulo(10,250,100,300); g pDC->TextOut(110,280, Rectangulo);
Ing. Daniel Osorio Maldonado 85

Ing. Daniel Osorio Maldonado

86

Ing. Daniel Osorio Maldonado

87

Ing. Daniel Osorio Maldonado

88

Usando la clase Cpen


Se trata de utilizar el mismo proyecto para hacer uso de la clase Cpen Cpen. Seleccione la clase Classview y active la funcin OnDraw(CDC *pDC). Estando E t d en l funcin OnDraw(...) edtela y posesinese antes d l dibujo la f i O D ( ) dt l i t del dib j de lneas Escriba el siguiente cdigo Cpen *n_pincel=new Cpen; // Crea un objeto Cpen n_pincel->CreatePen(PS_SOLID,6,RGB(255,0,0)); n pincel >CreatePen(PS SOLID 6 RGB(255 0 0)); //iinitialization iti li ti
pDC->SelectObject(n_pincel);

Ing. Daniel Osorio Maldonado

89

Ing. Daniel Osorio Maldonado

90

Usando la clase Cbrush


Active la pestaa ClassView y edite la funcin OnDraw.
Agregue el siguiente codigo antes del dibujo de las figuras: CBrush *n_brocha=new CBrush; // Crea un objeto n_brocha->CreateHatchBrush(HS_CROSS,RGB(255,0,0)); pDC->SelectObject(n_brocha);

Ing. Daniel Osorio Maldonado

91

BIBLIOGRAFIA
Fco. Fco Javier Cevallos Sierra VISUAL C++ Aplicaciones para Windows Edit Ra-Ma 1era Edicin Joel Carrasco Muoz Creacin de Programas con Visual C++ Edit A&C Editores 1era Edicion C++ Editores www.microsoft.com http://msdn.microsoft.com/espe/library/60k1461a.aspx pe/library/60k1461a aspx

Ing. Daniel Osorio Maldonado

92

También podría gustarte