VC菜鸟之路03_利用MFC绘制动态矩阵图——03
2009-12-18 16:05
288 查看
继续,接下来需要做的是对鼠标点击的响应。我需要当鼠标点击客户区时,判断出鼠标的位置然后找到鼠标对应的输入输出,并且对鼠标锁对应的输入输出线的交点上做标记(画圆)。
流程很简单,首先还是遍历找到鼠标锁对应的输入输出,然后找到其交点,以交点为圆心,画一个圆。需要注意的是,因为输出只能对应一个输入,因此在同一输出线上,只能同时有一个圆。因此找到交点后首先需要判断这条输出线上是否有其他圆,有话就对此进行擦除。我采用的方法是定义一维动态数组,数组中存放输出线上的交点坐标,每次画圆之后保存输出线上的坐标点,下次画圆之前首先擦除这次保存的坐标点。另外,因为窗口的切换或者最小化都会导致客户区的重绘,因此每次绘图后需要将数据保存,在下次显示时重绘。代码如下:
void CMy123View::OnLButtonDown(UINT nFlags, CPoint point)
{
CFormView::OnLButtonDown(nFlags, point);
CRect rect(XLeft,YTop,XRight,YBotton);//定义画布大小
CDC* pDC=GetDC();
pDC->SetROP2(R2_NOTXORPEN);//设置二次绘图消除效果
CPen pen(PS_SOLID,2,RGB(255,0,0));//定义一个画笔
CPen* pOldPen=pDC->SelectObject(&pen);//选中画笔
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);//设置画刷背景为空
if ( rect.PtInRect( point ) )//判断鼠标是否在画布范围内
{
for( j=1;j<=N_InPut;j++)//遍历
{
CRect rc_x(XLeft+((XRight-XLeft)/N_Max*j)-(XRight-XLeft)/(2*(N_Max))+1,
YTop,
XLeft+((XRight-XLeft)/N_Max*j)+(XRight-XLeft)/(2*(N_Max))-1,
YBotton);
if(rc_x.PtInRect(point))
{
for( i=1;i<=N_OutPut;i++ )
{
CRect rc_y(XLeft,
YTop+((YBotton-YTop)/N_Max)*(i+1)-(YBotton-YTop)/(2*N_Max)+1,
XRight,
YTop+((YBotton-YTop)/N_Max)*(i+1)+(YBotton-YTop)/(2*N_Max)-1);
if(rc_y.PtInRect(point))
{
//pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);
int X0=XLeft+((XRight-XLeft)/N_Max*j);
int Y0=YTop+((YBotton-YTop)/N_Max)*(i+1);
int X1=X0-((XRight-XLeft)/(N_Max*3));
int Y1=Y0-((XRight-XLeft)/(N_Max*3));
int X2=X0+((XRight-XLeft)/(N_Max*3));
int Y2=Y0+((XRight-XLeft)/(N_Max*3));
m1[i]=X1;
n1[i]=Y1;
m2[i]=X2;
n2[i]=Y2;//保留此次绘图坐标
pDC->Ellipse(X1,Y1,X2,Y2);//画圆
}
}
}
}
}
ReleaseDC(pDC);注销pDC
}
上面是鼠标点击相应函数。重绘时需要在OnDraw()中加入以下代码:
for(i=1;i<N_Max;i++)
{
pDC->SetROP2(R2_NOTXORPEN);//定义二次绘图消除效果
CPen open(PS_SOLID,2,RGB(255,0,0));
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);
pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);//恢复
}
做到这一步,绘图方面基本上就完成了,剩下的就是功能函数了,效果图如下:
流程很简单,首先还是遍历找到鼠标锁对应的输入输出,然后找到其交点,以交点为圆心,画一个圆。需要注意的是,因为输出只能对应一个输入,因此在同一输出线上,只能同时有一个圆。因此找到交点后首先需要判断这条输出线上是否有其他圆,有话就对此进行擦除。我采用的方法是定义一维动态数组,数组中存放输出线上的交点坐标,每次画圆之后保存输出线上的坐标点,下次画圆之前首先擦除这次保存的坐标点。另外,因为窗口的切换或者最小化都会导致客户区的重绘,因此每次绘图后需要将数据保存,在下次显示时重绘。代码如下:
void CMy123View::OnLButtonDown(UINT nFlags, CPoint point)
{
CFormView::OnLButtonDown(nFlags, point);
CRect rect(XLeft,YTop,XRight,YBotton);//定义画布大小
CDC* pDC=GetDC();
pDC->SetROP2(R2_NOTXORPEN);//设置二次绘图消除效果
CPen pen(PS_SOLID,2,RGB(255,0,0));//定义一个画笔
CPen* pOldPen=pDC->SelectObject(&pen);//选中画笔
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);//设置画刷背景为空
if ( rect.PtInRect( point ) )//判断鼠标是否在画布范围内
{
for( j=1;j<=N_InPut;j++)//遍历
{
CRect rc_x(XLeft+((XRight-XLeft)/N_Max*j)-(XRight-XLeft)/(2*(N_Max))+1,
YTop,
XLeft+((XRight-XLeft)/N_Max*j)+(XRight-XLeft)/(2*(N_Max))-1,
YBotton);
if(rc_x.PtInRect(point))
{
for( i=1;i<=N_OutPut;i++ )
{
CRect rc_y(XLeft,
YTop+((YBotton-YTop)/N_Max)*(i+1)-(YBotton-YTop)/(2*N_Max)+1,
XRight,
YTop+((YBotton-YTop)/N_Max)*(i+1)+(YBotton-YTop)/(2*N_Max)-1);
if(rc_y.PtInRect(point))
{
//pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);
int X0=XLeft+((XRight-XLeft)/N_Max*j);
int Y0=YTop+((YBotton-YTop)/N_Max)*(i+1);
int X1=X0-((XRight-XLeft)/(N_Max*3));
int Y1=Y0-((XRight-XLeft)/(N_Max*3));
int X2=X0+((XRight-XLeft)/(N_Max*3));
int Y2=Y0+((XRight-XLeft)/(N_Max*3));
m1[i]=X1;
n1[i]=Y1;
m2[i]=X2;
n2[i]=Y2;//保留此次绘图坐标
pDC->Ellipse(X1,Y1,X2,Y2);//画圆
}
}
}
}
}
ReleaseDC(pDC);注销pDC
}
上面是鼠标点击相应函数。重绘时需要在OnDraw()中加入以下代码:
for(i=1;i<N_Max;i++)
{
pDC->SetROP2(R2_NOTXORPEN);//定义二次绘图消除效果
CPen open(PS_SOLID,2,RGB(255,0,0));
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);
pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);//恢复
}
做到这一步,绘图方面基本上就完成了,剩下的就是功能函数了,效果图如下:
相关文章推荐
- VC菜鸟之路03_利用MFC绘制动态矩阵图——02
- VC菜鸟之路03_利用MFC绘制动态矩阵图
- C++实现矩阵链乘法利用动态规划及运行实例结果
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 利用SH函数绘制空间中动态物体
- MFC---如何利用菜单更新机制动态更新菜单
- MFC 动态绘制曲线 适用于串口数据接收显示
- MFC中绘制动态曲线
- MFC 等待窗口刷新 单色位图生成 程序结构及动态文本绘制
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- 在MFC/WTL中如何绘制Gif动态图片
- C++实现矩阵链乘法利用动态规划及运行实例结果
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 利用FusionCharts将Excel绘制成动态图表
- 利用贝塞尔曲线绘制(UIBezierPath)自定义iOS动态速度表,可以自定义刻度,刻度值,进度条样式
- 利用动态规划求矩阵中和最大的子矩阵
- C++实现矩阵链乘法利用动态规划及运行实例结果
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- 利用MATLAB 绘制矩阵色块图
- HTML5利用canvas绘制动态信号瀑布图