關於 GetObject |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 大家好, 請問一下大家, 下面這段程式碼的用意是什麼? 謝謝大家!應該是一些windows api的使用, 好像可以設定TEdit物件中顯字元的寬度用! 但程式碼看不太懂? ~~~Delphi K.Top討論區站長~~~var lf: TLogFont; begin GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf); lf.lfWidth := 8; Edit1.Font.Handle := CreateFontIndirect(lf); end;
------
~~~Delphi K.Top討論區站長~~~ |
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
最近正好在幫 geOShell 的 geOCommandTime 模組除錯,正好是 FONT 處理的 BUG,只不過 geOShell 是用 VC 開發的,所用到的都是 WinAPI。
GetObject() 這個函式在 geOShell 及其 plugins 中都很常見,可以用來取得現有模組中的字型、顏色、筆刷、等等的繪圖資訊。
只是沒想到在 VCL 中也可以這樣玩。
GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf);
等於是由目前的 Edit1 字型中取得此字型的相關資訊,
lf.lfWidth := 8;
就如同天使所說的,就是設字寬囉。
只是不清楚在 BCB 的 TFont 中沒有這個屬性嗎?(應該是沒有,不然就不用如此麻煩)。
Edit1.Font.Handle := CreateFontIndirect(lf);
是用 lf 建立一個 HFONT 再指回給 Edit1.Font
在 WinAPI 中,還可以用 CreateFont() 來建立 HFONT,不過這個 API 就要輸入一大堆的參數,對於現有字型用上述的方式可以快速修改其屬性。
----------
在此,我有一個問題,也許與此無關,就是在以上的程式碼中,這個 FONT 是在此 Create 的,在此模組/程式結束時,會自動 delete 嗎?
如果原本的 Edit1.Font 是使用 parent font,而 Edit1 在產生時也許是「共用」parent 的字型,那結束時自然不該去 delete。如果原本的 Edit1.Font 有自己指定字型,在結束時就會自己 delete,兩者工作模式不同。
當然,以上只是個人的猜想,並沒有詳細去看 VCL 原始碼,也許 VCL 在實作時已有考慮。
像 geOShell 的 geOCommandTime 是有多人開發,使用的是自定的物件及 WinAPI,而我所 fix 的 bugs 正好是使用 parent font 時把 parent font 給 delete 了!!
------
http://www.ViewMove.com |
linkolong
一般會員 ![]() ![]() 發表:4 回覆:35 積分:12 註冊:2002-04-23 發送簡訊給我 |
hagar其實這段程式之前我不曾用過,但在解釋此程式碼中,我反而更充實... GetObject當我在查詢其意義時,註解開宗明義的講這是一個圖形化物件,將物件圖形化,我們知道在Windows大部分物件皆由Handle管理,由系統負責建構,也由系統負責摧毀,當然GetObject所處理的物件也一定是Graphic物件,可參考本身其說明,因為要處理Font所以第一個參數指向Font.Handle,處理hFont,依說明需用TLongFont來存所取得的圖形化物件,第2個參數為分配對應之大小記憶體,第三個參數為TLogFont的指標型態,所以
GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf);
更改TLogFont的值
lf.lfWidth := 8;
{可解釋為將該圖形化物件(非字體因為此時已經為物件了)的寬度改為8}
將TLogFont組成HFont還原給Edit1;
{此時透過CreateFontIndirect將物件還給HFont了} ---------------
引言
在此,我有一個問題,也許與此無關,就是在以上的程式碼中,這個 FONT 是在此 Create 的,在此模組/程式結束時,會自動 delete 嗎?
----------------
我認為在程式中Font並未Create過而是繼承Edit1.Font,
Step1:建立一個圖形化物件,此物件繼承了Edit1.Font.Handle
Step2:更該此圖形化物件內值
Step3:將圖形化物件交還給一個已經存在的Font.Handle
況且CreateFontIndirect中Indirect是非直接的Create,所以實際上並未Create過
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |