?? drawview.cpp
字號:
p_Screen[0].blc=blc;
pDoc->m_CurrentScreen=0;
InitVScroll();
InitHScroll();
Invalidate();
}
//“鼠標選中”菜單項的對應(yīng)函數(shù)
void CDrawView::OnSelectMouse()
{
m_DrawCurrent=30; //標識進行圖形選中操作
PushNumb=0;
}
//“放棄選中”菜單項的對應(yīng)函數(shù),用來放棄所作的選擇
void CDrawView::OnSelectClear()
{
CDrawDoc* pDoc = GetDocument();
CClientDC ht(this);
for(int i=0;i<pDoc->n_GraphSelect;i++) //將選中的圖形元素原樣進行繪制
pDoc->DrawGraph(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].Index,0,0,m_bColor);
pDoc->n_GraphSelect=0;
if(pDoc->b_IsOleSelect)
{
POSITION pos=pDoc->GetStartPosition();
while(pos!=NULL)
{
CDrawCntrItem *pItem=(CDrawCntrItem *)pDoc->GetNextClientItem(pos);
if(pItem!=NULL)
pItem->b_Select=FALSE;
}
pDoc->b_IsOleSelect=0;
Invalidate();
}
}
//用來刪除一個圖形元素的函授數(shù)
//Lb-刪除圖形的類別 Index-刪除圖形頂序列號
void CDrawView::Delete(CDC* pDC,int Lb,int Index)
{
float x1,y1,x2,y2;
CDrawDoc* pDoc = GetDocument();
if(Lb==1) //如果是直線,得到直線指針并以屏幕底色重畫達到刪除的效果
{
CLine* p_Line=pDoc->GetLine(Index);
p_Line->Draw(pDC,0,2,m_bColor);
p_Line->Delete(1); //做刪除標識
}
else if(Lb==2) //如果是連續(xù)直線或多邊形
{
CPline* p_PLine=pDoc->GetPLine(Index); //得到連續(xù)直線(多邊形)的指針
if(p_PLine->IsPLine()) //如果是連續(xù)直線,以屏幕底色重畫達到刪除的效果
p_PLine->Draw(pDC,0,2,m_bColor);
else //如果是多邊形區(qū)域
{
p_PLine->GetRect(&x1,&y1,&x2,&y2); //得到多邊形區(qū)域的邊界矩形
ReDrawRect(x1,y1,x2,y2); //重畫多邊形區(qū)域所在頂區(qū)域
}
p_PLine->Delete(1); //做刪除標識
}
else if(Lb==3) //如果是圓或圓形區(qū)域
{
CCircle* p_Circle=pDoc->GetCircle(Index);//得到圓(圓形區(qū)域)的指針
if(p_Circle->IsCircle()) //如果是圓,則以屏幕底色進行重畫
p_Circle->Draw(pDC,0,2,m_bColor);
else //如果是圓形區(qū)域,則得到其邊界矩形并重畫這個區(qū)域
{
p_Circle->GetRect(&x1,&y1,&x2,&y2);
ReDrawRect(x1,y1,x2,y2);
}
p_Circle->Delete(1); //做刪除標識
}
else if(Lb==4) //如果是圓弧,則以屏幕底色進行重畫
{
CArc* p_Arc=pDoc->GetArc(Index); //得到圓弧的指針
p_Arc->Draw(pDC,0,2,m_bColor);
p_Arc->Delete(1); //做刪除標識
}
else if(Lb==5) //如果是標注文字,則得到其邊界矩形并重畫這個區(qū)域
{
CText* p_Text=pDoc->GetText(Index); //得到標注文字的指針
p_Text->GetRect(&x1,&y1,&x2,&y2);
p_Text->Delete(1); //做刪除標識
ReDrawRect(x1,y1,x2,y2);//重畫屏幕區(qū)域
}
}
//此函數(shù)用來重畫由點(X1,Y1)和點(X2,Y2)確定的區(qū)域
void CDrawView::ReDrawRect(float X1, float Y1, float X2, float Y2)
{
float xx1,xx2,yy1,yy2;
CRect r1;
xx1=m_xStart; xx2=m_xStart+blc*m_wScreen;
yy1=m_yStart; yy2=m_yStart+blc*m_hScreen;
//得到區(qū)域與視圖區(qū)域相交的矩形
BOOL IsCross=RectCross(&xx1,&yy1,&xx2,&yy2,X1,Y1,X2,Y2);
if(IsCross) //如果相交,則重畫這一區(qū)域
{
//以下得到這個區(qū)域頂像素坐標
r1.left=(int)((xx1-m_xStart)/blc)-1;
r1.right=(int)((xx2-m_xStart)/blc)+1;
r1.top=m_hScreen-(int)((yy2-m_yStart)/blc)-1;
r1.bottom=m_hScreen-(int)((yy1-m_yStart)/blc)+1;
InvalidateRect(r1);
}
}
//此函數(shù)用來計算由(*x1,*y1),(*x2,*y2)和(xx1,yy1),(xx2,yy2)決定的兩個區(qū)域的相交區(qū)域
//返回:TURE,兩區(qū)域相交,相交區(qū)域由(*x1,*y1),(*x2,*y2)決定
BOOL CDrawView::RectCross(float* x1,float* y1,float* x2,float* y2,float xx1,
float yy1,float xx2,float yy2)
{
float m_X1,m_Y1,m_X2,m_Y2;
m_X1=*x1; m_Y1=*y1; m_X2=*x2 ;m_Y2=*y2;
if(m_X1>xx2||m_X2<xx1||m_Y1>yy2||m_Y2<yy1) //兩個矩形區(qū)域不相交
return FALSE; //如不相交函數(shù)返回0
else //兩個矩形相交,得到相交矩形的坐標
{
*x1=max(m_X1,xx1);
*y1=max(m_Y1,yy1);
*x2=min(m_X2,xx2);
*y2=min(m_Y2,yy2);
return TRUE; //如果相交就返回1
}
}
//“刪除圖形”菜單項的對應(yīng)函數(shù),用來刪除鼠標選中的圖形
void CDrawView::OnSelectDelete()
{
CDrawDoc* pDoc = GetDocument();
CClientDC ht(this);
for(int i=0;i<pDoc->n_GraphSelect;i++) //刪除選中的圖形
Delete(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].Index);
//以下是記錄刪除圖形這一操作,供逆操作時用
pDoc->AddUndo(3,pDoc->n_GraphSelect,pDoc->GraphSelect);
ReleaseCapture();
pDoc->n_GraphSelect=0; //選中的圖形元素為0
if(pDoc->b_IsOleSelect)
{
POSITION pos=pDoc->GetStartPosition();
while(pos!=NULL)
{
CDrawCntrItem *pItem=(CDrawCntrItem *)pDoc->GetNextClientItem(pos);
if(pItem!=NULL)
{
if(pItem->b_Select)
{
pDoc->RemoveItem(pItem);
delete pItem;
m_pSelection =NULL; // set selection to last inserted item
}
}
}
pDoc->UpdateAllViews(this);
}
}
//“Cut"菜單項的對應(yīng)函數(shù),用來刪除鼠標選中的圖形并將刪除的圖形放在剪裁板
void CDrawView::OnEditCut()
{
CClientDC ht(this);
CDrawDoc* pDoc = GetDocument();
if(pDoc->WriteClipBoard())
{
for(int i=0;i<pDoc->n_GraphSelect;i++) //刪除圖形
Delete(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].Index);
//以下是記錄刪除圖形這一操作,供逆操作時用
pDoc->AddUndo(3,pDoc->n_GraphSelect,pDoc->GraphSelect);
pDoc->n_GraphSelect=0; //選中的圖形元素為0
}
}
void CDrawView::OnEditPaste()
{
m_DrawCurrent=20;
PushNumb=0;
}
//“Copy"菜單項的對應(yīng)函數(shù),用來將選中的圖形放在剪裁板
void CDrawView::OnEditCopy()
{
CDrawDoc* pDoc = GetDocument();
pDoc->WriteClipBoard(); //將圖形寫入剪裁板
}
//“Undo"菜單項的對應(yīng)函數(shù),用來實現(xiàn)完全的逆操作
void CDrawView::OnEditUndo()
{
CDrawDoc* pDoc = GetDocument();
CClientDC ht(this);
pDoc->OnEditUndo(); //進行一步逆操作
pDoc->UpdateAllViews(this); //重畫所有視圖
}
void CDrawView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
short nScrollInc;
int nNewPos;
CRect r1;
switch(nSBCode)
{
case SB_TOP:
nScrollInc=-nHScrollPos;
break;
case SB_BOTTOM:
nScrollInc=nHScrollMax-nHScrollPos;
break;
case SB_LINEUP:
nScrollInc=-nXLine;
break;
case SB_LINEDOWN:
nScrollInc=nXLine;
break;
case SB_PAGEUP:
nScrollInc=-nXPage;
break;
case SB_PAGEDOWN:
nScrollInc=nXPage;
break;
case SB_THUMBPOSITION:
nScrollInc=nPos-nHScrollPos;
break;
default:
nScrollInc=0;
}
nNewPos=max(0,min(nHScrollPos+nScrollInc,nHScrollMax));
nScrollInc=nNewPos-nHScrollPos;
if(nScrollInc) //如果產(chǎn)生了滾動
{
nHScrollPos=nNewPos; //設(shè)定新的滾動位置
SetScrollPos(SB_HORZ,nHScrollPos);
UpdateWindow();//使?jié)L動條的位置改動在屏幕上實現(xiàn)
m_xStart=m_xStart+blc*nScrollInc*nScrollMin;//調(diào)整縱坐標使圖形產(chǎn)生滾動
GetClientRect(&r1); //得到客戶區(qū)的矩形邊界
if(abs(nScrollInc)*nScrollMin<r1.right) //如果滾動后的屏幕與滾動前有重疊
{
if(nScrollInc>0) //如果是圖形向上滾動
r1.left=nScrollInc*nScrollMin; //得到滾動屏幕上重疊區(qū)域的矩形
else //如果圖形向下滾動
r1.right=r1.right-nScrollInc*nScrollMin; //得到重疊區(qū)域的矩形
ScrollWindow(-nScrollInc*nScrollMin,0,r1); //滾動重疊的區(qū)域
if(nScrollInc>0) //如果是向上滾動
r1.left=r1.right-nScrollInc*nScrollMin; //得到需要重畫的區(qū)域
else //如果是向下滾動
r1.right=-nScrollInc*nScrollMin; //得到需要重畫的區(qū)域
InvalidateRect(r1,0); //對圖形進行局部重畫
}
else //如果滾動后的區(qū)域與滾動前的區(qū)域沒有重疊,則全屏重畫
Invalidate();
//恢復(fù)矩形rr原來的坐標
// r.left=0;
// r.right=ScreenWide;
}
/*
if(nScrollInc)
{
nHScrollPos=nNewPos;
SetScrollPos(SB_HORZ,nHScrollPos);
UpdateWindow();
startx=startx+blc*nScrollInc*nScrollMin;
Screenxy[numb][0]=startx;
Invalidate();
r.top=0;
r.bottom=ScreenHigh;
}*/
CView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CDrawView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
short nScrollInc;
int nNewPos;
CRect r1;
switch(nSBCode) //判斷按鍵位置
{
case SB_TOP: //如果將滾動條滾動到頂部
nScrollInc=-nVScrollPos; //得到相對滾動范圍
break;
case SB_BOTTOM: //如果將滾動條滾動到底部
nScrollInc=nVScrollMax-nVScrollPos; //得到相對的滾動范圍
break;
case SB_LINEUP: //如果按了滾動條中的向上的按鍵
nScrollInc=-nYLine; //得到相對滾動位置
break;
case SB_LINEDOWN: //如果按中了向下的按鍵
nScrollInc=nYLine; //得到相對的滾動位置
break;
case SB_PAGEUP: //如果按中了中間活動按鈕的上部區(qū)域
nScrollInc=-nYPage; //得到相對的滾動位置
break;
case SB_PAGEDOWN: //如果按中了中間活動鈕的下部位置
nScrollInc=nYPage; //得到相對的滾動位置
break;
case SB_THUMBPOSITION: //如果用鼠標拖動中間活動鈕到一個位置
nScrollInc=nPos-nVScrollPos; //通過信息處理函數(shù)得到的按鈕位置得到相對移動位置
break;
default:
nScrollInc=0;
}
//進行滾動邊界檢查,得到實際的滾動位置(不能超出滾動條的滾動范圍)
nNewPos=max(0,min(nVScrollPos+nScrollInc,nVScrollMax));
//得到實際的相對滾動范圍
nScrollInc=nNewPos-nVScrollPos;
if(nScrollInc) //如果產(chǎn)生了滾動
{
nVScrollPos=nNewPos; //設(shè)定新的滾動位置
SetScrollPos(SB_VERT,nVScrollPos);
UpdateWindow();//使?jié)L動條的位置改動在屏幕上實現(xiàn)
m_yStart=m_yStart-blc*nScrollInc*nScrollMin;//調(diào)整縱坐標使圖形產(chǎn)生滾動
GetClientRect(&r1); //得到客戶區(qū)的矩形邊界
if(abs(nScrollInc)*nScrollMin<r1.bottom) //如果滾動后的屏幕與滾動前有重疊
{
if(nScrollInc>0) //如果是圖形向上滾動
r1.top=nScrollInc*nScrollMin; //得到滾動屏幕上重疊區(qū)域的矩形
else //如果圖形向下滾動
r1.bottom=r1.bottom+nScrollInc*nScrollMin; //得到重疊區(qū)域的矩形
ScrollWindow(0,-nScrollInc*nScrollMin,r1); //滾動重疊的區(qū)域
if(nScrollInc>0) //如果是向上滾動
r1.top=r1.bottom-nScrollInc*nScrollMin; //得到需要重畫的區(qū)域
else //如果是向下滾動
r1.bottom=-nScrollInc*nScrollMin; //得到需要重畫的區(qū)域
InvalidateRect(r1,0); //對圖形進行局部重畫
//pbdy=1;
}
else //如果滾動后的區(qū)域與滾動前的區(qū)域沒有重疊,則全屏重畫
Invalidate();
}
CView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CDrawView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_HOME:
OnHScroll(SB_PAGEUP,0,NULL);
break;
case VK_END:
OnHScroll(SB_PAGEDOWN,0,NULL);
break;
case VK_PRIOR:
OnVScroll(SB_PAGEUP,0,NULL);
break;
case VK_NEXT:
OnVScroll(SB_PAGEDOWN,0,NULL);
break;
case VK_UP:
OnVScroll(SB_LINEUP,0,NULL);
break;
case VK_DOWN:
OnVScroll(SB_LINEDOWN,0,NULL);
break;
case VK_LEFT:
OnHScroll(SB_LINEUP,0,NULL);
break;
case VK_RIGHT:
OnHScroll(SB_LINEDOWN,0,NULL);
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CDrawView::OnChangeDlgEdit()
{
char p1[7];
CMainFrame* p_Wnd=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
p_Wnd->m_wndDlgBar.GetDlgItemText(IDC_EDIT1,p1,6);
m_LineWide=(unsigned char)atoi(p1);
}
void CDrawView::OnChangeDlgCom()
{
CMainFrame* p_Wnd=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
CComboBox* plist=(CComboBox*)(p_Wnd->m_wndDlgBar.GetDlgItem(IDC_COMBO1));
m_LineType=(unsigned char)plist->GetCurSel();
}
void CDrawView::OnBitmapCut()
{
CBitmap Bitmap;
CClientDC ht(this);
CDC MemDC;
RECT r1;
GetClientRect(&r1);
Bitmap.CreateCompatibleBitmap(&ht,r1.right-r1.left,r1.bottom-r1.top);
MemDC.CreateCompatibleDC(&ht);
MemDC.SelectObject(&Bitmap);
MemDC.BitBlt(0,0,r1.right-r1.left,r1.bottom-r1.top,&ht,0,0,SRCCOPY);
ht.BitBlt(0,0,r1.right-r1.left,r1.bottom-r1.top,&MemDC,100,100,SRCCOPY);
if(!OpenClipboard())
return;
EmptyClipboard();
::SetClipboardData(CF_BITMAP,Bitmap.m_hObject);
Bitmap.Detach();
CloseClipboard();
}
void CDrawView::OnBitmapPaste()
{
CClientDC ht(this);
CBitmap Bitmap;
BITMAP BitmapInfo;
HANDLE HBitmap;
CDC MemDC;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -