📄 testtxttobmpdlg.cpp
字号:
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;*/
//-------------------------------------
//HBITMAP hBitmap;
BITMAP Bitmap;
CDC * pDC;
pDC=this->GetDC();
CDC memdc;
//BITMAP *struc;
memdc.CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&memdc,128,64);
//Bitmap=HBITMAP(bitmap);
//GetObject(Bitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
//bitmap.GetBitmap(struc);
memdc.SelectObject(&bitmap);
GetObject(HBITMAP(bitmap), sizeof(BITMAP), (LPSTR)&Bitmap);
memdc.FillSolidRect(0,0,128,64,RGB(255,0,0));
GetObject(HBITMAP(bitmap), sizeof(BITMAP), (LPSTR)&Bitmap);
memdc.TextOut(0,0,"abcdefgabcdefgabcdefgabcdefgabcdefgvabcdefg");
GetObject(HBITMAP(bitmap), sizeof(BITMAP), (LPSTR)&Bitmap);
return HBITMAP(bitmap);
}
int CTestTxtToBmpDlg::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
//hBitmap 为刚才的屏幕位图句柄
//lpFileName 为位图文件名
HDC hDC;//设备描述表
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount; //位图中每个像素所占字节数
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize,dwWritten;//定义调色板大小, 位图中像素字节大小 ,//位图文件大小 , 写入文件字节数
BITMAP Bitmap;//位图属性结构
BITMAPFILEHEADER bmfHdr;//位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL;//定义文件,分配内存句柄,调色板句柄//计算位图文件每个像素所占字节数
//-----------------------------------
CDC * pDC;
pDC=this->GetDC();
CDC memdc;
CBitmap bitmap;
CRect rect;
::GetClientRect(::GetDlgItem(this->m_hWnd,IDC_SS),rect);
memdc.CreateCompatibleDC(NULL);
bitmap.CreateCompatibleBitmap(&memdc,rect.Width(),rect.Height());
memdc.SelectObject(&bitmap);
memdc.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
memdc.TextOut(0,0,"abcdefgabcdefgabcdefgabcdefgabcdefgvabcdefg");
//---------------------
GetObject(HBITMAP(bitmap), sizeof(BITMAP), (LPSTR)&Bitmap);
hDC=CreateDC("DISPLAY",NULL,NULL,NULL);
iBits=GetDeviceCaps(hDC,BITSPIXEL);
iBits=iBits*GetDeviceCaps(hDC,PLANES);
//pDC=GetDC();
//int num=pDC->GetDeviceCaps(SIZEPALETTE);
DeleteDC(hDC);
//计算调色板大小
wBitCount=iBits/8;
if (wBitCount<=8)
dwPaletteSize = (1<<wBitCount) *sizeof(RGBQUAD);
//bitmap.LoadBitmap(IDB_BITMAP1);
//设置位图信息头结构
GetObject(HBITMAP(bitmap), sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC=(HDC)GetDC();
hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
}
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi,dwDIBSize,&dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 1;
}
void CTestTxtToBmpDlg::OnButton1()
{
// TODO: Add your control notification handler code here
/*CDC * pDC;
pDC=this->GetDC();
CDC memdc;
CBitmap bitmap;
CRect rect;
::GetClientRect(::GetDlgItem(this->m_hWnd,IDC_SS),rect);
memdc.CreateCompatibleDC(NULL);
bitmap.CreateCompatibleBitmap(&memdc,rect.Width(),rect.Height());
memdc.SelectObject(&bitmap);
memdc.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
memdc.TextOut(0,0,"abcdefgabcdefgabcdefgabcdefgabcdefgvabcdefg");
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);*/
SaveBitmap();
}
BOOL CTestTxtToBmpDlg::WriteDib()
{
return 1;
}
void CTestTxtToBmpDlg::SaveBitmap()
{
CDC * pDC;
pDC=this->GetDC();
CDC memdc;
CBitmap bitmap;
CRect rect;
::GetClientRect(::GetDlgItem(this->m_hWnd,IDC_SS),rect);
memdc.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
memdc.SelectObject(&bitmap);
memdc.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(0,255,0));
memdc.TextOut(0,0,"abcdefgabcdefgabcdefgabcdefgabcdefgvabcdefg");
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
BITMAP btm;
bitmap.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
//LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
char *lpData=new char[size];
//HANDLE hDib=GlobalAlloc(GHND,size);
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(memdc,bitmap,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
//bm.GetBitmapBits(size,lpData);//(LPSTR)hDib
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=0x4D42;
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CString name="text.bmp";
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
}
//GlobalFreePtr(lpData);
delete[] lpData;
}
void CTestTxtToBmpDlg::OnButton2()
{
// TODO: Add your control notification handler code here
jbm();
}
void CTestTxtToBmpDlg::jbm()
{
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
// bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
//////////////////////////////
CString name="jbm.bmp";
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
}
GlobalFreePtr(lpData);
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -