移动无标题栏的窗口

本来是想在vb.net中移动无标题栏的窗口的位置,找了很多资料,还是没能解决.

第1种方法:这种方法在vs2003中好象还可以,但是在vs 2005中会报错,实现代码如下

Public   Const  WM_NCLBUTTONDOWN  =   & HA1S

Public   Const  HTCAPTION  =   2

ExpandedBlockStart.gifContractedBlock.gif
Public   Declare   Function SendMessage() Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntegerByVal wMsg As IntegerByVal wParam As IntegerByVal lParam As ObjectAs Long
ExpandedSubBlockStart.gifContractedSubBlock.gif  
Public Declare Function ReleaseCapture()Function ReleaseCapture Lib "user32" () As Integer

'在要移动的控件上处理MouseDown事件
ExpandedSubBlockStart.gifContractedSubBlock.gif
 Private Sub titleBar1_MouseDown()Sub titleBar1_MouseDown(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles titleBar1.MouseDown
    
Try
      
If e.Button = MouseButtons.Left Then
        ReleaseCapture()
        SendMessage(
Me.pnlInfo.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
      
End If
    
Catch ex As Exception
      MsgShow(txtInfo, ex.Message)
    
End Try
  
End Sub
但如果你是在C#中使用又没有问题,把上面的一段代码改为C#的语法就可以了,实现的方法是一样
 [System.Runtime.InteropServices.DllImport( " user32.dll " , EntryPoint  =   " SendMessage " )]
        
public   static   extern   int  SendMessage( int  hWnd,  int  wMsg,  int  wParam,  int  lParam);
        [System.Runtime.InteropServices.DllImport(
" user32.dll " , EntryPoint  =   " ReleaseCapture " )]
        
private    static   extern   int  ReleaseCapture();
        
public   const   int  WM_SysCommand  =   0x0112 ;
        
public   const   int  SC_MOVE  =   0xF012 ;
因此最后只有结合这两种
用C#写一个DLL,在VB中调用
实现如下:
C#类库:
namespace  MoveWindow
ExpandedBlockStart.gifContractedBlock.gif
{
    
public class ClassMoveWindow
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{


        [System.Runtime.InteropServices.DllImport(
"user32.dll", EntryPoint = "SendMessage")]
        
private  static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
        [System.Runtime.InteropServices.DllImport(
"user32.dll", EntryPoint = "ReleaseCapture")]
        
private  static extern int ReleaseCapture();
        
private  const int WM_SysCommand = 0x0112;
        
private  const int SC_MOVE = 0xF012;

      
        
public void SendMessage(Int32 Handle)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            ReleaseCapture();
            SendMessage(Handle , WM_SysCommand, SC_MOVE, 
0);
        }


    }

}

在VB.net中调用,先添加Dll的引用,实现代码如下
ExpandedBlockStart.gif ContractedBlock.gif Private   Sub titleBar1_MouseDown() Sub titleBar1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles titleBar1.MouseDown
    
Dim MoveObj As New MoveWindow.ClassMoveWindow

    
Try
      
If e.Button = Windows.Forms.MouseButtons.Left Then
        MoveObj.SendMessage(
Me.pnlInfo.Handle.ToInt32)
      
End If
    
Catch ex As Exception
      
MsgBox(ex.Message)
    
Finally
      MoveObj 
= Nothing

    
End Try


  
End Sub
方法3:
如果你是直接在在窗体上移动位置,则可以加入下面的代码,但如果窗体上有控件则不能响应到MouseDown,这个道理很简单,因为被别的控件挡住了
Public   Const  WM_NCLBUTTONDOWN  =   & HA1S

Public   Const  HTCAPTION  =   2

ExpandedBlockStart.gifContractedBlock.gif
Public   Declare   Function SendMessage() Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntegerByVal wMsg As IntegerByVal wParam As IntegerByVal lParam As ObjectAs Long
ExpandedSubBlockStart.gifContractedSubBlock.gif  
Public Declare Function ReleaseCapture()Function ReleaseCapture Lib "user32" () As Integer

'在要移动的控件上处理MouseDown事件
ExpandedSubBlockStart.gifContractedSubBlock.gif
 Private Sub titleBar1_MouseDown()Sub titleBar1_MouseDown(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles titleBar1.MouseDown
    
Try
      
If e.Button = MouseButtons.Left Then
        ReleaseCapture()
        SendMessage(
Me.pnlInfo.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
      
End If
    
Catch ex As Exception
      MsgShow(txtInfo, ex.Message)
    
End Try
  
End Sub
e

转载于:https://www.cnblogs.com/ruinet/archive/2007/04/25/726863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值