2011-10-14 16 views
13

सीमाओं मैं हर tabControls पर इन दृश्य खामियों जब मैं अपने tabPagesBackColor और फार्म की BackColor बदल रहा हूँ के रूप में निम्नलिखित चित्र पर सचित्र है,:TabControl और दृश्य गड़बड़

  • tabPage के शीर्ष पर, एक आंतरिक एक पिक्सेल सफेद सीमा है।
  • tabPage के बाईं ओर, एक आंतरिक तीन-पिक्सेल सफेद सीमा है।
  • tabPage के तल पर, एक आंतरिक एक-पिक्सेल सफेद सीमा और बाहरी दो-पिक्सेल सफेद सीमा है।
  • tabPage के दाईं ओर, एक आंतरिक एक-पिक्सेल सफेद सीमा और बाहरी दो-पिक्सल सफेद सीमा है।

Top and left borders Bottom borders Top and right borders

वहाँ एक रास्ता मैं उन सफेद सीमाओं से छुटकारा पा सकते है?

+0

क्या होता है यदि आप पैरेंट (टैबcontrol) के लिए बैककलर सेट करते हैं? – Rob

+0

@Rob: दुर्भाग्य से, 'tabControl' में कोई बैककॉलर प्रॉपर्टी नहीं है। – Otiel

+0

ओके, आप सीएसएस का उपयोग कर टैब पेज के मार्जिन को सेट करने का प्रयास कर सकते हैं .. मार्जिन: -1 पीएक्स -3 पीएक्स -3 पीएक्स -3 पीएक्स; यह क्षेत्र को थोड़ा बड़ा और व्हाइटस्पेस – Rob

उत्तर

15

यहां मेरा प्रयास हैक है। मैंने उन "सफेद" रिक्त स्थान को भरने के लिए TabControl पर आकर्षित करने के लिए NativeWindow का उपयोग किया।

public class TabPadding : NativeWindow { 
    private const int WM_PAINT = 0xF; 

    private TabControl tabControl; 

    public TabPadding(TabControl tc) { 
    tabControl = tc; 
    tabControl.Selected += new TabControlEventHandler(tabControl_Selected); 
    AssignHandle(tc.Handle); 
    } 

    void tabControl_Selected(object sender, TabControlEventArgs e) { 
    tabControl.Invalidate(); 
    } 

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

    if (m.Msg == WM_PAINT) { 
     using (Graphics g = Graphics.FromHwnd(m.HWnd)) { 

     //Replace the outside white borders: 
     if (tabControl.Parent != null) { 
      g.SetClip(new Rectangle(0, 0, tabControl.Width - 2, tabControl.Height - 1), CombineMode.Exclude); 
      using (SolidBrush sb = new SolidBrush(tabControl.Parent.BackColor)) 
      g.FillRectangle(sb, new Rectangle(0, 
              tabControl.ItemSize.Height + 2, 
              tabControl.Width, 
              tabControl.Height - (tabControl.ItemSize.Height + 2))); 
     } 

     //Replace the inside white borders: 
     if (tabControl.SelectedTab != null) { 
      g.ResetClip(); 
      Rectangle r = tabControl.SelectedTab.Bounds; 
      g.SetClip(r, CombineMode.Exclude); 
      using (SolidBrush sb = new SolidBrush(tabControl.SelectedTab.BackColor)) 
      g.FillRectangle(sb, new Rectangle(r.Left - 3, 
               r.Top - 1, 
               r.Width + 4, 
               r.Height + 3)); 
     } 
     } 
    } 
    } 
} 

और यह हुक अप करने के लिए:: मैं यह एकदम सही है का दावा नहीं करेगा

public Form1() { 
    InitializeComponent(); 
    var tab = new TabPadding(tabControl1); 
} 

मेरे अंतिम परिणाम:

enter image description here

+0

वास्तव में चिकनी लग रहा है। अभी के लिए, मुझे यह सही लगता है। अगर मुझे कुछ गड़बड़ मिलती है तो मैं आपको अद्यतित रखूंगा। बहुत बहुत धन्यवाद, अद्भुत काम! – Otiel

+2

वाह, इसके लिए धन्यवाद। आपका बहुत बहुत धन्यवाद! क्या वास्तव में टैबकंट्रोल करने की अपेक्षा करेगा (और एक बार फिर "माइक्रोसॉफ्ट, क्यों ?!") – Knickedi

+0

मुझे यह समाधान मेरे लिए काम करने के लिए नहीं मिला। मैंने कोड को बिल्कुल कॉपी किया और मेरे मौजूदा टैब नियंत्रण के साथ एक नया टैबपैडिंग बनाया - यह कुछ भी नहीं किया। – stuzor

3

आप नियंत्रण से विरासत सकते

public class TabControlEx : TabControl 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x1300 + 40) 
     { 
      RECT rc = (RECT)m.GetLParam(typeof(RECT)); 
      rc.Left -= 0; 
      rc.Right += 3; 
      rc.Top -= 0; 
      rc.Bottom += 3; 
      Marshal.StructureToPtr(rc, m.LParam, true); 
     } 
     base.WndProc(ref m); 
    } 

} 
internal struct RECT { public int Left, Top, Right, Bottom; } 
+1

यह इस पृष्ठ पर एकमात्र समाधान है जो मेरे लिए काम करता है, हालांकि मुझे बाएं से - = 4, राइट टू + = 2, और टॉप टू - = 2. धन्यवाद – stuzor

0

मैंने हाल ही में इस समस्या में भाग लिया और कभी भी एक अच्छा सरल समाधान नहीं मिला। यही वह समय था जब मैंने नियंत्रण के क्लिपिंग क्षेत्र को समायोजित करने के बारे में सोचा था। ऐसा लगता है कि कोई ध्यान देने योग्य साइड इफेक्ट्स के साथ ठीक काम करना प्रतीत होता है। दाएं तरफ 2 अतिरिक्त सफेद पिक्सेल और नीचे एक अतिरिक्त सफेद पिक्सेल अब दिखाई नहीं दे रहा है।

class TabControlEx : TabControl 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0005) // WM_SIZE 
     { 
      int Width = unchecked((short)m.LParam); 
      int Height = unchecked((short)((uint)m.LParam >> 16)); 

      // Remove the annoying white pixels on the outside of the tab control 
      // by adjusting the control's clipping region to exclude the 2 pixels 
      // on the right and one pixel on the bottom. 
      Region = new Region(new Rectangle(0, 0, Width - 2, Height - 1)); 
     } 

     base.WndProc(ref m); 
    } 
} 
+0

मुझे यह समाधान मेरे लिए काम करने में नहीं मिला: - ( – stuzor

-1

उपयोग MaterialSkin NuGet पैकेज से MaterialSkin जोड़ने [अपने समाधान पर राइट क्लिक करें - क्लिक NuGet संकुल प्रबंधित करें - खोज MaterialSkin.dll] अपने पिटारे में अगले खींचें MaterialSkin.dll और सामग्री त्वचा TabControl का उपयोग

+0

मैं Google द्वारा सामग्री डिज़ाइन का उपयोग नहीं कर रहा हूं। बस सादा WinForms। – Otiel

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