2

我正在用 C#(使用 VS2008,.net 3.5)创建一个允许文本输入的 WinForms 控件。我已经从 User32.dll 导入了必要的 Win32 API 函数来显示正常的 Windows 插入符号,这些函数都工作正常,但它并没有完全显示我想要的样子。

文本以空白边框显示在控件上,我使用 Graphics.SetClip() 使该边距保持清晰。我希望将插入符号剪辑到同一区域,但由于我不绘制它并且没有明显的 API 函数来设置剪辑区域,所以我看不到任何这样做的方法。我错过了什么明显的东西吗?

插入符号被剪辑在绘制它的控件内。因此,我知道一种解决方案可能是将文本放置在没有边框的单独子控件中。但是,如果有比重新设计控件的这一部分更简单的方法,我想先寻找它。

提前感谢您的帮助!

4

2 回答 2

2

如何将您当前剪辑的区域定义SetClip()为 windows 真正的客户区?(通过覆盖WM_NCCALCSIZE)。

于 2010-05-09T12:01:09.123 回答
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 将整个窗口剪辑到您需要的剪辑区域。当然,这也会剪裁您的边界区域,这对您来说可能是问题,也可能不是问题。仅取决于背景是否具有不侵入边框的性质,基本上所有边框都是透明的。

但归根结底,我认为您选择使用子控件将提供最大的控制权。

于 2010-05-07T19:15:11.900 回答