GDI画笔对象
GDI中的画笔对象包含了直线和曲线的宽度、形式、颜色、端点形状、交点以及样式。你画出来的线是啥颜色,好宽,都由它决定的。
缺省的DC画笔是单个象素宽的黑色画笔。一旦画笔被选入设备上下文后,只有颜色是可以改变的,可通过下面两个函数来访问设置和得到DC画笔颜色。
COLORREFGetDCPenColor(HDChdc);
COLORREFSetDCPenColor(HDChdc,COLORREFcrColor);
GetDCPenColor函数获取设备上下文中DC画笔的当前颜色,SetDCPenColor函数设置一个新的颜色,并返回旧的颜色。
hdc=::GetDC(this->m_hWnd);
COLORREFcrCol;
crCol=GetDCPenColor(hdc);//默认为黑色
MoveToEx(hdc,0,200,NULL);
LineTo(hdc,100,200);//绘制一条黑色的直线
HGDIOBJhld=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)。
下面用下面两个函数来创建画笔。
HPENCreatePen(intfnPenStyle,intnwidth,COLORREFcrColor);
HPENCreatePenIndirect(CONSTLOGPEN*lgPen);
fnPenStyle画笔样式有下面这些样式。
PS_SOLID---------------纯色,所有象素都画
PS_DASH---------------虚线
PS_DOT-----------------点画线
PS_DASHDOT---------虚线和点画线交替出现
PS_DASHDOTDOT---虚线和两交点画线交替出现
PS_NULL----------------不画线
PS_INSIDEFRAME----纯色,所有象素都画
hdc=::GetDC(this->m_hWnd);
HPENp_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);
CreatePenIndirect函数
结构LOGPEN存储了逻辑画笔的三个参数,画笔样式、宽度、颜色。
typedefstructtagLOGPEN{
UINTlopnStyle;//样式
POINTlopnWidth;//宽度
COLORREFlopnColor;//颜色
}LOGPEN,*PLOGPEN;
LOGPENlogpen;
HPENp;
HGDIOBJhOld;
HDChdc=::GetDC(this->m_hWnd);
logpen.lopnWidth.x=1;
logpen.lopnColor=RGB(255,0,0);
logpen.lopnStyle=PS_SOLID;
p=CreatePenIndirect(&logpen);
hOld=SelectObject(hdc,p);
MoveToEx(hdc,0,10,NULL);
LineTo(hdc,50,10);
SelectObject(hdc,hOld);
DeleteObject(p);
::ReleaseDC(this->m_hWnd,hdc);
ExtCreatePen函数
上面CreatePen和CreatePenIndirect(CreatePenIndirect也是调用的CreatePen函数)创建的画笔,当宽度大于一个象素时,画笔不能画真实形式的直线,例如虚线和点划线。绘制的直线画端是圆角的,这时这两个函数将不能满足需要了。这时就可用到ExtCreatePen函数。ExtCreaetPen可以创建几何画和装饰性画笔。
HPENExtCreatePen(DWORDdwPenStylek,
DWORDdwWidth,
CONSTLOGBRUSH*lplb,
DWORDdwStyleCont,
CONSTDWORD*lpStyle);
相关推荐
vc gdi+ gdiplus vc 精通GDI+编程
VC使用GDI+的方法.
VC使用GDI+进行绘图
VC6.0GDI++,绘制界面,VC6.0的一般不支持,需要自己添加
GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图
VC6使用GDI+,其中包含GDI源码、VC例子和使用说明
这段时间在研究GDI+双缓冲的方法,在网上找了很多时间都没有找到合适的示例,特别是针对VC6的。后来通过对网上资料的分析,和对SDK,MFC的学习,实现了VC6下GDI+双缓冲的效果,把它写出来与大家分享,希望可以找到更...
vc mtc GDI+ 双缓存vc mtc GDI+ 双缓存vc6.0编译通过
vc_GDI+显示PNG图片.doc
vc 用GDI实现画直线时的橡皮筋效果,可以捕捉到直线的任何时候的形状
分别在VC6和VC2005中调用GDI+的步骤说明,简明清析,TXT格式
VC6下的GDI+双缓冲,解决闪烁问题,附有例子源码,一看就会,图像编程过程中非常实用
VC命令行GDI动画演示(Windows Console GDI Animation Demo) 70行纯C代码在Windows下Console即cmd窗口中演示一个图形动画效果。 非常适合仅学过简单TC图形的学生转到Windows下GDI图形编程时参考。
使用VC6和GDI+开发图形界面.首先在VC6加载GDI+动态库,然后根据自己的要求建立控件,在控件中使用GDI+绘图.使用GDI+比使用GDI思路更清晰,界面更美观.
GDI+绘制库在VC中用GDI+调用png图片实现半透明渐变的特效窗口,GDI+的应用使得平面图形图象编程变的更加容易
这个东西可以帮你从vc6中支持gdi+的编程。可以下载来安装后即可以用的
VC6下使用GDI+需要的相关文件 include文件,lib,以及dll,详细使用可以参考相关文章
VC下如何使用GDI+进行 图像程序设计
VC 用GDI与PNG图片实现半透明桌面时钟
基于VC++语言,VS平台开发,应用GDI+库,双缓冲,实现图片旋转,屏幕不闪烁。代码量不大,简单易学。