📄 drawvw.cpp
字号:
}
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 + -