2009-10-08 18 views
14

मैं चाहता हूं कि उपयोगकर्ता नीचे दाएं कोने पर एक सीमा रहित विंडो का आकार बदलना चाहें जैसे कि मैं combobox नियंत्रण की स्वत: पूर्ण विंडो का आकार बदल सकता हूं।निचले दाएं कोने पर सीमा रहित विंडो का आकार बदलें

मुझे इस तरह के फॉर्म को कॉन्फ़िगर करने के लिए गुण नहीं मिल रहे हैं।

शायद कोई समस्या पर मेरी मदद कर सकता है।

एक छवि यहां पाया जा सकता है:

enter image description here

+0

कुछ कोड पोस्ट करें। आप नियंत्रण की चौड़ाई और ऊंचाई को बदलकर आकार बदल सकते हैं। –

+0

एंड्रयू कीथ की टिप्पणी के कारण स्क्रीनशॉट में संशोधित प्रश्न और जोड़ा गया लिंक: उपयोगकर्ता को फ़ॉर्म का आकार बदलने में सक्षम होना चाहिए। –

+0

पैनल के साथ मेरा समाधान देखें: http://stackoverflow.com/a/8848440/640781 – edid

उत्तर

13

यह प्राप्त करने का उचित तरीका एक संदेश प्रो हैंडलर (उदाहरण के लिए Form.WndProc ओवरराइड करके) WM_NCHITTEST संदेश को संभालना होगा। (आप PInvoke.net पर उस संदेश की सी # परिभाषा पा सकते हैं) विशेष रूप से, जब आप संदेश प्राप्त करते हैं, तो गणना करें कि हिट टेस्ट उस क्षेत्र के बिंदु के लिए है जिसे आपने आकार बदलने के लिए नामित किया है और यदि ऐसा है, तो HTBOTTOMRIGHT लौटाएं। डिफ़ॉल्ट विंडो proc आपके लिए बाकी करेगी, क्योंकि यह मान लीजिए कि उपयोगकर्ता ने विंडो सीमा के निचले दाएं कोने पर क्लिक किया है, भले ही आपकी विंडो की कोई सीमा न हो।

इस aproach के लिए Win32 इंटरऑप का एक किशोर बिट की आवश्यकता है, लेकिन यह आपके आकार को किसी भी अन्य विंडो आकार बदलने की तरह दिखता है।

@benPearce के रूप में करना आसान तरीका होगा और कोने में एक पैनल डालें और चौड़ाई/ऊंचाई का उपयोग करके फॉर्म आकार समायोजित करें। यह काम करने जा रहा है, लेकिन आकार बदलना आसान नहीं होगा, खासकर विस्टा और विन 7 बेसिक पर, जहां मानक कदम और आकार बदलने पर पूर्ण रेड्रो अक्षम है, जबकि हर कदम पर फिर से प्रयास करने जा रहा है।

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

अपडेट 2: यदि आपके पास एक नियंत्रण है जो पूरी विंडो को कवर करता है, तो यह फॉर्म माउस संदेश खाएगा। आपको किसी भी तरह उस स्थान को क्लिप करना होगा जिसे आप उस नियंत्रण से बाहर करने के लिए उपयोग करना चाहते हैं। इस से निपटने के लिए आपके पास कई विकल्प हैं:

  1. आकार बदलने के लिए कुछ जगह बनाने के लिए नियंत्रण का आकार बदलें।
  2. आकार बदलने वाली पकड़ को बाहर करने के लिए नियंत्रण क्षेत्र (क्षेत्र संपत्ति को थ्रूग) में ट्विक करें।
  3. आकार बदलने वाली पकड़ को एक पैनल को कवर करें, अपने माउसइंटर संदेश को सुनें और फॉर्म को कैप्चर करें, सत्य को कैप्चर करें, जिससे सभी माउस संदेश इस पर जा सकेंगे। नोट: आकार बदलने के बाद माउस उस क्षेत्र को छोड़ने के बाद आपको कैप्चरिंग जारी करनी होगी।

मैं विकल्प 1 के लिए सबसे सरल के रूप में जाने की अनुशंसा करता हूं। विकल्प 3 सबसे जटिल है और विंडोज़ में माउस इनपुट कैसे काम करता है, इस बारे में अंतरंग विवरण की आवश्यकता होगी, इसलिए मैं इसकी अनुशंसा नहीं करता।विकल्प 2 विकल्प 1 का एक अच्छा विकल्प है, लेकिन आपको यह देखने का प्रयास करना होगा कि ListView नियंत्रण कैसे अपने क्षेत्र में tweaked पर प्रतिक्रिया करेगा।

+1

बहुत बहुत धन्यवाद, यह emtpy रूपों के लिए महान काम करता है। लेकिन मेरे रूप में एक सूचीदृश्य है जो फॉर्म भरता है। कोई WM_NCHITTEST संदेश निकाल दिया गया है। –

+1

कोई भी व्यक्ति जो पकड़ने की तलाश में आ रहा है, 'ControlPaint.DrawSizeGrip' एक शुरुआत है। – AnotherUser

2

एक पैनल या कोने में कुछ अन्य नियंत्रण रखो, पैनल के MouseDown और MouseMove घटनाओं का उपयोग कर, समायोजित रूपों उचित रूप से आकार।

माउसडाउन में, मैं निर्देशांक रिकॉर्ड करता हूं, फिर माउसमोव में आप फॉर्म आकार को समायोजित करने के लिए मूल स्थिति से अंतर की गणना कर सकते हैं।

+0

मुझे लगता है कि दूसरी वाक्य में "माउसडाउन" का अंतिम उदाहरण "माउसमोव" होना चाहिए। – bentsai

+0

सही! अपडेट किया गया। – benPearce

+0

इसमें थोड़ा सा काम आया लेकिन मुझे अन्य घटनाओं से बेहतर घटना-संचालित समाधान पसंद है। धन्यवाद – BrianLegg

31

यहां फ्रांसी के स्पष्टीकरण से संबंधित कोड है, मैं इसे लिख रहा था लेकिन उसने इस बीच उत्तर दिया ताकि इस स्पष्टीकरण को वोट दें यदि यह कोड आपकी आवश्यकताओं के अनुरूप है।

protected override void WndProc(ref Message m) { 
    const int wmNcHitTest = 0x84; 
    const int htBottomLeft = 16; 
    const int htBottomRight = 17; 
    if (m.Msg == wmNcHitTest) { 
     int x = (int) (m.LParam.ToInt64() & 0xFFFF); 
     int y = (int) ((m.LParam.ToInt64() & 0xFFFF0000) >> 16); 
     Point pt = PointToClient(new Point(x, y)); 
     Size clientSize = ClientSize; 
     if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { 
      m.Result = (IntPtr) (IsMirrored ? htBottomLeft : htBottomRight); 
      return; 
     } 
    } 
    base.WndProc(ref m); 
} 

संपादित करें: ग्रिपर लिखने के लिए, आप एक new VisualStyleRenderer(VisualStyleElement.Status.Gripper.Normal) प्रारंभ और उसके PaintBackground() विधि का उपयोग कर सकते हैं।

+1

ग्रिपर ड्राइंग पर अधिक स्पष्टीकरण http://stackoverflow.com/a/4918111/161052 पर प्रदान किया जाता है – JYelton

19

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

//*********************************************************** 
//This gives us the ability to resize the borderless from any borders instead of just the lower right corner 
protected override void WndProc(ref Message m) 
{ 
    const int wmNcHitTest = 0x84; 
    const int htLeft = 10; 
    const int htRight = 11; 
    const int htTop = 12; 
    const int htTopLeft = 13; 
    const int htTopRight = 14; 
    const int htBottom = 15;    
    const int htBottomLeft = 16; 
    const int htBottomRight = 17;   

    if (m.Msg == wmNcHitTest) 
    { 
     int x = (int)(m.LParam.ToInt64() & 0xFFFF); 
     int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); 
     Point pt = PointToClient(new Point(x, y)); 
     Size clientSize = ClientSize; 
     ///allow resize on the lower right corner 
     if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     {   
      m.Result = (IntPtr)(IsMirrored ? htBottomLeft : htBottomRight); 
      return; 
     }  
     ///allow resize on the lower left corner 
     if (pt.X <= 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htBottomRight : htBottomLeft); 
      return; 
     } 
     ///allow resize on the upper right corner 
     if (pt.X <= 16 && pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htTopRight : htTopLeft); 
      return; 
     } 
     ///allow resize on the upper left corner 
     if (pt.X >= clientSize.Width - 16 && pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htTopLeft : htTopRight); 
      return; 
     } 
     ///allow resize on the top border 
     if (pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htTop); 
      return; 
     } 
     ///allow resize on the bottom border 
     if (pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htBottom); 
      return; 
     } 
     ///allow resize on the left border 
     if (pt.X <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htLeft); 
      return; 
     } 
     ///allow resize on the right border 
     if (pt.X >= clientSize.Width - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htRight); 
      return; 
     } 
    } 
    base.WndProc(ref m); 
} 
//*********************************************************** 
//*********************************************************** 
//This gives us the ability to drag the borderless form to a new location 
public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HT_CAPTION = 0x2; 

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

private void YOURCONTROL_MouseDown(object sender, MouseEventArgs e) 
{ 
    //ctrl-leftclick anywhere on the control to drag the form to a new location 
    if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control) 
    {  
     ReleaseCapture(); 
     SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
    } 
} 
//*********************************************************** 
//*********************************************************** 
//This gives us the drop shadow behind the borderless form 
private const int CS_DROPSHADOW = 0x20000; 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ClassStyle |= CS_DROPSHADOW; 
     return cp; 
    } 
} 
//*********************************************************** 
संबंधित मुद्दे