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

📄 drawview.cpp

📁 Wince 下的画图软件的源代码,是一款不错的EVC图形编辑软件,可以直接作为PMP的配套软件.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DrawView.cpp : implementation of the CDrawView class
//

#include "stdafx.h"
#include "Draw.h"
#include "MainFrm.h"
#include "DrawDoc.h"
#include "DrawView.h"
#include "CDLine.h"
#include "CDPen.h"
#include "CDEllipse.h"
#include "CDRectangle.h"
#include "CDText.h" 
#include"CDBackMap.h"
//#pragma comment(lib,"SBitmap.lib")
//#pragma comment(lib,"Strmiids.lib")

#include <wingdi.h>
#include "Sipapi.h" 

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif




HDC	hMemDC;
CPoint m_RopFirstPoint,m_RopSecondPoint;
extern int    iScreenWidth,iScreenHeight;


LPSTR GettingBits(HBITMAP hSourceBitmap) ;
BOOL SaveDIBToFile(LPSTR hDib, LPCTSTR szFileName);
HBITMAP CopyScreenToBitmap(HWND hPic,HDC m_Hdc,LPRECT lpRect);
/////////////////////////////////////////////////////////////////////////////
// CDrawView

IMPLEMENT_DYNCREATE(CDrawView, CView)

BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_COMMAND(ID_TOOL_PEN, OnToolPen)
ON_COMMAND(ID_TOOL_LINE, OnToolLine)
ON_COMMAND(ID_TOOL_RECTANGLE, OnToolRectangle)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_TOOL_RED, OnToolRed)
ON_COMMAND(ID_TOOL_YELLOW, OnToolYellow)
ON_COMMAND(ID_TOOL_BLUE, OnToolBlue)
ON_COMMAND(ID_TOOL_GREEN, OnToolGreen)
ON_COMMAND(ID_TOOL_FBC, OnToolFbc)
ON_COMMAND(ID_TOOL_HRED, OnToolHred)
ON_COMMAND(ID_TOOL_AMET, OnToolAmet)
ON_COMMAND(ID_TOOL_FBLUE, OnToolFblue)
ON_COMMAND(ID_TOOL_FGRAY, OnToolFgray)
ON_COMMAND(ID_TOOL_FRED, OnToolFred)
ON_COMMAND(ID_TOOL_GRAY, OnToolGray)
ON_COMMAND(ID_TOOL_HBLUE, OnToolHblue)
ON_COMMAND(ID_TOOL_HGREEN, OnToolHgreen)
ON_COMMAND(ID_TOOL_HYELLOW, OnToolHyellow)
ON_COMMAND(ID_TOOL_WHITE, OnToolWhite)
ON_COMMAND(ID_TOOL_WHITEBLUE, OnToolWhiteblue)
ON_COMMAND(ID_TOOL_BLACK, OnToolBlack)
ON_COMMAND(ID_TOOL_CDIALOG, OnToolCdialog)
ON_COMMAND(ID_TOOL_BC, OnToolBc)
ON_COMMAND(ID_TOOL_FC, OnToolFc)
ON_COMMAND(ID_TOOL_ELLIPSE, OnToolEllipse)
ON_COMMAND(ID_TOOL_CHARA, OnToolChara)
ON_COMMAND(ID_TOOL_PALL, OnToolPall)
ON_COMMAND(ID_TOOL_PKALL, OnToolPallk)
ON_UPDATE_COMMAND_UI(ID_TOOL_PEN, OnUpdateToolPen)
ON_UPDATE_COMMAND_UI(ID_TOOL_CHARA, OnUpdateToolChara)
ON_UPDATE_COMMAND_UI(ID_TOOL_ELLIPSE, OnUpdateToolEllipse)
ON_UPDATE_COMMAND_UI(ID_TOOL_LINE, OnUpdateToolLine)
ON_UPDATE_COMMAND_UI(ID_TOOL_PALL, OnUpdateToolPall)
ON_UPDATE_COMMAND_UI(ID_TOOL_PKALL, OnUpdateToolPallk)
ON_UPDATE_COMMAND_UI(ID_TOOL_RECTANGLE, OnUpdateToolRectangle)
ON_COMMAND(ID_TOOL_B_SEL, OnToolBSel)
ON_COMMAND(ID_TOOL_B_BIG, OnToolBBig)
ON_UPDATE_COMMAND_UI(ID_TOOL_B_BIG, OnUpdateToolBBig)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction

CDrawView::CDrawView()
{
	m_BackgroundColor=RGB(255,255,255);
	m_BkMode=TRANSPARENT;
	m_toolcolorFB=Tool_S_PEN;
	m_CurPen=RGB(0,0,0);		//当前画笔颜色
	m_CurBrush=RGB(255,255,255);	//当前画刷颜色
	m_transparence=false;		//不透明
	SipShowIM(SIPF_OFF);
}

CDrawView::~CDrawView()
{
}

BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing



/////////////////////////////////////////////////////////////////////////////
// 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

/*

  InPEdit* CDrawView::ShowInPlaceEdit(int iRowIndex, int iColumnIndex, CString& rstrCurSelection)
  {
  
	InPEdit* pInPlaceEdit = InPEdit::GetInstance();
	
	  CRect obCellRect(0, 0, 0, 0);
	  CalculateCellRect(iColumnIndex, iRowIndex, obCellRect);	
	  
		pInPlaceEdit->ShowEditCtrl(m_dwEditCtrlStyle, obCellRect, this, 0, 
		iRowIndex, iColumnIndex,
		m_strValidEditCtrlChars, rstrCurSelection);
		
		  return pInPlaceEdit;
		  }
*/


//================初始化======================================
void CDrawView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	CDrawDoc *pDoc=this->GetDocument();  
	CClientDC dc(this);
	m_pCurrentUnit=new CDBackMap;
	HBITMAP hbitmap;
	hMemDC=CreateCompatibleDC(dc.m_hDC);
	
	hbitmap=::CreateCompatibleBitmap(dc.m_hDC,iScreenWidth,iScreenHeight);
	HBITMAP  pOldBitmap = (HBITMAP)SelectObject(hMemDC,hbitmap); 	
	
	CBrush m_brush;
	m_brush.CreateSolidBrush(RGB(255,255,255));
	SelectObject(hMemDC,&m_brush);
	Rectangle(hMemDC,0,0,iScreenWidth,iScreenHeight);
	
	
	pDoc->m_BackMapArray.Add((CDBackMap*)m_pCurrentUnit);
	::DeleteObject(hbitmap);
	
}


//====================刷新==========================================
void CDrawView::OnDraw(CDC* pDC)
{
	CDrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	for(int i=0;i<pDoc->m_BackMapArray.GetSize();i++)
	{
		CDBackMap*  BKMAP=(CDBackMap*)pDoc->m_BackMapArray.GetAt(i);
		BKMAP->DrawStatic(pDC); 
	}
	
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	
	CDrawDoc *pDoc=this->GetDocument();  
	CClientDC dc(this);
	
	
	if(m_status)return;
	if(edit1.m_hWnd!=NULL)
	{
		RECT rc;
		edit1.GetWindowRect(&rc);
		if(!PtInRect(&rc,point))
		{
			CString EditStr;
			edit1.GetWindowText(EditStr);
			edit1.DestroyWindow(); 
			this->RedrawWindow();
			this->UpdateWindow();
			m_pCurrentUnit=new CDText;
			pDoc->m_TextArray.Add((CDText *)m_pCurrentUnit);
			m_pCurrentUnit->m_FirstPoint=m_FirstPt;
			m_pCurrentUnit->m_PenColor=m_CurPen;
			m_pCurrentUnit->m_BackgroundColor=m_CurBrush;
			m_pCurrentUnit->m_SecondPoint=point;
			m_pCurrentUnit->m_TextStr=EditStr;
			m_pCurrentUnit->m_transparence=m_transparence;
			m_pCurrentUnit->DrawActive(&dc,point,CMD_LBDOWN);
			m_tool_type=Tool_NULL;
			SipShowIM(SIPF_OFF);
		}			
	}
	if(m_tool_type==Tool_PEN)
	{ 
		m_FirstPt=point;
	}
	else if(m_tool_type==Tool_LINE)
	{
		m_FirstPt=point;	
	}
	else if(m_tool_type==Tool_RECTANGLE)
	{		 
		m_FirstPt=point;			
	}		 
	else if(m_tool_type==Tool_ELLIPSE)	//实心圆
	{
		m_FirstPt=point;
	}
	
	else if(m_tool_type==Tool_CHAR)
	{
		m_FirstPt=point;  	 
		//GetScreen();
		edit1.Create(WS_VSCROLL|WS_HSCROLL|ES_MULTILINE | ES_WANTRETURN | WS_CHILD |WS_TABSTOP | WS_BORDER,
			CRect(point.x,point.y,point.x+100,point.y+70),this, ID_EDIT);	
		edit1.ShowWindow(true);
		
		
	}
	else if(m_tool_type==Tool_SEL)
	{ 
		if(SelectB.m_hWnd!=NULL)
		{
			RECT rc;
			SelectB.GetWindowRect(&rc);
			this->ScreenToClient(&rc);
			
			int ptcenter_x,ptcenter_y;
			
			ptcenter_x=(rc.right-rc.left)/2+rc.left;
			ptcenter_y=(rc.bottom-rc.top)/2+rc.top;
			
			
			if((point.x<=(rc.left+10)) && (point.x>=(rc.left-10)))
			{
				
				m_CurPtSel=Tool_SEL_LEFT;
			}
			else if((point.x<=(rc.right+10)) && (point.x>=(rc.right-10)))
			{
				m_CurPtSel=Tool_SEL_RIGHT;
			}
			else if((point.y<=(rc.top+10)) && (point.y>=(rc.top-10)))
			{
				m_CurPtSel=Tool_SEL_TOP;
			}
			else if((point.y<=(rc.bottom+10)) && (point.y>=(rc.bottom-10)))
			{
				m_CurPtSel=Tool_SEL_BOTTOM;  //Tool_SEL_CENTER
			}
			else if(((point.x<=(ptcenter_x+10)) && (point.x>=(ptcenter_x-10))) 
				&& ((point.y<=(ptcenter_y+10)) && (point.y>=(ptcenter_y-10)))   )
			{
				m_FirstPt=point;
				m_SecondPt.x=rc.left;
				m_SecondPt.y=rc.top;
				m_CurPtSel=Tool_SEL_CENTER;
			}
			else
			{
				m_CurPtSel=Tool_SEL_NULL;
				SelectB.DestroyWindow();
			}
		}
		else
		{
			GetScreen();	
			SelectB.Create(_T(" "), WS_CHILD|WS_VISIBLE|SS_CENTER,  CRect(point.x,point.y,point.x+100,point.y+70),this, ID_SELECT);
			SelectB.ShowWindow(true);		 
		}	
	}			
	else if(m_tool_type==Tool_BIGSMALL)
	{

			int P_x,P_y;
			P_x=point.x-20;
			P_y=point.y-20;
			if(P_x<0)P_x=0;
			if(P_y<0)P_x=0;
		HPEN m_pen,m_oldpen;	HBRUSH m_brush;
		m_pen=CreatePen(PS_SOLID,2,RGB(255,0,0));
		m_oldpen=(HPEN)SelectObject(dc.m_hDC,m_pen);
		m_brush=CreateSolidBrush(RGB(255,255,255));
		SelectObject(dc.m_hDC,m_brush);
		Rectangle(dc.m_hDC,iScreenWidth-114,iScreenHeight-166,iScreenWidth-115+83,iScreenHeight-167+83);		
		SelectObject(dc.m_hDC,m_oldpen);
		::DeleteObject(m_pen);
		::DeleteObject(m_oldpen);
		::DeleteObject(m_brush);		
		StretchBlt(dc.m_hDC,iScreenWidth-113,iScreenHeight-165,80,80,hMemDC,P_x,P_y,40,40,SRCCOPY);  
	//	StretchBlt(dc.m_hDC,0,0,80,80,hMemDC,P_x,P_y,40,40,SRCCOPY);  
	//BitBlt(dc.m_hDC,0,0,80,80,hMemDC,P_x,P_y,SRCCOPY);

		/*
		if(m_BigSmall.m_hWnd!=NULL)
		{
			m_BigSmall.m_FirstPoint=point;
			m_BigSmall.DrawZoom(&dc) ;
			
		}
		else
		{

			int  Pos_x=106,Pos_y=135;
			CRect rect(iScreenWidth-Pos_x,iScreenHeight-Pos_y,(iScreenWidth-Pos_x)+80,(iScreenHeight-Pos_y)+80);
			m_BigSmall.Create(_T(" "), WS_BORDER|WS_CHILD|WS_VISIBLE|SS_CENTER,  rect,this, ID_BIGSMALL);
			m_BigSmall.ShowWindow(true);		 
		}
		*/

	}
	
	CView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	
	CDrawDoc *pDoc=this->GetDocument();  
	CClientDC dc(this);
	
	if(m_tool_type==Tool_PEN)
	{
		m_FirstPt=point;
	}
	else if(m_tool_type==Tool_LINE)
	{	
		
		m_pCurrentUnit=new CDLine;
		pDoc->m_LineArray.Add((CDLine*)m_pCurrentUnit);
		m_pCurrentUnit->m_FirstPoint=m_FirstPt;		
		m_pCurrentUnit->m_SecondPoint=point;
		m_pCurrentUnit->m_BackgroundColor=m_CurBrush;
		m_pCurrentUnit->m_PenColor=m_CurPen;
		m_pCurrentUnit->DrawActive(&dc,point,CMD_LBUP);
		m_status=false;	
	}
	else if(m_tool_type==Tool_RECTANGLE)
	{
		
		m_pCurrentUnit=new CDRectangle;
		pDoc->m_RectangleArray.Add((CDRectangle *)m_pCurrentUnit);
		m_pCurrentUnit->m_FirstPoint=m_FirstPt;
		m_pCurrentUnit->m_PenColor=m_CurPen;
		m_pCurrentUnit->m_BackgroundColor=m_CurBrush;
		m_pCurrentUnit->m_SecondPoint=point;
		m_pCurrentUnit->m_transparence=m_transparence;
		m_pCurrentUnit->DrawActive(&dc,point,CMD_LBUP);
		m_status=false;	
	}
	
	else if(m_tool_type==Tool_ELLIPSE)
	{		 
		
		m_pCurrentUnit=new CDEllipse;
		pDoc->m_EllipseArray.Add((CDEllipse*)m_pCurrentUnit);
		m_pCurrentUnit->m_FirstPoint=m_FirstPt;
		m_pCurrentUnit->m_PenColor=m_CurPen;
		m_pCurrentUnit->m_BackgroundColor=m_CurBrush;
		m_pCurrentUnit->m_SecondPoint=point;
		m_pCurrentUnit->m_transparence=m_transparence;
		m_pCurrentUnit->DrawActive(&dc,point,CMD_LBUP);
		m_status=false;	
		
	} 
	else if(m_tool_type==Tool_CHAR)
	{ 
		
	}
	else if(m_tool_type==Tool_SEL)
	{ 
		if(SelectB.m_hWnd!=NULL)
		{
			CDC *pDC=GetWindowDC();
			RECT rc;
			SelectB.GetWindowRect(&rc);
			this->ScreenToClient(&rc);
			if(m_CurPtSel==Tool_SEL_LEFT)
			{
				//	CDC *pDCMem = CDC::FromHandle(hMemDC);
				//	pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
				SelectB.MoveWindow(point.x,rc.top,rc.right-point.x,rc.bottom-rc.top);
				SelectB.RedrawWindow();
				CDC *pDCMem = CDC::FromHandle(hMemDC);
				pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
			}
			else if(m_CurPtSel==Tool_SEL_RIGHT)
			{
				//	CDC *pDCMem = CDC::FromHandle(hMemDC);
				//	pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
				SelectB.MoveWindow(rc.left,rc.top,point.x-rc.left,rc.bottom-rc.top);
				SelectB.RedrawWindow();
				CDC *pDCMem = CDC::FromHandle(hMemDC);
				pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
			}
			else if( m_CurPtSel==Tool_SEL_TOP)
			{
				CDC *pDCMem = CDC::FromHandle(hMemDC);
				pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
				SelectB.MoveWindow(rc.left,point.y,rc.right-rc.left,rc.bottom-point.y);
				SelectB.RedrawWindow();
			}
			else if( m_CurPtSel==Tool_SEL_BOTTOM)
			{
				CDC *pDCMem = CDC::FromHandle(hMemDC);
				pDC->BitBlt(0,0,iScreenWidth,iScreenHeight,pDCMem,0,0,SRCCOPY);
				SelectB.MoveWindow(rc.left,rc.top,rc.right-rc.left,point.y-rc.top);
				SelectB.RedrawWindow();
			}
			SelectB.UpdateWindow();
			
		}
		

⌨️ 快捷键说明

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