日期:2014-05-19  浏览次数:20868 次

求助:如何用代码实现窗体拖动或者改变大小时出现虚线边框,顺便散分
小弟我手头在做的一个2.0的项目,
把Form重画了,做了个自己的皮肤。
但是发现.Net重绘窗体的效率太低,拖动或者改变窗体大小时会有非常厉害的延迟,拖动的时候非常恐怖。
开了双缓冲也没有好转。
所以我想回避拖动和改变大小时整个窗体重绘的问题,改用MouseDown时出现窗体的虚框,调整好后MouseUp时需框消失并且按照虚框的大小和位置设置窗体大小位置。
但是我不知道怎么实现这个功能。

思路有,但是不知道怎么将边框延伸到窗体以外的部分。
还有调整大小和移动……
混乱ing

或者大家推荐下好的解决重绘的问题的方法?

小弟拜谢啦~
顺便散散分,聚聚人气,呵呵。

------解决方案--------------------
沙发沙发帮忙顶
------解决方案--------------------
接分~~

------解决方案--------------------
帮顶。

------解决方案--------------------
4颗猩猩也学人家接分,不知道这么混到4个猩猩的,汗
------解决方案--------------------
你所说的窗体其实是伪造的,边框才是重新绘制的窗体。
------解决方案--------------------
还有,我自定义窗体调整大小怎么没有像你说的那样恐怖?你是不是上面干太多事了?
------解决方案--------------------
直接在系统中设置一下不就可以了
------解决方案--------------------
Private HTCAPTION As IntPtr = CType(2, IntPtr)
Private HTCLIENT As IntPtr = CType(1, IntPtr)
Private WM_NCHITTEST As Integer = 132

Protected Overrides Sub WndProc(ByRef m As Message)
'ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/M_System_Windows_Forms_Control_WndProc_1_89703afe.htm#codeExampleToggle
'拖动无边框窗体
If (m.Msg = WM_NCHITTEST) Then
MyBase.WndProc(m)
If (m.Result = HTCLIENT) Then
m.Result = HTCAPTION
End If
Else
If (m.Msg = 163) Then
'屏蔽最大化!
Else
MyBase.WndProc(m)
End If
End If
End Sub
------解决方案--------------------
呵呵,你用其他的方式都会很卡的,自定义窗体用消息接受就可以了,直接让他可以调整大小就是了。

这段代码是拖动无边框窗体的,调整大小也是类似的操作,和拖动区别就在于消息值不同罢了——C#我写不大好,你可以自己修改一下
private IntPtr HTCAPTION = (IntPtr)2;
private IntPtr HTCLIENT = (IntPtr)1;
private int WM_NCHITTEST = 132;

protected override void WndProc(ref Message m)
{
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/M_System_Windows_Forms_Control_WndProc_1_89703afe.htm#codeExampleToggle
//拖动无边框窗体
if ((m.Msg == WM_NCHITTEST))
{
base.WndProc(m);
if ((m.Result == HTCLIENT))
{
m.Result = HTCAPTION;
}
}
else
{
if ((m.Msg == 163))
{
}
//屏蔽最大化!
else
{
base.WndProc(m);
}
}
}

==================================================================
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
优惠接单开发,组件控件定制开发,成品源代码批发
联系方式:Q64180940 全天在线
==================================================================
------解决方案--------------------
WM_NULL = $0000;
  WM_CREATE = $0001;
  应用程序创建一个窗口
  WM_DESTROY = $0002;
  一个窗口被销毁
  WM_MOVE = $0003;
  移动一个窗口
  WM_SIZE = $0005;
  改变一个窗口的大小
  WM_ACTIVATE = $0006;
  一个窗口被激活或失去激活状态;
  WM_SETFOCUS = $0007;
  获得焦点后
  WM_KILLFOCUS = $0008;
  失去焦点
  WM_ENABLE = $000A;
  改变enable状态
  WM_SETREDRAW = $000B;
  设置窗口是否能重画
  WM_SETTEXT = $000C;