Red de conocimiento informático - Problemas con los teléfonos móviles - Programación Vcaccess

Programación Vcaccess

Pasos y procedimientos:

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)

{

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);

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);

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

}

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);

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

{

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();