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

📄 drawvw.cpp

📁 任意点阵字模生成软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -