Programación Vcaccess
Abra MFC AppWizard (exe) en VC Program-File-New-Project, ingrese el nombre del proyecto en el cuadro debajo del proyecto (asumiendo que el nombre del proyecto es 111), haga clic en Aceptar-Seleccionar Documento múltiple, haga clic en Siguiente; haga clic en Siguiente nuevamente hasta que se confirme y se complete el marco básico, como se muestra a continuación.
En este momento, hay tres botones debajo del borde izquierdo de la interfaz VC: ClassView, ResourceView y FileView. En ClassView, hay 111 clases de ingeniería: CAdoutDlg, CChildFrame, CMy111App, CMY11Doc, CMy65438. En el punto ResourceView, hay clases de recursos: acelerador, cuadro de diálogo, ícono, menú, tabla de cadenas, barra de herramientas y versión. Haga clic en la vista de archivos, hay clases de archivos: archivo fuente, archivo de encabezado, archivo de recursos y ReadMe.txt; p >
Haga clic en el botón "Proyecto" en la interfaz-Agregar proyecto-Crear-Seleccionar archivo fuente C++, ingrese el nombre del archivo (como DIBAPI) en el cuadro debajo del archivo y haga clic en "Finalizar", para que El archivo DIBAPI.cpp se agregará al archivo fuente en FileView, todo el código se agregó al archivo.
Haga clic en el botón "Proyecto" en la interfaz-Agregar proyecto-Crear-Seleccionar archivo de encabezado C/C++, ingrese el nombre del archivo en el cuadro debajo del archivo (debe ser el mismo que el nombre del archivo anterior), haga clic en "Finalizar", entonces eso en FileView Hay un archivo DIBAPI.h más en el archivo de encabezado, que es el archivo de encabezado de DIBAPI.cpp
Haga clic en el archivo DIBAPI.h en blanco e ingrese el siguiente código en el archivo:
//dibabi . h
#ifndef _INC_DIBAPI
#define _INC_DIBAPI
DECLARAR _ HANDLE(HDIB);
#Definir PALVERSION 0x300
# definir IS _ WIN30 _ DIB(lpbi)((*(lpd word)(lpbi))= = sizeof(BITMAPINFOHEADER))
# definir ancho de rectángulo (lpRect) ((lpRect)->derecha-(lpRect)->izquierda)
# definir alto de rectángulo(lpRect)((lpRect)->abajo-(lpRect)- > Arriba)
#define ancho byte (bit)(((bit)+31)/32*4)
#define DIB _ HEADER _ MARKER((WORD)( ' M '<<8)|'B ')
BOOL WINAPI PaintDIB(HDC, LPRECT, HDIB, LPRECT, CPalette * pPal);
BOOL WINAPI CreateDIBPalette(HDIB HDIB , CPalette * cPal);
LPSTR WINAPI finddibits(LPSTR lpbi);
DWORD WINAPI DIB ancho(LPSTR lpDIB);
DWORD WINAPI DIB alto(LPSTR lpDIB) );
WORD WINAPI PaletteSize(LPSTR lpbi);
WORD WINAPI DIBNumColors(LPSTR lpbi);
h identificador de copia global de WINAPI (h global h);
BOOL WINAPI SaveDIB(HDIB hDib, CFile y archivo amp;
HDIB WINAPI lee el archivo DIB(CFile y amp; archivo
// Enter); su propia declaración de función aquí.
#endif//! _INC_DIBAPI
Las funciones anteriores se utilizan para implementar funciones básicas del procesamiento de imágenes, como leer y almacenar imágenes. También puede ingresar la función requerida en "//Ingrese aquí su propia declaración de función".
Haga clic en el archivo DIBAPI.cpp en blanco y agregue el siguiente código:
//DIBAPI.cpp
#include " stdafx.h "
#Contiene "DIBAPI.h"
WORD WINAPI DIBNumColors(LPSTR lpbi)
{
WORD wBitCount
if (IS_WIN30_DIB(lpbi))
{
DWORD dwClrUsed
dwClrUsed =((LPBITMAPINFOHEADER)lpbi)-& gt;
if(dwClrUsed)
return(WORD)dwClrUsed;
}
if(IS_WIN30_DIB(lpbi))
wbit count =((LPBITMAPINFOHEADER)lpbi)-& gt; biBitCount
Otro
wbit count =((LPBITMAPCOREHEADER)lpbi)-& gt;bcBitCount
Cambiar ( wBitCount)
{
Caso 1:
devolución 2;
Caso 4:
devolución 16 ;
Caso 8:
Devuelve 256;
Valor predeterminado:
Devuelve 0; / p>
}
Tamaño de paleta WINAPI de WORD(LPSTR lpbi)
{
if(IS_WIN30_DIB(lpbi))
return (WORD)(DIBNumColors(lpbi)* sizeof(RGBQUAD));
Otros
return(WORD)(DIBNumColors(lpbi)* sizeof(RGBTRIPLE));
}
LPSTR WINAPI finddibits(LPSTR lpbi)
{
return(lpbi+*(lpd palabra)lpbi+::PaletteSize(lpbi))
}
DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi
LPBITMAPCOREHEADER lpbmc<; / p>
lpbmi =(LPBITMAPINFOHEADER)lpDIB;
lpbmc =(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
Devolver lpbmi - & gt; doble ancho;
Otro
return (DWORD)lpbmc->bcWidth
}
DWORD WINAPI DIB height( LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi
LPBITMAPCOREHEADER lpbmc
lpbmi =(LPBITMAPINFOHEADER)lpDIB;
lpbmc =(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
Devuelve lpbmi-& g
t; altura BIH;
Otro
retorno (DWORD)lpbmc->bcHeight
}
BOOL WINAPI PaintDIB(HDC hDC, LPRECT lpDCRect, HDIB hDIB, LPRECT lpDIBRect, CPalette* pPal)
{
LPSTR lpDIBHdr
LPSTR lpDIBBits
BOOL bSuccess = FALSE
HPALETTE hPal = NULL
HPALETTE hOldPal = NULL
if(hDIB==NULL)
Devuelve FALSO
lpDIBHdr =(LPSTR)::bloqueo global((h global)hDIB);
lpDIBBits = FindDIBBits(lpDIBHdr);
If (pPal!=null)
{
hPal =(letra HPA)pPal-& gt;m_hObject
hOldPal=::SelectPalette(hDC, hPal, TRUE);
}
* SetStretchBltMode(hDC, COLORONCOLOR);
if((ancho recto(lpd cret)= = ancho recto(lpDIBRect))&&(alto recto(lpd rect) )= = altura rect(lpDIBRect)))
{
b éxito =::SetDIBitsToDevice(hDC, lpd rect-& gt; izquierda, lpd rect-& gt; arriba, ancho de rect (lpd rect), alto de rect (lpd rect), lpDIBRect-& gt; left, \
(int)DIB height(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT( lpDIBRect), 0, (WORD)DIBHeight(lpDIBHdr), \
lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS);
}
Otros
{
bSuccess=::StretchDIBits(hDC,lpd rect->izquierda,lpd rect->arriba,ancho de recto(lpd rect),alto de recto( lpd rect), lpDIBRect-> izquierda,\
lpDIBRect->arriba, RECTWIDTH(lpDIBRect), RECTHEIGHT(lpDIBRect),\
lpDIBBits, (LPBITMAPINFO) lpDIBHdr, DIB_RGB_COLORS, copia src);
}
* desbloqueo global((h global)hDIB);
if(hOldPal)
* seleccione paleta(hDC, hOldPal, TRUE); /p>
Desbloqueo global (hDIB);
Devuelve b correctamente
}
BOOL WINAPI CreateDIBPalette(H).
DIB HDIB, CPalette* pPal)
{
LPLOGPALETTE lpPal
Manejo de hLogPal
HPALETTE hPal = NULL
LPSTR lpbi
LPBITMAPINFO lpbmi
LPBITMAPCOREINFO lpbmc
BOOL bWinStyleDIB
int I;
WORD wNumColors
BOOL bResult = FALSE
if(hDIB==NULL)
Devuelve FALSE
lpbi =(LPSTR)::bloqueo global( (h global)hDIB);
lpbmi =(LPBITMAPINFO)lpbi;
lpbmc =(LPBITMAPCOREINFO)lpbi;
wNumColors = DIBNumColors(lpbi);
bWinStyleDIB = IS_WIN30_DIB(lpbi);
if(wNumColors!=0)
{
hLogPal=:: GlobalAlloc(GHND, sizeof(paleta de registro)+sizeof(entrada de paleta)* wNumColors);
if(hLogPal==0)
{
* desbloqueo global((h global)hDIB);
Devolver FALSO
}
lpPal =(LPLOGPALETTE)::bloqueo global(hLogPal);
lpPal -& gt;palVersion = PALVERSION
lpPal->palNumEntries =(WORD)wNumColors;
bWinStyleDIB = IS_WIN30_DIB(lpbi);
p>for( I = 0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{ p>
lpPal-& gt ;Psicometría[i]. peRed = lpbmi->bmiColors[i]. rgbRed
lpPal-& gt;Psicometría[i]. PE verde = lpbmi->bmiColors[i]. rgbGreen
lpPal-& gt;cardiometría[i]. PE azul = lpbmi->bmiColors[i]. rgbBlue
lpPal-& gt;Psicometría[i]. Banderas de PE = 0;
}
Otros
{
lpPal-& gt;cardiometría[i]. peRed = lpbmc->bmciColors[i]. rgbtRed
lpPal-& gt;Psicometría[i]. PE verde = lpbmc->bmciColors[i]. rgbtGreen
lpPal-& gt;Psicometría[i]. PE azul = lpbmc->bmciColors[i]. rgbtBlue
lpPal-& gt;Psicometría[i].
Banderas PE = 0;
}
}
br esult = pPal-& gt; crear paleta(lpPal); desbloqueo global((h global)hLogPal);
* global gratis((h global)hLogPal);
}
* desbloqueo global((h global) )hDIB);
Devolver bResult
}
h identificador de copia WINAPI global (h global h)
{
if(h==NULL)
Devolver NULL
DWORD dwLen =::GlobalSize((h global)h);
h global hCopy = * global alloc(GHND, dwLen);
if (hCopy!=null)
{
void * copia LP =::bloqueo global(( h global)hCopy);
void * LP =::global lock((h global)h);
memcpy(lpCopy, lp, dwLen);
*Desbloqueo global (hCopy);
*Desbloqueo global (h);
}
Volver a hCopy
}< / p>
BOOL WINAPI SaveDIB (archivos HDIB hDib, CFile y amp)
{
BITMAPFILEHEADER bmfHdr
LPBITMAPINFOHEADER lpBI
DWORD dwDIBSize
Si (!hDib)
Devuelve FALSO
lpBI =(LPBITMAPINFOHEADER)::bloqueo global((h global)hDib); p >
if(lpBI==NULL)
Devuelve FALSO
if (!IS_WIN30_DIB(lpBI))
{
* desbloqueo global((h global)hDib);
Devolver FALSO
}
bmf HDR tipo = DIB _ HEADER _ MARKER
dwDIBSize = *(lpd palabra)lpBI+::PaletteSize((LPSTR)lpBI);
if((lpBI-& gt;compresión BI = = BI _ RLE 8)| |( lpBI -& gt;Compresión dual==BI_RLE4))
dwDIBSize+= lpBI-& gt;biSizeImage
Otro
{
DWORD dwBmBitsSize
dwBmBitsSize = ancho bytes((lpBI-& gt;biWidth)*((DWORD)lpBI->biBitCount))* lpBI->BIH alto;
dwDIBSize+ = dwBmBitsSize;
lpBI->; biSizeImage = dwBmBitsSize
}
bmfhdr = dwDIBSize+s.
izeof(encabezado del archivo de mapa de bits);
bmf HDR 1 = 0;
bmf HDR reservado 2 = 0
bmfhdr. (DWORD)sizeof(encabezado del archivo de mapa de bits)+lpBI-& gt;biSize+::PaletteSize((LPSTR)lpBI);
Pruebe
{
Archivo. write((LPSTR)&bmfHdr,sizeof(encabezado del archivo de mapa de bits));
Archivo. WriteHuge(lpBI, dwDIBSize);
}
Catch (CFileException, e)
{
* desbloqueo global((h global )hDib);
THROW _ LAST();
}
End_capture
* desbloqueo global((h global) hDib) ;
Devuelve VERDADERO
}
HDIB WINAPI lee el archivo DIB (archivo CF y archivo)
{
BITMAPFILEHEADER bmfHeader
DWORD dwBitsSize
HDIB hDIB
LPSTR pDIB
dwBitsSize=archivo. GetLength();
if (file.read((LPSTR)&bmfHeader, sizeof(bmfHeader))!=sizeof(bmfHeader))
Devolver NULL
if(bmfHeader.bfType!= DIB _ HEADER _ MARKER)
devuelve NULL
hDIB = (hDIB)::global alloc(GMEM_movable | Inicialización GMEM_zero, dwBitsSize);
if(hDIB==0)
Devuelve NULL
pDIB =(LPSTR)::bloqueo global((h global)hDIB );
if (file.ReadHuge(pDIB, dwBitsSize-sizeof(encabezado del archivo de mapa de bits))!= dwBitsSize-sizeof(encabezado del archivo de mapa de bits))
{
* desbloqueo global((h global)hDIB);
* global free((h global)hDIB);
Devolver NULL
}
* desbloqueo global ((h global)hDIB);
Regresar hDIB
}
//Ingrese aquí su propia definición de función.
Lo anterior es la definición de la función declarada en el archivo de encabezado DIBAPI.h. Puede agregar su propia definición de función después de "//Ingrese su propia definición de función aquí".
Agregue la función de asignación de mensajes correspondiente a continuación, haga clic en Ctrl+W y aparecerá el cuadro de diálogo MFC ClassWizard. Haga clic en el mapa de mensajes, seleccione CMy111Doc en el cuadro debajo de Nombre de clase y luego seleccione OnOpenDocument en el mensaje. Luego haga clic en el botón Agregar función para agregar la función de asignación de mensajes correspondiente.
De manera similar, agregue las funciones de mensaje correspondientes a OnSaveDocument, DeleteContents y CanCloseFrame, y haga clic en Aceptar.
Haga clic en el archivo 111Doc.cpp, que contiene la ubicación de la definición de función de mapeo de mensajes correspondiente. Ingrese el siguiente código en la función cmy 11 doc::cmy 11 doc().
m _ refColorBKG = 0x00808080
m _ hDIB = NULL
m _ palDIB = NULL
m_sizeDoc=CSize(1, 1 );
Ingrese el siguiente código en la función cmy111doc::~ cmy11doc():
if(m_hDIB!=null)
* global free(( h global)m_hDIB);
Si (m_palDIB!=null)
Eliminar m_palDIB
En función boolcymy 111 doc::on documento abierto (lpctstr lpsz nombre de ruta )/todo:Agregue aquí su código de creación dedicado, agregue el siguiente código:
CFile file;
CFileException fe
If (! file . Open(lpszPathName , CFile::modeRead | CFile::shared enywrite, &fe))
{
ReportSaveLoadException(lpsz nombre de ruta, &fe, FALSE, AFX_IDP_FAILED _ TO _ OPEN _ DOC); p>
Devolver FALSO
}
eliminar contenidos();
BeginWaitCursor();
p>
Pruebe
{
m _ hDIB =::leer archivo DIB(archivo);
}
CATCH (CFileException, eLoad)
{
Archivo.
abortar();
EndWaitCursor();
ReportSaveLoadException(nombre de ruta lpsz, eLoad, FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
m _ hDIB = NULL
Devuelve FALSO
}
End_capture
InitDIBData();
EndWaitCursor();
if(m_hDIB==NULL)
{
CString strMsg
StrMsg= "¡Error al leer la imagen! ¡Es posible que este tipo de archivo de imagen no sea compatible! ";
MessageBox(NULL, strMsg, NULL, MB_icon information | MB_OK);
Devolver FALSE p>
}
establecer nombre de ruta (lpsz pathname);
SetModifiedFlag(FALSE);
En la función boolcymy 111 doc::onsavedocument(lpctstr lpsz pathname)//Agrega el siguiente código después de todo: Agrega tu código dedicado y/o llame a la clase base aquí:
CFile file;
CFileException fe
if (! file.Open(lpszPathName, CFile::mode create | CFile::modo lectura escritura | CFile::compartir exclusivo, & ampfe))
{
ReportSaveLoadException( lpsz nombre de ruta,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
Devuelve FALSE
}
BOOL bSuccess = FALSE
Intenta
{
BeginWaitCursor();
bSuccess=::SaveDIB(m_hDIB, archivo);
Archivo. close();
}
CATCH(CException, eSave)
{
Archivo. abortar();
EndWaitCursor();
ReportSaveLoadException(nombre de ruta lpsz, eSave, TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
Devolver FALSO
}
End_Capture
EndWaitCursor();
SetModifiedFlag(FALSE);
Si (!b tiene éxito)
{
CString strMsg
StrMsg= "No se puede guardar la imagen BMP";
MessageBox(NULL , strMsg, NULL, MB _ información del icono | MB _ OK);
}
Haga clic en ClassView, haga clic con el botón derecho en la clase de documento cmy 111, haga clic en Agregar variable miembro y abra el cuadro de diálogo Agregar variables miembro.
Ingrese el nombre del tipo de variable HDIB en el cuadro debajo de Tipo de variable, ingrese el nombre de la variable m_hDIB en Nombre de variable y seleccione Público en Access para agregarlo al documento CMY11. Agregue también m_nColorIndex de tipo int y m_refColorBKG variables miembro de tipo COLORREF * * *, y luego agregue variables m_palDIB de la clase CSize y la clase CPalette* que protegen las variables miembro (seleccionadas en Access). Haga clic con el botón derecho en la clase CMy111Doc, haga clic en Agregar función miembro para abrir el cuadro de diálogo Agregar función miembro, ingrese el nombre del tipo de función void en el cuadro debajo del tipo de función e ingrese el nombre de la función InitDIBData() en la declaración de la función. Seleccione Público en Access y agregue la función miembro pública initdibdata() al documento cmy 111. De manera similar, agregue la función miembro de tipo vacío * * * ReemplazarHDIB (HDIB hDIB).
Agregue el código de la función en 111Doc.cpp y agregue el siguiente código en InitDIBData():
If (m_palDIB!=null)
{
Eliminar m _ palDIB
m _ palDIB = NULL
}
if(m_hDIB==NULL)
Regresar;
LPSTR lpDIB =(LPSTR)::bloqueo global((h global)m _ hDIB);
if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX )
{
* desbloqueo global((h global)m _ hDIB);
* global libre((h global)m _ hDIB);
p>
m _ hDIB = NULL
CString strMsg
StrMsg="¡La imagen BMP es demasiado grande!";
MessageBox(NULL, strMsg, NULL , MB _ información del icono | MB _ OK
Retorno
}
m _ tamaño doc = CSize(( int)::ancho DIB( LP DIB), (int)::alto DIB(LP DIB));
* desbloqueo global((h global)m _ hDIB);
m _ palDIB = nueva CPalette
if(m_palDIB==NULL)
{
* global free((h global)m _ hDIB);
m _ hDIB = NULL
Return;
}
if(::CreateDIBPalette(m_hDIB, m_palDIB)==NULL)
{
Eliminar m_palDIB
m_palDIB = NULL
Devolver;
}
Reemplazar el siguiente código Agregado a la función ReemplazarHDIB(HDIB hDIB):
if(m_hDIB!=null)
* global free((h global)m _ hDIB); p>
m _ hDIB = hDIB
En cmy111doc.h
//Propiedades
Público:
Agregue lo siguiente código:
HDIB GetHDIB() constante
{
Devolver m _ hDIB
}
CPalette* Constante GetDocPalette()
{
Devolver m _ palDIB
}
Constante CSize GetDocSize()
{
Devolver m_sizeDoc
}
Tenga en cuenta que la declaración #include "dibapi . h" se agrega antes de 111Doc.h (antes de la declaración de la clase cmy 11 doc: documento público).
Se agrega el siguiente código a la función void cmy 111 view+01 view::ondraw(CDC * PDC):
BeginWaitCursor();
cmy 111 * pDoc = get document();
ASSERT _ VALID(pDoc);
// TODO: Agregue el código de dibujo de los datos nativos aquí
HDIB HDIB = pDoc->GetHDIB();
if(hDIB!=null)
{
LPSTR lpDIB =(LPSTR)::bloqueo global ( (h global)hDIB);
int CX DIB =(int)::DIB ancho(LP DIB);
int cy DIB =(int)::DIB alto( LP DIB);
* desbloqueo global((h global)hDIB);
CRect rcDIB
RC DIB superior = RC DIB izquierda = 0; /p>
RC DIB . derecha = CX DIB;
RC DIB . gt;IsPrinting())
{
int CX página = pDC-& gt;GetDeviceCaps(horz RES);
int cy página = pDC- & gt;GetDeviceCaps(VERTRES);
int c xinch = pDC-& gt;GetDeviceCaps(LOGPIXELSX);
int cy pulgadas = pDC-& gt;GetDeviceCaps(LOGPIXELSY); /p>
rcdest . arriba = rcdest izquierda = 0;
rcdest =(int)(((doble)cy DIB * página CX * cy pulgada)/((doble) CX DIB * CX pulgadas));
Destino RC derecha = página CX;
int temp = página cy-(r destino. abajo-r destino. arriba);
p>
rcdest . inferior+= temp/2
rcdest .top+= temp/2
}
Otros p>
{
rcDest = rcDIB
}
* pintar DIB(pDC->m_hDC&rcDest,pDoc->GetHDIB () ,&rcDIB,pDoc->GetDocPalette());
}
EndWaitCursor();
Lo anterior es para abrir, mostrar y guardar la imagen Relevante Pasos y código.
ParseCommandLine(cmd info) de la función InitInstance() en el archivo 11.cpp; ingrese una declaración debajo de la declaración
cmd info . /p>
Los documentos vacíos no se abrirán automáticamente al inicio.
Mostrar histograma de imagen:
1. Haga clic en ResourceView, haga clic derecho en el cuadro de diálogo, seleccione Insertar cuadro de diálogo en el cuadro de diálogo Propiedades, cambie el ID a ID_HIST y cambie el nombre. del cuadro de diálogo a "Imagen de histograma".
2. Haga clic en Insertar-Nueva clase en la barra de herramientas, ingrese el nombre de la clase, seleccione la clase base como CDialog y el ID del diálogo como ID_HIST. De esta manera, el cuadro de diálogo se vincula a la clase y se arrastra un control de edición al cuadro de diálogo, con su ID establecido en IDC _ HISTSHOW;
3. " para abrir el cuadro de diálogo Asistente de clases MFC. Seleccione WM_INITDIALOG y WM_Paint en la columna Mensajes y luego haga clic en "Agregar función" para agregar las funciones de inicialización y dibujo del diálogo a la clase de diálogo.
4. Introduzca la siguiente definición de variable en "público:" en el archivo Hist.h:
LONG m _ lCount[256]
char *; m _ lpDIBBits
LARGO m _ lAncho
LARGO m _ lAlto
int m _ iIsDraging
CDlgIntensity(CWnd * p parent = NULL);
5. Abra el programa Hist.cpp y copie el siguiente código antes de "//todo:add extra inicialization here" en la función CHist::OnInitDialog():
Unsigned char *lpSrc
龙i;
龙j;
6. Copie el siguiente código en "//todo: agregue extra aquí después de la "inicialización". ":
CWnd * pWnd = GetDlgItem(IDC_hist show);
CRect rect
GetClientRect(rect);
cliente a pantalla (&rect);
for(I = 0;i<256;i++)
{
m _ lCount[I ]= 0; >
}
Bytes lineales de línea;
bytes de línea = bytes de ancho(m _ lAncho * 8);
for(I = 0; i); & ltm _ LH altura; i++)
{
for(j = 0; j & ltm _ lWidthj++)
{
LP src =(unsigned char *)m _ lpDIBBits+línea bytes * I+j;
m _ lCount[*(lpSrc)]++;
}
}
m _ iIsDraging = 0;
7. En la función CHist::OnPaint() "CPaintDC DC(this); "Copie el siguiente código antes:
CString cadena;
LARGO yo;
LARGO lmax count = 0;
LARGO m_ilow gris = 0;
LONG m_iUpGray = 255
Copia el siguiente código a la función CHist::OnPaint()"//todo: Agrega tu código de controlador Después del mensaje:
CWnd * pWnd = GetDlgItem(IDC_hist show);
CDC * pDC = pWnd->GetDC();
pWnd->invalidate();
pWnd- >actualizar ventana();
pDC->Rectangle(0, 0, 330, 300) ;
CPen * pPenRed = nuevo CPen;
ppen rojo->CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
CPen * pPenBlue = nuevo CPen;
ppen azul->CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
CPen * pPenGreen = nuevo CPen
ppen verde->CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
CGdiObject * pold pen = pDC->seleccionar objeto(ppen rojo);
pDC->MoveTo(10,10);
pDC->LineTo(10,280);
pDC->LineTo(320,280);
Estrecho. formato(" 0 ");
pDC->; TextOut(10, 283, cadena); formato("50");
pDC->;TextOut(60, 283, str);
str. formato(" 100 ");
pDC->; TextOut(110, 283, cadena
formato("150");
pDC->;TextOut(160, 283, str);
str. Formato("200");
pDC->; TextOut(210, 283, cadena); Formato(" 255 ");
pDC->; TextOut(265, 283, cadena
for(I = 0; i<256;i+=5)
p>{
Si ((i&1)==0)
{
pDC->; MoveTo(i+10, 280);
pDC->; LíneaA(i+10, 284
}
Otros
{
pDC->; MoverA(i+10, 280);
pDC->; LíneaA(i+10, 282);
pDC->;MoveTo(315,275);
pDC->;LineTo(320,280);
pDC->;LineTo (315, 285);
pDC->; MoverA(10, 10);
pDC->; LíneaA(5, 15);
pDC ->MoverA(10, 10)
pDC->LineTo(15,15)
for(I = m_ilow gray;i<= m_ iUpGrayi++)
{
if(m_lCount[I]>lMaxCount)
{
lmax count = m_ lCount[I];
}
}
pDC->; MoverA(10,25);
pDC->; LíneaA(14,25);
Str.
Formato (" %d ", recuento lmax);
pDC->; TextOut (11, 26, str);
pDC->; /p>
pDC->; MoverA(m_iLowGray+10, 25);
pDC->; MoveTo(m_iUpGray+10, 25);
pDC->; LineTo(m_iUpGray+10, 280);
pDC->; >
if(lmax count & gt; 0)
{
for(I = m _ ilow grey; i & lt= m _ iUpGrayi++)
{
pDC->; MoveTo(i+10, 280);
pDC->; * 256/lmax count));
}
}
pDC->; seleccionar objeto(polígrafo);
Eliminar pPenRed
Eliminar pPenBlue
Eliminar pPenGreen
8. Haga clic en el menú en ResourceView, aparecerán los tipos IDR_MAINFRAME e IDR_my 111. Haga doble clic en IDR_my 111 type y aparecerá la interfaz del programa, con los botones de archivo, edición, vista, ventana y ayuda. Haga clic con el botón derecho en la vista: haga clic en el cuadro de puntos debajo de Propiedades, ingrese el título (histograma) y la ID (mayúsculas en inglés, como ID_VIEW_HIST) para vincular el botón y el programa a través de la ID. Haga clic en este botón y se ejecutará el programa correspondiente. Agregue una función para este botón: haga clic en Ctrl+W para abrir el cuadro de diálogo MFC ClassWizard, seleccione el nombre de clase CMy111View, seleccione el ID de la colección (como ID_VIEW_HIST) en la opción correspondiente al ID del objeto y seleccione COMANDO en la opción Mensajes . Luego haga clic en el botón "Agregar función", seleccione la configuración predeterminada y agregue la función correspondiente OnViewHist() para ID_VIEW_HIST.
La función está definida en el archivo 111View.cpp. Agregue el siguiente código a la función void cmy 111 view::onview hist():
// TODO: agregue el código del controlador de comandos aquí
cmy 111 doc * pDoc = obtener documento();
if(pDoc-& gt;m_hDIB==NULL)
{
MessageBox( "¡Primero abra una imagen BMP de 256 colores!", "Mensaje del sistema", información del icono MB | MB _ OK
Regresar
}
LPSTR lpDIB
LPSTR lpDIBBits
LP DIB =(LPSTR)::global lock((h global)pDoc-& gt;GetHDIB());
lpDIBBits =::finddibits(lpDIB);
if(::DIBNumColors(lpDIB)!=256)
{
MessageBox("Solo actualmente se puede ver el histograma de mapa de bits en escala de grises de 256 colores ", "Mensaje del sistema", MB _ información del icono | MB _ OK);
* desbloqueo global((h global)pDoc-& gt; GetHDIB ( ));
Retorno;
}
BeginWaitCursor();
CHist dlgPara
dlgPara m. _ lpDIBBits = lpDIBBits
DLG para . m _ lWidth =::DIB ancho(LP DIB);
DLG para . _ LH alto =::DIB alto(LP DIB ) ;
//DLG para . m _ ilow gris = 0;
//DLG para . DoModal()! =IDOK)
{
Retorno;
}
* desbloqueo global((h global)pDoc- & gt;GetHDIB());
EndWaitCursor();