2009-07-27 16 views
7

जो मैं करने की कोशिश कर रहा हूं वह एक एमडीआई कंटेनर के रूप में चिह्नित रूप में कुछ गिलास खींचता है। हालांकि जैसे ही IsMdiContainer सेट किया गया है, फॉर्म नियंत्रणों की सूची में एमडीआई क्लाइंट जोड़ता है। इस बिंदु पर माता-पिता के रूप में कुछ होता है - लगभग एक अंधेरे ग्रे पैनल की तरह पूरे फॉर्म में डॉक किया जा रहा है जिस पर MdiClient रखा जा रहा है।एमडीआई पैरेंट फॉर्म पर ग्रे पृष्ठभूमि को कैसे हटाया जाए?

मैं तो करना है रास्ते से बाहर एक सा MdiClient नियंत्रण स्थानांतरित करने के लिए निम्नलिखित:

foreach(var c in Controls) 
    { 
     if(c is MdiClient) 
     { 
      var client = (MdiClient)c; 
      client.BackColor = Color.Red; 
      client.Dock = DockStyle.None; 
      client.Size = new Size(this.Width-100, this.Height); 
      break; 
     } 
    } 

यह तो वास्तविक MdiClient क्षेत्र में आता है छोटे तो हम देख सकते हैं कि (इसके पीछे है बिट को होस्ट बच्चे बनाते हैं) और यह स्पष्ट रूप से स्पष्ट है कि मूल रूप पेंटिंग या कुछ नहीं है।

के रूप में यहां देखा जा सकता: http://img525.imageshack.us/img525/8605/mdiglassproblem.png

मैं अब किसी भी तरह (गहरे भूरे रंग हिस्सा जो कांच खंड पर सफेद प्रदान की गई है) MdiClient के पीछे क्षेत्र पाने के लिए दूर जाने की जरूरत है।

कोई विचार?

पीएस - ग्लास को Vista में DwmExtendFrameIntoClientArea विधि का उपयोग करके प्रस्तुत किया जा रहा है।

+0

बस एक तरफ नोट; "अगर (सी MdiClient है)" लाइन अनावश्यक है। 'As' ऑपरेटर एक ही चेक करता है और गलत होने पर शून्य लौटाता है। तो, बस 'as' ऑपरेटर का उपयोग करें और फिर इसके बजाय शून्य के लिए जांचें। –

+0

... या 'है' के साथ छड़ी और सी शैली कास्ट का उपयोग करें, लेकिन मैं व्यक्तिगत रूप से अन्य दृष्टिकोण पसंद करता हूं। –

+0

उचित पर्याप्त बिंदु। – Dylan

उत्तर

5

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

तो बस इसके आधार पर कॉल किए बिना ऑनपेंट विधि को ओवरराइड करें और उसके बाद सामान्य पेंट विधि में ग्लास खींचने के लिए इस्तेमाल किया गया कोड लें और इसे ऑनपेंट विधि में चिपकाएं।

protected override void OnPaint(PaintEventArgs e) 
    { 
     //base.OnPaint(e); 
     bool glassEnabled = IsGlassEnabled(); 
     if (glassEnabled) // draw glass if enabled 
     { 
      Rectangle rc = picPlaceHolder.ClientRectangle; 

      IntPtr destdc = e.Graphics.GetHdc(); // hwnd must be the handle of form, not control 
      IntPtr Memdc = CreateCompatibleDC(destdc); 
      IntPtr bitmapOld = IntPtr.Zero; 

      BITMAPINFO dib = new BITMAPINFO(); 
      dib.bmiHeader.biHeight = -(rc.Bottom - rc.Top); 
      dib.bmiHeader.biWidth = rc.Right - rc.Left; 
      dib.bmiHeader.biPlanes = 1; 
      dib.bmiHeader.biSize = Marshal.SizeOf(typeof(BITMAPINFOHEADER)); 
      dib.bmiHeader.biBitCount = 32; 
      dib.bmiHeader.biCompression = BI_RGB; 
      if (!(SaveDC(Memdc) == 0)) 
      { 
       IntPtr bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0, IntPtr.Zero, 0); 
       if (!(bitmap == IntPtr.Zero)) 
       { 
        bitmapOld = SelectObject(Memdc, bitmap); 
        BitBlt(destdc, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, Memdc, 0, 0, SRCCOPY); 
       } 

       // remember to clean up 
       SelectObject(Memdc, bitmapOld); 

       DeleteObject(bitmap); 
       ReleaseDC(Memdc, -1); 
       DeleteDC(Memdc); 
      } 
      e.Graphics.ReleaseHdc(); 
     } 
    } 

तो बस यह सुनिश्चित करें कि MdiContainer कांच के रास्ते में नहीं है और यह पूरी तरह से आकर्षित करना चाहिए।

6

मुझे लगता है कि यह काफी सही है।

foreach (Control ctrl in this.Controls) 
{ 

     if (ctrl is MdiClient) 
     { 
      ctrl.BackColor = Color.LightGray; 
     } 


} 
संबंधित मुद्दे