سؤال

ويمكنني استخدام التعليمات البرمجية التالية لسحب استمارة بلا حدود، عن طريق النقر والسحب النموذج نفسه. كان يعمل، ولكن لم يحدث ذلك لأنه عندما كنت انقر واسحب عنصر تحكم موجود في النموذج. أنا بحاجة إلى أن تكون قادرة على سحبه عند النقر على بعض الضوابط دون غيرها - السحب من التسميات، ولكن لا بواسطة أزرار ومربعات النص. كيف أفعل ذلك؟

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    const int WM_NCHITTEST = 0x84;
    const int HTCLIENT = 0x1;
    const int HTCAPTION = 0x2;

    if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)
        m.Result = (IntPtr)HTCAPTION;
}
هل كانت مفيدة؟

المحلول

في الواقع، لقد وجدت الحل <لأ href = "http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/52469b75-de7c-4eaa-beb8-dd347a7de14a/" يختلط = " نوفولو noreferrer "> هنا .

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HTCAPTION = 0x2;

[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

// Paste the below code in the your label control MouseDown event
if (e.Button == MouseButtons.Left)
{
    ReleaseCapture();
    SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}

ويعمل.

وكذلك في قانون بلدي أعلاه، إذا كان المطلوب تغيير حجم، إذا يجب تغيير تصريح ل

        if (m.Msg == WM_NCHITTEST)
            if ((int)m.Result == HTCLIENT)
                m.Result = (IntPtr)HTCAPTION;

نصائح أخرى

استخدم جاسوس ++ لتحليل ما الضوابط يتلقون ما الرسائل ويندوز، عليك ثم نعرف ما عليك أن تكون اسر.

وبغض النظر بعمق في التعليمات البرمجية انا تخيل أن عناصر التحكم التابعة على النافذة الرئيسية هي استقبال الرسائل وليس على شكل وتريد الرد على بعض هذه على وجه التحديد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top