C# 窗口拖动尺寸大小鼠标闪动,拖动不方便
时间: 2023-08-02 11:16:59 浏览: 47
C# 窗口拖动尺寸大小时鼠标会闪动是因为窗口正在进行重绘操作,这可能会导致拖动不方便。为了解决这个问题,你可以使用以下方法:
1. 设置窗口的双缓冲,以减少窗口重绘的次数。
```csharp
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
```
2. 在窗口的 `ResizeBegin` 和 `ResizeEnd` 事件中,禁用和启用窗口的重绘。
```csharp
private void Form1_ResizeBegin(object sender, EventArgs e)
{
this.SuspendLayout();
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
this.ResumeLayout();
}
```
这样就可以避免窗口在拖动时闪动,提高用户体验。
相关问题
C# 窗口拖动尺寸大小鼠标闪动,拖动不方便
这种情况可能是因为窗口的边框样式设置不当所导致的。你可以尝试在窗口加载时,通过代码将窗口的边框样式设置为None,然后自己实现窗口的拖动与缩放功能。
具体实现可以参考以下代码:
```csharp
public partial class MainForm : Form
{
private const int WM_NCHITTEST = 0x0084;
private const int HTLEFT = 10;
private const int HTRIGHT = 11;
private const int HTTOP = 12;
private const int HTTOPLEFT = 13;
private const int HTTOPRIGHT = 14;
private const int HTBOTTOM = 15;
private const int HTBOTTOMLEFT = 16;
private const int HTBOTTOMRIGHT = 17;
private const int BORDER_WIDTH = 5;
public MainForm()
{
InitializeComponent();
// 设置窗口的边框样式为None
this.FormBorderStyle = FormBorderStyle.None;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST)
{
Point point = this.PointToClient(new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16));
if (point.X <= BORDER_WIDTH && point.Y <= BORDER_WIDTH)
{
m.Result = (IntPtr)HTTOPLEFT;
}
else if (point.X >= this.ClientSize.Width - BORDER_WIDTH && point.Y <= BORDER_WIDTH)
{
m.Result = (IntPtr)HTTOPRIGHT;
}
else if (point.X <= BORDER_WIDTH && point.Y >= this.ClientSize.Height - BORDER_WIDTH)
{
m.Result = (IntPtr)HTBOTTOMLEFT;
}
else if (point.X >= this.ClientSize.Width - BORDER_WIDTH && point.Y >= this.ClientSize.Height - BORDER_WIDTH)
{
m.Result = (IntPtr)HTBOTTOMRIGHT;
}
else if (point.X <= BORDER_WIDTH)
{
m.Result = (IntPtr)HTLEFT;
}
else if (point.X >= this.ClientSize.Width - BORDER_WIDTH)
{
m.Result = (IntPtr)HTRIGHT;
}
else if (point.Y <= BORDER_WIDTH)
{
m.Result = (IntPtr)HTTOP;
}
else if (point.Y >= this.ClientSize.Height - BORDER_WIDTH)
{
m.Result = (IntPtr)HTBOTTOM;
}
}
}
}
```
这段代码实现了窗口的边框拖动功能,当鼠标移动到窗口边缘时,鼠标的样式会改变,然后通过重写窗口的WndProc方法,实现窗口的拖动与缩放功能。
C# 窗口拖动定位时鼠标闪动,很难定位拖动
这个问题可能是由于鼠标跟随窗口移动导致的。你可以尝试禁用鼠标跟随功能来解决这个问题。以下是一种可能的解决方案:
1. 在窗口类的构造函数中添加以下代码:
```csharp
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
```
这将启用双缓冲和所有绘图操作在窗口消息处理程序中进行。
2. 在窗口类中添加以下变量:
```csharp
private const int WM_NCHITTEST = 0x0084;
private const int HTCLIENT = 0x01;
private const int HTCAPTION = 0x02;
```
这些变量将用于确定鼠标指针在窗口的哪个部分。
3. 重写窗口的 WndProc 方法:
```csharp
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if (m.Result.ToInt32() == HTCLIENT)
m.Result = new IntPtr(HTCAPTION);
return;
}
base.WndProc(ref m);
}
```
这将覆盖默认的窗口消息处理程序并允许拖动窗口时正常移动鼠标指针。
这些步骤应该可以解决闪烁问题并使窗口拖动更加精确。