VC++开发GIS系统(24)设置宽度大于1的虚线边框
在之前的文章的3篇文章中,我发现了一个“好玩”的现象:怎样设置PS_DASH,PS_DOT的线宽。本来只是无意中遇到了,就去查找了一下解决方案,后来发现这个有趣的代码应该分享一下。
3篇文章的血案
关于CPEN这个类,我写了有3篇文章了,分别是:VC++开发GIS系统(21)关于VC++中的CPEN函数,VC++开发GIS系统(22)设置点的边框线型,VC++开发GIS系统(23)设置点的边框宽度
在写教程22和教程23的时候,我发现是无法设置PS_DASH,PS_DOT的线宽的,后来想了一下,原因在于CPEN这个类本身的限制,我在教程21中已经有了相关说明。
宽度由逻辑单位给出,逻辑单位取决于当前的映射模式,其中PS_SOLID、PS_NULL、PS_INSIDEFRAME可以指定任意逻辑宽度,但其余(PS_DASH、PS_DOT、PS_DASHDOT、PS_DASHDOTDOT)必须指定1单位宽,如果指定其它任何值都会在后台自动修正为1逻辑宽度。
也就是说,PS_DASH、PS_DOT、PS_DASHDOT、PS_DASHDOTDOT的线宽度只能是1,那是不是就没有办法了呢?当然不是!
新的CPEN
记不记得我在教程21中有介绍了CPEN的两的构造函数。如下:
CPen(
int nPenStyle,
int nWidth,
COLORREF crColor
);
CPen(
int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount = 0,
const DWORD* lpStyle = NULL
);
在本文中就是用到了第2个构造函数,代码如下:
void CMalaGISView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (curMod == "drawpoint")
{
CClientDC dc(this);
//画方形的点
LOGBRUSH log;
log.lbColor = 0;
log.lbStyle = BS_SOLID;
CPen pen(PS_GEOMETRIC | PS_DASH, 5, &log);
CPen *oldPen = dc.SelectObject(&pen);
dc.Rectangle(CRect(CPoint(point.x - 60, point.y - 60), CPoint(point.x + 60, point.y + 60)));
dc.SelectObject(oldPen);
pen.DeleteObject();
}
CView::OnLButtonDown(nFlags, point);
}
效果图如下:
关于第CPEN的第2个构造函数会在后面的文章中有所介绍,具体在本文就不赘述了。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。