2017-02-12 48 views
0

我正在開發一個帶有彈出窗口的文本編輯器組件。彈出窗口的寬度應該在設計時在我的組件的屬性編輯器中設置。如何在組件的屬性中使用DPI感知值?

如何將設置的寬度應用於屏幕分辨率?

如果我爲Width輸入一個值,Delphi將該值存儲在.dfm文件中。還存儲了一個PixelsPerInch值。如果我把一個寬度= 96,而我使用的是100%的Windows DPI設置,裏面的.DFM將存儲:

PixelsPerInch = 96 
Width = 96 

如果我改變我的Windows DPI設置現在右到150%,重新打開項目在德爾福,屬性編輯器顯示我的寬度。

我想有這也爲我的價值:

published 
    property PopupWidth: Integer read FPopupWidth write FPopupWidth; 

...但德爾福不適用PixelsPerInch處理我的價值。

爲什麼不呢?我該如何執行這個?

enter image description here

+0

- *「爲什麼不呢?」 * - 因爲編譯器無法瞭解你的心思。 - *「.. how ..」 - - 我想你應該在TCustomForm.ReadState中看到代碼。這也可能是相關的:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Considerations_When_Dynamically_Resizing_Forms_and_Controls –

+0

它也不會縮放不是像素數的其他整數值。它應該擴大這些嗎? –

+0

@DavidHeffernan:是的,它應該擴展 - 這就是我想要的。我如何告訴德爾福擴展一個物業? – Tahtu

回答

2

這種調整機制是在VCL明確的代碼來處理。該框架提供虛擬ChangeScale方法TControl以允許您的控件參與。

你會覆蓋ChangeScale爲您控制和實現它是這樣的:

procedure TMyControl.ChangeScale(M, D: Integer); 
begin 
    if sfWidth in ScalingFlags then 
    PopupWidth := MulDiv(PopupWidth, M, D); 
    inherited; 
end; 
相關問題