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

📄 factionview.cpp

📁 V《牛顿法解方程之混沌情况》源代码(C完整应用程序代码)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		*/

	//pDC->BitBlt(r.left,r.top,r.Width(),r.Height(),&memDC,0,0,SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CFactionView printing

BOOL CFactionView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CFactionView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CFactionView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CFactionView diagnostics

#ifdef _DEBUG
void CFactionView::AssertValid() const
{
	CView::AssertValid();
}

void CFactionView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CFactionDoc* CFactionView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFactionDoc)));
	return (CFactionDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFactionView message handlers

void CFactionView::OnFileRedraw() 
{
	// TODO: Add your command handler code here
	//g_document.UpdateAllViews(NULL);
	CRect rt;
	GetClientRect(rt);
	InvalidateRect(rt,FALSE);
}

///////////////////////////////////////////////////////
////////保存为位图 START
WORD WINAPI PaletteSize(LPSTR lpbi)
{
	DWORD dwClrUsed;
      
	dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
	if (dwClrUsed == 0)
		switch ( ((LPBITMAPINFOHEADER)lpbi)->biBitCount )
		{
		case 1:
			dwClrUsed=2;
			break;
		case 4:
			dwClrUsed=16;
			break;
		case 8:
			dwClrUsed=256;
			break;
		default:
			dwClrUsed=0;
			break;
		}
	return (WORD)(dwClrUsed * sizeof(RGBQUAD));
}

HANDLE WINAPI BitmapToDIB(HBITMAP hBitmap, HPALETTE hPal)
{
	ASSERT(hBitmap);
   
	BITMAP bm;
	BITMAPINFOHEADER bi;
	LPBITMAPINFOHEADER lpbi;
	DWORD dwLen;
	HANDLE hDib,h;
	HDC hDC;
	WORD biBits;
	UINT wLineLen;
	DWORD dwSize;
	DWORD wColSize;

	if (!hBitmap) return NULL;
	if (!::GetObject(hBitmap, sizeof(bm), &bm)) return NULL;

	if (hPal == NULL)
		hPal = (HPALETTE)::GetStockObject(DEFAULT_PALETTE);

	biBits = (WORD) (bm.bmPlanes * bm.bmBitsPixel);
	wLineLen = ( bm.bmWidth * biBits + 31 ) / 32 * 4;
	wColSize = sizeof(RGBQUAD) * (( biBits <= 8 ) ? 1 << biBits : 0 );
	dwSize = sizeof( BITMAPINFOHEADER ) + wColSize +
		(DWORD)(UINT)wLineLen * (DWORD)(UINT)bm.bmHeight;

	if (biBits <= 1)
		biBits = 1;
	else if (biBits <= 4)
		biBits = 4;
	else if (biBits <= 8)
		biBits = 8;
	else
		biBits = 24;

	bi.biSize = sizeof(BITMAPINFOHEADER);
	bi.biWidth = bm.bmWidth;
	bi.biHeight = bm.bmHeight;
	bi.biPlanes = 1;
	bi.biBitCount = biBits;
	bi.biCompression = BI_RGB;
	bi.biSizeImage = dwSize - sizeof(BITMAPINFOHEADER) - wColSize;
	bi.biXPelsPerMeter = 0;
	bi.biYPelsPerMeter = 0;
	bi.biClrUsed = ( biBits <= 8 ) ? 1 << biBits : 0;	
	bi.biClrImportant = 0;

	dwLen = bi.biSize + ::PaletteSize((LPSTR) &bi);

	hDC = ::GetDC(NULL);
	hPal = ::SelectPalette(hDC, hPal, FALSE);
	::RealizePalette(hDC);

	hDib = (HANDLE)::GlobalAlloc(GHND, dwLen);
	if (!hDib)
	{
		::SelectPalette(hDC, hPal, TRUE);
		::RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
		return NULL;
	}

	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
	if (!lpbi)
	{
		::SelectPalette(hDC, hPal, TRUE);
		::RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
		return NULL;
	}
	*lpbi = bi;

	::GetDIBits(hDC, hBitmap, 0, (WORD)bi.biHeight, NULL, 
		(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

	bi = *lpbi;
	bi.biClrUsed = ( biBits <= 8 ) ? 1 << biBits : 0;
	::GlobalUnlock(hDib);

	if (bi.biSizeImage == 0)
		bi.biSizeImage = ( ( ( (DWORD)bm.bmWidth * biBits ) + 31 ) / 32 * 4) * bm.bmHeight;

	dwLen = bi.biSize+::PaletteSize((LPSTR)&bi)+bi.biSizeImage;
	h = (HANDLE)::GlobalReAlloc(hDib, dwLen, 0);
	if ( h )
	{
		hDib = h;
	}
	else
	{
		::GlobalFree(hDib);
		hDib = NULL;
		::SelectPalette(hDC, hPal, TRUE);
		::RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
		return NULL;
	}

	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
	if (!lpbi)
	{
		::GlobalFree(hDib);
		hDib = NULL;
		::SelectPalette(hDC, hPal, TRUE);
		::RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
		return NULL;
	}

	if (::GetDIBits(hDC,hBitmap,0,(WORD)bi.biHeight, 
		(LPSTR)lpbi + (WORD)lpbi->biSize + ::PaletteSize((LPSTR) lpbi),
		(LPBITMAPINFO)lpbi,DIB_RGB_COLORS) == 0)
   {
		::GlobalUnlock(hDib);
		hDib = NULL;
		::SelectPalette(hDC, hPal, TRUE);
		::RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
		return NULL;
	}
   
	bi = *lpbi;

	::GlobalUnlock(hDib);
	::SelectPalette(hDC, hPal, TRUE);
	::RealizePalette(hDC);
	::ReleaseDC(NULL, hDC);

	return hDib;
}

HANDLE WINAPI WindowToDIB(CWnd *pWnd, CRect* pRect)
{
	CBitmap 	   bitmap;
	CWindowDC	dc(pWnd);
	CDC 		   memDC;
	CRect		   rect;
   
	memDC.CreateCompatibleDC(&dc); 
   
	if ( pRect == NULL )
	{
		pWnd->GetWindowRect(rect);
		rect.OffsetRect(-rect.left,-rect.top);
	}
	else
		rect = *pRect;
   
	bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );
   
	CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
	memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, rect.left, rect.top, SRCCOPY); 

	CPalette pal;
	if ( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE )
	{
		UINT nSize=sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
		LOGPALETTE *pLP=(LOGPALETTE *) new BYTE[nSize];
		pLP->palVersion=0x300;
		pLP->palNumEntries = (USHORT) GetSystemPaletteEntries( dc, 0, 255, pLP->palPalEntry );
		pal.CreatePalette( pLP );
		delete[] pLP;
	}
	memDC.SelectObject(pOldBitmap);
	HANDLE hDib = BitmapToDIB( bitmap, pal );
	return hDib;
}

BOOL WINAPI SaveDIBFile(HANDLE hDib, CFile& file)
{
	BITMAPFILEHEADER bmfHdr;
	LPBITMAPINFOHEADER lpBI;
	DWORD dwDIBSize;
   
	if (hDib == NULL)
		return FALSE;

	lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
	if (lpBI == NULL)
		return FALSE;

	bmfHdr.bfType = ((WORD) ('M' << 8) | 'B');  // "BM"
   
	dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);

	if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
	{
		dwDIBSize += lpBI->biSizeImage;
	}
	else
	{
		DWORD dwBmBitsSize;
		dwBmBitsSize = ( ( (lpBI->biWidth)*((DWORD)lpBI->biBitCount) + 31) / 32 * 4) * lpBI->biHeight;
		dwDIBSize += dwBmBitsSize;
		lpBI->biSizeImage = dwBmBitsSize;
	}

	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;

	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
		+ PaletteSize((LPSTR)lpBI);

	file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
	file.WriteHuge(lpBI, dwDIBSize);

	::GlobalUnlock((HGLOBAL) hDib);
	return TRUE;
}
////////保存为位图 END
///////////////////////////////////////////////////////

/*void CSaveDibView::OnViewSave() 
{
	CWnd *pWnd=AfxGetMainWnd();
	HANDLE hDib=WindowToDIB(pWnd,NULL);
	CFile file;
	file.Open("save.bmp",CFile::modeCreate|CFile::modeWrite);
	SaveDIBFile(hDib,file);
	file.Close();
	GlobalFree(hDib);
}*/

void CFactionView::OnFileSaveAsBmp() 
{
	// TODO: Add your command handler code here

	static char BASED_CODE szFilter[] = "BMP Files (*.BMP)|*.BMP|All Files (*.*)|*.*||";
	CFileDialog fileDlg(FALSE, NULL, "*.bmp",
			OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, this);
	fileDlg.m_ofn.lpstrTitle = "选择BMP位图文件";
	char cPath[128];
	CString csFile;
	GetCurrentDirectory(128, cPath);
	fileDlg.m_ofn.lpstrInitialDir = cPath;
	if( fileDlg.DoModal() == IDOK)
	{
		csFile = fileDlg.GetPathName();
		if( ! csFile.GetLength() )
			return;
	}
	SetCurrentDirectory(cPath);
	
	CWnd *pWnd=AfxGetMainWnd();
	HANDLE hDib=WindowToDIB(pWnd,NULL);
	CFile file;
	file.Open(csFile,CFile::modeCreate|CFile::modeWrite);
	SaveDIBFile(hDib,file);
	file.Close();
	GlobalFree(hDib);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -