2012-01-04 3 views
0

ユーザーがwinformを移動しないようにしたい。どのようにwinformの場所をロックまたはフリーズしますか?だから、彼らが何をしても、それは動かすことができません。私は、win32の場合は、Windows用のフリーズオプションがあると思います。このオプションを設定すると、移動しているウィンドウのアウトラインのみが表示されますが、実際のウィンドウは元の位置に残ります。私はwinformで同様のことをやろうとしています。 winformの場所をロックまたはフリーズする方法は?

EDIT

:ここ は、Win32で位置変更のためにウィンドウメッセージをキャプチャするための手順です:

//Frozen is a user-defined boolean variable 
procedure TVIewFrm.WMPosChanging(var Msg: TMessage); 
var 
    wp:PWINDOWPOS; 
begin 
    if Frozen then 
    begin 
    wp := PWINDOWPOS(Msg.lParam); 
    wp^.flags := wp^.flags or SWP_NOMOVE; 
    end; 
    inherited; 
end; 

の作業手順であり、それは私がWinフォームをどうしようとしていますものです。これまでのところ、皆さんは私が探している解決策ではなく、すべての課題を投稿しました。

+0

最大化されたウィンドウ?メニューバーとドラッグ可能なエッジのないウィンドウ? –

+0

WinFormの 'WndProc'をオーバーライドして、フォームのウィンドウのドラッグイベントを実装できますか? –

+0

@MrLister最大化することはできますが、メニューバーとドラッグ可能なエッジはありません。 – ThN

答えて

0

あなたのうちの何人かが近づいてきましたが、私にとってはうまくいきませんでした。あなたの答えは多かれ少なかれ回避していました。私はまっすぐな解決策を探していました。

私は私の問題を理解しました。私のソリューションは完璧に動作しますが、winformのアウトラインを描画してドラッグすることはありません。私はおそらくそれを達成するためにLarsTechに似たコードを実装する必要があります。ここで

は私の作業コードです:

//declared within a form class under protected 
method WndProc(var m:Message); override; 

//and is defined as follows. 
method MainForm.WndProc(var m: Message); 
const WM_NCLBUTTONDOWN = 161; 
const WM_SYSCOMMAND = 274; 
const HTCAPTION = 2; 
const SC_MOVE = 61456; 
begin 
    if ((m.Msg = WM_SYSCOMMAND) and (m.WParam.ToInt32 = SC_MOVE)) then 
    begin 
     exit; 
    end; 

    if ((m.Msg = WM_NCLBUTTONDOWN) and (m.WParam.ToInt32 = HTCAPTION)) then 
    begin 
     exit; 
    end; 
    inherited WndProc(var m); 
end; 

は、あなたの答えありがとうございました。

0

フォームの移動イベントでは、場所を元の位置に戻すだけです。

+0

まあ、私はユーザーがwinformをまったく動かすことができないようにしたくありません。移動しようとしても、ロックされているか、またはその位置に固定されている必要があります。しかし、ウィンドウをドラッグしようとすると、winformのアウトラインを見ることができるはずです。彼らがマウスを動かすか、それを行かせるとき、アウトラインは消えるはずですが、winformはまだ元の位置にあるはずです。 – ThN

3

これを試してみてください:

Public Class UnmovableForm 

    Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs) 
     '' Remove the Move command from the system menu so the window becomes unmovable 
     Call RemoveMenu(GetSystemMenu(Me.Handle, False), SC_MOVE, MF_BYCOMMAND) 
     MyBase.OnHandleCreated(e) 
    End Sub 

    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer 
    Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal bRevert As Boolean) As IntPtr 
    Private Const MF_DISABLED As Integer = 2 
    Private Const MF_BYCOMMAND As Integer = 0 
    Private Const SC_MOVE As Integer = &HF010 
End Class 

ホープこれはあなたの問題を解決します。あなたのニーズに関してで

+0

かなり良いですが、これはOnHandleCreated()が確実に動作するためのオーバーライドで呼び出される必要があります。引数はByValでなければなりません。 –

+0

さん、コードを編集して効率を上げることができますか?私は不動のフォームを作成するたびに、私は通常そのようにします。 –

+0

@HansPassantあなたはオーバーライドする必要があるという点で正しいです。それでも、ジョンの解決策は役に立たないと思います。 – ThN

0

良い答え:(?多分MouseDownイベントでつかん)

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByRef lpvParam As String, ByVal fuWinIni As Integer) As Integer 

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByRef lpvParam As Long, ByVal fuWinIni As Integer) As Integer 

Private Const SPI_GETDRAGFULLWINDOWS = 38 
Private Const SPI_SETDRAGFULLWINDOWS = 37 
Private Const SPIF_SENDWININICHANGE = 2 

Private Sub frmMain_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move 
Dim result As Long 
result = SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 1&, vbNullString, SPIF_SENDWININICHANGE) 
Me.Location = New Point(0, 0) 
result = SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 0&, vbNullString, SPIF_SENDWININICHANGE) 

End Sub 

今、あなたの最初の場所にMe.Location =新しいポイント(0,0)を設定することができるはず

0

あなたの形でこれを試すことができます。

public partial class TestForm : Form { 

    private const int HT_CAPTION = 0x2; 
    private const int WM_NCLBUTTONDOWN = 0xA1; 

    [DllImportAttribute("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

    public TestForm() { 
    InitializeComponent(); 
    this.ControlBox = false; 
    } 

    protected override void WndProc(ref Message m) { 
    if (m.Msg == Win32.WM_NCLBUTTONDOWN) { 
     Form moveForm = new Form(); 
     moveForm.FormBorderStyle = FormBorderStyle.None; 
     moveForm.StartPosition = FormStartPosition.Manual; 
     moveForm.ShowInTaskbar = false; 
     moveForm.TransparencyKey = Color.Lime; 
     moveForm.BackColor = Color.Lime; 
     moveForm.SetBounds(this.Left, this.Top, this.Width, this.Height); 
     moveForm.Paint += moveForm_Paint;   
     moveForm.Show(); 
     SendMessage(moveForm.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
     moveForm.Paint -= moveForm_Paint; 
     moveForm.Close(); 
    } else { 
     base.WndProc(ref m); 
    } 
    } 

    void moveForm_Paint(object sender, PaintEventArgs e) { 
    using (Pen p = new Pen(Color.Gray, 7)) { 
     p.Alignment = System.Drawing.Drawing2D.PenAlignment.Center; 
     e.Graphics.DrawRectangle(p, ((Form)sender).ClientRectangle); 
    } 
    } 
} 

それは国境の周りに灰色の四角形を描画する透明フォームアップをポップし、MESSAを送信し、非クライアント領域は、マウスダウンボタンを左傍受あなたがクリックしたフォームであれば、そのままフォームを移動してください。

関連する問題