2011-05-24 5 views
7

के साथ WinForm नियंत्रण मेरे पास एक ऐसा फॉर्म है जिसमें कुछ नियंत्रण हैं (btnCreateReport, pnlDarkLayer)। मेरे पास एक पैनल है जो (डॉक = भरें) बनाने के लिए उपयुक्त है और यह सभी नियंत्रणों के पीछे है। जब उपयोगकर्ता क्लिक करता है btnCreateReport बटन, मैं pnlDarkLayer BringToFront विधि को कॉल करता हूं और कुछ गणना के बाद मैं बटन के SendToBack() विधि को कॉल करता हूं। मैं फॉर्म नियंत्रणों पर एक गहरा परत खींचना चाहता हूं और फ़ॉर्म पर सभी नियंत्रण अक्षम करना चाहता हूं। क्या यह संभव है? धन्यवाद।ओपेसिटी

हो सकता है कि इस कोड को मदद यू मेरा उद्देश्य को समझने के लिए:

private void btnCreateReport_Click(object sender, EventArgs e) 
{ 
    pnlDarkLayer.BackColor = Color.FromArgb(100, Color.Gray);   

    pnlDarkLayer.BringToFront(); 
    btnCreateReport.Enabled = false; 

    Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport)); 
    ProcessReport.Start(); 
    while (ProcessReport.IsAlive) 
    { 
     Application.DoEvents(); 
    } 
    pnlDarkLayer.SendToBack(); 

    btnCreateReport.Enabled = true; 

} 

इस कोड को छिपाने के नियंत्रण के सभी लेकिन मैं छिपाने के लिए form.I पर नियंत्रण उन पर एक अंधेरे परत आकर्षित करने के लिए चाहते हैं नहीं करना चाहती। और उपयोगकर्ता नियंत्रण देख सकते हैं। मुझे उनके नियंत्रण के लिए रूपों की अस्पष्टता संपत्ति की तरह कुछ चाहिए।

pnlDarkLayer.CreateGraphics().CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceOver;

अद्यतन:

मैं परीक्षण यह है मैं परीक्षण यह एक है: (पैनल के बजाय एक फार्म का उपयोग करें)

private void btnCreateReport_Click(object sender, EventArgs e) 
{   

    btnCreateReport.Enabled = false; 

    frmProgress ProgressForm = new frmProgress(); 
    ProgressForm.TopLevel = false; 
    ProgressForm.Parent = this; 
    ProgressForm.BringToFront(); 
    this.Controls.Add(ProgressForm); 
    ProgressForm.Show(); 

    Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport)); 
    ProcessReport.Start(); 

    while (ProcessReport.IsAlive) 
    { 
     Application.DoEvents(); 
    } 
    ProgressForm.Close(); 
    btnCreateReport.Enabled = true; 

} 

लेकिन मैं नहीं देख सकते हैं मेरे रूप में प्रगतिफॉर्म।

+3

अस्पष्टता के साथ कुछ भी करने के अलावा, * कृपया * उस प्रकार के लूप को 'DoEvents' कॉल करने का उपयोग न करें। या तो 'प्रसंस्करण रिपोर्ट' कुछ प्रकार के हुक को समाप्त होने पर कॉल करने के लिए उपयोग करने के लिए उपयोग करें, या 'प्रसंस्करण रिपोर्ट' विधि के अंत में कोड का आखिरी बिट डालें, यह सुनिश्चित करने के लिए कि 'BeginInvoke' का उपयोग करना याद रखें, यह सुनिश्चित करने के लिए कि यह इसे निष्पादित करता है यूआई धागा आपको लगभग सभी मामलों में 'Application.DoEvents' से बचना चाहिए। –

+0

तो थ्रेड के काम को समाप्त करने के बाद मैं कुछ कैसे कर सकता हूं? – Saleh

+0

सभी नियंत्रणों को अक्षम करने के लिए आप यह भी करने का प्रयास कर सकते हैं: foreach (नियंत्रण में नियंत्रण आइटम) {item.Enabled = false;} – Reniuz

उत्तर

6

WinForms में http://support.microsoft.com/kb/943454

पारदर्शी नियंत्रण से उनके माता पिता को पारदर्शी रिश्तेदार, अन्य नियंत्रण के लिए नहीं कर रहे हैं। में पारदर्शिता वास्तविक पारदर्शिता से WinForms के समान है। एक पारदर्शी नियंत्रण वास्तव में आपको फ़ॉर्म के माध्यम से इसके पीछे नियंत्रण देखने देता है। यह अपने माता-पिता से "पारदर्शी" नियंत्रण पर अपनी की अपनी पृष्ठभूमि खींचने के लिए कहता है। यही कारण है कि एक पारदर्शी नियंत्रण इसके पीछे के रूप को दिखाता है, लेकिन किसी अन्य नियंत्रण को कवर करता है।

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

यह पृष्ठ यह दिखाने के लिए एक कोड उदाहरण (vb में, दुख की बात) प्रदान करता है कि यह कैसे किया जाता है।

5

यदि मैं सही ढंग से समझता हूं, तो आप ऑपरेशन चलते समय फ़ॉर्म की सामग्री को 'अंधेरा' करना चाहते हैं।

जैसा कि किसी ने पहले कहा है, सही करना बहुत मुश्किल है। लेकिन एक आरक्षण के साथ इसे आसानी से करने का एक तरीका है (नीचे देखें)।इस स्रोत कोड को

देखो:

public partial class Form1 : Form 
{ 
    private Bitmap _background; 
    private bool _isShrouded; 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     if (true == _isShrouded && null!=_background) 
      e.Graphics.DrawImage(_background, 0, 0); 
    } 

    public void Shroud() 
    { 
     if (false == _isShrouded) 
     { 
      CreateScreenshot(); 

      HideControls(); 

      _isShrouded = true; 

      this.Invalidate(); 
     } 
    } 

    public void Unshroud() 
    { 
     if (true == _isShrouded) 
     { 
      ShowControls(); 

      _isShrouded = false; 

      this.Invalidate(); 
     } 


    } 

    private void HideControls() 
    { 
     foreach (Control control in this.Controls) 
      control.Visible = false; 
    } 

    private void ShowControls() 
    { 
     foreach (Control control in this.Controls) 
      control.Visible = true; 
    } 

    private void CreateScreenshot() 
    { 
     Rectangle area = this.RectangleToScreen(this.ClientRectangle); 
     Bitmap screenGrab = new Bitmap(area.Width, area.Height); 

     Brush dark = new SolidBrush(Color.FromArgb(128, Color.Black)); 

     Graphics g = Graphics.FromImage(screenGrab); 
     g.CopyFromScreen(area.Location, Point.Empty, area.Size); 
     g.FillRectangle(dark, 0, 0, area.Width, area.Height); 
     g.Dispose(); 

     _background = screenGrab; 
    } 
} 

Form1 वर्ग दो मुख्य तरीके, श्राउड() और Unshroud है()।

श्राउड() विधि फॉर्म का स्नैपशॉट लेती है, और इसे बिटमैप में कॉपी करती है, जिसे तब 'अंधेरा' किया जाता है। नियंत्रण तब छिपाए जाते हैं, और बिटमैप को फॉर्म पर चित्रित किया जाता है।

UnShroud() विधि नियंत्रण को पुनर्स्थापित करती है, और फ़ॉर्म को बिटमैप को आकर्षित करने के लिए कहती है।

इसमें दो निजी चर की आवश्यकता होती है: एक बिटमैप को स्टोर करने के लिए, और एक ध्वज जो वर्तमान स्थिति को बनाए रखता है।

यह ऑनपेंट() को ओवरराइड करता है क्योंकि इसे पृष्ठभूमि छवि को 'shrouded' खींचने की आवश्यकता होती है।

नोट: श्राउडिंग फॉर्म का स्क्रीनशॉट लेकर काम करता है। इसका मतलब है कि फॉर्म shrouding के बिंदु पर शीर्ष-सबसे अधिक रूप होना चाहिए। यदि फॉर्म अन्य रूपों से अस्पष्ट है तो उन्हें स्क्रीनशॉट में शामिल किया जाएगा। मुझे आशा है कि यह आपके लिए कोई समस्या नहीं होगी।

नोट: जैसा कि पहले कहा गया था, विंडोज़ में पारदर्शिता प्राप्त करने का एकमात्र तरीका शामिल सभी नियंत्रणों से पूर्ण सहयोग है, और यह एक कठिन कार्य है। कुछ और (इस समाधान सहित) वास्तव में सिर्फ चालबाजी है।