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

📄 drawview.cpp

📁 用EVC4.0开发的一个画图板程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -