📄 drawvw.cpp
字号:
// DrawVw.cpp : implementation file
//
#include "stdafx.h"
#include "screen.h"
#include "DrawVw.h"
#include "mainfrm.h"
#include "listvw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawVw
IMPLEMENT_DYNCREATE(CDrawVw, CFormView)
CDrawVw::CDrawVw()
: CFormView(CDrawVw::IDD)
{
//{{AFX_DATA_INIT(CDrawVw)
// pCurStagementObj=NULL;
m_MouseFlag=0;
bFirstShow=TRUE;
//}}AFX_DATA_INIT
}
CDrawVw::~CDrawVw()
{
}
void CDrawVw::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDrawVw)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDrawVw, CFormView)
//{{AFX_MSG_MAP(CDrawVw)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_WM_RBUTTONDOWN()
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_WM_CHAR()
ON_WM_KEYDOWN()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawVw diagnostics
#ifdef _DEBUG
void CDrawVw::AssertValid() const
{
CFormView::AssertValid();
}
void CDrawVw::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CScreenDoc* CDrawVw::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScreenDoc)));
return (CScreenDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawVw message handlers
void CDrawVw::OnOK()
{
// TODO: Add your control notification handler code here
}
void CDrawVw::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
CalcLayout();
}
void CDrawVw::OnButton1()
{
// TODO: Add your control notification handler code here
}
void CDrawVw::DrawGraph(CDC *pMemDC,int mode)
{
// CScreenDoc* pDoc=GetDocument();
POSITION wordpos = pDoc->pCurStagementObj->wordList.GetHeadPosition();
CWordObj* pWordObj;
CObject* pObject;
int m,n;
int orgx=pDoc->pCurStagementObj->orgx;
int orgy=pDoc->pCurStagementObj->orgy;
double step=pDoc->pCurStagementObj->step;
while (wordpos != NULL)
{
pObject=pDoc->pCurStagementObj->wordList.GetAt(wordpos);
pWordObj=(CWordObj*)pObject;
if(mode==1)
DrawDz(pMemDC,pWordObj,RGB(0,0,0),mode);
else
{
if(!pWordObj->GetIsSelected())
{
DrawDz(pMemDC,pWordObj,pWordObj->m_color,mode);
}
if (pWordObj->GetIsSelected())
{
if(m_MouseFlag==2)
{
pWordObj->left+=(m_MovPt.x-m_OrgPt.x)/step;//*step;
pWordObj->top+=(m_MovPt.y-m_OrgPt.y)/step;//*step;
}
DrawDz(pMemDC,pWordObj,pWordObj->m_color,mode);
if(m_MouseFlag==1)
{
// pWordObj->left+=(m_MovPt.x-m_OrgPt.x)/step;//*step;
// pWordObj->top+=(m_MovPt.y-m_OrgPt.y)/step;//*step;
int trueWidth;
trueWidth=pWordObj->m_width;
if(pWordObj->m_strname!="pic")
{
char c=pWordObj->m_strname.GetAt(0);
if(c>=0 && c<=255)
trueWidth=pWordObj->m_width/2;
}
CPen pen;
CPen* pOldPen;
pen.CreatePen(2,1,RGB(255,255,255));
pOldPen=pMemDC->SelectObject(&pen);
pMemDC->MoveTo(orgx+(m_MovPt.x-m_OrgPt.x)/step*step+(pWordObj->left)*step,orgy+(m_MovPt.y-m_OrgPt.y)/step*step+(pWordObj->top)*step);
pMemDC->LineTo(orgx+(m_MovPt.x-m_OrgPt.x)/step*step+(pWordObj->left+trueWidth)*step,orgy+(m_MovPt.y-m_OrgPt.y)/step*step+(pWordObj->top)*step);
pMemDC->LineTo(orgx+(m_MovPt.x-m_OrgPt.x)/step*step+(pWordObj->left+trueWidth)*step,orgy+(m_MovPt.y-m_OrgPt.y)/step*step+(pWordObj->top+pWordObj->m_height)*step);
pMemDC->LineTo(orgx+(m_MovPt.x-m_OrgPt.x)/step*step+(pWordObj->left)*step,orgy+(m_MovPt.y-m_OrgPt.y)/step*step+(pWordObj->top+pWordObj->m_height)*step);
pMemDC->LineTo(orgx+(m_MovPt.x-m_OrgPt.x)/step*step+(pWordObj->left)*step,orgy+(m_MovPt.y-m_OrgPt.y)/step*step+(pWordObj->top)*step);
pMemDC->SelectObject(pOldPen);
}
}
}
pDoc->pCurStagementObj->wordList.GetNext(wordpos);
}
if(m_MouseFlag==2)
m_MouseFlag=0;
}
void CDrawVw::OnLButtonDown(UINT nFlags, CPoint point)
{
CScreenDoc* pDoc=GetDocument();
if(pDoc->pCurStagementObj==NULL)
return;
CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
CDC* pDC=GetDC();
//pDC->SetWindowExt(100,100);
//pDC->SetViewportExt(100*scale,100*scale);
// pDC->LPtoDP(&point);
POSITION CurPos = NULL;
BOOL IsSel = FALSE;
BOOL IsInObj =FALSE;
IsInObj = IsInWordRect(pDC,point,&(pDoc->pCurStagementObj->wordList),&CurPos,&IsSel);
// int iBeSelCount = BeSelectedNum(pObList);
CWordObj* pWordObj1;
if(IsInObj)
{
pWordObj1= (CWordObj *)(pDoc->pCurStagementObj->wordList).GetAt(CurPos);
if(!pWordObj1->GetIsSelected())
{
pDoc->pCurStagementObj->m_SelectNum++;
if(pDoc->pCurStagementObj->m_SelectNum>1)
{
POSITION pos = pDoc->pCurStagementObj->wordList.GetHeadPosition();
CWordObj* pWordObj2;
CObject* pObject;
while (pos != NULL)
{
pObject = pDoc->pCurStagementObj->wordList.GetAt(pos);
pWordObj2=(CWordObj*)pObject;
if(pWordObj2->GetIsSelected() && (pWordObj2->m_width!=pWordObj1->m_width || pWordObj2->m_height!=pWordObj1->m_height))
{
pMainFrame->m_wndToolBarDraw.m_wordWidth.SetWindowText("");
pMainFrame->m_wndToolBarDraw.m_wordHeight.SetWindowText("");
break;
}
pMainFrame->bModiftBtnEnable=0;
pMainFrame->m_txtToolBar.GetToolBarCtrl().EnableButton(ID_MODIFYBTN,pMainFrame->bModiftBtnEnable);
pDoc->pCurStagementObj->wordList.GetNext(pos);
}
// SetDlgItemText(IDC_EDIT1,"");
}
else
{
CString str1;
str1.Format("%d",pWordObj1->m_width);
pMainFrame->m_wndToolBarDraw.m_wordWidth.SetWindowText(str1);
str1.Format("%d",pWordObj1->m_height);
pMainFrame->m_wndToolBarDraw.m_wordHeight.SetWindowText(str1);
pMainFrame->bModiftBtnEnable=1;
if(pWordObj1->m_strname!="pic")
pMainFrame->m_txtToolBar.m_Text.SetWindowText(pWordObj1->m_strname);
else
{
pMainFrame->m_txtToolBar.m_Text.SetWindowText("");
pMainFrame->bModiftBtnEnable=0;
}
pMainFrame->m_txtToolBar.GetToolBarCtrl().EnableButton(ID_MODIFYBTN,pMainFrame->bModiftBtnEnable);
pMainFrame->bBold=pWordObj1->bBold;
pMainFrame->bItalic=pWordObj1->bItalic;
}
}
pWordObj1->SetIsSelected(TRUE);
pWordObj1->bOrder=0;
m_MouseFlag=1;//数标按下
// pZkObject->SetIsSelected(1);
}
else
{
POSITION pos = pDoc->pCurStagementObj->wordList.GetTailPosition();
int ht = CRectTracker::hitNothing;
CObject *pObject;
while(pos!=NULL)
{
pObject=pDoc->pCurStagementObj->wordList.GetAt(pos);
pWordObj1=(CWordObj*)pObject;
pWordObj1->SetIsSelected(FALSE);
pDoc->pCurStagementObj->wordList.GetPrev(pos);
}
pDoc->pCurStagementObj->m_SelectNum=0;
m_MouseFlag=0;
}
DrawScreen();
/* if(m_SelectNum==1)
{
CButton* pBtn=(CButton*)GetDlgItem(IDC_INPUT);
pBtn=(CButton*)GetDlgItem(IDC_BTNEDIT);
pBtn->EnableWindow(TRUE);
}
else
{
CButton* pBtn=(CButton*)GetDlgItem(IDC_INPUT);
pBtn=(CButton*)GetDlgItem(IDC_BTNEDIT);
pBtn->EnableWindow(FALSE);
}*/
m_OrgPt=point;
m_MovPt=point; // TODO: Add your message handler code here and/or call default
CFormView::OnLButtonDown(nFlags, point);
}
void CDrawVw::OnMouseMove(UINT nFlags, CPoint point)
{
if(GetDocument()->pCurStagementObj==NULL)
return;
CScreenDoc* pDoc=GetDocument();
CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
CPoint pt=point;
// pMemDC.DPtoLP(&pt);
// CString abc;
// abc.Format("%d %d",pt.x,pt.y);
// pMainFrame->m_txtToolBar.m_Text.SetWindowText(abc);
if(pDoc->pCurStagementObj==NULL)
return;
if(pMainFrame->bLock==FALSE)
{
if(pDoc->pCurStagementObj->m_SelectNum>0)
{
if(m_MouseFlag==1)
{
m_MovPt=point;
DrawScreen();
}
}
else
m_MouseFlag=0;
}
CFormView::OnMouseMove(nFlags, point);
}
void CDrawVw::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_MouseFlag==1)
{
m_MouseFlag=2;
DrawScreen();
}
CFormView::OnLButtonUp(nFlags, point);
}
void CDrawVw::DrawDz(CDC *pMemDC, CWordObj *pWordObj, COLORREF color,int mode)
{
CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
int orgx=GetDocument()->pCurStagementObj->orgx;
int orgy=GetDocument()->pCurStagementObj->orgy;
double step=GetDocument()->pCurStagementObj->step;
int pingwidth=GetDocument()->pCurStagementObj->screenwidth;
int pingheight=GetDocument()->pCurStagementObj->screenheight;
int index=0;
int bits=0;
CString str;
str=pWordObj->m_strname;
int trueWidth=pWordObj->m_width;
if(str!="pic")
{
char c=str.GetAt(0);
if(c>=0 && c<=255)
trueWidth=pWordObj->m_width/2;
}
for(int m=0;m<pWordObj->m_height;m++)
{
for(int n=0;n<trueWidth;n++)
{
int cmpvalue=pWordObj->buf[index]&(0x80>>bits);
if(cmpvalue!=0)
{
CBrush brush(color);
CBrush* pOldBrush=pMemDC->SelectObject(&brush);
// if(pWordObj->left+n<0 || pWordObj->top+m<0)
// continue;
CRect rc(orgx+(pWordObj->left+n)*step,
orgy+(pWordObj->top+m)*step,
orgx+(pWordObj->left+n+1)*step,
orgy+(pWordObj->top+m+1)*step);
// pMemDC->DPtoLP(&rc);
if(mode==0)
{
if(step>2)
{
//pMemDC->Ellipse(&rc);
CRgn srcRgn;
//srcRgn.CreateEllipticRgn(orgx+(pWordObj->left+n)*step,orgy+(pWordObj->top+m)*step,
//orgx+(pWordObj->left+n+1)*step,orgy+(pWordObj->top+m+1)*step);
srcRgn.CreateEllipticRgnIndirect(&rc);
// pMemDC->FillRgn(&srcRgn,&brush);
pMemDC->Ellipse(&rc);
}
else
pMemDC->SetPixel(orgx+(pWordObj->left+n)*step,
orgy+(pWordObj->top+m)*step,RGB(255,0,0));
}
else if(mode==1)
{
pMemDC->SetPixel((pWordObj->left+n),(pWordObj->top+m),RGB(255,255,255));
// rc.SetRect((pWordObj->left+n),(pWordObj->top+m),
// (pWordObj->left+n+1),(pWordObj->top+m+1));
// pMemDC->FillRect(&rc,&brush);
}
pMemDC->SelectObject(pOldBrush);
}
bits++;
if(bits>=8)
{
bits=0;
index++;
}
}
}
if(mode==1)//取模
return;
if(pWordObj->GetIsSelected())
{
CPen pen;
pen.CreatePen(0,1,RGB(180,255,0));
CPen* pOldPen=pMemDC->SelectObject(&pen);
pMemDC->MoveTo(orgx+pWordObj->left*step,
orgy+pWordObj->top*step);
pMemDC->LineTo(orgx+(pWordObj->left+trueWidth)*step,
orgy+pWordObj->top*step);
pMemDC->LineTo(orgx+(pWordObj->left+trueWidth)*step,
orgy+(pWordObj->top+pWordObj->m_height)*step);
pMemDC->LineTo(orgx+pWordObj->left*step,
orgy+(pWordObj->top+pWordObj->m_height)*step);
pMemDC->LineTo(orgx+(pWordObj->left)*step,
orgy+pWordObj->top*step);
pMemDC->SelectObject(pOldPen);
}
if(pMainFrame->bShowRectangle)
{
CPen pen;
pen.CreatePen(2,1,RGB(0,255,255));
CPen* pOldPen=pMemDC->SelectObject(&pen);
pMemDC->MoveTo(orgx+(pWordObj->left)*step,
orgy+(pWordObj->top)*step);
pMemDC->LineTo(orgx+(pWordObj->left+trueWidth )*step,
orgy+(pWordObj->top)*step);
pMemDC->LineTo(orgx+(pWordObj->left+trueWidth )*step,
orgy+(pWordObj->top+pWordObj->m_height )*step);
pMemDC->LineTo(orgx+(pWordObj->left)*step,
orgy+(pWordObj->top+pWordObj->m_height )*step);
pMemDC->LineTo(orgx+(pWordObj->left)*step,
orgy+(pWordObj->top)*step);
pMemDC->SelectObject(pOldPen);
}
}
BOOL CDrawVw::IsInWordRect(CDC* pDC,CPoint point, CObList *pObList, POSITION *pCurPos, BOOL *pIsSel)
{
*pCurPos = NULL;
*pIsSel = FALSE;
BOOL bTest=FALSE;
BOOL bCtrl;
bCtrl=FALSE;
int orgx=GetDocument()->pCurStagementObj->orgx;
int orgy=GetDocument()->pCurStagementObj->orgy;
double step=GetDocument()->pCurStagementObj->step;
int pingwidth=GetDocument()->pCurStagementObj->screenwidth;
int pingheight=GetDocument()->pCurStagementObj->screenheight;
if(::GetKeyState(VK_CONTROL)<0)
bCtrl=TRUE;
//=GetAsyncKeyState(VK_LCONTROL)&&0x8000;
CScreenDoc* pDoc=GetDocument();
CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
POSITION pos = pDoc->pCurStagementObj->wordList.GetTailPosition();
int ht = CRectTracker::hitNothing;
CWordObj *pWordObj;
CObject *pObject;
int trueWidth;
CString str;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
CRect tmprc;
::GetWindowRect(pStatic->GetSafeHwnd(),&tmprc);
// pStatic->GetClientRect(&rc);
ScreenToClient(&tmprc);
point.x=point.x-tmprc.left;
point.y=point.y-tmprc.top;
while(pos!=NULL)
{
pObject = pDoc->pCurStagementObj->wordList.GetAt(pos);
pWordObj = (CWordObj *)pObject;
str=pWordObj->m_strname;
char c=str.GetAt(0);
trueWidth=pWordObj->m_width;
if(str!="pic")
if(c>=0 && c<=255)
trueWidth=pWordObj->m_width/2;
CRect rc;
rc.left=orgx+pWordObj->left*step;
rc.top=orgy+pWordObj->top*step;
rc.right=orgx+(pWordObj->left+trueWidth)*step;
rc.bottom=orgy+(pWordObj->top+pWordObj->m_height)*step;
pMemDC.LPtoDP(&rc);
// ScreenToClient(&point);
// pDC->LPtoDP(&rc);
// pMemDC->DPtoLP(&point);
// point.x*=scale;
// point.y*=scale;
// pMemDC->DPtoLP(&point);
pWordObj->SetTrackRect(rc);
ht = pWordObj->m_RectTracker.HitTest(point);
if (ht != CRectTracker::hitNothing)
{
*pCurPos = pos;
bTest=TRUE;
*pIsSel = pWordObj->GetIsSelected();
break;
}
pDoc->pCurStagementObj->wordList.GetPrev(pos);
}
if(*pIsSel==FALSE && bCtrl==FALSE)
{
pos = pDoc->pCurStagementObj->wordList.GetTailPosition();
pDoc->pCurStagementObj->m_SelectNum=0;
while(pos!=NULL)
{
if(pos==*pCurPos)
{
pDoc->pCurStagementObj->wordList.GetPrev(pos);
continue;
}
pObject = pDoc->pCurStagementObj->wordList.GetAt(pos);
pWordObj = (CWordObj *)pObject;
pWordObj->SetIsSelected(FALSE);
pDoc->pCurStagementObj->wordList.GetPrev(pos);
}
}
return bTest;
}
void CDrawVw::DrawScreen()
{
CRect rc;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
pStatic->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(rc,0);//(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -