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

📄 drawvw.cpp

📁 任意点阵字模生成软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

}

void CDrawVw::OnDraw(CDC* pDC) 
{
CRect rc;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
pStatic->GetWindowRect(&rc);
//	return;
ScreenToClient(&rc);
//CBrush brush(RGB(0,121,155));
//pDC->FillRect(&rc,&brush);

if(GetDocument()->pCurStagementObj==NULL)
{
CBrush brush(RGB(0,121,155));
pDC->FillRect(&rc,&brush);
	
	return;
}
//		CDC pMemDC;
CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
//ScreenToClient(&rc);
pDC->SetMapMode(MM_ISOTROPIC   );
//SetStretchBltMode(pDC->GetSafeHdc(),HALFTONE); //字体平滑
pDC->SetWindowExt(100,100);
pDC->SetViewportExt(100*GetDocument()->pCurStagementObj->scale,100*GetDocument()->pCurStagementObj->scale);
pDC->DPtoLP(&rc);
//int x=GetDeviceCap(LOGPIXELSX);
//int x=GetDeviceCaps(LOGPIXELSX);
int x=GetDeviceCaps(pDC->m_hDC,LOGPIXELSX);
//pDC->Ellipse();
//rc.bottom=0-rc.bottom;
//pDC->Rectangle(&rc); 
memBitmap.CreateCompatibleBitmap(pDC, rc.Width()*GetDocument()->pCurStagementObj->scale, rc.Height()*GetDocument()->pCurStagementObj->scale);
//	return;
pMemDC.Detach();
pMemDC.CreateCompatibleDC(pDC);
//pMemDC.SetMapMode(MM_HIMETRIC   );
oldmemBitmap = pMemDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
pMemDC.SetMapMode(MM_ISOTROPIC   );
//SetStretchBltMode(pMemDC->GetSafeHdc(),HALFTONE); //字体平滑
pMemDC.SetWindowExt(100,100);
pMemDC.SetViewportExt(100*GetDocument()->pCurStagementObj->scale,100*GetDocument()->pCurStagementObj->scale);

DrawGrid(&pMemDC);

//pMemDC.Rectangle(0,0,500,500);
	CScreenDoc* pDoc=GetDocument();
	if(pDoc->pCurStagementObj==NULL)
	{
		pDC->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&pMemDC,0,0,SRCCOPY);
		pMemDC.SelectObject(oldmemBitmap);
		return;
	}
		DrawGraph(&pMemDC,0);

	pDC->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&pMemDC,0,0,SRCCOPY);
//			pDC->BitBlt(orgx,orgy,rc.Width(),rc.Height(),&pMemDC,0,0,SRCCOPY);
			pMemDC.SelectObject(oldmemBitmap);	
}
void CDrawVw::DrawGrid(CDC* tpDC)
{
	CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
	CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
	CString str;
	pMainFrame->m_wndToolBarDraw.m_screenHeight.GetWindowText(str);
//int pingHeight=atoi(str);
	pMainFrame->m_wndToolBarDraw.m_screenWidth.GetWindowText(str);
//int pingWidth=atoi(str);
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
CRect mrc;
pStatic->GetClientRect(&mrc);
//mrc.SetRect(0,0,(pingWidth-1)*,(pingHeight-1)*scale);
tpDC->DPtoLP(&mrc);
//mrc.right=mrc.left+step*mrc.Width();
//mrc.bottom=mrc.left+step*mrc.Height();
//mrc.left=mrc.left+10;
//mrc.right=mrc.right-10;
//mrc.top=mrc.top+10;
//mrc.bottom=mrc.bottom-10;
CBrush brush(RGB(0,121,155));
tpDC->FillRect(&mrc,&brush);
/*//	pingHeight=64;
//	pingWidth=96;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
CRect mrc;
pStatic->GetClientRect(&mrc);
tpDC->DPtoLP(&mrc);
//CRect mrc(0,0 ,xscreen,yscreen*3/5);
if(pingWidth==0 || pingHeight==0)
	return;
int tmp1=mrc.Width()/pingWidth;
int tmp2=mrc.Height()/pingHeight;
if(tmp1<=tmp2)
	step=tmp1;
else
	step=tmp2;
if (step==0)
step=1;
step=1;
//step=mrc.Width()/pingWidth;
orgx=(mrc.Width()/scale-pingWidth*scale*step)/2;
orgy=(mrc.Height()/scale-pingHeight*scale*step)/2;*/

//for(int i=(mrc.Height()-pingHeight*step)/2;i<mrc.Height()-pingHeight*step;i+=step)
//CBrush brush(RGB(0,121,155));
//tpDC->FillRect(&mrc,&brush);
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;
CBrush brush1(RGB(0,255,0));
CBrush* pOldBrush=tpDC->SelectObject(&brush1);
CPen pen; 
//tpDC->Rectangle(&mrc);
//turn;
	for(int j=0;j<=pingWidth;j++)
	{
		tpDC->MoveTo(orgx+j*step,orgy);
		tpDC->LineTo(orgx+j*step,orgy+pingHeight*step);
	}	
//for(i=0;i<xscreen;i+=step)
	for(j=0;j<=pingHeight;j++)//(mrc.Height()-pingHeight*step)/2;j<(mrc.Height()-pingHeight*step)/2+pingHeight*step;j+=step)
	{
		tpDC->MoveTo(orgx,orgy+j*step);
		tpDC->LineTo(orgx+pingWidth*step,orgy+j*step);
	}
tpDC->SelectObject(pOldBrush);

}


void CDrawVw::OnButton2() 
{
}

void CDrawVw::CalcParameter()
{
	CPoint ppt;
	GetCursorPos(&ppt);
	ScreenToClient(&ppt);
int pingWidth=GetDocument()->pCurStagementObj->screenwidth;
int pingHeight=GetDocument()->pCurStagementObj->screenheight;
	CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
	CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
	CString str;
	pMainFrame->m_wndToolBarDraw.m_screenHeight.GetWindowText(str);
	pMainFrame->m_wndToolBarDraw.m_screenWidth.GetWindowText(str);
	//	pingHeight=64;
	//	pingWidth=96;
	CStatic* pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
	CRect mrc;
	pStatic->GetClientRect(&mrc);
	ppt.x-=1;//mrc.left;
	ppt.y-=1;//mrc.top;
//	ppt.x=ppt.x-10-mrc.Width()/2;
//	ppt.y=ppt.y-10-mrc.Height()/2;
	//CRect mrc(0,0 ,xscreen,yscreen*3/5);
	if(pingWidth==0 || pingHeight==0)
	return;
	int tmp1=mrc.Width()/pingWidth;
	int tmp2=mrc.Height()/pingHeight;
	if(tmp1<=tmp2)
		GetDocument()->pCurStagementObj->pixperunit=tmp1;
	else
		GetDocument()->pCurStagementObj->pixperunit=tmp2;
	if(GetDocument()->pCurStagementObj->pixperunit==0)
		GetDocument()->pCurStagementObj->pixperunit=1;
	GetDocument()->pCurStagementObj->step=(double)GetDocument()->pCurStagementObj->pixperunit*GetDocument()->pCurStagementObj->scale;
	int x=(mrc.Width())/GetDocument()->pCurStagementObj->scale;
	int y=(mrc.Height())/GetDocument()->pCurStagementObj->scale;
//	pMemDC->DPtoLP(&mrc);
//	ppt.x=mrc.Width()/2;
//	ppt.y=mrc.Height()/2;
	CPoint pt=ppt;
	//pMemDC->DPtoLP(&pt);
	
	pt.x=int(pt.x/GetDocument()->pCurStagementObj->prescale);
	pt.y=int(pt.y/GetDocument()->pCurStagementObj->prescale);
	CString abc;
	abc.Format("%d %d",pt.x,pt.y);
	//pMainFrame->m_txtToolBar.m_Text.SetWindowText(abc);
	//pt.x=pingWidth*step;
	//pt.y=pingHeight*step;
//	if(pingWidth*step<x && pingHeight*step<y)
	{
//	orgx=(x-pingWidth*step)/2;
//	orgy=(y-pingHeight*step)/2;
	}
//	else
	{
	GetDocument()->pCurStagementObj->orgx=(double)(ppt.x/GetDocument()->pCurStagementObj->scale)-(double)((double)((pt.x-GetDocument()->pCurStagementObj->orgx)/GetDocument()->pCurStagementObj->prescale)*GetDocument()->pCurStagementObj->scale);
	GetDocument()->pCurStagementObj->orgy=(double)(ppt.y/GetDocument()->pCurStagementObj->scale)-(double)((double)((pt.y-GetDocument()->pCurStagementObj->orgy)/GetDocument()->pCurStagementObj->prescale)*GetDocument()->pCurStagementObj->scale);
	}
//	orgx-=pingWidth*pixperunit*(scale-prescale)/2+ppt.x/pixperunit/2;
//	orgy-=pingHeight*pixperunit*(scale-prescale)/2+ppt.y/pixperunit/2;
//	orgx-=(x-pingWidth*step)/2;//*scale;
//	orgy-=(y-pingHeight*step)/2;//*scale;
//	orgx=orgx-ppt.x/10;
//	orgy=orgy-ppt.y/10;
//	orgx=(ppt.x-pingWidth*step)/2;
//	orgy=(ppt.y-pingHeight*step)/2;
//	orgx=(x-pingWidth*step)/2;
//	orgy=(y-pingHeight*step)/2;
	pMemDC.LPtoDP(&pt);
	GetDocument()->pCurStagementObj->prescale=GetDocument()->pCurStagementObj->scale;
	CScrollBar* pScroll=(CScrollBar*)GetDlgItem(IDC_VSCROLL);
	if(pingHeight*GetDocument()->pCurStagementObj->step>=y)
	{
//	pScroll->MoveWindow(mrc.right-15,0,15,mrc.Height(),0);
	pScroll->SetScrollRange(GetDocument()->pCurStagementObj->orgy,pingHeight*GetDocument()->pCurStagementObj->step-y);
	pScroll->SetScrollPos(0);
	if(pScroll->IsWindowVisible()==0)
	{
		pScroll->ShowWindow(1);
		CalcLayout();
	}

	}
	else
	{
		if(pScroll->IsWindowVisible)
		{
			pScroll->ShowWindow(0);
			CalcLayout();
		}
	}

	pScroll=(CScrollBar*)GetDlgItem(IDC_HSCROLL);
	if(pingWidth*GetDocument()->pCurStagementObj->step>=x)
	{

		pScroll->SetScrollRange(GetDocument()->pCurStagementObj->orgx,pingWidth*GetDocument()->pCurStagementObj->step-x);
		pScroll->SetScrollPos(0);
		if(pScroll->IsWindowVisible()==0)
		{
			pScroll->ShowWindow(1);
			CalcLayout();
		}
}
	else
	{
		if(pScroll->IsWindowVisible)
		{
			pScroll->ShowWindow(0);
			CalcLayout();
		}
	}
		//	orgx+=(;
//	orgy+=(;
/*	int a=pt.x;
	int b=pt.y;
	CPoint ppt;
	ppt.x=425;
	ppt.y=289;

	orgx=(x-ppt.x*step)/2;
	orgy=(y-ppt.y*step)/2;
*/
}

void CDrawVw::OnButton3() 
{
	// TODO: Add your control notification handler code here
	GetDocument()->pCurStagementObj->orgx+=10;
	GetDocument()->pCurStagementObj->orgy+=10;
	Invalidate(0);
}

void CDrawVw::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString s;
//	ScreenToClient(&point);
	s.Format("%d , %d",point.x,point.y);
	AfxMessageBox(s);
	CFormView::OnRButtonDown(nFlags, point);
}

void CDrawVw::OnButton4() 
{
	// TODO: Add your control notification handler code here
	
}

void CDrawVw::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	UINT c=nChar;
	CFormView::OnChar(nChar, nRepCnt, nFlags);
}

void CDrawVw::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	UINT c=nChar;
	
	CFormView::OnKeyDown(nChar, nRepCnt, nFlags);
}

BOOL CDrawVw::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CFormView::OnScroll(nScrollCode, nPos, bDoScroll);
}

BOOL CDrawVw::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	return CFormView::PreTranslateMessage(pMsg);
}

void CDrawVw::ZoomOut()
{
	if(GetDocument()->pCurStagementObj==NULL)
		return;
GetDocument()->pCurStagementObj->scale+=0.1;
CalcParameter();
DrawScreen();

}

void CDrawVw::ZoomIn()
{
	if(GetDocument()->pCurStagementObj==NULL)
		return;
GetDocument()->pCurStagementObj->scale-=0.1;	
if(GetDocument()->pCurStagementObj->scale<0.1)
GetDocument()->pCurStagementObj->scale=0.1;
CalcParameter();
DrawScreen();

}

void CDrawVw::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	pDoc=GetDocument();
}



void CDrawVw::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int min,max;
	pScrollBar->GetScrollRange(&min,&max);
	int pos=pScrollBar->GetScrollPos();
	switch (nSBCode)
	{
	case SB_LINEDOWN:
		GetDocument()->pCurStagementObj->orgy-=(max-min)/100;
		pos+=(max-min)/100;
	break;

	case SB_LINEUP:
	GetDocument()->pCurStagementObj->orgy+=(max-min)/100;
	pos-=(max-min)/100;
	break;

	case SB_PAGEDOWN:
		GetDocument()->pCurStagementObj->orgy-=(max-min)/80;
		pos+=(max-min)/80;
		break;

	case SB_PAGEUP:
	GetDocument()->pCurStagementObj->orgy+=(max-min)/80;
	pos-=(max-min)/80;
		break;

			 default:
	return;
	}	
	pScrollBar->SetScrollPos(pos);
	DrawScreen();
	CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CDrawVw::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int min,max;
	pScrollBar->GetScrollRange(&min,&max);
	int pos=pScrollBar->GetScrollPos();
	switch (nSBCode)
	{
	case SB_LINEDOWN:
		GetDocument()->pCurStagementObj->orgx-=(max-min)/100;
		pos+=(max-min)/100;
	break;

	case SB_LINEUP:
	GetDocument()->pCurStagementObj->orgx+=(max-min)/100;
	pos-=(max-min)/100;
	break;

	case SB_PAGEDOWN:
		GetDocument()->pCurStagementObj->orgx-=(max-min)/80;
		pos+=(max-min)/80;
		break;

	case SB_PAGEUP:
	GetDocument()->pCurStagementObj->orgx+=(max-min)/80;
	pos-=(max-min)/80;
		break;

			 default:
	return;
	}	
	pScrollBar->SetScrollPos(pos);
	DrawScreen();

	CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CDrawVw::CalcLayout()
{
	BOOL bVshow=FALSE;
	BOOL bHshow=FALSE;
	CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
	if(pStatic==NULL)
		return;
	CRect rc;
	GetClientRect(&rc);
	
	CScrollBar* pScroll=(CScrollBar*)GetDlgItem(IDC_VSCROLL);
	if(pScroll->IsWindowVisible())
		bVshow=TRUE;
	if(bVshow)
		pScroll->MoveWindow(rc.right-15,0,15,rc.Height(),0);
	pScroll=(CScrollBar*)GetDlgItem(IDC_HSCROLL);
	if(pScroll->IsWindowVisible())
		bHshow=TRUE;
	if(bHshow)
		if(bVshow)
			pScroll->MoveWindow(0,rc.bottom-15,rc.Width()-15,15,0);
		else
			pScroll->MoveWindow(0,rc.bottom-15,rc.Width(),15,0);
	
	
	pStatic->MoveWindow(15,15,rc.Width()-30,rc.Height()-30,1);
//if(GetDocument()->pCurStagementObj==NULL)
//return;
//	if((GetDocument()->pCurStagementObj->step)==0)
		FirstCalc();
//	else
//		CalcParameter();
	bFirstShow=0;
	if(bFirstShow)
	{
	}
	DrawScreen();

}

BOOL CDrawVw::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return CFormView::OnEraseBkgnd(pDC);
}

HBRUSH CDrawVw::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

void CDrawVw::FirstCalc()
{
	CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PREVIEW);
	if(pStatic==NULL)
		return;
	if(GetDocument()->pCurStagementObj==NULL)
		return;

	CWnd* pMainWnd=AfxGetApp()->m_pMainWnd;
	CMainFrame* pMainFrame=(CMainFrame*)pMainWnd;
	if(pMainFrame==NULL)
		return;
	CString str;

	pMainFrame->m_wndToolBarDraw.m_screenHeight.GetWindowText(str);
	pMainFrame->m_wndToolBarDraw.m_screenWidth.GetWindowText(str);
	int pingHeight=GetDocument()->pCurStagementObj->screenheight;//atoi(str);
	int pingWidth=GetDocument()->pCurStagementObj->screenwidth;//atoi(str);
	//	pingHeight=64;
	//	pingWidth=96;
	CRect mrc;
	pStatic->GetClientRect(&mrc);
	//CRect mrc(0,0 ,xscreen,yscreen*3/5);
	if(pingWidth==0 || pingHeight==0)
	return;
	int tmp1=mrc.Width()/pingWidth;
	int tmp2=mrc.Height()/pingHeight;
	if(tmp1<=tmp2)
	GetDocument()->pCurStagementObj->pixperunit=tmp1;
	else
	GetDocument()->pCurStagementObj->pixperunit=tmp2;
	if(GetDocument()->pCurStagementObj->pixperunit==0)
		GetDocument()->pCurStagementObj->pixperunit=1;
	GetDocument()->pCurStagementObj->step=(double)GetDocument()->pCurStagementObj->pixperunit*GetDocument()->pCurStagementObj->scale;
	int x=mrc.Width()/GetDocument()->pCurStagementObj->scale;
	int y=mrc.Height()/GetDocument()->pCurStagementObj->scale;
//	pMemDC->DPtoLP(&mrc);
	CPoint pt;
	pt.x=pingWidth*GetDocument()->pCurStagementObj->step;
	pt.y=pingHeight*GetDocument()->pCurStagementObj->step;
	GetDocument()->pCurStagementObj->orgx=(x-pingWidth*GetDocument()->pCurStagementObj->step)/2;
	GetDocument()->pCurStagementObj->orgy=(y-pingHeight*GetDocument()->pCurStagementObj->step)/2;	
}

⌨️ 快捷键说明

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