Posición fija de un formulario en tiempo de ejecución

28/06/2005 - 01:09 por clr | Informe spam
Hola, nuevamente, como puedo hacer para que un formulaio no puede ser
desplazado de su posición original, esto es que si lo coloco centrado en la
pantalla, permanezca en ese lugar hasta que se salga de la aplicación

De antemano muchas gracias

Preguntas similare

Leer las respuestas

#1 Juan Pedro Gonzalez
28/06/2005 - 09:41 | Informe spam
Hola clr,

Podrias ajustar la posicion, pero produciría un parpadeo bastante
desagradable que tendrias que corregir con el siguiente código:

Protected Overrides Sub OnLocationChanged(ByVal e As System.EventArgs)
Me.Location = New
System.Drawing.Point((SystemInformation.PrimaryMonitorMaximizedWindowSize.Wi
dth - Me.Width) / 2,
(SystemInformation.PrimaryMonitorMaximizedWindowSize.Height - Me.Height) /
2)
End Sub

Otra opcion es poner el FormBorder a None, de esta forma el usuario no
tendrá donde pinchar para desplazar la ventana. y podrias pintar
posteriormente el borde con ControlPaint, e incluso podrias redibujar la
barra superior. Personalmente opino que esta ultima es la mas acertada y la
mas sencilla.

Un Saludo,

Juan Pedro González




"clr" escribió en el mensaje
news:e#
Hola, nuevamente, como puedo hacer para que un formulaio no puede ser
desplazado de su posición original, esto es que si lo coloco centrado en


la
pantalla, permanezca en ese lugar hasta que se salga de la aplicación

De antemano muchas gracias


Respuesta Responder a este mensaje
#2 Eduardo A. Morcillo [MS MVP VB]
28/06/2005 - 17:09 | Informe spam
Puedes usar APIs para quitar el item Mover del menu de control de la
ventana. Lo mejor entonces es encapsular ese codigo en un formulario y
heredar los demas formularios del que contiene el codigo. Aqui esta como
hacerlo, simplemente hereda tus formularios de esta clase en lugar de
System.Windows.Forms.Form:

Option Strict On
Option Explicit On

Imports System
Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class MovableForm
Inherits System.Windows.Forms.Form

Private _movable As Boolean = True

<DllImport("user32.dll")> _
Private Shared Function GetSystemMenu( _
ByVal hWnd As IntPtr, ByVal revert As Boolean) As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function DeleteMenu(ByVal hMenu As IntPtr, _
ByVal position As Integer, ByVal flags As Integer) As Boolean
End Function

<Category("Window Style"), _
DefaultValue(True)> _
Public Property Movable() As Boolean
Get
Return _movable
End Get
Set(ByVal value As Boolean)

If value <> _movable Then
SetMovableCore(value)
_movable = Movable
End If

End Set
End Property

Protected Sub SetMovableCore(ByVal movable As Boolean)

Const MF_BYCOMMAND As Integer = 0
Const SC_MOVE As Integer = &HF010

If Me.IsHandleCreated Then

If movable Then

GetSystemMenu(Me.Handle, True)

Else

Dim menu As IntPtr = GetSystemMenu(Me.Handle, False)

DeleteMenu(menu, SC_MOVE, MF_BYCOMMAND)

End If

End If

End Sub

Protected Overrides Sub CreateHandle()

MyBase.CreateHandle()

SetMovableCore(_movable)

End Sub

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#3 clr
29/06/2005 - 02:05 | Informe spam
Coloque el FormBorder a None, pero no se como redibujar la barra de titulo,

"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:%23Qy8UN$
Puedes usar APIs para quitar el item Mover del menu de control de la
ventana. Lo mejor entonces es encapsular ese codigo en un formulario y
heredar los demas formularios del que contiene el codigo. Aqui esta como
hacerlo, simplemente hereda tus formularios de esta clase en lugar de
System.Windows.Forms.Form:

Option Strict On
Option Explicit On

Imports System
Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class MovableForm
Inherits System.Windows.Forms.Form

Private _movable As Boolean = True

<DllImport("user32.dll")> _
Private Shared Function GetSystemMenu( _
ByVal hWnd As IntPtr, ByVal revert As Boolean) As IntPtr
End Function

<DllImport("user32.dll")> _
Private Shared Function DeleteMenu(ByVal hMenu As IntPtr, _
ByVal position As Integer, ByVal flags As Integer) As Boolean
End Function

<Category("Window Style"), _
DefaultValue(True)> _
Public Property Movable() As Boolean
Get
Return _movable
End Get
Set(ByVal value As Boolean)

If value <> _movable Then
SetMovableCore(value)
_movable = Movable
End If

End Set
End Property

Protected Sub SetMovableCore(ByVal movable As Boolean)

Const MF_BYCOMMAND As Integer = 0
Const SC_MOVE As Integer = &HF010

If Me.IsHandleCreated Then

If movable Then

GetSystemMenu(Me.Handle, True)

Else

Dim menu As IntPtr = GetSystemMenu(Me.Handle, False)

DeleteMenu(menu, SC_MOVE, MF_BYCOMMAND)

End If

End If

End Sub

Protected Overrides Sub CreateHandle()

MyBase.CreateHandle()

SetMovableCore(_movable)

End Sub

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo


Respuesta Responder a este mensaje
#4 Eduardo A. Morcillo [MS MVP VB]
29/06/2005 - 04:45 | Informe spam
¿Probaste lo que te mande? Quitarle el borde al formulario quita tambien la
barra de titulo. Con el codigo que mande no tienes mas que setear la
propiedad Movable del formulario para especificar si se puede mover o no.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#5 José Ramón
29/06/2005 - 11:55 | Informe spam
Con esto el formulario no se mueve

Protected Overrides Sub WndProc(ByRef m As Message)

Const WM_NCLBUTTONDOWN As Int32 = &HA1

Const WM_SYSCOMMAND As Int32 = &H112

Const HTCAPTION As Int32 = &H2

Const SC_MOVE As Int32 = &HF010

If m.Msg = WM_SYSCOMMAND And m.WParam.ToInt32() = SC_MOVE OrElse
m.Msg = WM_NCLBUTTONDOWN And m.WParam.ToInt32() = HTCAPTION Then

Return

End If

MyBase.WndProc(m)

End Sub
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida