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