*Experts* Merrion Posted June 4, 2003 *Experts* Posted June 4, 2003 Often, especially where a customised or skinned look is desired, the form is created with the FormBorderStyle set to FixedSingle. However if you still want to move that skinned form you have a bit of a problem. Fortunately it is possible to handle the WM_NCHITTEST window message to make windows think the mouse is over the caption even where a form doesn't have one. 1. Defining a rectangle that emulates the form caption In the form: Public Class Form1 Inherits System.Windows.Forms.Form #Region "Private memeber variables" Dim rcCaption As Rectangle #End Region Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() '\\ Make the fake caption rectangle rcCaption = New Rectangle(0, 0, Me.Width, 29) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint e.Graphics.FillRectangle(New SolidBrush(Color.Blue), rcCaption) End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) '\\ We want to pretend that the rectangle rcCaption, is the caption bar so we can drag the form by it... If m.Msg = WM_NCHITTEST Then Call FakeCaptionForCaptionlessWindow(Me, m, rcCaption) Else MyBase.WndProc(m) End If End Sub End Class 2. The WM_NCHITTEST handler This is kept in a seperate module for reusability... Imports System.Windows.Forms '\\ --[ApiHitTestHandling]------------------------------------- '\\ Used to handle the WM_HITTEST message, to allow dragging of '\\ captionless windows... '\\ ----------------------------------------------------------- Module ApiHitTestHandling Public Const WM_NCHITTEST = &H84 Public Enum HitTestResult HTBORDER = 18 HTBOTTOM = 15 HTBOTTOMLEFT = 16 HTBOTTOMRIGHT = 17 HTCAPTION = 2 HTCLIENT = 1 HTERROR = (-2) HTGROWBOX = 4 HTHSCROLL = 6 HTLEFT = 10 HTMAXBUTTON = 9 HTMENU = 5 HTMINBUTTON = 8 HTNOWHERE = 0 HTRIGHT = 11 HTSYSMENU = 3 HTTOP = 12 HTTOPLEFT = 13 HTTOPRIGHT = 14 HTVSCROLL = 7 HTTRANSPARENT = (-1) HTOBJECT = 19 HTCLOSE = 20 HTHELP = 21 End Enum Public Sub FakeCaptionForCaptionlessWindow(ByVal fParent As Form, ByRef m As Message, ByVal CaptionRectangle As Rectangle) If m.Msg = WM_NCHITTEST Then '\\ If the mouse is in the rectangle that is considered to be the caption set the return value to HTCAPTION Dim ptClickLocation As New Point(m.LParam.ToInt32) ptClickLocation = fParent.PointToClient(ptClickLocation) If CaptionRectangle.Contains(ptClickLocation) Then m.Result = New IntPtr(HitTestResult.HTCAPTION) Else m.Result = New IntPtr(HitTestResult.HTCLIENT) End If End If End Sub End Module Quote Printer Monitor for .NET? - see Merrion Computing Ltd for details
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.