这两天学习GDI绘制连续的折线,采用鼠标点击输入关键点,并同步在客户区中绘制出来。
为防止闪烁,采用了双缓存技术。绘图的同时,需要显示一张背景图片。
出现的问题是:
当折线绘制完发现有个别关键点位置不对,需要修改关键点位置,此时选中关键点、移动关键点都实现了,
但是,移动时,与该关键点相连的橡皮线显示不正确,移过的地方都成黑色的一片,分不出最后绘制的线在哪里了,
我绘制时也采用了setRop2()操作,不使用双缓存时直接在一个DC中画时,显示正常.不知该如何绘制了,请高手帮助,谢谢。
联系方式是:
[email protected],或QQ:82280347
为防止闪烁,采用了双缓存技术。绘图的同时,需要显示一张背景图片。
出现的问题是:
当折线绘制完发现有个别关键点位置不对,需要修改关键点位置,此时选中关键点、移动关键点都实现了,
但是,移动时,与该关键点相连的橡皮线显示不正确,移过的地方都成黑色的一片,分不出最后绘制的线在哪里了,
我绘制时也采用了setRop2()操作,不使用双缓存时直接在一个DC中画时,显示正常.不知该如何绘制了,请高手帮助,谢谢。
联系方式是:
[email protected],或QQ:82280347
解决方案 »
- VS2010在WIN7 与 XP 下的子窗口刷新问题
- Windows7 画图
- 弱弱的问题!!!我创建连接.mdb工程的时候,系统总提示我不能识别数据库格式,这是怎么回事??
- 郁闷,怎么在drop list的combobox中设置当前值?
- ADO调用Excel类库实现打印及预览,运行时出现的问题。求教,急~!!
- CFormView中有没有类似CDialog的OnInitDialog()函数?
- 那位能介绍一下低级波形音频API中缓冲区的使用方法
- 基于对话框的程序,开机自动启动时,运行了主程序但没有显示对话框?
- 抢分啊~~~~~,关于CSocket的简单奇怪的问题!!
- 请教早绑定(early binding)的问题,谢谢!
- 想做一个邮件提示 - 比如 收到新邮件,
- 这样的SQL语句怎么写
{
CDC *pdc = this->GetDC( );
CDC MenDC;
CBitmap bm;
CRect rt;
GetClientRect( &rt );
MenDC.CreateCompatibleDC( pdc );
bm.CreateCompatibleBitmap( pdc, rt.Width( ), rt.Height( ) );
MenDC.SelectObject( &bm );
//-------------------------------------------------------------------
Graphics graphics( MenDC.m_hDC ); //这里使用内存DC的句柄生成Graphics
DrawAll( &graphics ); //假设你在这个DrawAll函数中去绘制了背景等(绘制折线前所需要绘制的所有东西)
DrawMouseMovePolygn(&graphics); //在这里绘制鼠标移动过程中的折线。
//-------------------------------------------------------------------
pdc->BitBlt( 0, 0, rt.Width( ), rt.Height( ), &MenDC, 0, 0, SRCCOPY ); //从内存DC贴图到屏幕DC
MenDC.DeleteDC( );
bm.DeleteObject( );
ReleaseDC( pdc );
C***::OnMouseMove( nFlags, point );
}
楼主看看上面鼠标移动时的概略代码。多点折线进行鼠标调整大致上应该按照这样的步骤:1.声明数组Ary 为PointF[]类型(CArray最好,可以动态添加)
2.设定两个状态 一是用户输入点的状态 二是用户输入点完成状态 通过BOOL型来控制。这里不多说了 只要鼠标落下就采集点 直到采集结束(双击?)
3.用户采集完成后Ary里面有相应的点了。在OnDraw或者OnPaint中直接绘制折线即可
Graphics graphics( pDC->m_hDC ); //这里使用OnDraw中的pDC的句柄生成Graphics
DrawAll( &graphics ); //仍然先绘制底图等
DrawPolygn(&graphics); //这里直接绘制折线,Ary设为类成员变量,在DrawPolygn中使用
4.设定各种标志 例如鼠标落下BOOL DFg; 鼠标拖动BOOL FRg; 还有鼠标落下点记录 PointF DPt; 当前选中点INT CurrentSelectDot;等
5.鼠标录下的时候 给各个点建立选中区域Region Dgn[]; 使用For循环查找鼠标是否选中某个点 如果选中设定CurrentSelectDot 否则CurrentSelectDot = -1;
6.鼠标移动的时候,检查CurrentSelectDot是否大于-1 如果大于-1 生成一个临时PointF MovePt;来代替CurrentSelectDot的对应位置 同时CurrentSelectDot前后两个点与CurrentSelectDot这个点之间使用虚线连接 其他为实线。
7.用户移动完毕 鼠标抬起的时候 用鼠标抬起点 UpPt来重新设定Ary中CurrentSelectDot对应的点 实现数组更新。基本上就是这样了 楼主可以去试试这个思路 我一直是这样来弄的。
首先,必须保存好背景,也就是将实际数据先画出来,画在一个缓冲a里面,比如BMP什么的
其次,在进行一下改变操作的时候,这样做:
1、将保存好的缓冲a的数据取出来,拷贝到缓冲b
2、在缓冲b里面画过程,比如当前拖动的位置导致线的新位置(最好用其它颜色标志动态的色彩)
3、将缓冲B贴出来