📄 p_rview.cpp
字号:
SetCapture(); //捕捉鼠标
if(m_TotleObj==0)
{
dc.MoveTo(rc.left+10,point.y);
dc.LineTo(point.x,point.y); //重画移动到点的直线
// if(m_RgnPoint!=NULL)
// delete m_RgnPoint;
m_RgnPoint=new CPoint[2];
g_Terrain =new Terrain[100];
int g=sizeof(Terrain);
m_RgnPoint[0]=CPoint(rc.left+10,point.y);
m_RgnPoint[1]=CPoint(point);
g_Terrain[g_SumTer]=Terrain(CPoint(rc.left+10,point.y),point);//给地形类赋值
g_SumTer++;
//Terrain p(CPoint(rc.left+10,point.y),point);
//g_Terrain[0]=p;
m_TotleObj++;
m_PointOrign= point;//得出画地形时的原始点
m_PointOld = point;//得到画地形时的前一点
g_HaveTerrain=true;
}
else
{
dc.MoveTo(m_PointOrign);
dc.LineTo(m_PointOld); //重画移动到点的直线
m_TotleObj++;
m_RgnPoint=(CPoint*)realloc(m_RgnPoint,sizeof(CPoint)*(m_TotleObj+1));//重新分配空间
// g_Terrain =(Terrain*)realloc(g_Terrain, sizeof(Terrain)*(++g_SumTer));//重新分配空间
//同时地形总个数自增
g_Terrain[g_SumTer]=Terrain(m_PointOrign,point);//给地形类赋值
g_SumTer++;
m_RgnPoint[m_TotleObj]=point;
m_PointOrign= point;//得出画地形时的原始点
m_PointOld = point;//得到画地形时的前一点
}
CBrush b;
b.CreateSolidBrush(RGB(0,255,0)); // 创建填充色画刷
CBrush* pOldBrush;
pOldBrush=(CBrush*)dc.SelectObject(&b);//选择对象进DC
dc.SelectObject(pOldBrush);//恢复系统画刷
b.DeleteObject();//删除临时画刷
break;
}
}
dc.SelectObject(pOldPen); //恢复画笔
CView::OnLButtonDown(nFlags, point);
}
void CP_RView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bLdown=false; //鼠标按下为假
ReleaseCapture(); //释放鼠标
CView::OnLButtonUp(nFlags, point);
}
void CP_RView::OnMouseMove(UINT nFlags, CPoint point)
{
// m_OldPoint=point;//为了画第一道线而设
CClientDC dc(this);
CString str; //零时字符串
OnPrepareDC(&dc);
CMainFrame * pFrame = (CMainFrame *) AfxGetApp()->m_pMainWnd;//得到主框架指针
CStatusBar * pStatus = (CStatusBar *) &pFrame->m_wndStatusBar;//得到状态栏指针
CPoint m_ptMouse;//记录当前点
m_ptMouse = point;
str.Format ("坐标 X=%i pixel, Y=%i pixel", m_ptMouse.x, m_ptMouse.y);
pStatus->SetPaneText(0, str);//显示坐标
//以上程序是为了在状态栏中显示坐标
CRect rc;
GetClientRect(&rc);//得到视图区大小
switch(NOWACTION)
{
case NULLACTION:
{
if(m_bLdown==true)
if(OnPoint)
{
InvalidateRect(CRect((int)g_fEXAxis-6,(int)g_fEYAxis-6,
(int)g_fEXAxis+76,(int)g_fEYAxis+26),true);//重画放炮点区域
CRect rc;
GetClientRect(&rc);
if(point.x<rc.left+10)
point.x=rc.left+10;
if(point.y<rc.top+10)
point.y=rc.top+10;
if(point.x>rc.right-10)
point.x=rc.right-10;
if(point.y>rc.bottom-10)
point.y=rc.bottom-10;
g_fEXAxis=(float)point.x;
g_fEYAxis=(float)point.y;
}
break;
}
case DRAWTERRAIN:
{
dc.SetROP2(R2_NOT);//选择反色的绘画模式
if(m_TotleObj==0)
{
if(m_OldPoint!=point)
{
dc.MoveTo(rc.left+10,m_OldPoint.y);
dc.LineTo(m_OldPoint.x,m_OldPoint.y); //擦除原来的直线
dc.MoveTo(rc.left+10,point.y);
dc.LineTo(point.x,point.y); //重画移动到点的直线
m_OldPoint = point;
}
}
//dc.SelectStockObject(NULL_BRUSH);
//dc.SetROP2(R2_NOT); //选择反色的绘画模式
//如果鼠标的现在移动点与上一个点不相同
//将上一个顶点到上一个移动点的直线擦除,绘制从上一个顶点到移动点的直线
else
{
if(m_PointOld!=point)
{
dc.MoveTo(m_PointOrign);
dc.LineTo(m_PointOld); //擦除原来的直线 ;
dc.MoveTo(m_PointOrign);
dc.LineTo(point); //重画移动到点的直线
m_PointOld=point;
}
}
}
break;
}
CView::OnMouseMove(nFlags, point);
}
void CP_RView::OnButtonErase()
{
Invalidate(true);//搽除所有点
NOWACTION = NULLACTION; //当前动作置为空
m_hMouseCursor=LoadCursor(NULL,IDC_ARROW);//恢复系统鼠标指针
::SetCursor(m_hMouseCursor);
}
BOOL CP_RView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
ASSERT(m_hMouseCursor!=NULL);
::SetCursor(m_hMouseCursor);
return TRUE;
}
void CP_RView::OnContextMenu(CWnd* pWnd, CPoint point)
{
if(NOWACTION != NULLACTION)
return;
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME); //这个ID对应你在资源中创建的一个菜单
CMenu *submenu=menu.GetSubMenu(3); //对应你自定义菜单的第一列
submenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);//显示菜单
}
void CP_RView::OnFileOpen()
{
Invalidate(true);
//Invalidate(true);
//g_Array.
//g_Array.SaveArray(false);
}
void CP_RView::OnFileSave()
{
}
void CP_RView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
}
void CP_RView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen(0,3,RGB(4,36,255)); //创建画笔
CPen* pOldPen=dc.SelectObject(&pen);//选入画笔
CRect rc;
GetClientRect(&rc);//得到视图区大小
switch(NOWACTION)
{
case DRAWTERRAIN:
{
dc.MoveTo(m_PointOrign);
dc.LineTo(point); //擦除原来的直线
//g_Terrain =(Terrain*)realloc(g_Terrain, sizeof(Terrain)*(++g_SumTer));//重新分配空间
//同时地形总个数自增
g_Terrain[g_SumTer]=Terrain(m_PointOrign,point);//给地形类赋值
g_SumTer++;
m_TotleObj++;
m_RgnPoint=(CPoint*)realloc(m_RgnPoint,sizeof(CPoint)*(m_TotleObj+4));//重新分配空间
m_RgnPoint[m_TotleObj]=point;
dc.MoveTo(point);
dc.LineTo(rc.right-10,point.y); //擦除原来的直线
// g_Terrain =(Terrain*)realloc(g_Terrain, sizeof(Terrain)*(++g_SumTer));//重新分配空间
//同时地形总个数自增
g_Terrain[g_SumTer]=Terrain(point,CPoint(rc.right-10,point.y)); //给地形类赋值
g_SumTer++;
m_TotleObj++;
m_RgnPoint[m_TotleObj]=CPoint(rc.right-10,point.y);
m_RgnPoint[m_TotleObj+1]=CPoint(rc.right-10,rc.bottom-10);
m_RgnPoint[m_TotleObj+2]=CPoint(rc.left+10,rc.bottom-10); //
m_Rgn.CreatePolygonRgn(m_RgnPoint,m_TotleObj+3,WINDING);
CBrush pointKnob(::GetSysColor(COLOR_3DSHADOW));
//
dc.FillRgn(&m_Rgn, &pointKnob);
pointKnob.DeleteObject();
NOWACTION = NULLACTION; //当前动作置为空
m_hMouseCursor=LoadCursor(NULL,IDC_ARROW);//恢复系统鼠标指针
Invalidate(true);
::SetCursor(m_hMouseCursor);
RayBegin();
}
break;
}
dc.SelectObject(pOldPen); //恢复画笔
CView::OnLButtonDblClk(nFlags, point);
}
void CP_RView::Center(CPoint *point,int totle,int *xp,int *yp)
{
int sumx=0,sumy=0;
for(int i=0;i<totle;i++)
{
sumx+=point[i].x;
sumy+=point[i].y;
}
sumx+=point[i-1].x;
sumy+=point[i-1].y;
sumx+=point[i-2].x;
sumy+=point[i-2].y;
sumx+=point[i-1].x;
sumy+=point[i-1].y;
sumx+=point[i-2].x;
sumy+=point[i-2].y;
*xp=int((float)sumx/(totle+4));
*yp=int((float)sumy/(totle+4));
}
void CP_RView::RayBegin()
{
//g_fEXAxis;//炮点x坐标
// g_fEYAxis;//炮点y坐标
CRect rc;
GetClientRect(&rc);//得到视图区大小
/*
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
// 0 行 1 列对应于右面的CVPNView
int row = 0, col = 1;
// 得到分割条的指针
CSplitterWnd* pSplitter = &pMainWnd->m_wndSplitter;
CView* pOldActiveView = (CView* )pSplitter->GetPane(row,col);
CClientDC dc(this);
pOldActiveView->OnDraw(&dc);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -