About Forum Sitemap Login Register

Home

C#

VB

Java

C++

Other

Forum

English

Farsi

دوستان:

 

JG Solutions

TechwizWorld

Rishoo Blog

Ranjhaco.110MB

Free Download Software

Anar News & Reviews

Yazdi Programming Co.

Darth Scape
Online Star Wars RPG

Caustic Designs Production

News: (1) 110MB registration is now open, it's time to make your own website on 110MB, one the greatest free web hostings in the world!


C#‎ - ‏حرکت دادن فرم بدون حاشیه

گرانبار کردن عملگر ها

همان طور که می دانید کاربر یک فرم بدون حاشیه را نمی تواند با عمل 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. به صورت دستی:

این روش نسبت به روش قبل پیچیده تر می باشد. به زودی مقاله آن آماده می شود.

 

نظر ها

توسط بهزاد

در 2008-02-03 07:41:04 GMT

این پست توسط بهزاد در 2008-02-03 07:41:04 GMT فرستاده شده

 

ایمیل

Rolling On The Floor

توسط ریحانه

در 2009-04-23 07:02:32 GMT

این پست توسط ریحانه در 2009-04-23 07:02:32 GMT فرستاده شده

 

ایمیل

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

 

اگر دوست دارید می توانید با پر کردن فرم زیر به راحتی نظر خود را ثبت کنید:

نام:

ایمیل:

وب سایت:

 

 

More Emoticons

 

 

گرانبار کردن عملگر ها

IP: 38.107.191.101

Country: United States

Browser: Unknown

OS: Unknown

@2008 Alamat.110MB programming

Site Statistics:

Powered by 110MB free web hosting