Sunteți pe pagina 1din 25

3-12-2013

Reporte Ejercicios
Visual Studio
Programacin Avanzada

Hctor Saldaa Andrade


VII SEMESTRE

Objetivo
Desarrollar habilidades en la programacin de objetos mediante la realizacin de los ejercicios propuestos en el
documento Teach Yourself Visual C++ in 21 Days, en los que manejaremos las herramientas del software Microsoft
Visual Studio para C++.

Marco Terico
Visual Studio es un conjunto completo de herramientas de desarrollo para la generacin de aplicaciones web
ASP.NET, Servicios Web XML, aplicaciones de escritorio y aplicaciones mviles. Visual Basic, C# y C++ utilizan todos el
mismo entorno de desarrollo integrado (IDE) que habilita el uso compartido de herramientas y hace ms sencilla la
creacin de soluciones en varios lenguajes. As mismo, dichos lenguajes utilizan las funciones de .NET Framework, las
cuales ofrecen acceso a tecnologas clave para simplificar el desarrollo de aplicaciones web ASP y Servicios Web XML.
Retomando Visual C++, incluye las MFC (Microsoft Foundation Classes), que son clases que facilitan la
programacin Windows, sin tener que usar directamente el API de dicho sistema, pues agrupan las libreras de Windows
en clases C++. Fueron introducidas por Microsoft en 1992 y desde entonces fueron apareciendo nuevas versiones con
las actualizaciones del entorno de programacin Visual C++. MFC es una jerarqua de estas clases, y nos proporciona un
modelo de desarrollo de aplicaciones llamado documento/vista, que nos permite disear aplicaciones de forma que
los datos de la aplicacin vayan separados de los elementos que componen el interfaz de usuario, lo que permite
modificar de forma independiente las dos partes del programa.
Adems, MFC brinda la oportunidad de crear controles ActiveX, que son un componente de software
reutilizable, basado en el modelo de objetos componentes (COM), que admite una gran variedad de funciones OLE y se
puede personalizar de modo que se adapte a las necesidades del software. Estos controles estn diseados para su uso
tanto en contenedores de controles ActiveX ordinarios como en pginas Web de Internet. Se pueden desarrollar para
muchos usos, tales como acceso a bases de datos, supervisin de datos o creacin de grficos.

Desarrollo
Da 1. Creando tu primer aplicacin C++
En este ejercicio nos muestra paso a paso como iniciar nuestra primera aplicacin y comenzar a familiarizarnos con el
programa. Consta de dos botones, Ok y Cancel con los que aparecer un mensaje o finalizar la aplicacin
respectivamente.
BOTN OK (MUESTRA UN MENSAJE)
MessageBox(_T("Mi primer app en Visual C++"));

BOTN CANCEL (SALIR DE LA APLICACIN)


CDialogEx::OnCancel();

Da 2. Creando tu primer aplicacin C++


En este ejercicio comenzamos a utilizar algunos controles estndar en las aplicaciones de Windows, como lo son las
casillas de verificacin, botones. Adems, no slo colocamos y configuramos, sino que interactuamos con ellos, esto es
porque trabajamos con un cuadro de edicin de control, en el cual tenemos 3 partes, la de Mensaje, Programa y Control
de los anteriores. En la primer parte manejamos un texto, ya sea que hagamos que aparezca en un mensaje, se borre, o
bien se reemplace por uno ya predeterminado. Por otro lado, en Programa, elegimos que aplicacin correr de una lista
que ah se encuentra. Por ltimo, la parte de Control hace referencia a manipular las acciones anteriores, esto es
habilitndolo o deshabilitndolo, u ocultndolo, mediante las casilla de verificacin ya integradas.

CUADRO DE EDICIN
BOOL CDay2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_strMessage = "Escribe algo aqu...";
m_bShowMsg = TRUE;
m_bShowPgm = TRUE;
m_bEnableMsg = TRUE;
m_bEnablePgm = TRUE;
UpdateData(FALSE);
return TRUE; // return TRUE

unless you set the focus to a control

BOTN DE SALIDA
void CDay2Dlg::OnClickedExit()
{
// TODO: Add your control notification handler code here
OnOK();
}

MOSTRAR MENSAJE
void CDay2Dlg::OnBnClickedShwmsg()
{
UpdateData(TRUE);
MessageBox(m_strMessage);
// TODO: Add your control notification handler code here
}

ELIMINAR MENSAJE
void CDay2Dlg::OnBnClickedClrmsg()
{
m_strMessage = "";
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}

DESHABILITAR CONTROLES DE MENSAJE


void CDay2Dlg::OnBnClickedCkenblmsg()
{
UpdateData(TRUE);
if (m_bEnableMsg == TRUE)
{
GetDlgItem(IDC_MSG)->EnableWindow(TRUE);
GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
}
else
{
// No, so disable all controls that have anything
// to do with showing the user message
GetDlgItem(IDC_MSG)->EnableWindow(FALSE);
GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);
}
// TODO: Add your control notification handler code here
}

MOSTRAR CONTROLES DE MENSAJE


void CDay2Dlg::OnBnClickedCkshwmsg()
{
UpdateData(TRUE);
if (m_bShowMsg == TRUE)
{
GetDlgItem(IDC_MSG)->ShowWindow(TRUE);
GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);
GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);
GetDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);
GetDlgItem(IDC_STATICMSG)->ShowWindow(TRUE);
}
else
{
// No, so hide all controls that have anything
// to do with showing the user message
GetDlgItem(IDC_MSG)->ShowWindow(FALSE);
GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);
GetDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);
GetDlgItem(IDC_CLRMSG)->ShowWindow(FALSE);
GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);
}
// TODO: Add your control notification handler code here
}

EJECUTAR UNA APLICACIN


void CDay2Dlg::OnBnClickedRunpgm()
{
UpdateData(TRUE);
CString strPgmName;
strPgmName = m_strProgToRun;
strPgmName.MakeUpper();
if (strPgmName == "Paint")
WinExec("mspaint.exe", SW_SHOW);
if (strPgmName == "Notepad")
WinExec("notepad.exe", SW_SHOW);
if (strPgmName == "Calculadora")
WinExec("calc.exe", SW_SHOW);
if (strPgmName == "CMD")
WinExec("cmd.exe", SW_SHOW);
// TODO: Add your control notification handler code here
}

MENSAJE POR DEFECTO


void CDay2Dlg::OnDfltmsg()
{
m_strMessage = "Ing. Mecatrnica";
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}

DESHABILITAR CONTROLES DE APLICACIONES


void CDay2Dlg::OnCkenblpgm()
{
UpdateData(TRUE);
if (m_bEnablePgm == TRUE)
{
GetDlgItem(IDC_PROGTORUN)->EnableWindow(TRUE);
GetDlgItem(IDC_RUNPGM)->EnableWindow(TRUE);
GetDlgItem(IDC_STATICPGM)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_PROGTORUN)->EnableWindow(FALSE);
GetDlgItem(IDC_RUNPGM)->EnableWindow(FALSE);
GetDlgItem(IDC_STATICPGM)->EnableWindow(FALSE);
}
// TODO: Add your control notification handler code here
}

MOSTRAR CONTROLES DE APLICACIONES


void CDay2Dlg::OnBnClickedCkshwpgm()
{
UpdateData(TRUE);
if (m_bShowPgm == TRUE)
{
GetDlgItem(IDC_PROGTORUN)->ShowWindow(TRUE);
GetDlgItem(IDC_RUNPGM)->ShowWindow(TRUE);
GetDlgItem(IDC_STATICPGM)->ShowWindow(TRUE);
}
else
{
GetDlgItem(IDC_PROGTORUN)->ShowWindow(FALSE);
GetDlgItem(IDC_RUNPGM)->ShowWindow(FALSE);
GetDlgItem(IDC_STATICPGM)->ShowWindow(FALSE);
}
// TODO: Add your control notification handler code here
}

Da 3. Integrando el Ratn y Teclado en tu aplicacin


En este ejercicio nos encontramos con la captura de eventos de ratn y teclado, as como las reacciones a ellos en la
aplicacin es decir, determinamos en qu posicin se encuentra el cursor con su espacio de aplicacin, y de la misma
manera se determina las teclas que se presionan. As es como tenemos en este ejercicio un recuadro para pintar
siempre y cuando el botn izquierdo del ratn se mantenga presionado, mientras que con el teclado, utilizamos los
nmeros para controlar el grosor y color del trazo y algunas letras para cambiar el cursor.
MOVIMIENTO DEL RATN
void C3DMouseDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ((nFlags & MK_LBUTTON) == MK_LBUTTON)
{
CClientDC dc (this);
CPen lpen(PS_SOLID, b_Line, b_Colors);
dc.SelectObject(&lpen);
dc.MoveTo(m_iPrevX, m_iPrevY);
dc.LineTo(point.x, point.y);
m_iPrevX = point.x;
m_iPrevY = point.y;
}
CDialogEx::OnMouseMove(nFlags, point);
}

BOTN IZQUIERDO DEL RATN PRESIONADO


void C3DMouseDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_iPrevX = point.x;
m_iPrevY = point.y;
CDialogEx::OnLButtonDown(nFlags, point);
}

CONFIGURACIN DEL CURSOR


BOOL C3DMouseDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(m_bCursor)
return TRUE;
else
return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}

RECONOCER TECLAS PRESIONADAS


void C3DMouseDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
char lsChar;
HCURSOR lhCursor;
lsChar = char(nChar);
if (lsChar == '1')
{
b_Line = 1;
}
if (lsChar == '2')
{
b_Line = 2;
}
if (lsChar == '3')

{
b_Line = 8;
}
if (lsChar == '4')
{
b_Line = 16;
}
if (lsChar == '5')
{
b_Line = 36;
}
if (lsChar == '6')
{
b_Colors = RGB(0,0,0);
}
if (lsChar == '7')
{
b_Colors = RGB(255,128,0);
}
if (lsChar == '8')
{
b_Colors = RGB(0,128,255);
}
if (lsChar == '9')
{
b_Colors = RGB(0,153,0);
}
if (lsChar == '0')
{
b_Colors = RGB(127,0,204);
}
if (lsChar == 'A')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_ARROW);
SetCursor(lhCursor);
}
if (lsChar == 'B')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_IBEAM);
SetCursor(lhCursor);
}
if (lsChar == 'C')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_WAIT);
SetCursor(lhCursor);
}
if (lsChar == 'D')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_NO);
SetCursor(lhCursor);
}
if (lsChar == 'E')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_CROSS);
SetCursor(lhCursor);
}
if (lsChar == 'F')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_HELP);
SetCursor(lhCursor);
}
if (lsChar == 'G')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_SIZEALL);

SetCursor(lhCursor);
}
if (lsChar == 'H')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_UPARROW);
SetCursor(lhCursor);
}
if (lsChar == 'I')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_SIZENWSE);
SetCursor(lhCursor);
}
if (lsChar == 'J')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_SIZENESW);
SetCursor(lhCursor);
}
if (lsChar == 'K')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_SIZEWE);
SetCursor(lhCursor);
}
if (lsChar == 'L')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_SIZENS);
SetCursor(lhCursor);
}
if (lsChar == 'M')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_HAND);
SetCursor(lhCursor);
}
if (lsChar == 'N')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_APPSTARTING);
SetCursor(lhCursor);
}
if (lsChar == 'X')
{
lhCursor = AfxGetApp() -> LoadStandardCursor(IDC_ARROW);
m_bCursor = TRUE;
SetCursor(lhCursor);
OnOK();
}
else
{
m_bCursor = TRUE;
}
UpdateData (FALSE);
CDialogEx::OnKeyDown(nChar, nRepCnt,
nFlags);
}

Da 4. Trabajando con Temporizadores


Como su nombre lo dice claramente, en este ejercicio se trabaj con los temporizadores (de Windows), de manera tal
que, apreciamos como fue agregado un reloj con el horario y fecha de nuestro ordenador, as como un contador, el cual
sus intervalos son manejados por medio del valor que ingresemos y su avance lo apreciamos en una barra de progreso.
TEMPORIZADOR (HORA Y FECHA)
void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime curTime = CTime:: GetCurrentTime();
switch(nIDEvent)
{
case ID_CLOCK_TIMER:
m_sTime.Format ("%d:%d:%d", curTime.GetHour(), curTime.GetMinute(), curTime.GetSecond());
break;
case ID_COUNT_TIMER:
m_iCount++;
m_progressBar.SetRange(m_iInicio,m_iFinal);
m_progressBar.SetPos(m_iCount);
m_sCount.Format("%d", m_iCount);
if (m_progressBar.GetPos()==100)
{
m_progressBar.SetPos(0);
m_iInicio=m_iFinal;
m_iFinal+100;
m_progressBar.SetRange(m_iInicio,m_iFinal);
UpdateData(FALSE);
}
break;
}
UpdateData(FALSE);
CDialogEx::OnTimer(nIDEvent);
}

INICIAR CONTADOR
void CTimerDlg::OnBnClickedStartime()
{
UpdateData(TRUE);
m_iCount = 0;
m_sCount.Format("%d",m_iCount);
UpdateData(FALSE);
SetTimer(ID_COUNT_TIMER, m_iInterval, NULL);
m_cStopTime.EnableWindow(TRUE);
m_cButton.EnableWindow(FALSE);
m_cStartTime.EnableWindow(FALSE);
}

DETENER CONTADOR
void CTimerDlg::OnBnClickedStoptime()
{
KillTimer(ID_COUNT_TIMER);
m_cStopTime.EnableWindow(FALSE);
m_cButton.EnableWindow(TRUE);
m_cStartTime.EnableWindow(TRUE);
// TODO: Add your control notification handler code here
}

POSICIN DE LA BARRA DE PROGRESO


void CTimerDlg::OnBnClickedButton1()
{
m_controlBar.Format ("%d",m_progressBar.GetPos());
// TODO: Add your control notification handler code here
}

Da 5. Agregando Cajas de Dilogo


Agregar ventanas adicionales y hacer uso de las mismas para obtener
informacin del usuario es el enfoque de esta aplicacin; es decir, utilizar los
cuadros de dilogo para realizar preguntas al usuario y construir los nuestros para obtener informacin ms detallada,
como el tipo de respuesta elegida.
BOTN YES, NO, CANCEL
void CDay5Dlg::OnClickedYesNoCancel()
{
// TODO: Add your control notification handler code here
int iResults;
iResults=MessageBox("Press the Yes, No, or Cancel button", "Yes, No, Cancel Dialog",
MB_YESNOCANCEL | MB_ICONINFORMATION);
switch (iResults)
{
case IDYES: // The Yes button?
m_sResults = "Yes! Yes! Yes!";
break;
case IDNO: // The No button?
m_sResults = "No, no, no, no, no.";
break;
case IDCANCEL: // The Cancel button?
m_sResults = "Sorry, canceled.";
break;
}
UpdateData(FALSE);
}

BOTN ABORT, RETRY, IGNORE


void CDay5Dlg::OnBnClickedAbortretryignore()
{
// TODO: Add your control notification handler code here
int iResults;
iResults=MessageBox("Press the Abort, Retry, or Ignore button", "Abort, Retry, Ignore Dialog",
MB_ABORTRETRYIGNORE | MB_ICONQUESTION);
switch (iResults)
{
case IDABORT:
m_sResults = "Abort! Abort! Abort!";
break;
case IDRETRY:
m_sResults = "Retry, Retry, Retry.";
break;
case IDIGNORE:
m_sResults = "Nothing 2 do";
break;
}
UpdateData(FALSE);
}

MOSTRAR DIRECCIN DE ARCHIVO


void CDay5Dlg::OnFileOpen()
{
// TODO: Add your control notification handler code here
CFileDialog m_ldFile(TRUE);
if (m_ldFile.DoModal() == IDOK)
{
m_sResults = m_ldFile.GetPathName();
UpdateData(FALSE);
}
}

BOTN CUSTOM DIALOG


void CDay5Dlg::OnBnClickedBcustomdialog()
{
// TODO: Add your control notification handler code here
if (m_dMsgDlg2.DoModal () == IDOK)
{
m_sResults = m_dMsgDlg2.m_sMessage;
UpdateData(FALSE);
m_cWhichOption.EnableWindow(TRUE);
}
}

CONOCER LA OPCIN ELEGIDA


void CDay5Dlg::OnClickedBwichoption()
{
// TODO: Add your control notification handler code here
switch(m_dMsgDlg2.m_iOption)
{
case 0: // Was it the first radio button?
m_sResults = "The first option was selected.";
break;
case 1: // Was it the second radio button?
m_sResults = "The second option was selected.";
break;
case 2: // Was it the third radio button?
m_sResults = "The third option was selected.";
break;
case 3: // Was it the fourth radio button?
m_sResults = "The fourth option was selected.";
break;
default: // Were none of the radio buttons selected?
m_sResults = "No option was selected.";
break;
}
// Update the dialog
UpdateData(FALSE);
}

BOTN YES OR NOT


void CDay5Dlg::OnBnClickedYesno()
{
// TODO: Add your control notification handler code here
switch (m_dMsgDlg2.m_iYesNo)
{
case IDYES: // Did the user answer YES?
m_sResults = "Yes!";
break;
case IDNO: // Did the user answer NO?
m_sResults = "No!";
break;
}
// Update the dialog
UpdateData(FALSE);
}

Da 6. Creando Mens
El uso de mens es una parte importante en una aplicacin, por ello en este ejercicio hacemos uso de estos. Agregamos
una barra con mens desplegables y uno ms tras presionar el botn derecho del ratn, en el cul se posiciono dicho
men de tal forma que una de las esquinas del mismo, coincidiera con la punta del cursor.
OPCIN HELLO DEL MEN FILE
void CMenusDlg::OnFileHello()
{
// TODO: Add your command handler code here
MessageBox(L"Hello World", L"Hello");
}

OPCIN EXIT DEL MEN FILE


void CMenusDlg::OnFileExit()
{
// TODO: Add your command handler code here
OnOK();
}

OPCIN ABOUT DEL MEN HELP


void CMenusDlg::OnHelpAbout()
{
// TODO: Add your command handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}

MEN DE CONTEXTO (AL PRESIONAR EL BOTN DERECHO DEL RATN)


void CMenusDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu *m_lMenu; // A pointer to the menu
CPoint m_pPoint; // A copy of the mouse position
// Copy the mouse position to a local variable
m_pPoint = point;
// Convert the position to a screen position
ClientToScreen(&m_pPoint);
// Get a pointer to the window menu
m_lMenu = GetMenu();
// Get a pointer to the first submenu
m_lMenu = m_lMenu->GetSubMenu(2);
// Show the Popup Menu
m_lMenu->TrackPopupMenu(TPM_CENTERALIGN + TPM_LEFTBUTTON,(m_pPoint.x-488), (m_pPoint.y-363),
this, NULL);
}

OPCIN CALCULADORA DEL MEN RUN


void CMenusDlg::OnRunCalculator()
{
// TODO: Add your command handler code here
WinExec("calc.exe",SW_SHOW);
}

Da 7. Trabajando con Textos y Fuentes


Con este ejercicio aprendemos acerca de la infraestructura de fuente en el Sistema Operativo y como acceder a esta en
una aplicacin; as, adquirimos una lista de las fuentes, entre las cuales al seleccionar cualquiera de ellas, el texto que
tengamos cambiar al tipo de letra elegido. Adems de otras funciones como itlico, subrayado, tachado.
MOSTRAR LISTADO DE FUENTES Y TEXTO INICIAL
BOOL CDay7Dlg::OnInitDialog()
{...
FillFontList();
// Initialize the text to be entered
m_strSampText = "Mecatrnica";
// Copy the text to the font sample area
m_strDisplayText = m_strSampText;
m_bUseText = TRUE;
// Update the dialog
UpdateData(FALSE);
return TRUE;
}

// return TRUE

unless you set the focus to a control

TEXTO INGRESADO A MOSTRAR


void CDay7Dlg::OnEnChangeEsamptext()
{
UpdateData(TRUE);
if (m_bUseText)
{
// Copy the current text to the font sample
m_strDisplayText = m_strSampText;
// Update the dialog with the variables
UpdateData(FALSE);
}
}

FUENTE AL TEXTO
void CDay7Dlg::OnLbnSelchangeLfonts()
{
// TODO: Add your control notification handler code here
// Update the variables with the dialog controls
UpdateData(TRUE);
if (!m_bUseText)
{
// Copy the font name to the font sample
m_strDisplayText = m_strFontName;
// Update the dialog with the variables
UpdateData(FALSE);
}
// Set the font for the sample
SetMyFont();
}

CASILLA DE VERIFICACIN ITALIC


void CDay7Dlg::OnClickedCbitalic()
{
// TODO: Add your control notification handler code here
// Update the variables with the dialog controls
UpdateData(TRUE);
// Set the font for the sample
SetMyFont();
}

CASILLA DE VERIFICACIN STRIKE-OUT


void CDay7Dlg::OnBnClickedDefaultmsg2()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
SetMyFont();
}

FUNCIN SETMYFONT
void CDay7Dlg::SetMyFont(void)
{
CRect rRect; // The rectangle of the display area
int iHeight; // The height of the display area
int iItalic=0;
int iUnderline=0;
int iStrike=0;
// Has a font been selected?
if (m_strFontName != "")
{
// Get the dimensions of the font sample display area
m_ctlDisplayText.GetWindowRect(&rRect);
// Calculate the area height
iHeight = rRect.top - rRect.bottom;
// Make sure the height is positive
if (iHeight < 0)
iHeight = 0 - iHeight;
m_fSampFont.Detach();
// Should the font be italicized?
if (m_bItalic)
iItalic = 1;
if (m_bDefault)
iUnderline = 1;

}
else
{
// Get the dimensions of the font sample display area
m_ctlDisplayText.GetWindowRect(&rRect);
// Calculate the area height
iHeight = rRect.top - rRect.bottom;
// Make sure the height is positive
if (iHeight < 0)
iHeight = 0 - iHeight;
m_fSampFont.Detach();
// Create the font to be used
m_fSampFont.CreateFont((iHeight - 5), 0, 0, 0, FW_NORMAL,0, 0, 0, DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |FF_DONTCARE,
m_strFontName);
}
}

FUNCIN FILLFONTLIST
void CDay7Dlg::FillFontList()
{
int iCount; // The number of fonts
int iCurCount; // The current font
CString strCurFont; // The current font name
CString strPrevFont = L""; // The previous font name
LOGFONT lf;
// Initialize the LOGFONT structure
lf.lfCharSet = DEFAULT_CHARSET;
strcpy_s(lf.lfFaceName, L"");
// Clear the list box
m_ctlFontList.ResetContent();
// Create a device context variable
CClientDC dc (this);
// Enumerate the font families
::EnumFontFamiliesEx((HDC) dc, &lf,(FONTENUMPROC) EnumFontFamProc, (LPARAM) this, 0);
// Get the number of fonts in the list box
iCount = m_ctlFontList.GetCount();
// Loop from the last entry in the list box to the first,
// searching for and deleting the duplicate entries
for (iCurCount = iCount; iCurCount > 0; iCurCount--)
{
// Get the current font name
m_ctlFontList.GetText((iCurCount - 1), strCurFont);
// Is it the same as the previous font name?
if (strCurFont == strPrevFont)
{
// If yes, then delete it
m_ctlFontList.DeleteString((iCurCount - 1));
}
// Set the previous font name to the current font name
strPrevFont = strCurFont;
}
}

Da 8. Agregando Flash
Sin duda un ejercicio en el que ponemos a prueba lo aprendido, esto porque las instrucciones se tornan menos
descriptivas. Sin ms prembulo, esta aplicacin consiste en dibujar grficos al seleccionar en una ventana el formato,
mientras en otra apreciamos el resultado tras actualizar la aplicacin.
MOSTRAR VENTANA PARA TRAZOS
BOOL CGraphicsDlg::OnInitDialog()
{
m_iColor = 0;
m_iShape = 0;
m_iTool = 0;
UpdateData(FALSE);
m_dlgPaint.Create(IDD_PAINT_DLG, this);
m_dlgPaint.ShowWindow(SW_SHOW);
return TRUE;

// Devuelve TRUE

a menos que establezca el foco en un control

SINCRONIZAR INFORMACIN Y CUADROS DE DILOGO


void CGraphicsDlg::OnRSelection()
{
UpdateData(TRUE);
m_dlgPaint.Invalidate();
}

BOTN ACTUALIZAR
void CGraphicsDlg::OnActualizar()
{
// TODO: Agregue aqu su cdigo de controlador de notificacin de control
UpdateData(TRUE);
m_dlgPaint.Invalidate();
}

BOTN BITMAP
void CGraphicsDlg::OnBbitmap()
{
// TODO: Agregue aqu su cdigo de controlador de notificacin de control
static char BASED_CODE szFilter[] = "Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, ".bmp", m_sBitmap,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if (m_ldFile.DoModal() == IDOK)
{
m_sBitmap = m_ldFile.GetPathName();
HBITMAP hBitmap = (HBITMAP) ::LoadImageA (AfxGetInstanceHandle(),
m_sBitmap, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (hBitmap)
{
if (m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_dlgPaint.Invalidate();
}
}

TABLA DE COLORES
const COLORREF CPaintDlg::m_crColors[8] = {
RGB( 0, 0, 0),
RGB( 0, 0, 255),
RGB( 0, 255, 0),
RGB( 0, 255, 0),
RGB( 255, 0, 0),
RGB(255, 0, 255),
RGB(255, 255, 0),
RGB(255, 255, 255)
};

FUNCIN DRWALINE
void CPaintDlg::DrawLine(CPaintDC *pdc, int iColor)
{
CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]);
CPen lDotPen (PS_DOT, 1, m_crColors[iColor]);
CPen lDashPen (PS_DASH, 1, m_crColors[iColor]);
CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]);
CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor]);
CPen lNullPen (PS_NULL, 1, m_crColors[iColor]);
CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColors[iColor]);
CRect lRect;
GetClientRect (lRect);
lRect.NormalizeRect();
CPoint pStart;
CPoint pEnd;
int liDist = lRect.Height() / 8;
CPen *lOldPen;
pStart.y
pStart.x
pEnd.y =
pEnd.x =

= lRect.top;
= lRect.left;
pStart.y;
lRect.right;

int i;
for (i=0; i<7; i++)
{
switch (i)
{
case 0:
lOldPen = pdc->SelectObject(&lSolidPen);
break;
case 1:
pdc->SelectObject(&lDotPen);
break;
case 2:
pdc->SelectObject(&lDashPen);
break;
case 3:
pdc->SelectObject(&lDashDotPen);
break;
case 4:
pdc->SelectObject(&lDashDotDotPen);
break;
case 5:
pdc->SelectObject(&lNullPen);
break;
case 6:
pdc->SelectObject(&lInsidePen);
break;

}
pStart.y = pStart.y + liDist;
pEnd.y = pStart.y;
pdc->MoveTo(pStart);
pdc->LineTo(pEnd);
}
pdc->SelectObject(lOldPen);
}

FUNCIN ONPAINT
void CPaintDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Agregue aqu su cdigo de controlador de mensajes
CGraphicsDlg *pWnd = (CGraphicsDlg*) GetParent();
if(pWnd)
{
if (pWnd->m_iTool == 2)
{
if (pWnd->m_sBitmap != "")
ShowBitmap(&dc, pWnd);
}
else
{
if (pWnd->m_iShape == 0)
DrawLine(&dc, pWnd->m_iColor);
else
DrawRegion(&dc, pWnd->m_iColor, pWnd->m_iTool, pWnd->m_iShape);
}
}
// No llama a CDialog::OnPaint() para mensajes de pintura
}

FUNCIN DRAWREGION
void CPaintDlg::DrawRegion(CPaintDC *pdc, int iColor, int iTool, int iShape)
{
CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]);
CPen lDotPen (PS_DOT, 1, m_crColors[iColor]);
CPen lDashPen (PS_DASH, 1, m_crColors[iColor]);
CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]);
CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor]);
CPen lNullPen (PS_NULL, 1, m_crColors[iColor]);
CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColors[iColor]);
CBrush
CBrush
CBrush
CBrush
CBrush
CBrush
CBrush
CBrush

lSolidBrush (m_crColors[iColor]);
lBDiagBrush (HS_BDIAGONAL, m_crColors[iColor]);
lCrossBrush (HS_CROSS, m_crColors[iColor]);
lDiagCrossBrush (HS_DIAGCROSS, m_crColors[iColor]);
lFDiagBrush (HS_FDIAGONAL, m_crColors[iColor]);
lHorizBrush (HS_HORIZONTAL, m_crColors[iColor]);
lVertBrush (HS_VERTICAL, m_crColors[iColor]);
lNullBrush (RGB(192, 192, 192));

CRect lRect;
GetClientRect (lRect);
lRect.NormalizeRect();
int liVert = lRect.Height() / 2;
int liHeight = liVert - 10;

int liHorz = lRect.Width() / 4;


int liWidth = liHorz - 10;
CRect lDrawRect;
CPen *lOldPen;
CBrush *lOldBrush;
int i;
for (i = 0; i < 7; i++)
{
switch (i)
{
case 0:
lDrawRect.top = lRect.top + 5;
lDrawRect.left = lRect.left + 5;
lDrawRect.bottom = lDrawRect.top + liHeight;
lDrawRect.right = lDrawRect.left + liWidth;
lOldPen = pdc->SelectObject(&lSolidPen);
lOldBrush = pdc->SelectObject(&lSolidBrush);
break;
case 1:
lDrawRect.left = lDrawRect.left + liHorz;
lDrawRect.right = lDrawRect.left + liWidth;
pdc->SelectObject(&lDotPen);
pdc->SelectObject(&lBDiagBrush);
break;
case 2:
lDrawRect.left = lDrawRect.left + liHorz;
lDrawRect.right = lDrawRect.left + liWidth;
pdc->SelectObject(&lDashPen);
pdc->SelectObject(&lCrossBrush);
break;
case 3:
lDrawRect.left = lDrawRect.left + liHorz;
lDrawRect.right = lDrawRect.left + liHorz;
pdc->SelectObject(&lDashDotPen);
pdc->SelectObject(&lDiagCrossBrush);
break;
case 4:
lDrawRect.top = lDrawRect.top + liVert;
lDrawRect.left = lRect.left + 5;
lDrawRect.bottom = lDrawRect.top + liHeight;
lDrawRect.right = lDrawRect.left + liWidth;
pdc->SelectObject(&lDashDotDotPen);
pdc->SelectObject(&lFDiagBrush);
break;
case 5:
lDrawRect.left = lDrawRect.left + liHorz;
lDrawRect.right = lDrawRect.left + liWidth;
pdc->SelectObject(&lNullPen);
pdc->SelectObject(&lHorizBrush);
break;
case 6:
lDrawRect.left = lDrawRect.left + liHorz;
lDrawRect.right = lDrawRect.left + liWidth;
pdc->SelectObject(&lInsidePen);
pdc->SelectObject(&lVertBrush);
break;

}
if (iTool == 0)
pdc->SelectObject(lNullBrush);
else
pdc->SelectObject(lNullPen);
if (iShape == 1)
pdc->Ellipse(lDrawRect);
else
pdc->Rectangle(lDrawRect);
}
pdc->SelectObject(lOldBrush);
pdc->SelectObject(lOldPen);
}

Da 9. Agregando Active X
En este ltimo ejercicio utilizamos un control Active X, que previamente debimos habilitarlo en el sistema para poder
hacer uso de l. Este control, no es ms que una tabla en la que mostramos datos aleatorios.
FUNCIN LOADDATA
void CActiveXDlg::LoadData(void)
{
int liCount;
CString lsAmount;
srand((unsigned)time(NULL));
for (liCount = m_ctlFGrid.get_FixedRows();
liCount < m_ctlFGrid.get_Rows(); liCount++)
{
m_ctlFGrid.put_TextArray(GenID(liCount, 0),
m_ctlFGrid.put_TextArray(GenID(liCount, 1),
m_ctlFGrid.put_TextArray(GenID(liCount, 2),
lsAmount.Format("%5d.00", rand());
m_ctlFGrid.put_TextArray(GenID(liCount, 3),
}
m_ctlFGrid.put_MergeCol(0, TRUE);
m_ctlFGrid.put_MergeCol(1, TRUE);
m_ctlFGrid.put_MergeCol(2, TRUE);
DoSort();
}

RandomStringValue(0));
RandomStringValue(1));
RandomStringValue(2));
lsAmount);

FUNCIN GENID
int CActiveXDlg::GenID(int m_iRow, int m_iCol)
{
int liCols = m_ctlFGrid.get_Cols();
return (m_iCol + liCols * m_iRow);
return 0;
}

VALOR ALEATORIO
CString CActiveXDlg::RandomStringValue(int m_iColumn)
{
CString lsStr;
int liCase;
switch (m_iColumn)
{
case 0:
liCase = (rand() % 5);
switch (liCase)
{
case 0:
lsStr = "Northwest";
break;
case 1:
lsStr = "Southwest";
break;
case 2:
lsStr = "Midwest";
break;
case 3:
lsStr = "Northeast";
break;
default:
lsStr = "Southeast";
break;
}
break;
case 1:
liCase = (rand() % 5);

switch (liCase)
{
case 0:
lsStr = "Dodads";
break;
case 1:
lsStr = "Thingamajigs";
break;
case 2:
lsStr = "Whatchamacallits";
break;
case 3:
lsStr = "Round Tuits";
break;
default:
lsStr = "Widgets";
break;
}
break;
case 2:
liCase = (rand() % 4);
switch (liCase)
{
case 0:
lsStr = "Dore";
break;
case 1:
lsStr = "Harvey";
break;
case 2:
lsStr = "Pogo";
break;
default:
lsStr = "Nyra";
break;
}
break;
}
return lsStr;
return CString();
}

FUNCIN DOSORT
void CActiveXDlg::DoSort(void)
{
m_ctlFGrid.put_Col(0);
m_ctlFGrid.put_ColSel((m_ctlFGrid.get_Cols() - 1));
m_ctlFGrid.put_Sort(1);
}

X
void CActiveXDlg::OnMousedownMsfgrid(short Button, short Shift, long x, long y)
{
if (m_ctlFGrid.get_MouseRow() != 0)
{
m_iMouseCol = 0;
return;
}
m_iMouseCol = m_ctlFGrid.get_MouseCol();

// TODO: Add your message handler code here

X
void CActiveXDlg::OnMouseupMsfgrid(short Button, short Shift, long x, long y)
{
if (m_iMouseCol == 0)
return;
m_ctlFGrid.put_Redraw(FALSE);
m_ctlFGrid.put_ColPosition(m_iMouseCol, m_ctlFGrid.get_MouseCol());
DoSort();
m_ctlFGrid.SetRedraw(TRUE);
// TODO: Add your message handler code here
}

X
void CActiveXDlg::OnDblclickMsfgrid()
{
if (m_ctlFGrid.get_MouseRow() != 0)
{
m_iMouseCol = 0;
return;
}
m_iMouseCol = m_ctlFGrid.get_MouseCol();
if (m_iMouseCol == 0)
return;
m_ctlFGrid.SetRedraw(FALSE);
m_ctlFGrid.put_ColPosition(m_iMouseCol, 0);
DoSort();
m_ctlFGrid.SetRedraw(TRUE);
// TODO: Add your message handler code here
}

Conclusin
Sin lugar a duda, por medio de estos ejercicios he aprendido a utilizar mayor parte de las herramientas que nos
ofrece Visual Studio con respecto a la programacin orientada a objetos, que abarc desde agregar un simple mensaje o
cerrar una aplicacin con un botn, hasta interactuar con el ratn y teclado o bien poder apreciar el avance del valor de
una variable en una barra de control, e incluso agregar un control Active X que manualmente habilitamos. No obstante,
aprend que al trabajar con distintas versiones de este software, 2012 y 2013, resulta algo complicado migrar el proyecto
de una a otra (por supuesto considerando que un proyecto creado en una version nueva difcilmente podr abrirse en
una version anterior), esto debido al conjunto de caracteres que maneja (Unicode, Multi-Byte, Ninguno).
Por ltimo, cabe mencionar que en aquellos errores que se presentaron, no solo los mencionados sino algunos
ms por no entender lo que se deba hacer, encontr solucin a cada uno de ellos, en lugar de omitirlos y comenzar el
proyecto nuevamente; con lo que result en un mejor aprendizaje y experiencia.

Bibliografa
Teach Yourself Visual C++ in Days
http://informatica.uv.es/iiguia/AIG/docs/intro_visual.htm
http://es.wikipedia.org/wiki/Microsoft_Foundation_Classes
http://msdn.microsoft.com/es-es/library/e6w9eycd(v=vs.90).aspx
*http://social.msdn.microsoft.com/Forums/vstudio/en-US/c1b08c0a-a803-41c3-ac8c-84eba3be1ddb/faqcannot-convert-from-const-char-to-lpctstr?forum=vclanguage
*Este es una de las direcciones a las que se ingreso para buscar solucin a las complicaciones de migracin de proyecto entre las
versiones 2012 y 2013 de Microsoft Visual Studio

S-ar putea să vă placă și