2011-05-18 38 views
0

我有一個C#UserControl託管一個文本框。使用Graphics.DrawString來模擬TextBox渲染

當自定義控制被禁用,我想文本框,好像它是殘疾人+只讀(即不能灰色)被呈現。因此,當自定義控件捕獲EnabledChanged時,它相應地設置託管的TextBox屬性。

然而,用戶控件的啓用狀態的優先級高於一切,文本框仍呈現灰色的(儘管其內部的前景色是正確的)。

因此,我決定隱藏託管文本框時,自定義控制被禁用,並且吸取它自己。我可以使用各種ControlPaint.DrawXxx函數成功呈現文本框邊框。

然而,相對於原生渲染繪製時,在伸展後的輸出,文字的效果。也就是說,文本從完全相同的像素位置開始,但字符間距明顯更大。

我用文本框本身的字體進行渲染,所以我不知道我做錯了事情。我可以做的唯一理由是C#文本框直接由Windows(使用ExtTextOut Win32 API)呈現,這導致了明顯的差異。

我可以使用什麼選項來模仿原生TextBox呈現?

回答

2

不同的是,Graphics.DrawString使用GDI +呈現文本,而在Win32 API使用GDI內部的一切,包括控制繪製文本。

As of .NET 2.0,你可以很容易地使用​​來模仿它的外觀,它也使用GDI繪製。

在大多數情況下,更換Graphics.DrawStringTextRenderer.DrawText很簡單。你不顯示任何代碼,所以很難給出具體的例子。


至於爲什麼你必須首先做這件事......禁用容器控件總是禁用它的所有子控件。這在Windows中是一個硬性規則,沒有例外。當然,這是一個非常明智的選擇。
如果您不希望禁用容器內的所有控件,則不應禁用整個容器 - 只需禁用該容器內的各個控件即可。

與渲染文本的稍微好一點的方法連武器,我仍然強烈建議您嘗試和重新實施TextBox控制。這是一項相當複雜的工作,只有幾天/每週的努力,你不太可能做到這一點。

+0

你的建議很好。我已經改變了我的策略,而不是擺弄控件的啓用/禁用狀態,我公開了一個ReadOnly屬性來驅動託管的TextBox是否是隻讀的。 – 2011-05-21 11:36:16