在Panel上绘图的实现
???? 近期制作了FDS的一個建模工具,由于知識有限,做出的效果是2D的。昨天上課的時候看老師畫一個長方體,突然想到,為什么不給普通的2D圖形加畫上幾條直線,就能實現2D圖形的3D視覺效果呢?于是回來馬上做了嘗試,果然,效果很好,非常滿意。但是把測試程序代碼移植到FDS建模工具上的時候出現問題了:Panel沒有Canvas屬性,也不能說沒有,實際上在TPanel的實現源碼里有Canvas屬性,不過是Protected不允許外部訪問。怎么辦?簡單思考了一下,有這么幾個方向:
一、把Panel設置成透明的,在Form的Canvas上繪畫圖形
二、在Panel里面加一個有Canvas屬性的組件,然后在那上面繪圖
三、想辦法在Panel本身上實現畫圖的方法
通過查資料,改源程序代碼,發現方案一,畫出的圖形總是被Panel本身遮擋(這是由于我程序本身的需要,Panel里面也要套一層Panel),沒有找到好的解決辦法。
方案二:在Panel里面加了一個Image組件,但引發了更多問題:由于組件是動態生成了,產生了比如如何確定在哪個組件添加的Image,另外Image擋住了Panel的事件響應。總之也是沒有很好的解決。
走了很多很多彎路后才最后走到第三步。最后在臺灣的一個Delphi論壇上找到了類似的問題:如何在Panel組件上定點寫字http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=70988源碼是C++的,我以前學過一點C++就根據自己的理解轉換成了Delphi的,可能有不對的地方,但沒想到一運行居然成功了!
uses Math;procedure TForm1.pnl1Click(Sender: TObject); var Panel:TPanel; PanelCanvas:TControlCanvas; beginPanelCanvas:=TControlCanvas.Create;PanelCanvas.Control:=pnl5;Panel:=sender as TPanel;with PanelCanvas dobeginpen.Color:=clGreen;MoveTo(Panel.Left,Panel.Top);LineTo(Panel.left+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));LineTo(Panel.left+Panel.Width,Panel.top);MoveTo(Panel.Left+Panel.Width,Panel.Top+Panel.Height);LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top+Panel.Height-round(Panel.Height/sqr(2)));LineTo(Panel.left+Panel.Width+round(Panel.Height/sqr(2)),Panel.top-round(Panel.Height/sqr(2)));end;PanelCanvas.Free; end;?
成功的關鍵在TControlCanvas的使用,TControlCanvas的Control屬性使得Panel的Canvas屬性可以被訪問使用。
看看TControlCanvas的Control屬性說明:Specifies the control associated with the control canvas object.
轉載于:https://www.cnblogs.com/delphi7456/archive/2010/11/17/1880115.html
總結
以上是生活随笔為你收集整理的在Panel上绘图的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sicily 1817 校歌手大奖赛
- 下一篇: 你若安好,便是晴天。