PDA

View Full Version : ثابت نگه داشتن موقعیت مکانی یک فرم



mehdi58
پنج شنبه 11 مرداد 1386, 17:29 عصر
با سلام
آیا این امکان وجود داره که هنگام نمایش یه فرم ، کاربر نتونه با درگ روی نوار عنوان فرم مورد نظر اون رو جابجا کنه ؟
البته بدون اینکه خاصیت formBorderStyle رو برابر None قرار بدیم یا فرم رو در حالت Maximize نمایش بدیم و دکمه مربوطه رو غیر فعال کنیم .
با تشکر

اَرژنگ
پنج شنبه 11 مرداد 1386, 19:24 عصر
با سلام
آیا این امکان وجود داره که هنگام نمایش یه فرم ، کاربر نتونه با درگ روی نوار عنوان فرم مورد نظر اون رو جابجا کنه ؟
البته بدون اینکه خاصیت formBorderStyle رو برابر None قرار بدیم یا فرم رو در حالت Maximize نمایش بدیم و دکمه مربوطه رو غیر فعال کنیم .
با تشکر



[VB.NET]
Protected Overrides Sub WndProc(ByRef m As Message)
const Integer WM_NCLBUTTONDOWN = 161
const Integer WM_SYSCOMMAND = 274
const Integer HTCAPTION = 2
const Integer SC_MOVE = 61456

If (m.Msg = WM_SYSCOMMAND) &&(m.WParam.ToInt32() = SC_MOVE) Then
Return
End If

If (m.Msg = WM_NCLBUTTONDOWN) &&(m.WParam.ToInt32() = HTCAPTION) Then
Return
End If

MyBase.WndProc( m)
End Sub

saeed_rezaei
پنج شنبه 11 مرداد 1386, 19:41 عصر
چند وقت قبل هم یه تاپیک مثل همین تاپیک ارائه شد. نتیجه نهایی که در اون تاپیک گرفته شد این بود که مختصات فرم رو در متغیرهایی ذخیره کنند و هر بار در تابع form1_move ، مختصات فرم رو دوباره reset کنند.

اَرژنگ
پنج شنبه 11 مرداد 1386, 20:05 عصر
چند وقت قبل هم یه تاپیک مثل همین تاپیک ارائه شد. نتیجه نهایی که در اون تاپیک گرفته شد این بود که مختصات فرم رو در متغیرهایی ذخیره کنند و هر بار در تابع form1_move ، مختصات فرم رو دوباره reset کنند.
بیزحمت یک لیبک به آن توپیک بدید.
وقتی که اجرا میشد فرم نمیپرید، در زمان اجرا فرقی با این یکی متد داشت؟ یا هردو یکجورند؟

Business Analyst
پنج شنبه 11 مرداد 1386, 20:57 عصر
اگه متغیر داشته باشین اول فرم move میکنه بعدان به جای اولش میاد!
اگه بردر (title bar ( رو برداری فکر نکنم بشه مووو کرد اما راه درستی نیست!

mehdi.mousavi
پنج شنبه 11 مرداد 1386, 21:44 عصر
با سلام
آیا این امکان وجود داره که هنگام نمایش یه فرم ، کاربر نتونه با درگ روی نوار عنوان فرم مورد نظر اون رو جابجا کنه ؟
البته بدون اینکه خاصیت formBorderStyle رو برابر None قرار بدیم یا فرم رو در حالت Maximize نمایش بدیم و دکمه مربوطه رو غیر فعال کنیم .
با تشکر

سلام.
راه صحیح برای انجام اینکار برداشتن آیتم Move از System Menu مربوط به فرم هستش. من چون VB بلد نیستم براتون به C# مینویسم، مطمئنا کسی پیدا میشه که اینو براتون به VB.NET تبدیل کنه. من زیاد با روش آرژنگ موافق نیستم چون با ازای هر Message ای که به Window ارسال میشه، باید 4 تا شرط چک بشه...


private const Int32 SC_MOVE = 0xf010;
private const Int32 MF_BYCOMMAND = 0x00000000;

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, Boolean bRevert);

[DllImport("user32.dll")]
private static extern Boolean RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

بعد، توی Constructor یا توی OnLoad، بزنید:



RemoveMenu(GetSystemMenu(this.Handle, false), SC_MOVE, MF_BYCOMMAND);


البته من هر جور تغییر در نحوه اجرای استاندارد یه برنامه (از جمله همین کار) رو به هیچکس توصیه نمیکنم.

saeed_rezaei
پنج شنبه 11 مرداد 1386, 21:48 عصر
کد آقا ارژنگ رو باید به صورت زیر استفاده کرد.



Const WM_NCLBUTTONDOWN AsInteger = 161
Const WM_SYSCOMMAND AsInteger = 274
Const HTCAPTION AsInteger = 2
Const SC_MOVE AsInteger = 61456
If (m.Msg = WM_SYSCOMMAND) And (m.WParam.ToInt32() = SC_MOVE) Then
Return
EndIf
If (m.Msg = WM_NCLBUTTONDOWN) And (m.WParam.ToInt32() = HTCAPTION) Then
Return
EndIf
MyBase.WndProc(m)


که البته همانطور که آقای مهدی گفتن، با هر بار اجرا چهارتاشرط اجرا می شه. که این خوب نیست اما از روشهای قبلی بهتره
کد آقا مهدی رو من بلد نیستم تبدیل کنم. اما مطمئنن از دوستان هستند که این کار رو بتونن انجام بدن

asar_001
جمعه 12 مرداد 1386, 09:33 صبح
سلام.
راه صحیح برای انجام اینکار برداشتن آیتم Move از System Menu مربوط به فرم هستش. من چون VB بلد نیستم براتون به C# مینویسم، مطمئنا کسی پیدا میشه که اینو براتون به VB.NET تبدیل کنه. من زیاد با روش آرژنگ موافق نیستم چون با ازای هر Message ای که به Window ارسال میشه، باید 4 تا شرط چک بشه...


private const Int32 SC_MOVE = 0xf010;
private const Int32 MF_BYCOMMAND = 0x00000000;

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, Boolean bRevert);

[DllImport("user32.dll")]
private static extern Boolean RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

بعد، توی Constructor یا توی OnLoad، بزنید:



RemoveMenu(GetSystemMenu(this.Handle, false), SC_MOVE, MF_BYCOMMAND);


البته من هر جور تغییر در نحوه اجرای استاندارد یه برنامه (از جمله همین کار) رو به هیچکس توصیه نمیکنم.
با تشکر از شما
من میخواستم از این کد ها استفاده کنم ولی روی DllImport ارور میده
می شه بگید چرا؟:متفکر:

mehdi58
جمعه 12 مرداد 1386, 09:55 صبح
[VB.NET]
Protected Overrides Sub WndProc(ByRef m As Message)
const Integer WM_NCLBUTTONDOWN = 161
const Integer WM_SYSCOMMAND = 274
const Integer HTCAPTION = 2
const Integer SC_MOVE = 61456

If (m.Msg = WM_SYSCOMMAND) &&(m.WParam.ToInt32() = SC_MOVE) Then
Return
End If

If (m.Msg = WM_NCLBUTTONDOWN) &&(m.WParam.ToInt32() = HTCAPTION) Then
Return
End If

MyBase.WndProc( m)
End Sub


دوست عزیز با تشکر از پاسخگویی شما اما از کد شما خیلی سر در نیاوردم .
میشه بیشتر توضیح بدین ( البته فکر می کنم کدتون #C بود)

mehdi.mousavi
جمعه 12 مرداد 1386, 12:36 عصر
با تشکر از شما
من میخواستم از این کد ها استفاده کنم ولی روی DllImport ارور میده
می شه بگید چرا؟:متفکر:


DllImport در System.Runtime.InteropServices namespace تعریف شده!