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个构造函数会在后面的文章中有所介绍,具体在本文就不赘述了。

VC++开发GIS系统(23)设置点的边框宽度 VC++开发GIS系统(25)关于VC++中的CPEN类2

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论