📄 base5.htm
字号:
//Draw the ellipse. <br>
pDC->Ellipse (rcView); <br>
//Restore original brush. <br>
pDC->SelectObject (pOrgBrush); <br>
} <br>
三、确定GDI对象的属性信息 <br>
可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到 <br>
缓冲区。下例创建了几个有用的辅助函数。 <br>
//Determine if font is bold. <br>
BOOL IsFontBold (const CFont&font) <br>
{kk1} <br>
LOGFONT stFont; <br>
font.GetObject (sizeof (LOGFONT), &stFont); <br>
return (stFont.lfBold)? TRUE: FALSE; <br>
} <br>
<br>
//Return the size of a bitmap. <br>
CSize GetBitmapSize (const CBitmap&bitmap) <br>
{ kk1}<br>
BITMAP stBitmap; <br>
bitmap.GetObject (sizeof (BITMAP), &stBitmap); <br>
return CSize (stBitmap.bmWidth, stBitmap. bmHeight); <br>
} <br>
//Create a pen with the same color as a brush. BOOL CreatePenFromBrush
(Cpen&pen, cost Cbrush&brush) <br>
{kk1} <br>
LOGBRUSH stBrush; <br>
brush.Getobject (sizeof (LOGBRUSH), &stBrush); <br>
return pen. Createpen (PS_SOLID, 0, stBrush.ibColor); <br>
} <br>
四、实现一个橡皮区矩形 <br>
CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand <br>
响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。 <br>
首先,在文件档中声明一个CRectTracker数据成员: class
CSampleView : Public CView <br>
{ kk1}<br>
… <br>
public : <br>
CrectTracker m_tracker; <br>
… <br>
}; <br>
其次,在文档类构造函数中初始化CRectTracker对象: CSampleDoc::
CSampleDOC () <br>
{ kk1}<br>
//Initialize tracker position, size and style. m_tracker.m_rect.SetRect (0, 0,
10, 10); <br>
m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker:: dottedLine; <br>
} <br>
然后,在OnDraw函数中画椭圆和踪迹矩形: <br>
void CSampleView:: OnDraw (CDC* pDC) <br>
{ kk1}<br>
CSampleDoc* pDoc=GetDocument (); <br>
ASSERT_VALID (pDoc); <br>
//Select blue brush into device context. CBrush brush (RGB (0, 0, 255)); <br>
CBrush* pOldBrush=pDC->SelectObject (&brush); <br>
//draw ellipse in tracking rectangle. <br>
Crect rcEllipse; <br>
pDoc->m_tracker.GetTrueRect (rcEllipse); <br>
pDC->Ellipse (rcEllipse); <br>
//Draw tracking rectangle. <br>
pDoc->m_tracker.Draw (pDC); <br>
//Select blue brush out of device context. <br>
pDC->Selectobject (pOldBrush); <br>
} <br>
最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。 <br>
void CSampleView::OnLButtonDown (UINT nFlags, CPoint point) <br>
{ kk1}<br>
//Get pointer to document. <br>
CSampleDoc* pDoc=GetDocument (); <br>
ASSERT_VALID (pDoc); <br>
//If clicked on ellipse, drag or resize it. Otherwise create a rectangle<br>
//rubber-band rectangle nd create a new ellipse. BOOL
bResult=pDoc->m_tracker.HitTest (point)!= <br>
CRectTracker::hitNothing; <br>
//Tracker rectangle changed so update views. <br>
if (bResult) <br>
{ kk1}<br>
pDoc->m_tracker.Track (this,point,TRue);<br>
pDoc->SetModifiedFlag (); <br>
pDoc->UpdateAllViews (NULL); <br>
} <br>
else pDoc->m-tracker.TrackRubberBand (this,point,TRUE); <br>
CView:: onLButtonDown (nFlags,point); <br>
} <br>
<br>
在Delphi中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便的设计图形绘制程序。<br>
TCanvas Object(画布对象)<br>
TCanvas对象是一个用于绘图的表面,在这个区域上,程序可实现各种绘图功能,很多部件(如TIMage,TMemo)的Canvas属性就是TCanvas对象。在部件上绘制图形就是在部件的画布上绘制。TCanvas的Brush,Pen,Font属性分别是TBrush,TPen,TFont对象,它们用于定义绘制图形的风格。<br>
画布的笔的位置定义在PenPos属性中,可用MoveTo方法来移动笔。如果要在画布上输出文本,可用Textout方法。<br>
Tpen Object(画笔对象)<br>
应用程序常用TPen对象在画布上绘制各种线段,笔的颜色在Color属性中定义。线段宽度在Width属性中定义。Style属性定义了线段的各种类型,这些类型的定义与Visual
C++中的定义类似。<br>
Mode属性定义线段的颜色。可结合当前的颜色、屏幕在Delphi中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便的设计图形绘制程序。<br>
TCanvas Object(画布对象)<br>
TCanvas对象是一个用于绘图的表面,在这个区域上,程序可实现各种绘图功能,很多部件(如TIMage,TMemo)的Canvas属性就是TCanvas对象。在部件上绘制图形就是在部件的画布上绘制。TCanvas的Brush,Pen,Font属性分别是TBrush,TPen,TFont对象,它们用于定义绘制图形的风格。<br>
画布的笔的位置定义在PenPos属性中,可用MoveTo方法来移动笔。如果要在画布上输出文本,可用Textout方法。<br>
Tpen Object(画笔对象)<br>
应用程序常用TPen对象在画布上绘制各种线段,笔的颜色在Color属性中定义。线段宽度在Width属性中定义。Style属性定义了线段的各种类型,这些类型的定义与Visual
C++中的定义类似。<br>
Mode属性定义线段的颜色。可结合当前的颜色、屏幕TColor类型<br>
TColor类型用于定义一个对象颜色。很多部件的颜色属性就是TColor
类型, 在Graphics单元中TColor定义如下:<br>
TColor = -(COLOR_ENDCOLORS + 1)..$02FFFFF;<br>
这是一个32位二进制数据。Graphic单元中还定义了一些常用的颜色常量,这些常量或直接映射成系统调色板中最相近的颜色,或映射成Wondows
控制面板中颜色部分的系统视频颜色。<br>
直接映射成系统调色板中的颜色有:<br>
ClAqua,CLBlack,ClBlue,ClbkGrray,ClFuchsoa...ClYellow<br>
映射程序用4字节的二进制码来定义颜色,低3 位字节代表RGB
相应的颜色,如$00FF0000表示纯蓝,$0000FF00表示纯绿,$000000FF表示纯红,$00000000表示黑色,$00FFFFFF表示白色。如果最高位字节是$00,则表示用系统调色板中最相近的颜色;最高位字节是$01,则表示用当前调色板中最相近的颜色匹配;最高位字节是$02,则用当前设备描述表中逻辑调色板的次相近颜色匹配。<br>
用Windows API的SelectPalette函数可创建逻辑调色板,要实现逻辑调色板到硬件调色板的映射,需用函数RealizePalett。<br>
图像对象概述<br>
TGraphic对象<br>
TGraphic对象是TBitmap ,TIcon,Tmetafile对象的基类。如果知道图像的具体类型(
如位图, 图标元文件) ,
则应将图像贮存在相应类型的对象中( 如TBitmap,TIcon,Tmetafile),否则应该使用可贮存任何图像类型的TPicture对象。<br>
TPicture对象<br>
TPicture对象可以保存位图、图标或元文件。Graphic属性中包括图像的类型;图像的高度和宽度分别定义在Height,Width属性中;调用LoadFromFile方法,可以从文件中装载一幅图像:<br>
procedure TForm1.FormCreate(Sender: TObject);<br>
begin<br>
BitBtn1.Glyph.LoadFromFile('TARTAN.BMP');<br>
end;<br>
要保存一个位图,则要用SaveToFile方法;要把图像复制到剪切板,可以调用TClipboard对象的Assign方法。<br>
TImage部件<br>
TImage部件用以在窗体中显示图像,它的Picture
属性保存着要显示的图像, 这是一个TPicture对象。AutoSize,Stretch属性是用来调节部件与图像的大小的。当AutoSize
为真值时,TImage部件将根据它所包含的图像的大小来调整自身的大小;当AutoSize为假值时,不论图像有多大,部件将保持设计时的大小。如果部件比图像小,
那么只有一部分图像是可见的。当Stretch为真值时,位图像将根据部件的大小调整自身的大小,当部件大小改变时,元文件也做相应变化。Stretch属性对图标没有作用。<br>
TBitmap Object(位图对象)<br>
位图对象包含一个位图图像,有HBITMAP,HPALETE句柄,可自动管理调色板。位图对象也有画布属性。位图的Palette属性用来控制位图的颜色映射,它包括256种可显示的颜色。
如果应用程序用前景色绘制位图,Palette 属性的颜色将被加入Windows系统调色板,其它颜色被映射到系统调色板已存在的颜色。如果应用程序用自己的颜色绘制位图,而其它程序已占有系统调色板,位图的颜色将被映射到系统调色板中。<br>
如果Monochrome属性设置成假,位图将显示成彩色,反之显示成黑白色。<br>
调用Draw和StretchDraw方法可在画布上绘制位图。<br>
<br>
这里是一个用Canvas对象实现的小画图程序,这里看到的是程序运行的一个瞬间,源程序在例程中——Canvas文件夹中,读者可以自行参照开发应用程序。<br>
<br>
在介绍用编程的方法来生成位图图形和进行图像处理前,我们先来看一下如何用Windows图形工具来生成和编辑位图文件。<br>
在Windows程序生成工具软件Visual C++中,提供了生成、编辑位图图片和图标的位图编辑器。通过位图编辑器,你可以很方便的画出一张图片加入所编译的应用程序中;或是给你的程序设计一个美观的图标。你还可以将你喜欢的位图图片和图标引入到你的程序中。<br>
你可以在程序源码中资源栏中直接新建或引入图片、图标。在已编译过的程序中你也可以用“插入”菜单中的“插入资源”选项,来完成上述这些处理操作。<br>
使用位图编辑器,你可以很方便的生成和编辑图片和图标,但位图编辑器只能用于简单的图形处理,在下一章里我们还将为您介绍如何用程序来实现。</p>
<p>
<a href = "#top">返回到上面</a>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -