您的位置:首页 > 编程语言

windows编程(三)GDI入门(续)

2014-04-04 21:12 681 查看
之前学到了画线,已经学完了画直线,接下来我们接触到以下内容

<1>Polyline和PolylineTo画多条直线

<2>Arc和AcrTo画弧线

<3>常用图形的绘制

首先是Polyline和PolylineTo

这两个函数也挺好理解,相对于LineTo来说,可以画多条直线,当然,实现的功能用LineTo也一样可以实现。但是效率可能不够好。我们一样可以用SetPixel来画,但是我们不用,为什么?效率问题。PolylineTo和Polyline的区别就是点的问题,PolylineTo从当前目标开始到第一个点,Polyline从第一个点开始。入下图所示





代码如下:

void DrawLine(HDC hdc, RECT rect)
{
HPEN pen = CreatePen(PS_SOLID,2,RGB(100 ,100, 100 ));
SelectObject(hdc,pen);

POINT point[5] = { 100,100,
600,100,
100,300,
600,300,
100,100
};
//Po
MoveToEx(hdc,10,10,NULL);
PolylineTo(hdc,point,sizeof(point)/sizeof(POINT));
//Polyline(hdc,point,sizeof(point)/sizeof(POINT));
TextOut(hdc,300,320,"polylineto",10);
}


接着,我们走到了Arc和ArcTo。看了这么多,有个to和没有个to的区别想必都知道了。这里我们就看Arc就行了。
Arc(HDC ,x1,y1,x2,y2,x3,y3,x4,y4);

我们首先了解下这几个坐标。(x1,y1)和(x2,y2)用来确定矩形的一条对角线,我们确定一个矩形,然后确定矩形的一个内接椭圆。这只是确定而已,没画出来,后面两个坐标的作用就是确定弧的范围,从椭圆中心向这两个点连虚拟线,然后和虚拟椭圆的交点就是确定的范围。如图所示:



这个图比较好的反应画弧的过程。我们还可以设置转的方向,可以上面是逆时针画弧,我们也可以通过设置实现顺时针画弧。调用SetArcDirection函数就行,伙伴们可以自己去尝试。结合上面的应该能理解,本人也是一边看书一边敲代码写的。学过windows编程,但是一到GDI这块直接跳过。GDI也是近期才开始接触。废话少写。上面代码如下,朋友们可以把函数的调用位置放在WM_PAINT消息的处理上

void DrawLine(HDC hdc, RECT rect)
{
HPEN pen = CreatePen(PS_SOLID,2,RGB(100 ,100, 100 ));
SelectObject(hdc,pen);

POINT point[5] = {
100,100,
600,100,
600,400,
100,400,
100,100
};
//Po
MoveToEx(hdc,10,10,NULL);
//PolylineTo(hdc,point,sizeof(point)/sizeof(POINT));
Polyline(hdc,point,sizeof(point)/sizeof(POINT));
Arc(hdc,100,100,600,400,600,100,100,400);
MoveToEx(hdc,100,100,NULL);
LineTo(hdc,600,400);
MoveToEx(hdc,100,400,NULL);
LineTo(hdc,600,100);

}


朋友们有没有想过如果后面两个点是相同的,会出现什么结果,没错,我们会得出一个椭圆。

在画线的时候,我们要注意到,如果线是虚线的话,当然,对于虚线只能设置为一个像素,设置大于一个像素显示的都是实现,如果画线是虚线,就会出现奇怪的现象,我们看下下图就知道了。



我们上面设置的明明是RGB(100,100,100)有木有,我们画出来的是白色的,仔细看看,实际上我们除了白色黑色外还有第三中颜色。那正是我们设置的颜色。那白色怎么冒出来了。因为windows画的虚线实际上也不是虚线,虚的部分用白色填充而已。前面我们在白色背景上当然看不出区别了。那我们怎么解决这个问题。我们可以通过SetBkMode(hdc,TRANSPARENT)来设置透明模式在我们上面的代码中,画线之前贴上这行代码就可以解决了。

看似万事俱备,我们可以开始画区域了。

看书的过程中,试了常见的几种区域图形函数的使用。都是调用API,难度不大。不过和前面讲的画线或多或少有些关联。具体代码如下,将下面函数在WM_PAINT消息中调用即可,当然,dc和rect得自己获取

void DrawDistrict(HDC hdc, RECT rect)
{
POINT point[6] = {
300,300,
400,250,
400,350,
300,300,
400,350,
400,600.
};

HPEN pen = CreatePen(PS_SOLID,1,RGB(250 ,250, 250 ));
SelectObject(hdc,pen);

HBRUSH brush = CreateSolidBrush(RGB(100,100,100));
SelectObject(hdc,brush);

Rectangle(hdc,50,50,200,200);

RoundRect(hdc,210,50,360,200,10,10);

Rectangle(hdc,370,50,520,200);
Ellipse(hdc,370,50,520,200);

Rectangle(hdc,530,50,530+150,200);
Chord(hdc,530,50,530+150,200,530+160,50,300,530);

Polygon(hdc,point,6);
}


效果见下图:



绘图和绘线个人觉得比较简单,但是代码还是要敲。不然就想当然了。下篇博文笔者将综合上面所讲,再结合自己分析《windows环境下32位汇编语言程序设计》中时钟的例子,用C语言实现同样的功能。以及比较重要的位图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图形 位图 GDI