c++点滴

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

GDI画笔对象

GDI中的画笔对象包含了直线和曲线的宽度、形式、颜色、端点形状、交点以及样式。你画出来的线是啥颜色,好宽,都由它决定的。

缺省的DC画笔是单个象素宽的黑色画笔。一旦画笔被选入设备上下文后,只有颜色是可以改变的,可通过下面两个函数来访问设置和得到DC画笔颜色。

COLORREF GetDCPenColor(HDC hdc);
COLORREF SetDCPenColor(HDC hdc,COLORREF crColor);

 GetDCPenColor函数获取设备上下文中DC画笔的当前颜色,SetDCPenColor函数设置一个新的颜色,并返回旧的颜色。

hdc=::GetDC(this->m_hWnd);
COLORREF crCol;
crCol 
= GetDCPenColor(hdc);//默认为黑色
MoveToEx(hdc,0,200,NULL);
LineTo(hdc,
100,200);//绘制一条黑色的直线
HGDIOBJ  hld=SelectObject(hdc,GetStockObject(DC_PEN));
SetDCPenColor(hdc,RGB(
255,0,0));
MoveToEx(hdc,
0,220,NULL);
LineTo(hdc,
100,220);//绘制一条红色的直线
SelectObject(hdc,hOld);
::ReleaseDC(
this->m_hWnd,hdc);

 上面的GetStockObject是啥?

原来GDI定义了四种预定义的画笔对象,叫库存画笔,为了获取库存画笔,那就要用到GetStockObject这个函数了。GetStockObject(BLACK_PEN)黑色、GetStockObject(White_PEN)白色、GetStockObject(NULL_PEN)什么都不画、GetStockObject(DC_PEN)。

下面用下面两个函数来创建画笔。

HPEN CreatePen(int fnPenStyle,int nwidth,COLORREF crColor);
HPEN CreatePenIndirect(CONST LOGPEN 
*lgPen);

fnPenStyle画笔样式有下面这些样式。

PS_SOLID---------------纯色,所有象素都画

PS_DASH---------------虚线

PS_DOT-----------------点画线

PS_DASHDOT---------虚线和点画线交替出现

PS_DASHDOTDOT---虚线和两交点画线交替出现

PS_NULL----------------不画线

PS_INSIDEFRAME----纯色,所有象素都画

hdc=::GetDC(this->m_hWnd);
HPEN p_SOLID,p_DASH,p_DOT,p_DASHDOT,p_DASHDOTDOT;
p_SOLID
=CreatePen(PS_SOLID,1,RGB(255,0,0));
p_DASH
=CreatePen(PS_DASH,1,RGB(255,0,0));
p_DOT
=CreatePen(PS_DOT,1,RGB(255,0,0));
p_DASHDOT
=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
p_DASHDOTDOT
=CreatePen(PS_DASHDOTDOT,1,RGB(255,0,0));
hOld
=SelectObject(hdc,p_SOLID);
MoveToEx(hdc,
0,10,NULL);
LineTo(hdc,
10,10);
SelectObject(hdc,p_DASH);
MoveToEx(hdc,
0,20,NULL);
LineTo(hdc,
0,20);
SelectObject(hdc,p_DOT);
MoveToEx(hdc,
0,30,NULL);
LineTo(hdc,
0,30);
SelectObject(hdc,p_DASHDOT);
MoveToEx(hdc,
0,40,NULL);
LineTo(hdc,
0,40);
SelectObject(hdc,p_DASHDOTDOT);
MoveToEx(hdc,
0,50,NULL);
LineTo(hdc,
0,50);
SelectObject(hdc,hOld);
DeleteObject(p_SOLID);
DeleteObject(p_DASH);
DeleteObject(p_DOT);
DeleteObject(p_DASHDOT);
DeleteObject(p_DASHDOTDOT);
::ReleaseDC(
this->m_hWnd,hdc);

 

先吃饭去了


 

posted on 2009-01-30 13:22  Reunion  阅读(1814)  评论(0编辑  收藏  举报