1.在画图时,如画直线,长方形,在view中的mousemove消息时显示图像变化,但是不刷新前会留下以前鼠标拖动时留下的痕迹,如果在每次mousemove的末尾加入this->invalidate(NULL)又会使画面极度闪动,而且当前鼠标拖到的位置都不会显示出图像,只有在LBUTTONUP时才显示.知如何解决.
2.我可以保存文件,但是保存文件没有后缀名,即保存文件时的那个对话框是*.*,不知如何加入后缀名。
3.我想加入移动图形的功能,即可以选中图形后,随鼠标拖动而图形移动,BUTTONUP时,图形确定位置,给些提示。
2.我可以保存文件,但是保存文件没有后缀名,即保存文件时的那个对话框是*.*,不知如何加入后缀名。
3.我想加入移动图形的功能,即可以选中图形后,随鼠标拖动而图形移动,BUTTONUP时,图形确定位置,给些提示。
2....
3.同1,如果使用了双缓存绘图,这个功能就很好实现了...只需在调用BitBlt时改变坐标值就行了...
pDC->SetROP2(R2_XORPEN);pDC->MoveTo(...);
//第一次调用,画线
pDC->LineTo(...);
//第二次调用,檫除之前的线(两次画在同一位置)
pDC->LineTo(...);
struct sLine
{
CPoint startPoint;
CPoint endPoint;
}
2,然后设置画图模式:
pDC->SetRop2(R2_NOTXORPEN);
3,然后开始画图,在鼠标按下事件中画图:
sLine.startPoint.x = x;
sLine.startPoint.y = y;
sLine.endPoint.x = x;
sLine.endPoint.y = y;
pDC->MoveTo(sLine.startPoint.x,sLine.startPoint.y);
pDC->LineTo(sLine.endPoint.x,sLine.endPoint.y);
//设置画图状态
bDrawLine = true;
在鼠标移动事件中:
//检测画图状态
if(!bDrawLine)
return;
//擦掉原来的图
pDC->MoveTo(sLine.startPoint.x,sLine.startPoint.y);
pDC->LineTo(sLine.endPoint.x,sLine.endPoint.y);
//画新图
pDC->MoveTo(sLine.startPoint.x,sLine.startPoint.y);
pDC->MoveTo(x,y);
//存储新图
sLine.endPoint.x = x;
sLine.endPoint.y = y;
在鼠标抬起事件中:
//取消画图状态
bDrawLine = false;
双缓冲是不错的解决方法
另外建议楼主也看看 GDI+方面的东西第二个问题是保存文件时 FileDialog的过滤器设置 CFileDialog Save(FALSE,NULL,NULL,OFN_HIDEREADONLY,NULL,NULL); //函数构造时要传参
Save.m_ofn.lpstrTitle="保存文件"; //对话框标题
Save.m_ofn.lpstrFilter="文本文件(*.txt)\0*.txt\0所有文件(*.*)\0*.*\0\0";//文件过滤
//获取保存文件名
CFileDialog dlgFile(FALSE, NULL, NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"dat文件(*.dat)|*.dat");
if(dlgFile.DoModal()!=IDOK)
return;
CString str = dlgFile.GetPathName();//保存文件
FILE *f = fopen((LPSTR)(LPCTSTR)str, "write");
if(!f)
{
AfxMessageBox("File open failed!");
return;
}
......//文件书写部分略
移动图形位置,首先LBUTTONDOWM时将图形变灰,也就是将它的颜色变灰--可以RGB(X1,X2,X3)-->RGB(X1-y,X2-y,X3-y);不过这样可能速度较慢,可以考虑使用一个图层罩在原背景上,两者进行透明颜色运算;
接着MOUSEMOVE中绘制一个空心的虚线框--用于表示图形移动后的位置,虚线框可以用pDC->MoveTo,pDC->LineTo绘制四条直线组成,并且跟随鼠标运动;
最后当然是LBUTTONUP事件,需要完成两个动作--擦除背景和重新绘制,将原先图形所在的矩形区域擦除掉--用你的背景色擦出,然后在新的矩形区域上面将图像绘制出来。
这样就完成了一个图形的移动了。使用MS的产品VC++来做就这么简单。