|
همان طور که می
دانید کاربر یک فرم
بدون حاشیه را نمی
تواند با عمل Drag تکان
دهد ولی می توان کد آن
را نوشت تا این کار
امکان پذیر شود. برای
این کار دو راه وجود
دارد:
1. با استفاده از API:
در این روش ما از
توابع موجود در فایل
های DLL خود ویندوز (API)
برای حرکت دادن فرم
استفاده می کنیم. به
همین دلیل این عمل
طبق تنظیمات ویندوز
و مثل حرکت دادن فرم
های دیگر انجام می
گیرد. تابع SendMessage
موجود در user32.dll تابعی
است که می تواند
پیامی را با پارامتر
های مربوط به آن به یک
پنجره بفرستد و
پنجره ای که پیام را
دریافت می کند، بر
اساس آن کار هایی را
انجام می دهد. این
تابع به صورت زیر
تعریف می شود:
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);
پارامتر های آن
عبارتند از: hWnd از
نوع IntPtr آدرس حافظه
ی پنجره است که نام
دیگر آن handle است، Msg از نوع int کد
پیام ارسالی است، wParam و lParam هم از نوع
int پارامتر های
دیگر پیام می باشند
که برای هر پیام
متفاوتند. دقت کنید
در اعلان API ها نام و
نوع پارامتر ها مهم
نیست بلکه ترتیب آن
ها اهمیت دارد.
بنابراین با توجه به
نیاز، نوع آن ها
تغییر می کند.
پیامی که می
خواهیم با متد بالا
به فرم بفرستیم WM_NCLBUTTONDOWN است. این پیام
هنگامی به یک پنجره
فرستاده می شود که
دکمه ی چپ ماوس بر روی
حاشیه ی فرم (قسمتی که
برای تغییر اندازه و
حرکت فرم توسط
ویندوز نمایش داده
می شود) فشرده شود. با
فرستادن این پیام در
اصل فرم را فریب می
دهیم. برای کامل شدن
این پیام، باید
پارامتر wParam را
نیز تعیین کنیم.
مقدار HTCAPTION را می
فرستیم تا به فرم
بگوید دکمه ی چپ ماوس
بر روی حاشیه ی
بالایی فرم فشرده
شده است. برای
پارامتر lParam مفدار
0 را می فرستیم زیرا
نیازی به آن نداریم.
این پارامتر مختصات
ماوس را نگه می دارد.
برای جلوگیری از
یک سری مشکلات مربوط
به سیستم عامل، قبل
از فرستادن پیام
بالا باید تابعی به
نام ReleaseCapture را فرا
بخوانیم. این تابع
کنترل (capture) ماوس را از
فرمی که در حال حاضر
ماوس روی آن قرار
دارد، آزاد می کند.
چون ما پیام WM_NCLBUTTONDOWN
را هنگام رویداد MouseDown به فرم می
فرستیم، ابتدا باید
با ReleaseCapture کنترل
ماوس را از فرم رها
کنیم.
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
حالا می توانیم
تابع DragForm را در
کلاس API بنویسیم:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MoveABorderlessForm
{
/// <summary>
/// Summary description for API.
/// </summary>
public class API
{
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HTCAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
 
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int
wParam, int lParam);
 
public static void Drag(Form form)
{
ReleaseCapture();
SendMessage(form.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
}
2. به صورت دستی:
این روش نسبت به
روش قبل پیچیده تر می
باشد. به زودی مقاله
آن آماده می شود.
|
IP: 38.107.191.101 |
Country: United States
|
Browser: Unknown |
OS: Unknown |
|
|