📄 drawview.cpp
字号:
// DrawView.cpp : implementation of the CDrawView class
//
#include "stdafx.h"
#include "Draw.h"
#include "DrawDoc.h"
#include "DrawView.h"
#include "CustomSizeDlg.h"
#include "MainFrm.h"
#include <afxcmn.h>
#include <atlconv.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int rect1,rect2;
int maxX, maxY; // screen dimensions
int globalBRUSH, globalPEN, globalSIZE=0;
CPen eraserPEN; // used for our pen
HCURSOR hCursor; // recycled for our cursor
CWinApp *pApp = AfxGetApp(); // to get the appname
/////////////////////////////////////////////////////////////////////////////
// CDrawView
IMPLEMENT_DYNCREATE(CDrawView, CView)
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_COMMAND(ID_CURVE, OnCurve)
ON_COMMAND(ID_FILL_CIRCLE, OnFillCircle)
ON_COMMAND(ID_FILL_RECT, OnFillRect)
ON_COMMAND(ID_FILL_ROUNDRECT, OnFillRoundrect)
ON_COMMAND(ID_HOLLOW_CIRCLE, OnHollowCircle)
ON_COMMAND(ID_HOLLOW_RECT, OnHollowRect)
ON_COMMAND(ID_line, Online)
ON_COMMAND(IDM_HALLOW_ROUNDRECT, OnHallowRoundrect)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_Reset, OnReset)
ON_COMMAND(ID_ERASER, OnEraser)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(IDM_BLACKBRUSH, OnBlackbrush)
ON_COMMAND(IDM_BLUEBRUSH, OnBluebrush)
ON_COMMAND(IDM_CUSTOM_BRUSH, OnCustomBrush)
ON_COMMAND(IDM_GREENBRUSH, OnGreenbrush)
ON_COMMAND(IDM_REDBRUSH, OnRedbrush)
ON_COMMAND(IDM_WHITEBRUSH, OnWhitebrush)
ON_COMMAND(IDM_YELLOWBRUSH, OnYellowbrush)
ON_COMMAND(IDM_BLACKPEN, OnBlackpen)
ON_COMMAND(IDM_BLUEPEN, OnBluepen)
ON_COMMAND(IDM_CUSTOM_PEN, OnCustomPen)
ON_COMMAND(IDM_GREENPEN, OnGreenpen)
ON_COMMAND(IDM_REDPEN, OnRedpen)
ON_COMMAND(IDM_YELLOWPEN, OnYellowpen)
ON_COMMAND(IDM_ONE, OnOne)
ON_COMMAND(IDM_TWO, OnTwo)
ON_COMMAND(IDM_THREE, OnThree)
ON_COMMAND(IDM_CUSTOM_SIZE, OnCustomSize)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction
CDrawView::CDrawView()
{
// TODO: add construction code here
// m_memDC=getDC();
m_var=8;
b1=false;
paint=0;
bmpstate=0;
redo=0;
undo=0;
m_pHistoryStack = new Stack(5);
InitHistory(NULL);
m_hBitmap = NULL;
m_RedPen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
m_GreenPen.CreatePen(PS_SOLID, 1, RGB(0,255,0));
m_BluePen.CreatePen(PS_SOLID, 1, RGB(0,0,255));
m_YellowPen.CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
m_OldPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
m_CurrentPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
corCol = RGB(0, 0, 0);
// create brushes
m_RedBrush.CreateSolidBrush(RGB(255,0,0));
m_GreenBrush.CreateSolidBrush(RGB(0,255,0));
m_BlueBrush.CreateSolidBrush(RGB(0,0,255));
m_YellowBrush.CreateSolidBrush(RGB(255, 255, 0));
m_BlackBrush.CreateStockObject(BLACK_BRUSH);
m_OldBrush.CreateStockObject(WHITE_BRUSH);
m_bkbrush.CreateStockObject(WHITE_BRUSH);
m_PreviousBrush.CreateStockObject(WHITE_BRUSH);
// m_CurrentBrush.CreateStockObject(WHITE_BRUSH);
// display, but don't fill, rectangles
HollowBrush.CreateStockObject(HOLLOW_BRUSH);
}
CDrawView::~CDrawView()
{
}
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
hCursor = pApp->LoadStandardCursor(IDC_CROSS);
::SetCursor(hCursor);
::ClipCursor(NULL);
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if (bmpstate==1)
{
if (0 == extname.Compare(_T("bmp")))
{
ShowBitmap(pDC,BmpName);
}
}
m_hBitmap=m_pHistoryStack->GetCurrent();
if(m_hBitmap != NULL){
CRect rcClient;
this->GetClientRect(rcClient);
HBITMAP hBitmap = CanvasToBmp();
CBitmap* bitmap;
bitmap = bitmap->FromHandle(m_hBitmap);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject(bitmap);
pDC->StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics
#ifdef _DEBUG
void CDrawView::AssertValid() const
{
CView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawDoc* CDrawView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers
void CDrawView::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BitMapFile(*.BMP)|*.BMP|"));
if (IDOK==dlg.DoModal())
{
bmpstate=1;
BmpName.Format(_T("%s"),dlg.GetPathName());
extname = dlg.GetFileExt();
extname.MakeLower();
redo=undo=0;
Invalidate();
}
}
void CDrawView::ShowBitmap(CDC* pDC,CString BmpName)
{
CClientDC DC(this);
if (bmpstate==1)
{
// HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,0);
m_bitmap.Detach();
m_bitmap.Attach(SHLoadDIBitmap(BmpName));
bmpstate=0;
BITMAP bmpInfo;
m_bitmap.GetBitmap(&bmpInfo);
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(&DC);
CBitmap* pOldBitmap = bitmapDC.SelectObject(&m_bitmap);
DC.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC,0, 0, SRCCOPY);
bitmapDC.SelectObject(pOldBitmap);
m_bitmap.DeleteObject();
}
}
/*
*****************************************************************************************
******** save filem 将文件保存为二进文件************************************************
*****************************************************************************************
*/
void CDrawView::OnFileSave()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T("BMP"),_T("Untitled"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BitMapFile(*.BMP)|*.BMP|"));
CString strFileName;
CString strExtension;
if (dlg.DoModal()==IDOK)
{
strFileName = dlg.GetFileName() ;
// strExtension = "bmp";
// strFileName = strFileName + '.' + strExtension;
}
HDC hMemDC;
CPaintDC hScrDC(this);
int width, height;
//the pointer will save all pixel point's color value
BYTE *lpBitmapBits = NULL;
//creates a device context for the screen device
// hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//get the screen point size
width = GetDeviceCaps(hScrDC, HORZRES);
height = GetDeviceCaps(hScrDC, VERTRES);
//creates a memory device context (DC) compatible with the screen device(hScrDC)
hMemDC = CreateCompatibleDC(hScrDC);
//initialise the struct BITMAPINFO for the bimap infomation,
//in order to use the function CreateDIBSection
// on wince os, each pixel stored by 24 bits(biBitCount=24)
//and no compressing(biCompression=0)
BITMAPINFO RGB24BitsBITMAPINFO;
ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
//use the function CreateDIBSection and SelectObject
//in order to get the bimap pointer : lpBitmapBits
HBITMAP directBmp = CreateDIBSection(hScrDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);
// copy the screen dc to the memory dc
BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);
//if you only want to get the every pixel color value,
//you can begin here and the following part of this function will be unuseful;
//the following part is in order to write file;
//bimap file header in order to write bmp file
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)
//write into file
FILE *mStream = NULL;
USES_CONVERSION;
char *p;
p=(char*)W2A((LPCTSTR)strFileName);
if((mStream = fopen(p, "wb"))) //filename const char *;
{
//write bitmap file header
fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
//write bitmap info
fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
//write bitmap pixels data
fwrite(lpBitmapBits, 3*width*height, 1, mStream);
//close file
fclose(mStream);
}
InvalidateRect(NULL);
//delete
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(directBmp);
DeleteObject(previousObject);
}
void CDrawView::OnCurve()
{
// TODO: Add your command handler code here
m_var=8;
}
void CDrawView::OnFillCircle()
{
// TODO: Add your command handler code here
m_var=7;
}
void CDrawView::OnFillRect()
{
// TODO: Add your command handler code here
m_var=3;
}
void CDrawView::OnFillRoundrect()
{
// TODO: Add your command handler code here
m_var=5;
}
void CDrawView::OnHollowCircle()
{
// TODO: Add your command handler code here
m_var=6;
}
void CDrawView::OnHollowRect() //画框
{
// TODO: Add your command handler code here
m_var=2;
}
void CDrawView::Online() //画线
{
// TODO: Add your command handler code here
m_var=1;
}
void CDrawView::OnHallowRoundrect() //画圆角框
{
// TODO: Add your command handler code here
m_var=4;
}
void CDrawView::OnEraser()
{
// TODO: Add your command handler code here
m_var=9;
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//MessageBox(_T("ONBUTTONDOWN"));
SetCapture();
CClientDC DC(this);
switch(m_var)
{
case 1: //m_memDC.MoveTo(point); //画线
DC.MoveTo(point);
hCursor = pApp->LoadCursor(IDC_PEN);
::SetCursor(hCursor);
::ClipCursor(NULL);
break;
case 9: eraserPEN.DeleteObject();
eraserPEN.CreatePen(PS_SOLID, globalSIZE, RGB(255, 255, 255));
DC.SelectObject(&eraserPEN);
hCursor = pApp->LoadCursor(IDC_ERASER);
::SetCursor(hCursor);
::ClipCursor(NULL);
break;
default: break;
}
if(m_var==8)
b1=true;
rect1 = point.x;
rect2 = point.y;
m_OldPoint=point;
paint=1;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint loc)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
// CPen pen(PS_SOLID,1,RGB(255,0,0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -