2010-05-07 41 views
2

我在C#(使用VS2008,.net 3.5)中創建了一個允許文本輸入的WinForms控件。我已經從User32.dll導入了必要的Win32 API函數來顯示正常的Windows插入符號,這些都可以正常工作,但它並不完全顯示我喜歡它的方式。在C#程序中剪切插入符號

文本以空白邊框顯示在控件上,我使用Graphics.SetClip()來清除此邊距。我希望插入剪輯到相同的區域,但由於我沒有繪製它,並且沒有明顯的API函數來設置裁剪區域,所以我看不到任何這樣做的方式。我錯過了什麼明顯的?

插入符號夾在繪製控件的內部。因此,我知道一種解決方案可能是將文本放置在沒有邊框的單獨的子控件中。但是,如果有一種比重新設計這部分控件更簡單的方法,我希望先找到它。

在此先感謝您的幫助!

+0

你是從TextBox派生出你的控件還是你自己畫了一切? – 2010-05-07 16:58:44

+0

它從頭開始繪製。不幸的是,Textbox是非託管Win32控件的一個相當薄的包裝,因此您可以對功能進行的修改有點受限。 – 2010-05-07 21:49:11

回答

0

那麼,我的理解是否正確,您的問題是默認插入符號「流血」到您的邊緣區域?

我認爲你最好的選擇是把文本放置在你提到的輔助或子控件上。您可以考慮兩個其他選項,這些選項可能適合您的要求

1-使用CreateCaret創建一個更小的光標,以適合您的修剪區域。當然,你仍然需要確保你不把它放在邊界空間。

[DllImport("user32", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private extern static bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 

// Create a caret which is 2 pixels wide by 8 high 
CreateCaret(theControl.Handle, IntPtr.Zero, 2, 8); 

2-另一個選項是有用的可能不太,但它會夾插入符號,所以我會提到它。使用Control.Region將整個窗口剪切到您需要的裁剪區域。當然這也會夾住你的邊界區域,這對你來說可能是或者可能不是問題。這取決於背景的性質是不是侵犯邊界,基本上邊界是透明的。

但是,在一天結束時,我認爲你使用子控制的選項將提供最大的控制。

+0

感謝您的建議。我想這個子控制器目前也是最好的選擇。 – 2010-05-07 21:50:46

1

如何定義您當前使用SetClip()剪輯的區域作爲Windows真實客戶區? (通過覆蓋WM_NCCALCSIZE)。

+0

這是一個有趣的想法。但是我無法從我已經閱讀過的文檔中弄清楚這個函數的輸出究竟是用來做什麼的。例如,如果我排除滾動條所在控件的部分,在必要時它還會被重新繪製嗎? – 2010-05-10 11:27:36

+1

您需要響應NC_PAINT並在覆蓋WM_NCCALCSIZE的任何窗口的客戶區外繪製任何內容。 (http://www.codeproject.com/KB/edit/PaddedRichTextBox.aspx) – 2010-05-10 11:58:51

+0

@AlexK。,這真的很有幫助,謝謝! – nekavally 2015-10-08 20:42:00