Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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如何更改控件';什么是位置和宽度?_.net_Winforms - Fatal编程技术网

.NET如何更改控件';什么是位置和宽度?

.NET如何更改控件';什么是位置和宽度?,.net,winforms,.net,Winforms,编辑:假设一个文本框作为示例的控件-高度不是问题 因此,我在运行时使用鼠标来更改控件的宽度和位置(通过用鼠标抓住一个句柄,与您在设计时更改控件的方式大致相同)。但是,我注意到一些调整大小的问题,我认为通过调用 <panel>.SuspendLayout <control>.location = new Point(x, y) <control>.width = newWidth <panel>.ResumeLayout .SuspendLayou

编辑:假设一个文本框作为示例的控件-高度不是问题

因此,我在运行时使用鼠标来更改控件的宽度和位置(通过用鼠标抓住一个句柄,与您在设计时更改控件的方式大致相同)。但是,我注意到一些调整大小的问题,我认为通过调用

<panel>.SuspendLayout
<control>.location = new Point(x, y)
<control>.width = newWidth
<panel>.ResumeLayout
.SuspendLayout
.位置=新点(x,y)
.width=newWidth
.简历布局
现在位置和宽度都正确地改变了,但是因为位置先改变了-你会看到文本框在移动后模糊地改变了宽度。现在通读Suspend和ResumeLayout,我想应该在构建控件之前调用它们。在这种情况下:如何确保位置和宽度立即更改以避免模糊

编辑:已解决-以下代码允许我在设置属性之前暂停绘制控件,然后再继续。而不是暂停布局*

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, _
                                                                ByVal wMsg As Integer, _
                                                                ByVal wParam As Integer,
                                                                ByVal lParam As Integer) As Integer

Private Const WM_SETREDRAW As Integer = 11

' Extension methods for Control
<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control, ByVal Redraw As Boolean)
  SendMessage(Target.Handle, WM_SETREDRAW, 1, 0)
  If Redraw Then
    Target.Refresh()
  End If
End Sub

<Extension()>
Public Sub SuspendDrawing(ByVal Target As Control)
  SendMessage(Target.Handle, WM_SETREDRAW, 0, 0)
End Sub

<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control)
  ResumeDrawing(Target, True)
End Sub
声明函数SendMessage Lib“user32”别名“SendMessageA”(ByVal hWnd为整数_
ByVal wMsg作为整数_
ByVal wParam作为整数,
ByVal lParam(作为整数)作为整数
私有常量WM_SETREDRAW为整数=11
“控制的扩展方法”
公共子图(ByVal目标为控件,ByVal重绘为布尔值)
SendMessage(Target.Handle,WM_SETREDRAW,1,0)
如果重新绘制,则
Target.Refresh()
如果结束
端接头
公共子SuspendDrawing(ByVal目标作为控件)
SendMessage(Target.Handle,WM_SETREDRAW,0,0)
端接头
公共子图(ByVal目标作为控件)
恢复绘图(目标,真)
端接头

防止此类闪烁发生的适当解决方案不是同时更改两个值,因为一个值总是设置在另一个值之前,而是将窗体设置为使用双缓冲。这样,在将更改复制到可见区域之前,您的更改将从屏幕上画出。您可以在表单上找到此属性


MSDN:有关.SuspendLayout()而不是
面板.SuspendLayout()
的更多信息,请执行
此.SuspendLayout()
。Suspend和Resume保证会遍历实际的对象树,但我从来没有幸运地将其遍历容器树。

我有点困惑。我已经为面板设置了以下设置。Me.SetStyle(ControlStyles.AllPaintingInWmPaint或ControlStyles.UserPaint或ControlStyles.DoubleBuffer,True)\n Me.UpdateStyles()\n Me.DoubleBuffered=True。这些都无助于抖动,我已经试过了。出于好奇,我还尝试暂停表单布局。它们都不起作用。嗯,我唯一尝试的另一种方法是通过Win32发送WM_REDRAW命令。有一种方法可以做到这一点:。在
Control
上将这些方法转换为扩展方法非常容易,因此您可以在多个位置使用它。我刚刚花了一个小时试图阻止WM_PAINT消息,但奇怪的是,面板和文本框实际上都不控制文本框边框的绘制。调整大小仍然有效,只是面板中没有填充物,或者文本框中没有白色(包括内部文本)。我将查看WM_REDRAW-谢谢你的建议。很高兴听到。你难道不喜欢.NET不能让你直接访问像这样的重要功能吗?是的,我没有太多编程经验,但我确实喜欢java。网络经常让我烦恼,哈哈。不过,这只是我的一点小经验。