Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在C#程序中剪裁插入符号_.net_Winforms_Winapi_Caret - Fatal编程技术网

.net 在C#程序中剪裁插入符号

.net 在C#程序中剪裁插入符号,.net,winforms,winapi,caret,.net,Winforms,Winapi,Caret,我正在用C#(使用VS2008、.NET3.5)创建一个WinForms控件,它允许文本输入。我已经从User32.dll导入了必要的Win32 API函数,用于显示正常的Windows插入符号,这些函数都可以正常工作,但它并没有显示我想要的方式 文本以空白边框显示在控件上,我使用Graphics.SetClip()将此页边距保留为空白。我希望插入符号被剪切到同一个区域,但由于我没有绘制它,并且没有明显的API函数来设置剪切区域,所以我看不到任何方法来实现这一点。我遗漏了什么明显的东西吗 插入符

我正在用C#(使用VS2008、.NET3.5)创建一个WinForms控件,它允许文本输入。我已经从User32.dll导入了必要的Win32 API函数,用于显示正常的Windows插入符号,这些函数都可以正常工作,但它并没有显示我想要的方式

文本以空白边框显示在控件上,我使用Graphics.SetClip()将此页边距保留为空白。我希望插入符号被剪切到同一个区域,但由于我没有绘制它,并且没有明显的API函数来设置剪切区域,所以我看不到任何方法来实现这一点。我遗漏了什么明显的东西吗

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


提前感谢您的帮助

那么,我是否正确理解了您的问题是默认插入符号“出血”到您的边缘区域

我认为您最好的选择是将文本放置在您提到的辅助控件或子控件上。你可以考虑的另外两个选项,它可能符合你的要求

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将整个窗口剪裁到所需的剪裁区域。当然,这也将剪辑您的边界区域,这可能对您来说是一个问题,也可能不是一个问题。这取决于背景是否具有不会侵入边界的性质,因此边界将是透明的


但最后,我认为您选择使用子控件将提供最多的控件。

如何将当前使用
SetClip()剪辑的区域定义为windows true client area?(通过重写)。

您是从TextBox派生控件还是自己绘制所有内容?它是从头开始绘制的。不幸的是,Textbox是非托管Win32控件的一个相当薄的包装器,因此您可以对功能进行的修改有点有限。谢谢您的建议。我认为子控件也是目前最整洁的选项。这是一个有趣的想法。但是,从我阅读的文档中,我看不出这个函数的输出用于什么。例如,如果我排除了滚动条所在的控件部分,是否仍会在必要时重新绘制?您需要响应NC_PAINT并在覆盖WM_NCCALCSIZE的任何窗口的客户端区域之外绘制任何内容。()