关于 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"));
}