?? drawview.cpp
字號:
// The following command handler provides the standard keyboard
// user interface to cancel an in-place editing session. Here,
// the container (not the server) causes the deactivation.
void CDrawView::OnCancelEditCntr()
{
// Close any in-place active item on this view.
COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
if (pActiveItem != NULL)
{
pActiveItem->Close();
}
ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);
}
// Special handling of OnSetFocus and OnSize are required for a container
// when an object is being edited in-place.
void CDrawView::OnSetFocus(CWnd* pOldWnd)
{
COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
if (pActiveItem != NULL &&
pActiveItem->GetItemState() == COleClientItem::activeUIState)
{
// need to set focus to this item if it is in the same view
CWnd* pWnd = pActiveItem->GetInPlaceWindow();
if (pWnd != NULL)
{
pWnd->SetFocus(); // don't call the base class
return;
}
}
CView::OnSetFocus(pOldWnd);
}
//當(dāng)視圖的大小變化時被調(diào)用,cx,cy為變化后屏幕頂長、寬(像素)
void CDrawView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
CDrawDoc *pDoc=(CDrawDoc *)GetDocument();
p_Screen=pDoc->m_Screen;
m_wScreen=cx;
m_hScreen=cy;
nXPage=m_hScreen/nScrollMin; //橫向一屏的滾動范圍
nYPage=m_wScreen/nScrollMin; //縱向一屏的滾動范圍
InitVScroll();
InitHScroll();
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics
#ifdef _DEBUG
void CDrawView::AssertValid() const
{
CView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawDoc* CDrawView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers
void CDrawView::InitVScroll()
{
//得到滾動條的最大范圍
nVScrollMax=(int)(((float)m_hScreen*p_Screen[0].blc)/(blc*nScrollMin));
//得到當(dāng)前的滾動條范圍
nVScrollPos=nVScrollMax-(int)((m_yStart-p_Screen[0].sy)/(blc*nScrollMin));
//設(shè)置滾動條最大范圍和當(dāng)前位置
SetScrollRange(SB_VERT,0,nVScrollMax,TRUE);
SetScrollPos(SB_VERT,nVScrollPos);//rrr.top=0;
UpdateWindow();
}
void CDrawView::InitHScroll()
{
//得到滾動條的最大范圍
nHScrollMax=(int)(((float)m_hScreen*p_Screen[0].blc/blc)/nScrollMin);
//得到當(dāng)前的滾動條范圍
nHScrollPos=(int)((m_xStart-p_Screen[0].sx)/blc/nScrollMin);
//設(shè)置滾動條最大范圍和當(dāng)前位置
SetScrollRange(SB_HORZ,0,nHScrollMax,TRUE);
SetScrollPos(SB_HORZ,nHScrollPos);//rrr.top=0;
UpdateWindow();
}
//選中菜單“繪制圓弧”時被調(diào)用
void CDrawView::OnDrawArc()
{
PushNumb=0; //鼠標(biāo)左鍵按下次數(shù)
m_DrawCurrent=6; //標(biāo)識進(jìn)行圓弧繪制操作
}
//選中菜單“繪制圓”時被調(diào)用
void CDrawView::OnDrawCircle()
{
PushNumb=0; //鼠標(biāo)左鍵按下次數(shù)
m_DrawCurrent=4; //標(biāo)識進(jìn)行圓繪制操作
}
//選中菜單“繪制圓形區(qū)域”時被調(diào)用
void CDrawView::OnDrawCircle1()
{
PushNumb=0; //鼠標(biāo)左鍵按下次數(shù)
m_DrawCurrent=5; //標(biāo)識進(jìn)行圓形區(qū)域操作
}
//選中菜單“繪制直線”時被調(diào)用
void CDrawView::OnDrawLine()
{
PushNumb=0;
m_DrawCurrent=1; //標(biāo)識進(jìn)行直線繪制操作
}
//選中菜單“繪制連續(xù)直線”時被調(diào)用
void CDrawView::OnDrawPline()
{
PushNumb=0;
m_DrawCurrent=2; //標(biāo)識進(jìn)行連續(xù)直線繪制操作
}
//選中菜單“繪制多邊形區(qū)域”時被調(diào)用
void CDrawView::OnDrawRgn()
{
PushNumb=0;
m_DrawCurrent=3; //標(biāo)識進(jìn)行多邊形區(qū)域繪制操作
}
//選中菜單“標(biāo)注文字”時被調(diào)用
void CDrawView::OnDrawText()
{
PushNumb=0;
m_DrawCurrent=7; //標(biāo)識進(jìn)行文字標(biāo)注操作
}
//在標(biāo)注文字對話框中填入文字時被調(diào)用在屏幕上寫文字
void CDrawView::DrawText()
{
CClientDC ht(this);
//以下從標(biāo)注文字對話框中得到字體參數(shù)
m_TextString=pTextDlg->m_Text;
m_FontHeight=pTextDlg->m_FontHeight;
m_FontWide=pTextDlg->m_FontWide;
m_TextAngle=pTextDlg->m_Angle1;
m_FontAngle=pTextDlg->m_Angle2;
m_FontBetween=pTextDlg->m_FontBetween;
//對一個字體類的參數(shù)重新進(jìn)行輔值
m_Text1->Init(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,m_TextX,m_TextY
,m_TextAngle,m_FontAngle,m_FontHeight,m_FontWide,m_FontBetween,0,m_TextString);
m_Text1->Draw(&ht,0,0,m_bColor);//繪制標(biāo)注信息
}
//按‘確定'退出標(biāo)注文字對話框時被調(diào)用的函數(shù),用來增加一個標(biāo)注文字項
void CDrawView::DrawTextOnOk()
{
CDrawDoc* pDoc = GetDocument();
CClientDC ht(this);
int TextLong;
PushNumb=0;
m_TextString=pTextDlg->m_Text; //得到標(biāo)注的文字信息
TextLong=m_TextString.GetLength(); //標(biāo)注文字的長度
if(TextLong>0)
{
//增加并重新繪制標(biāo)注的文字
int id=pDoc->GetTextId();
pDoc->AddText(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,m_TextX,
m_TextY,m_TextAngle,m_FontAngle,m_FontHeight,m_FontWide,
m_FontBetween,0,TextLong,m_TextString)
->Draw(&ht,0,0,m_bColor);
pTextDlg->m_Text.Empty(); //清空標(biāo)注文字對話框中編輯框中頂文字
pTextDlg->SendMessage(WM_INITDIALOG);
//以下是記錄增加標(biāo)注信息這一操作,供逆操作時用
GraphUndo[0].Index=pDoc->GetMaxIndex(5);//此標(biāo)注文字的位置
GraphUndo[0].Lb=5; //標(biāo)注文字
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture(); //釋放捕捉的鼠標(biāo)
}
}
//按‘放棄'退出標(biāo)注文字對話框時被調(diào)用的函數(shù)
void CDrawView::DrawTextOnCancel()
{
pTextDlg->m_Text.Empty(); ////清空標(biāo)注文字對話框中編輯框中頂文字
pTextDlg->SendMessage(WM_INITDIALOG);
}
//按下鼠標(biāo)左鍵時被調(diào)用,ON_WM_LBUTTONDOWN消息的映射函數(shù)
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
float r;
float xx1,yy1,xx2,yy2;
int x1,x2,y1,y2,Lb,Index,pbh;
BOOL m_Fill;
CDrawDoc* pDoc = GetDocument(); //得到文檔指針
CClientDC ht(this);
if(m_DrawCurrent==1) //如果正在繪制直線
{
if(PushNumb==0) //如果是第一次按下左鼠標(biāo)鍵
{
PushNumb++; //做標(biāo)記表示按下鼠標(biāo)左鍵一次
mPointOrign=point; //直線的第一點等于點中點
mPointOld=point; //記錄本次點中點
SetCapture(); //捕捉鼠標(biāo)輸入
}
else if(PushNumb==1) //第二次按下左鼠標(biāo)鍵(即按下直線的結(jié)束點時)
{
//以下得到直線起終點的實際坐標(biāo)
VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
VPtoDP(point.x,point.y,&xx2,&yy2);
int id=pDoc->GetLineId(); //得到直線的唯一識別號
//增加一條直線并重新繪畫此直線
pDoc->AddLine(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
xx1,yy1,xx2,yy2)
->Draw(&ht,0,0,m_bColor);
PushNumb=0; //鼠標(biāo)按鍵次數(shù)為0,重新進(jìn)行直線的繪制
//以下是記錄增加直線這一操作,供逆操作時用
GraphUndo[0].Index=pDoc->GetMaxIndex(1);//得到此直線的序號
GraphUndo[0].Lb=1; //直線
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
}
}
else if(m_DrawCurrent==2||m_DrawCurrent==3)//正在繪制連續(xù)直線或者多邊形區(qū)域
{
//將點的坐標(biāo)存入Pointxy中
PointXyz[PushNumb].x=m_xStart+blc*point.x;
PointXyz[PushNumb].y=m_yStart+blc*(m_hScreen-point.y);
if(PushNumb==0) //如果是第一次按下左鼠標(biāo)鍵
{
SetCapture(); //捕捉鼠標(biāo)
mPointOrign=point;//原點等于點中點
mPointOld=point; //將前一個點設(shè)為點中點的坐標(biāo)
}
else //二次以上按下鼠標(biāo)左鍵時
{
mPointOrign=mPointOld; //將上一個點設(shè)為原點
mPointOld=point; //將點中點設(shè)為原點
}
PushNumb++; //記錄按下點的數(shù)目
}
else if(m_DrawCurrent==4||m_DrawCurrent==5) //如果正在繪制普通圓或者填充圓
{
if(PushNumb==0) //如果是第一次按下左鼠標(biāo)鍵
{
mPointOrign=point; //原點等于點中點
mPointOld=point; //上一個點也等于點中點
PushNumb++;
SetCapture(); //捕捉鼠標(biāo)
}
else //二次以上按下鼠標(biāo)左鍵時
{
PushNumb=0; //鼠標(biāo)按鍵次數(shù)為0,重新進(jìn)行直線的繪制
//保存圓或填充圓
r=(float)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2));
VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
if(m_DrawCurrent==4) //如果是繪制一般圓
m_Fill=0;
else
m_Fill=1;
//保存圓并以覆蓋模式重畫圓
int id=pDoc->GetCircleId();
pDoc->AddCircle(m_pColor,m_brColor,m_LineWide,m_LineType,
m_Layer,id,xx1,yy1,r,m_Fill)
->Draw(&ht,0,0,m_bColor);
ReleaseCapture(); //釋放捕捉的鼠標(biāo)
//以下是記錄增加圓這一操作,供逆操作時用
GraphUndo[0].Index=pDoc->GetMaxIndex(3); //此圓的序號
GraphUndo[0].Lb=3; //類別是圓
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
}
}
else if(m_DrawCurrent==6)//正在繪制圓弧
{
if(PushNumb==0) //第一次按下鼠標(biāo)左鍵
{
SetCapture();
DrawArcYes=0;
mPointOrign1=point; //記錄圓弧第一點
PushNumb++;
}
else if(PushNumb==1) //第二次按下鼠標(biāo)左鍵
{
mPointOrign=point; //記錄下圓弧的第二點
PushNumb++;
}
else //第三次按下鼠標(biāo)鍵
{
//計算圓弧的特征參數(shù)
jsarc(mPointOrign1,mPointOrign,point,&m_CircleX,&m_CircleY,
&m_CircleR,&m_Angle1,&m_Angle2);
//增加一個圓弧并重新繪制圓弧
int id=pDoc->GetArcId();
pDoc->AddArc(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
m_CircleX,m_CircleY,m_CircleR,0,m_Angle1,m_Angle2)
->Draw(&ht,0,0,m_bColor);
PushNumb=0; ////鼠標(biāo)按鍵次數(shù)為0,重新進(jìn)行圓弧的繪制
ReleaseCapture(); //釋放捕捉的鼠標(biāo)
//以下是記錄增加圓弧這一操作,供逆操作時用
GraphUndo[0].Index=pDoc->GetMaxIndex(4); //此圓弧的序號
GraphUndo[0].Lb=4; //類別是圓弧
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
}
}
else if(m_DrawCurrent==7) //進(jìn)行標(biāo)注文字的操作
{
VPtoDP(point.x,point.y,&m_TextX,&m_TextY);
if(!pTextDlg) //如果標(biāo)注文字對話框不存在,產(chǎn)生對話框
{
//初始畫形成一個標(biāo)注文字對話框
pTextDlg=new TextWriteDlg(this,m_TextString,m_FontHeight,m_FontWide,
m_TextAngle,m_FontAngle,m_FontBetween);
ASSERT(pTextDlg);
}
if(!(pTextDlg->IsOpen())) //如果對話框沒有打開
{
pTextDlg->Create(ID_WRITE_TEXT,this);
}
if(!(pTextDlg->IsVisible()))//如果對話框當(dāng)前不可見
{
pTextDlg->ShowWindow(SW_SHOW); //使標(biāo)注文字對話框可見
}
}
else if(m_DrawCurrent==11||m_DrawCurrent==12||m_DrawCurrent==50) //正在進(jìn)行圖形放大或圖形移動
{
if(PushNumb==0) //如果第一次按下鼠標(biāo)左鍵
{
mPointOrign=point; //原點等于點中點
mPointOld=point; //上一個點等于點中點
PushNumb++; //按鍵數(shù)增加1
SetCapture(); //捕捉鼠標(biāo)
}
else if(PushNumb==1)//第二次按下左鍵
{
if(m_DrawCurrent==11) //圖形放大
{
//得到左下點和右上點
x1=min(mPointOrign.x,point.x);
y1=max(mPointOrign.y,point.y);
x2=max(mPointOrign.x,point.x);
y2=min(mPointOrign.y,point.y);
//改變原點的坐標(biāo)
VPtoDP(x1,y1,&m_xStart,&m_yStart);
//改變比例
float bl1=(float)m_wScreen/(float)(x2-x1); //橫向放大比例
float bl2=(float)m_hScreen/(float)(y1-y2); //縱向放大比例
if(bl2<bl1)
bl1=bl2; //取較小的變化比例
if(bl1>0)
blc=blc/bl1; //改變顯示比例
pDoc->AddScreen(m_xStart,m_yStart,blc); //保存本屏的參數(shù)
InitVScroll();
InitHScroll();
Invalidate(); //使圖形重畫
}
else if(m_DrawCurrent==12) //圖形移動操作
{
//改變原點(左下角點)的實際坐標(biāo)
m_xStart=m_xStart-blc*(point.x-mPointOrign.x);
m_yStart=m_yStart+blc*(point.y-mPointOrign.y);
pDoc->AddScreen(m_xStart,m_yStart,blc); //保存本屏的參數(shù)
InitVScroll();
InitHScroll();
Invalidate(); //使圖形重畫
}
else if(m_DrawCurrent==50) //如果是插入OLE對象操作
{
//得到左下點和右上點
x1=min(mPointOrign.x,point.x);
y1=max(mPointOrign.y,point.y);
x2=max(mPointOrign.x,point.x);
y2=min(mPointOrign.y,point.y);
COleInsertDialog dlg;
if (dlg.DoModal() != IDOK)
return;
BeginWaitCursor();
CDrawCntrItem* pItem = NULL;
TRY
{
pItem = new CDrawCntrItem(pDoc);
ASSERT_VALID(pItem);
if (!dlg.CreateItem(pItem))
AfxThrowMemoryException(); // any exception will do
ASSERT_VALID(pItem);
if (dlg.GetSelectionType()==COleInsertDialog::createNewItem)
pItem->DoVerb(OLEIVERB_SHOW, this);
ASSERT_VALID(pItem);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -