关于 GDI PS_INSIDEFRAME

“PS_INSIDEFRAME  创建一支画笔,该画笔在Windows GDI输出函数所产生的封闭形状的框架内画线,此输出函数指定一个限定矩形(例如,Ellipse,Rectangle,RoundRect,Pie和Chord成员函数),当此风格用于没有指定限定矩形的Windows GDI输出函数(例如LineTo成员函数)时,此画笔的绘制区域不受框架的限制。”

 

关于 PS_INSIDEFRAME 这个话题,google了一下,发现问的人很多,回答得人都是用MSDN原话解释,看MSDN谁都会,和没说一样。

亲自实践了一下原来是用来指示当画笔宽度大于1时候,如何在有边的封闭图形的边界线上分布:

1)当画笔宽度为1时, 使用PS_INSIDEFRAME不使用没有区别

2)当画笔宽度大于1时,使用PS_INSIDEFRAME会导致边缘变宽,宽度从矩形边缘向内增大。

3)当画笔宽度大于1时,如果不使用PS_INSIDEFRAME会导致边缘变宽,从边缘向内侧和外侧同时加宽;如果是偶数宽度,会导致向左或上扩展比向右和下多一个像素;如果宽度是2;只向左和上扩展1个像素

 

4像素宽的Pen的效果如图所示: 

 

 

 

附代码如下:

 

HPEN hPen1;

HPEN hPen2;

HPEN hPen3;

HBRUSH hBrush1;

 

void CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1; 

HDC hDC = ::GetDC( m_hWnd ); 1

hPen1 = ::CreatePen( PS_DASH,1,0x000000);//1像素宽度的虚线画笔,用于标记举行的实际边缘

hPen3 = ::CreatePen( PS_SOLID,8,0xff0000);

hPen2 = ::CreatePen( PS_SOLID|PS_INSIDEFRAME,8,0xff0000);

LOGBRUSH br;

br.lbColor = 0x000000;

br.lbStyle = BS_HOLLOW;

br.lbHatch = 0;

hBrush1 = CreateBrushIndirect(&br); //空心画刷,用来防止两个矩形的填充区域相互遮盖

    ::ReleaseDC( m_hWnd,hDC );

void OnDraw( CDC* pDC )

{

HDC hdc = pDC->m_hDC;

::SelectObject(hdc,hBrush1);

::SelectObject( hdc,hPen3 );

::Rectangle(hdc,200,200,300,300);

::SelectObject( hdc,hPen2 );

::Rectangle(hdc,400,200,500,300);

::SelectObject(hdc,hPen1);

::Rectangle(hdc,200,200,300,300);

::Rectangle(hdc,400,200,500,300);

::TextOut( hdc,200,320,"PS_INSIDEFRAME",strlen("PS_INSIDEFRAME")); 

::TextOut( hdc,4000,320,"NON-PS_INSIDEFRAME",strlen("NON-PS_INSIDEFRAME"));  

posted on 2009-12-29 19:30  cgwolver  阅读(1681)  评论(0编辑  收藏  举报

导航