the_king
مدیرکل انجمن
اولا در کد همینطوری 1024 ننویسید، اسم ثابتش رو تعریف کنید تا هم بعدا که خودتون یادتون رفت و هم بقیه بفهمند منظور WM_USER ئه.آها ممنون.
پس 2 بایت از اون 4 بایت را به مختصات x و 2 بایت دیگه شو به y اختصاص دادن.
--------------
من یه کلاس ساختم که از کنترل Panel ارث بری میکنه. میخوام وقتی موس رو روی این کنترل درگ میکنیم (کلیک میکنیم و جابجا میکنیم) ، کنترل والدش که فرم هست ، جابجا بشه (البته از روش کد زیر) .
در کد زیر ، وقتی موس رو روی Panel میبرم ، یه پیام شخصی به فرم ارسال میکنه (در کنترل Panel ام) :
کد:class MovablePanel : Panel { [DllImportAttribute("User32.dll", EntryPoint = "SendMessage")] private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr WParam, IntPtr LParam); private const int WM_NCHITTEST = 0x84; protected override void WndProc(ref Message m) { if (m.Msg == WM_NCHITTEST) { MovablePanel.SendMessage(this.Parent.Handle, 1024, new IntPtr(0), new IntPtr(1)); } base.WndProc(ref m); } }
در کنترل فرم ام :
کد:private const int WM_NCHITTEST = 0x84; protected override void WndProc(ref Message m) { if (m.Msg == 1024) { m.Result = (IntPtr)2; return; } base.WndProc(ref m); }
پیام به کنترل فرم میرسه اما با کد m.Result = (IntPtr)2 ، جابجا نمیشه . چرا؟ این کد رو میشه تغییر داد تا کار کنه؟ اگه آره ، چجوری؟
این پیام و پاسخی که بین دو پنجره رد و بدل کردید برای سیستم هیچ معنی خاصی نداره، چه 2 پس میفرستادید و چه 2222 به هر حال سیستم کاری انجام نمیداد.
پیام WM_USER شرحی نداره که مشخص باشه LParam و WParam اش برای چیه و چیکار میکنه. منطقی نداره که اگه 2 رو پس بفرسته ارتباطی با HTCAPTION در پیام WM_NCHITTEST داشته بشه، اینکه پیام WM_NCHITTEST نیست، پیام WM_USER ئه.
WM_USERیک پیام اختصاصی برنامه شما است که فقط خودتون میدونید مقادیرش چه معنی ای داره.
وقتی که ماوس میخواد روی پنجره ای Drag کنه، ماوس توسط پنجره Capture میشه تا پیام های جابجایی ماوس فقط توسط اون پنجره دریافت بشن. Capture شدن این ویژگی رو داره که حتی اگه ماوس از کادر پنجره دربیاد همچنان پیام ها به پنجره ارسال میشه، حتی اگه ماوس روی پنجره دیگری رفته باشه، تا زمانی که ماوس مجددا Release بشه.
پنجره MovablePanel شما مشکلی با WM_NCHITTEST پیشفرض نداره، چون هر نقطه داخل کادرش رو جزئی از خودش محسوب می کنه.
نیازی هم ندارید که محیط داخلش HTCAPTION محسوب بشه، چون نمیخواهید MovablePanel تون مستقل جابجا بشه، پس کاری به WM_NCHITTEST پنجره MovablePanel ندارید.
فقط و فقط میخواهید وقتی ماوس روی MovablePanel خواست Drag ای رو شروع کنه، بجاش پنجره والد شروع به جابجایی کنه.
کد:
class MovablePanel : Panel
{
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 2;
[DllImportAttribute("User32.dll", EntryPoint = "SendMessage")]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr WParam, IntPtr LParam);
[DllImport("User32.dll")]
private static extern int ReleaseCapture();
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Parent.Handle, WM_NCLBUTTONDOWN, new IntPtr(HTCAPTION), IntPtr.Zero);
return;
}
base.OnMouseDown(e);
}
}
منوی Project > {project name} Properties... > Application > Assembly Informationبعد اینکه استاد علی ، من نام پروژه ام را از VSS به PoshtibangirTolo تغییر دادم .
حالا توی تسک منیجر ، در قسمت اول ، همون نام Vss هست اما متن فرم که PoshtibangirTolo هست :
مشاهده پیوست 112329
چی کار باید کرد تا اون نوشته ی VSS در تسک منیجر هم به Poshtibangir Tolo تغییر کنه؟