2009-10-22 6 views
5

मैं फॉर्म को क्लिक करके और खींचकर सीमा रहित फ़ॉर्म खींचने के लिए निम्न कोड का उपयोग करता हूं। यह काम करता है, लेकिन यह तब नहीं होता जब आप फॉर्म पर स्थित नियंत्रण पर क्लिक करते हैं और खींचते हैं। कुछ नियंत्रणों पर क्लिक करते समय मुझे इसे खींचने में सक्षम होना चाहिए, लेकिन दूसरों के नहीं - लेबल द्वारा खींचें, लेकिन बटन और टेक्स्ट बॉक्स द्वारा नहीं। मैं यह कैसे करुं?सी #: फ़ॉर्म और उसके नियंत्रण से कैसे खींचें?

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; 
} 

उत्तर

3

दरअसल, मुझे समाधान here मिला।

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; 
को बदला जाना चाहिए अगर
1

उपयोग जासूस ++ विश्लेषण करने के लिए क्या नियंत्रण प्राप्त कर रहे हैं क्या विंडोज संदेश, इसके बाद आपको पता चल जाएगा कि क्या आप पर कब्जा करने की जरूरत है।

आपके कोड पर गहराई से देखे बिना मैं कल्पना कर रहा हूं कि मुख्य विंडो पर बाल नियंत्रण फ़ॉर्म के बजाय संदेश प्राप्त कर रहे हैं और आप इनमें से कुछ को विशेष रूप से जवाब देना चाहते हैं।