⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testtxttobmpdlg.cpp

📁 在VC++工程下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -