📄 factionview.cpp
字号:
*/
//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 + -