请写下注释mybmp.hclass mybmp : public CBitmap  
{
public:
mybmp();
virtual ~mybmp(); void Capture(CRect &rect);
CPalette *GetPalette(){return m_pPalette;};
HANDLE CreateDIB(int *pbmData=NULL);
void Print(CDC *pDC);
int m_nWidth;
int m_nHeight;
private:
CPalette *m_pPalette;
};mybmp.cppmybmp::mybmp()
{
m_pPalette=NULL;
}mybmp::~mybmp()
{
if(m_pPalette)
{
delete m_pPalette;
}}void mybmp::Capture(CRect &rect)
{
if(m_pPalette)
{
delete m_pPalette;
DeleteObject() ;
}
m_nWidth=rect.Width();
m_nHeight=rect.Height(); CDC dcScreen;
dcScreen.CreateDC("DISPLAY",NULL,NULL,NULL); CDC dcMem;
dcMem.CreateCompatibleDC(&dcScreen);
CreateCompatibleBitmap(&dcScreen,m_nWidth,m_nHeight);
dcMem.SelectObject(this);
dcMem.BitBlt(0,0,m_nWidth,m_nHeight,&dcScreen,rect.left,rect.top,SRCCOPY); int nColors=(1<<(dcScreen.GetDeviceCaps(BITSPIXEL)*dcScreen.GetDeviceCaps(PLANES)));
LOGPALETTE *pLogPal=(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE)+(nColors*sizeof(PALETTEENTRY))];
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=nColors;
::GetSystemPaletteEntries(dcScreen.m_hDC,0,nColors,(LPPALETTEENTRY)(pLogPal->palPalEntry)); m_pPalette=new CPalette;
m_pPalette->CreatePalette(pLogPal); delete []pLogPal;
dcMem.DeleteDC(); 
dcScreen.DeleteDC();
}HANDLE mybmp::CreateDIB(int *pbmData)
{
BITMAPINFOHEADER bi;
memset(&bi,0,sizeof(bi));
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biPlanes=1;
bi.biCompression=BI_RGB; BITMAP bm;
GetObject(sizeof(bm),(LPSTR)&bm);
bi.biWidth=bm.bmWidth;
bi.biHeight=bm.bmHeight; int bits=bm.bmPlanes*bm.bmBitsPixel;
if(bits<=1) bi.biBitCount=1;
else if(bits<=4) bi.biBitCount=4;
else if(bits<=8) bi.biBitCount=8;
else bi.biBitCount=24;

int biColorSize=0;
if(bi.biBitCount!=24) biColorSize=(1<<bi.biBitCount);
biColorSize*=sizeof(RGBQUAD);
bi.biSizeImage=(DWORD)bm.bmWidth*bi.biBitCount;
bi.biSizeImage=(((bi.biSizeImage)+31)/32)*4;
bi.biSizeImage*=bm.bmHeight; if(pbmData) *pbmData=bi.biSize+biColorSize;
HANDLE hDIB=::GlobalAlloc(GHND,bi.biSize+biColorSize+bi.biSizeImage); LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)::GlobalLock(hDIB);
*lpbi=bi;
CDC dc;
dc.Attach(::GetDC(NULL));
CPalette *pPal=dc.SelectPalette(m_pPalette,FALSE);
dc.RealizePalette(); ::GetDIBits(dc.m_hDC,(HBITMAP)m_hObject,0,(UINT)bi.biHeight,(LPSTR)lpbi+(WORD)lpbi->biSize+biColorSize,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
::GlobalUnlock(hDIB);
dc.SelectPalette(pPal,FALSE);
dc.RealizePalette();
return hDIB;
}void mybmp::Print(CDC *pDC)
{
int bmData;
HANDLE hDIB=CreateDIB(&bmData);
LPBITMAPINFOHEADER lpDIBHdr=(LPBITMAPINFOHEADER)::GlobalLock(hDIB);
LPSTR lpDIBBits=(LPSTR)lpDIBHdr+bmData; int cxBorder=pDC->GetDeviceCaps(LOGPIXELSX)/4;
int cyBorder=pDC->GetDeviceCaps(LOGPIXELSY)/4;
int cxPage=pDC->GetDeviceCaps(HORZRES)-(cxBorder*2);
int cyPage=(int)(((double)cxPage/(double)m_nWidth)*(double)m_nHeight); pDC->SetStretchBltMode(COLORONCOLOR);

int i=::StretchDIBits(pDC->m_hDC,cxBorder,cyBorder,cxPage,cyPage,0,0,m_nWidth,m_nHeight,lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY); ::GlobalUnlock(hDIB);
::GlobalFree(hDIB);
return;
}

解决方案 »

  1.   

    nod,先执行看看结果就能懂很多
      

  2.   

    是个画bmp图的类,
    可画位图,并打印
      

  3.   


    //这个成员函数主要完成什么工作
    void mybmp::Capture(CRect &rect)
    {
    if(m_pPalette)
    {
    delete m_pPalette;
    DeleteObject() ;
    }
    m_nWidth=rect.Width();
    m_nHeight=rect.Height(); CDC dcScreen;
    dcScreen.CreateDC("DISPLAY",NULL,NULL,NULL); CDC dcMem;
    dcMem.CreateCompatibleDC(&dcScreen);
    CreateCompatibleBitmap(&dcScreen,m_nWidth,m_nHeight);
    dcMem.SelectObject(this);
    dcMem.BitBlt(0,0,m_nWidth,m_nHeight,&dcScreen,rect.left,rect.top,SRCCOPY);//这一小段有什么作用
    int nColors=(1<<(dcScreen.GetDeviceCaps(BITSPIXEL)*dcScreen.GetDeviceCaps(PLANES)));
    LOGPALETTE *pLogPal=(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE)+(nColors*sizeof(PALETTEENTRY))];
    pLogPal->palVersion=0x300;
    pLogPal->palNumEntries=nColors;//这个子API干什么的 ::GetSystemPaletteEntries(dcScreen.m_hDC,0,nColors,(LPPALETTEENTRY)(pLogPal->palPalEntry)); m_pPalette=new CPalette;
    m_pPalette->CreatePalette(pLogPal); delete []pLogPal;
    dcMem.DeleteDC(); 
    dcScreen.DeleteDC();
    }
    //这个成员函数主要完成什么工作
    HANDLE mybmp::CreateDIB(int *pbmData)
    {
    BITMAPINFOHEADER bi;  //什么结构,有何作用
    memset(&bi,0,sizeof(bi));
    bi.biSize=sizeof(BITMAPINFOHEADER);
    bi.biPlanes=1;
    bi.biCompression=BI_RGB; BITMAP bm;
    GetObject(sizeof(bm),(LPSTR)&bm);
    bi.biWidth=bm.bmWidth;
    bi.biHeight=bm.bmHeight; int bits=bm.bmPlanes*bm.bmBitsPixel;
    if(bits<=1) bi.biBitCount=1;
    else if(bits<=4) bi.biBitCount=4;
    else if(bits<=8) bi.biBitCount=8;
    else bi.biBitCount=24;
    //下面这一小段有干什么的
    int biColorSize=0;
    if(bi.biBitCount!=24) biColorSize=(1<<bi.biBitCount);
    biColorSize*=sizeof(RGBQUAD);
    bi.biSizeImage=(DWORD)bm.bmWidth*bi.biBitCount;
    bi.biSizeImage=(((bi.biSizeImage)+31)/32)*4;
    bi.biSizeImage*=bm.bmHeight; if(pbmData) *pbmData=bi.biSize+biColorSize;//这个子API干什么的
    HANDLE hDIB=::GlobalAlloc(GHND,bi.biSize+biColorSize+bi.biSizeImage);//这个子API有什么作用
    LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)::GlobalLock(hDIB);
    *lpbi=bi;
    CDC dc;
    dc.Attach(::GetDC(NULL));
    CPalette *pPal=dc.SelectPalette(m_pPalette,FALSE);
    dc.RealizePalette();//这个子API干什么的 ::GetDIBits(dc.m_hDC,(HBITMAP)m_hObject,0,(UINT)bi.biHeight,(LPSTR)lpbi+(WORD)lpbi->biSize+biColorSize,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
    ::GlobalUnlock(hDIB);
    dc.SelectPalette(pPal,FALSE);
    dc.RealizePalette();
    return hDIB;
    }
      

  4.   

    void mybmp::Capture(CRect &rect)
    //这个成员函数主要用来捕获rect范围内的图象int nColors=(1<<(dcScreen.GetDeviceCaps(BITSPIXEL)*dcScreen.GetDeviceCaps(PLANES)));
    LOGPALETTE *pLogPal=(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE)+(nColors*sizeof(PALETTEENTRY))];
    pLogPal->palVersion=0x300;
    pLogPal->palNumEntries=nColors
    //这一小段用来定义逻辑调色板The GetSystemPaletteEntries function retrieves a range of palette entries from the system palette that is associated with the specified device context. HANDLE mybmp::CreateDIB(int *pbmData)//根据图象数据pbmData创建与设备无关位图(即DIB)
    BITMAPINFOHEADER bi;  //是位图文件头结构,用来定义位图的很多信息,如位图大小,位图的颜色种类,等等 int biColorSize=0;
    if(bi.biBitCount!=24) biColorSize=(1<<bi.biBitCount);
    biColorSize*=sizeof(RGBQUAD);
    bi.biSizeImage=(DWORD)bm.bmWidth*bi.biBitCount;
    bi.biSizeImage=(((bi.biSizeImage)+31)/32)*4;
    bi.biSizeImage*=bm.bmHeight;
    //这一小段用来计算位图图象的大小 HANDLE hDIB=::GlobalAlloc(GHND,bi.biSize+biColorSize+bi.biSizeImage);
    //这个API分配内存,并返回位图句柄LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)::GlobalLock(hDIB);  
    //这个子API指定位图数据的起始地址 ::GetDIBits(dc.m_hDC,(HBITMAP)m_hObject,0,(UINT)bi.biHeight,(LPSTR)lpbi+(WORD)lpbi->biSize+biColorSize,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
    //这个API从DDB(与设备相关位图,也就是这里的m_object)中生成DIB(与设备无关位图)建议你看一下<精通visual C++图象编程> 周长发著