怎样实现画图板中,选中一块区域 拖拉移动的功能? 微软的画图板小程序 有个功能是选中一块区域 然后可以剪切出来的功能。矩形差不多搞定,多边形的那个选取是怎么做的呢?给点提示吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多边形应该牵扯到数学里的问题了。我觉得可以从CDC的根本上去着手。我们把屏幕上的每个点做为一个结构对象,那么图像就是一个结构对象链表结构里包括(坐标,颜色值等)。那么多边形也是这么一个链表,这个链表里有多少个点,哪些点,就要靠数学去计算了 现在有了一些基本的思路1:算出图形的最小外接矩形2:把图形外和小矩形的空隙全部画线填充为单色3:用TransparentBlt转换成透明的位图。第二步骤的时候 出了很多问题。大家帮我看看。算法是收集鼠标画轮廓的时候的移动点集,然后遍历这个点集 找出Y坐标相同的两个点 然后从矩形框的边往这个点连线,最终目的可以把空隙全部填充完。这是我的算法参数points是监控mousemove收集到的点集,mixRect是鼠标勾画轮廓时候的最小外界矩形,memDc即是用作画线的设备上下文.void ConvertToOriginalRectPicture(CArray<CPoint,CPoint> &points, CRect& mixRect, CDC &memDc){ CPoint ptTemp = NULL; int iNumSameY = 0; long lY = 0;//矩形从上往下扫描 CArray<CPoint,CPoint> linePoints; CPen pen(PS_SOLID,1,RGB(0,255,255)); CPen* oldPen = (CPen*)memDc.SelectObject(&pen); int size = points.GetSize(); for (int n = 0;n < size ;n++) { if ( (n+1) == size) { break; } //Bresenham(points[n].x,points[n].y,points[n+1].x,points[n+1].y,points); GenerateAllPointsBetween2points(points[n],points[n+1],points); } int z = 0; for (int j = 0;j<(mixRect.bottom - mixRect.top);j++) { linePoints.RemoveAll(); lY = mixRect.top + j; for (int i = 0;i<points.GetSize();i++) { if(lY == points[i].y) { iNumSameY++; if (2 == iNumSameY) { linePoints.Add(ptTemp); linePoints.Add(points[i]); iNumSameY = 0; } ptTemp = points[i]; } } memDc.MoveTo(0,j); for (int m = 0;m < linePoints.GetSize();m++) { if (m>linePoints.GetSize()-1) { memDc.LineTo(mixRect.right,j); break; } else { memDc.LineTo(linePoints[m].x-mixRect.left,j); } if (m+1>linePoints.GetSize()-1) { break; } m += 1; memDc.MoveTo(linePoints[m].x-mixRect.left,j); } iNumSameY = 0; } memDc.SelectObject(oldPen);}应为鼠标move时候收集的点有很多遗漏,所以我会判断相邻的两个点 如果不连续 继续计算出这两点确定的直线上的所有点 加入到这个点集中(points)。这是我计算两点的间所有点的算法。void GenerateAllPointsBetween2points(IN CPoint start, IN CPoint end, OUT CArray<CPoint,CPoint> &points){ //points.RemoveAll(); if (start.x == end.x) { for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++) { points.Add(CPoint(start.x,i)); } return; } if (start.y == end.y) { return; } double k,b; k = (start.y-end.y) / (start.x - end.x); b = start.y - (k * start.x); for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++) { points.Add(CPoint(i,k*i+b)); }}按理来说 没什么问题 但是却只在图形上画出了几道横线。唉 找不出问题所在。 void GenerateAllPointsBetween2points(IN CPoint start, IN CPoint end, OUT CArray<CPoint,CPoint> &points){ //points.RemoveAll(); if (start.x == end.x) { for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++) { points.Add(CPoint(start.x,i)); } return; } if (start.y == end.y) { return; } double k,b; k = (start.y-end.y) / (start.x - end.x); b = start.y - (k * start.x); for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++) { points.Add(CPoint(i,k*i+b)); }} oledb连接sqlserver 弹出“Record set failed to open”对话框 看看下面个东西是做什么的 问两道笔试题 兄弟们帮忙就决下硬盘读写问题啊 在线等 在运行中的定时程序,如果我此时删除定时器,再重新启用该定时器会有什么后果或错误吗?在线等 TextOut的问题? 怎样取得游戏窗口句柄 一个多线程中读写计时器卡的问题 这两条语句/参数是什么意思??? ^^^^^^上面的! 这样的窗体上显示数字啊,DrawText,TectOut可不可以显示数字啊, WIN32 如何在List Ctrl实时判断是否获得焦点 J2K图像有什么库处理比较好
结构里包括(坐标,颜色值等)。那么多边形也是这么一个链表,这个链表里有多少个点,哪些点,就要靠数学去计算了
1:算出图形的最小外接矩形
2:把图形外和小矩形的空隙全部画线填充为单色
3:用TransparentBlt转换成透明的位图。
第二步骤的时候 出了很多问题。
大家帮我看看。
算法是收集鼠标画轮廓的时候的移动点集,然后遍历这个点集 找出Y坐标相同的两个点 然后从矩形框的边往这个点连线,最终目的可以把空隙全部填充完。
这是我的算法
参数points是监控mousemove收集到的点集,mixRect是鼠标勾画轮廓时候的最小外界矩形,memDc即是用作画线的设备上下文.void ConvertToOriginalRectPicture(CArray<CPoint,CPoint> &points, CRect& mixRect, CDC &memDc)
{ CPoint ptTemp = NULL;
int iNumSameY = 0;
long lY = 0;//矩形从上往下扫描
CArray<CPoint,CPoint> linePoints;
CPen pen(PS_SOLID,1,RGB(0,255,255));
CPen* oldPen = (CPen*)memDc.SelectObject(&pen); int size = points.GetSize();
for (int n = 0;n < size ;n++)
{
if ( (n+1) == size)
{
break;
}
//Bresenham(points[n].x,points[n].y,points[n+1].x,points[n+1].y,points);
GenerateAllPointsBetween2points(points[n],points[n+1],points);
}
int z = 0;
for (int j = 0;j<(mixRect.bottom - mixRect.top);j++)
{
linePoints.RemoveAll();
lY = mixRect.top + j;
for (int i = 0;i<points.GetSize();i++)
{
if(lY == points[i].y)
{
iNumSameY++;
if (2 == iNumSameY)
{
linePoints.Add(ptTemp);
linePoints.Add(points[i]);
iNumSameY = 0;
}
ptTemp = points[i];
}
}
memDc.MoveTo(0,j);
for (int m = 0;m < linePoints.GetSize();m++)
{
if (m>linePoints.GetSize()-1)
{
memDc.LineTo(mixRect.right,j);
break;
}
else
{
memDc.LineTo(linePoints[m].x-mixRect.left,j);
}
if (m+1>linePoints.GetSize()-1)
{
break;
}
m += 1;
memDc.MoveTo(linePoints[m].x-mixRect.left,j);
}
iNumSameY = 0;
} memDc.SelectObject(oldPen);
}应为鼠标move时候收集的点有很多遗漏,所以我会判断相邻的两个点 如果不连续 继续计算出这两点确定的直线上的所有点 加入到这个点集中(points)。这是我计算两点的间所有点的算法。void GenerateAllPointsBetween2points(IN CPoint start, IN CPoint end, OUT CArray<CPoint,CPoint> &points)
{
//points.RemoveAll();
if (start.x == end.x)
{
for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++)
{
points.Add(CPoint(start.x,i));
}
return;
}
if (start.y == end.y)
{
return;
} double k,b;
k = (start.y-end.y) / (start.x - end.x);
b = start.y - (k * start.x);
for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++)
{
points.Add(CPoint(i,k*i+b));
}}按理来说 没什么问题 但是却只在图形上画出了几道横线。
唉 找不出问题所在。
{
//points.RemoveAll();
if (start.x == end.x)
{
for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++)
{
points.Add(CPoint(start.x,i));
}
return;
}
if (start.y == end.y)
{
return;
} double k,b;
k = (start.y-end.y) / (start.x - end.x);
b = start.y - (k * start.x);
for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++)
{
points.Add(CPoint(i,k*i+b));
}}