?? 015.htm
字號(hào):
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基礎(chǔ)教程-->第五章 Delphi圖形圖像編程(二)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基礎(chǔ)教程 第五章 Delphi圖形圖像編程(二)">
<META NAME="description" CONTENT=" - DELPHI基礎(chǔ)教程 - 第五章 Delphi圖形圖像編程(二)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋體"}
.tt2 {font: 12pt/15pt "宋體"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" bgcolor="#e0e0e0"><strong><A HREF="016.htm"><FONT style="FONT-SIZE: 9pt">后一頁(yè)</font></A><BR>
<A HREF="014.htm"><FONT style="FONT-SIZE: 9pt">前一頁(yè)</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁(yè)</font></A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷體_GB2312">第五章 Delphi圖形圖像編程(二)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p><font face="宋體" lang="ZH-CN">
畫直線時(shí),用戶只有在松開鼠標(biāo)才能看見直線,對(duì)直線的變化不能進(jìn)行實(shí)時(shí)觀測(cè)。這是因?yàn)槭髽?biāo)移動(dòng)時(shí)程序沒有進(jìn)行某種應(yīng)。</font>Delphi<font
face="宋體" lang="ZH-CN">定義了</font>OnMouseMove<font face="宋體" lang="ZH-CN">事件來響應(yīng)鼠標(biāo)移動(dòng)。以下代碼可使用戶隨時(shí)觀測(cè)直線的變化: </p>
<p> </font> procedure TForm1.FormMouseMove(Sender:Tobject)</p>
<p>begin</p>
<p>Drowto(X,Y);</p>
<p>Moveto(origin);</p>
<p>end. </p>
<p>origin<font face="宋體" lang="ZH-CN">是起始點(diǎn)。</font> </p>
<p>5.2.3 <font face="宋體" lang="ZH-CN">繪圖功能的實(shí)現(xiàn)</p>
<p> 繪圖軟件常根據(jù)用戶的要求改變繪圖工具。</font>Graphex.dpr<font
face="宋體" lang="ZH-CN">例程中,當(dāng)用戶按下某個(gè)按鈕時(shí),可選擇繪圖工具中的畫筆或畫刷,在程序類型說明部分定義了五種繪圖工具。</p>
<p> type</p>
</font><p>TDrawingTool = (dtLine,dtRectangle,dtEllips,dtRoundRect,dtPolygon); </p>
<p><font face="宋體" lang="ZH-CN">當(dāng)選中某種按鈕,則選中了相應(yīng)的繪圖工具,如: </p>
</font><p>procedure TForm1.LineButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>DrawingTool := dtLine;</p>
<p>end; </p>
<p>procedure TForm1.RectangleButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>DrawingTool := dtRectangle;</p>
<p>end; </p>
<p>procedure TForm1.EllipseButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>DrawingTool := dtEllipse;</p>
<p>end; </p>
<p>procedure TForm1.RoundRectButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>DrawingTool := dtRoundRect;</p>
<p>end; </p>
<p>procedure TForm1.PolygonButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>DrawingTool :=dtPolygon;</p>
<p>end;<font face="宋體" lang="ZH-CN"> </p>
</font><p>DrawShape<font face="宋體" lang="ZH-CN">過程定義了每種繪圖工具的動(dòng)作: </p>
</font><p>procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);</p>
<p>begin</p>
<p>with Image.Canvas do</p>
<p>begin</p>
<p>Pen.Mode := AMode;</p>
<p>case DrawingTool of</p>
<p>dtLine: begin</p>
<p>MoveTo(TopLeft.X, TopLeft.Y);</p>
<p>LineTo(BottomRight.X, BottomRight.Y);</p>
<p>end;</p>
<p>dtRectangle: Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);</p>
<p>dtEllipse: Ellipse(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);</p>
<p>dtRoundRect: RoundRect(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y,</p>
<p>(TopLeft.X - BottomRight.X) div 2, (TopLeft.Y - BottomRight.Y) div 2);</p>
<p>dtPolygon:Polygon([Point(0,0),TopLeft,BottomRight]); end;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN"> 程序剛運(yùn)行時(shí),只有一個(gè)工具欄。當(dāng)用戶單擊畫筆和畫刷時(shí),則出現(xiàn)相應(yīng)的工具欄,如圖</font>5.4<font
face="宋體" lang="ZH-CN">。其代碼如下: </p>
</font><p>procedure TForm1.PenButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>PenBar.Visible := PenButton.Down;</p>
<p>end; </p>
<p>procedure TForm1.BrushButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>BrushBar.Visible := BrushButton.Down;</p>
<p>end;</p>
<p><font face="宋體" lang="ZH-CN">
在設(shè)計(jì)繪圖程序時(shí),還要解決一些問題。如為了在鼠標(biāo)移動(dòng)時(shí)能觀測(cè)圖形的變化,我們定義了</font>OnMouseMove<font
face="宋體" lang="ZH-CN">事件。但會(huì)出現(xiàn)這樣的現(xiàn)象,當(dāng)鼠標(biāo)進(jìn)入繪圖區(qū)時(shí),用戶未按下鼠標(biāo)鍵,畫布上卻出現(xiàn)繪制的圖形,這是我們不希望看到的。其原因是沒有對(duì)鼠標(biāo)按鈕是否按下進(jìn)行判斷。因此在窗體對(duì)象中定義了</font>drawing<font
face="宋體" lang="ZH-CN">的域,當(dāng)鼠標(biāo)按鈕按下時(shí),</font>drawing <font
face="宋體" lang="ZH-CN">設(shè)置成真值。只有</font>drawing<font face="宋體"
lang="ZH-CN">為真,鼠標(biāo)移動(dòng)才執(zhí)行繪圖功能;當(dāng)鼠標(biāo)鍵松開時(shí),</font>drawing<font
face="宋體" lang="ZH-CN">設(shè)置成假,鼠標(biāo)移動(dòng)將不執(zhí)行繪圖動(dòng)作。</font></p>
<p><font face="宋體" lang="ZH-CN">
另外一個(gè)問題是,</font> <font face="宋體"
lang="ZH-CN">我們希望得到的是鼠標(biāo)按鈕按下和松開這兩點(diǎn)所形成的圖形,但</font>OnMouseMove<font
face="宋體" lang="ZH-CN">卻把鼠標(biāo)軌跡上各點(diǎn)與起始點(diǎn)所形成的所有圖形畫在屏幕上,這同樣是我們不希望看到的,為了解決這些問題,程序定義了鼠標(biāo)的三個(gè)事件: </p>
</font><p>procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;</p>
<p>Shift: TShiftState; X, Y: Integer);</p>
<p>begin</p>
<p>Drawing := True;</p>
<p>Image.Canvas.MoveTo(X, Y);</p>
<p>Origin := Point(X, Y);</p>
<p>MovePt := Origin;</p>
<p>OriginPanel.Caption := Format('Origin: (%d, %d)', [X, Y]);</p>
<p>end; </p>
<p>procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;</p>
<p>Shift: TShiftState; X, Y: Integer);</p>
<p>begin</p>
<p>if Drawing then</p>
<p>DrawShape(Origin, Point(X, Y), pmCopy);</p>
<p>Drawing := False;</p>
<p>end; </p>
<p>procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,</p>
<p>Y: Integer);</p>
<p>begin</p>
<p>if Drawing then</p>
<p>begin</p>
<p>DrawShape(Origin, MovePt, pmNotXor);</p>
<p>MovePt := Point(X, Y);</p>
<p>DrawShape(Origin, MovePt, pmNotXor);</p>
<p>end;<font face="宋體" lang="ZH-CN"> </p>
</font><p>MovePt<font face="宋體" lang="ZH-CN">用來記錄鼠標(biāo)當(dāng)前位置。當(dāng)下次鼠標(biāo)移動(dòng)時(shí),</font>
<font face="宋體" lang="ZH-CN">就能在上次鼠標(biāo)繪制的圖形上畫一個(gè)形狀、大小一樣的圖形,并把畫筆顏色設(shè)置成</font>PmNotXor<font
face="宋體" lang="ZH-CN">,使上次繪制的圖形顏色變成了屏幕顏色,從而達(dá)到“橡皮擦”的效果。</p>
<p> 將畫筆、畫刷的</font>Style<font face="宋體" lang="ZH-CN">屬性設(shè)置成用戶希望的值,可實(shí)現(xiàn)對(duì)畫筆和畫刷風(fēng)格的選擇。 </p>
</font><p>procedure TForm1.SetBrushStyle(Sender: TObject);</p>
<p>begin</p>
<p>with Image.Canvas.Brush do</p>
<p>begin</p>
<p>if Sender = SolidBrush then Style := bsSolid</p>
<p>else if Sender = ClearBrush then Style := bsClear</p>
<p>else if Sender = HorizontalBrush then Style := bsHorizontal</p>
<p>else if Sender = VerticalBrush then Style := bsVertical</p>
<p>else if Sender = FDiagonalBrush then Style := bsFDiagonal</p>
<p>else if Sender = BDiagonalBrush then Style := bsBDiagonal</p>
<p>else if Sender = CrossBrush then Style := bsCross</p>
<p>else if Sender = DiagCrossBrush then Style := bsDiagCross;</p>
<p>end; </p>
<p>procedure TForm1.SetPenStyle(Sender: TObject);</p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -