大神們,先看正常顯示界面

然后是點擊最大化后,就變成這樣了。(在win7上正常,在win10上會出現這個問題)


最后貼上引起這個原因的代碼,但是這段代碼不能去掉,我要用,這段代碼可以解決頁面切換時的閃爍問題。

如果去掉這段代碼,確實可以完整顯示視窗,但是閃爍太嚴重了。
大神們有什么解決辦法嗎?感謝感謝
uj5u.com熱心網友回復:
WM_NCCALCSIZE重繪一下。uj5u.com熱心網友回復:
首先感謝大神,然后我自己去搜了一圈,好像沒找到啥實用的東西。大神能再幫忙指導一下怎么重繪嗎?或者有什么文章鏈接,分享一下,感謝感謝uj5u.com熱心網友回復:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace TimingMonitor.Windows
{
public partial class FormBase : Form
{
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOP = 12;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 0x10;
const int HTBOTTOMRIGHT = 17;
public FormBase()
{
InitializeComponent();
}
public bool ManualResize
{
get
{
return this.FormBorderStyle == System.Windows.Forms.FormBorderStyle.None
&& this.WindowState == FormWindowState.Normal;
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0084:
base.WndProc(ref m);
if (ManualResize)
{
Point vPoint = new Point((int)m.LParam & 0xFFFF,
(int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOM;
}
break;
case 0x0201: //滑鼠左鍵按下的訊息
if (ManualResize)
{
m.Msg = 0x00A1; //更改訊息為非客戶區按下滑鼠
m.LParam = IntPtr.Zero; //默認值
m.WParam = new IntPtr(2); //滑鼠放在標題欄內
}
base.WndProc(ref m);
break;
default:
try
{
base.WndProc(ref m);
}
catch (Exception) { }
break;
}
}
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
}
}
uj5u.com熱心網友回復:
大神你看看3樓的代碼,我的主視窗,就繼承的這個FormBaseuj5u.com熱心網友回復:
WndProc加一個判斷試試:
case WM_NCCALCSIZE: {//0x83
Refresh();
}
break;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/228657.html
