?? 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 + -