📄 displaymodeview.cpp
字号:
// DisplayModeView.cpp : implementation of the CDisplayModeView class
//
#include "stdafx.h"
#include "DisplayMode.h"
#include "DisplayModeDoc.h"
#include "DisplayModeView.h"
#include "ddb.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView
IMPLEMENT_DYNCREATE(CDisplayModeView, CView)
BEGIN_MESSAGE_MAP(CDisplayModeView, CView)
//{{AFX_MSG_MAP(CDisplayModeView)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_WM_CREATE()
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView construction/destruction
CDisplayModeView::CDisplayModeView()
{
// TODO: add construction code here
m_nWidth = 800;
m_nHeight = 600;
}
CDisplayModeView::~CDisplayModeView()
{
if(m_bitmap.GetSafeHandle())
m_bitmap.DeleteObject();
}
BOOL CDisplayModeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView drawing
void CDisplayModeView::OnDraw(CDC* pDC)
{
CDisplayModeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDib* pDib = pDoc->m_pDib;
if(pDib)
{
//获取位图的宽度和高度
m_nWidth = (int)pDib->GetWidth();
m_nHeight = (int)pDib->GetHeight();
//创建设备兼容位图
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
pDib->Draw(memDC.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
COLORREF textOldColor = memDC.SetTextColor(RGB(255, 0, 0));
int nOldBkMode = memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(10, 10, "位图--------通向图像处理和图形设计的大门");
pDC->BitBlt(0, 0, 800, 600, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.SetTextColor(textOldColor);
memDC.SetBkMode(nOldBkMode);
}
}
/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView diagnostics
#ifdef _DEBUG
void CDisplayModeView::AssertValid() const
{
CView::AssertValid();
}
void CDisplayModeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDisplayModeDoc* CDisplayModeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDisplayModeDoc)));
return (CDisplayModeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDisplayModeView message handlers
int CDisplayModeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
//创建设备兼容位图
m_bitmap.CreateCompatibleBitmap(&dc, 800, 600);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
CBrush* pBrush = new CBrush(RGB(255, 255, 255));
CRect rect(0, 0, 800, 600);
int nOldBkMode = memDC.SetBkMode(TRANSPARENT);
memDC.FillRect(rect, pBrush);
memDC.SelectObject(pOldBitmap);
delete pBrush;
ReleaseDC(&dc);
//将背景颜色置为灰色
//::DeleteObject ((HBRUSH)::SetClassLong (m_hWnd, GCL_HBRBACKGROUND, (long) (HBRUSH) ::GetStockObject (LTGRAY_BRUSH)));
return 0;
}
void CDisplayModeView::OnFileSave()
{
// TODO: Add your command handler code here
CFileDialog fileSaveDlg(FALSE, "*.bmp", "bit_24.bmp",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Bitmap Files(*.bmp)", NULL);
int nRespond = fileSaveDlg.DoModal();
if(nRespond == IDOK)
{
CString filePath = fileSaveDlg.GetPathName();
CDdb* pDdb = new CDdb(&m_bitmap);
pDdb->Save(filePath, 0, 0, m_nWidth, m_nHeight);
pDdb->ClearMemory();
}
}
void CDisplayModeView::OnFileSaveAs()
{
// TODO: Add your command handler code here
CFileDialog fileSaveDlg(FALSE, "*.bmp", "bit_8.bmp",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"256 Colors Bitmap Files(*.bmp)", NULL);
int nRespond = fileSaveDlg.DoModal();
if(nRespond == IDOK)
{
CString filePath = fileSaveDlg.GetPathName();
CDdb* pDdb = new CDdb(&m_bitmap);
pDdb->SaveAs256(filePath, 0, 0, m_nWidth, m_nHeight);
pDdb->ClearMemory();
}
}
LRESULT CDisplayModeView::OnDisplayChange (WPARAM which, LPARAM lp)
{
LRESULT result = CView::OnDisplayChange (which, lp);
//对于16色显示模式, 我们不准备处理它
if((which == 8) || (which == 16) || (which == 24) || (which == 32))
{
if(m_bitmap.GetSafeHandle())
{
m_bitmap.DeleteObject();
CClientDC dc(this);
//创建设备兼容位图
m_bitmap.CreateCompatibleBitmap(&dc, 800, 600);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
CBrush* pBrush = new CBrush(RGB(255, 255, 255));
CRect rect(0, 0, 800, 600);
memDC.FillRect(rect, pBrush);
memDC.SelectObject(pBrush);
delete pBrush;
ReleaseDC(&dc);
}
}
Invalidate();
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -