Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Add Transparent Control in MDI with image background in runtime

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 05-01-2010, 15:56. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-12-2009, 10:35 56045

    Add Transparent Control in MDI with image background in runtime



    Καλημέρα και καλές γιορτές σε όλους,

    έχουμε και λέμε το πρόβλημα:

    1)φτιαχνουμε μια form  και την ορίζουμε οτι ειναι MDI container (οποτε παίρνει και αυτο το 3d look) με το γκριζο background

    2)ορίζουμε και μια background image με layout "Stretch" φυσικα η εικονα δεν εμφανιζεται σε design mode αλλα στο runtime κανονικα.

    3)μετα γράφουμε λιγο κωδικα πανω σε ενα κουμπακι για παραδειγμα και λεμε να φτιαχνουμε ενα νεο control (eg) τυπου command-button.

    4)του οριζουμε το στιλ του να ειναι φλατ και οτι background color = Transparent!

    5)μετα κανουμε mdiform.controls.add(mynewcontrol) εμφανιζεται το αντικειμενο αλλά το background του control δεν ειναι transparent ωστε να βλεπουμε την εικονα του MDI Parent αλλα γκρι!

    αν κανουμε τα παντα σε design και η φορμα ΔΕΝ ειναι MDI και της βαλω background image τοτε το control γινεται transparent, αλλα σε runtime οχι!

    πειραματιστικα με αυτα αλλα καμια διαφορα. ασε που ετσι και κανεις resize το mdi form η εικονα απο πισω γινεται χαλια καθος το rendering δεν παιζει σωστα οταν ειναι Strectch και αφήνει ίχνη.

    Sad

    meta to initilazation εκανα δοκιμες με τα ακόλουθα αλλά τζίφος. Το MDIform ειναι doubleBuffer=true 

    1
    2
    3
    4
    5
    6
    7
     
            Me.SetStyle(ControlStyles.DoubleBuffer, True)
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, False)
            Me.SetStyle(ControlStyles.UserPaint, False)
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)

    6)και ενα δευτερο "προβλημα" ειναι οτι τα mdi child παραθυρα που ανοιγουν δεν καλυπτουν το αντικειμενο αυτο, θα ηθελα το control να ειναι ενα layer πισω απο τα παραθυρα, δοκιμασα να παιξω με τα bringtofront & sendtoback αλλα τιποτα.

    στην εικονα εμφανιζονται ολα τα προβληματα (no transparent control, image not redraws allways, child forms dont apear over the mdi "desktop" control.)

    καμια ιδέα?


    tnx a lot.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  23-12-2009, 17:49 56058 σε απάντηση της 56045

    Απ: Add Transparent Control in MDI with image background in runtime

    Χμμ,έχεις πολλά θέματα προς ανάλυση,θα προσπαθήσω λοιπόν να είμαι περιεκτικός χωρίς να φλυαρήσω.Όπως ίσως κατάλαβες όταν θέτεις το background color ενός control σε transparent δεν αποκτά πραγματικά διαφάνεια.Αυτό που συμβαίνει είναι ότι κοιτάει το background του parent του και το χρησιμοποιεί στα σημεία που είναι "διαφανές".Αυτό το τρικ βολεύει σε απλές περιπτώσεις αλλά όχι στη δική σου.Υπάρχει ένας καλύτερος τρόπος να κάνεις ένα control transparent και περιγράφεται εδώ,αλλά δυστυχώς πάλι δεν κάνει στην περίπτωσή σου διότι το Button κάνει πολύ δουλειά στην  OnPaint του και θα σου χαλάσει το εφέ.Αν φτιάξεις από την αρχή ένα δικό σου User Control και κάνεις τα βήματα που περιγράφονται στον σύνδεσμο θα έχεις μια ικανοποιητική (αν και κουραστική στην υλοποίηση) λύση.

    Όσον αφορά το κουμπί που κρύβει τα chilren forms,είναι feature του MDIParent,καθώς κρίθηκε ότι τα children δεν πρέπει να κρύβουν τα controls.Είναι μάλιστα δύσκολο να υπερβείς αυτή τη συμπεριφορά,μια που πρέπει σχεδόν να ξαναγράψεις την MDIParent κλάση.Υπάρχουν όμως δύο έμμεσες λύσεις:

    α)όταν έχεις ανοικτά mdi children,να κρύβεις το κουμπί με την SendToBack,για να το ξαναφέρνεις μπροστά με την BringToFront όταν δεν έχεις children ανοικτά.

    β)βάλε ένα panel και κάνε το dock σε μια από τις γωνίες του MDIParent.Βάλε εκεί όλα τα controls και τα children θα ανοίγουν στην client area που έχει απομείνει,χωρίς να μπλέκουν με τα controls.

    Προτείνω ανεπιφύλακτα να κάνεις την εφαμογή με WPF αντί για Forms,θα έχεις πραγματικό transparency με alpha blending και αισθητικά θα έχεις το βέλτιστο αποτέλεσμα.

  •  24-12-2009, 14:16 56063 σε απάντηση της 56045

    Απ: Add Transparent Control in MDI with image background in runtime

    Όντως πολλά και διάφορα προβλήματα. Θα επικεντρωθώ σε αυτό:

    "ασε που ετσι και κανεις resize το mdi form η εικονα απο πισω γινεται χαλια καθος το rendering δεν παιζει σωστα οταν ειναι Strectch και αφήνει ίχνη."

    Είναι όντως έτσι, το δοκίμασα κι εγώ. Δεν μπόρεσα να βρω ακριβώς γιατί με λίγο googling. Αυτό που έκανα για να κάνει σωστή επανασχεδίαση όταν αλλάζει το μέγεθος του κυρίως παραθύρου είναι να γράψω έναν handler για το event Resize, όπου απλά καλώ την Invalidate()

    C#:

    (Form1.Designer.cs)
    this.Resize += new System.EventHandler(this.Form1_Resize);

    (Form1.cs)
    private void Form1_Resize(object sender, EventArgs e)
    {
         Invalidate(true);
    }

    Έτσι λύνεται το πρόβλημα μερικώς. Μετά εμφανίζεται το πρόβλημα του flickering, το οποίο δεν ξέρω πώς λύνεται (σίγουρα όχι με DoubleBuffered=true, γιατί το δοκίμασα)

     


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  24-12-2009, 17:09 56065 σε απάντηση της 56063

    Απ: Add Transparent Control in MDI with image background in runtime

    αρχικα ευχαριστω για τις ιδεες,


    τελικα νομιζω ειμαι κοντα 99% στο να κανω αυτο που θελω με ενα μειγμα των λυσεων σας.

    1)εβαλα πανελ

    2)τα εικονιδια τα κανω panel.controls.add(icon) και ειναι μια χαρα το transparent, επισεις με το redrawonreize που ειπα παραπανω το panel δεν "χαλαει" την εικονα μου και το fickering ειναι ελαχιστο μονο κατα το drag-dro και ειναι ουσιαστικα ενα μικρο shadow δεν κανει flicker ολη η εικονα, ως εδω μια χαρα

    3)τα παραθυρα ομως αν τα ανοιξω ως mdichilder πανε πισω απο το panel! λογικο...

    ετσι ειπα να κανω και τα mdichilder panel.controls.add(newchildform) και παιζουν μια χαρα κατι μικρο χαζα με το focus αλλα με ενα addhandler on move ειναι σουπερ

    τι μενει? κατι ισως αστειο αλλά σημαντικό ταυτόχρονα, το παραθυρο που εμφανιζεται μεσα στο πανελ και εχει ολες τις συμπερηφορες μια κανονικης φορμας το CONTROLBOX και το header (εκει που ειναι το form text) ειναι σε φαση "disabled" σαν να μην ειναι focus!! γκριζαρισμενο καταλαβαινεται! εψαξα αλλα δεν βρηκα ενα τροπο να κανω το header να ειναι "εντονο" enabled και ετσι αν εχεις πολλα ανοιχτα δεν ξερεις ποιο ειναι focused και ποιο οχι!

    ειναι απλα να το αναπαράγεται απλα καντε

    Dim MyForm As New Form
    
    Me.panel1.Controls.Add(MyForm)
    
    MyForm.show
    κατι που μπορω να κανω ωστε να ειναι "forced-focus"? 



    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-12-2009, 14:24 56095 σε απάντηση της 56065

    Απ: Add Transparent Control in MDI with image background in runtime

    οκ ειμαι κοντα στο στοχο αλλα εχω ενα νεο θεμα,

    αν εχεισ ενα πανελ σε mdiparent και ανοιγεις mdchild forms αυτα πανε πισω απο το panel!!! φυσικα τα bringtofront etc δεν παιζουν.....

    δοκιμασα και parentform.controls.SetChildIndex τιποτα!

    ξερεις κανεις πως να κανω το mdichild form να εμφανιζεται Μπροστα απο το Πανελ?Indifferent


    tnx


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-12-2009, 16:12 56097 σε απάντηση της 56095

    Απ: Add Transparent Control in MDI with image background in runtime

    Όπως έγραψα και παραπάνω,η λύση είναι να κάνεις dock το panel σου σε μια από τις άκρες της οθόνης,έτσι τα child windows θα ανοίγουν στον ελεύθερο χώρο που απομένει (στο client χώρο της mdi parent).Αν δεν το κάνεις dock δεν θα πετύχεις τίποτα,θα έχεις το ίδιο πρόβλημα που θα είχες αν προσέθετες σκέτα τα control.

    Δες ένα παράδειγμα όπου έχω κάνει dock-left για να καταλάβεις:

    Όπως βλέπεις ούτε το panel ενοχλεί τα mdi children,ούτε το αντίθετο.Τέλος να αναφέρω ως tip πως αυτά που αναφέραμε παραπάνω για transparency εφαρμόζονται πολύ ωραία σε ένα panel,μια που κάνει ελάχιστη σχεδίαση του εαυτού του.

  •  28-12-2009, 18:30 56098 σε απάντηση της 56097

    Απ: Add Transparent Control in MDI with image background in runtime


    δεν θελω να κανω αυτο...Sad

    το πανελ μου θελω να ειναι οπως η επιφανεια εργασιας με τα εικονιδεια της και απο πανω της, οχι διπλα,να ανοιγουν mdichildforms, αυτο ειναι το προβλημα μακαρι να ηταν κατι τοσο ευκολο οπως ενα docking. docking einai to navbarcontrol οπως βλεπεις στο αρχικο screenshot

    θελω λοιπον να εχω ενα panel να φτιαχνω εκει μεσα αντικειμενα οπως τα εικονιδια των windows στο desktop μας (το κανω αυτο μια χαρα) αλλα τα παραθυρα θελω να ανοιγουν απο πανω σε normal windows state και ταυτοχρονα να βλεπω και τι εχω στο panel-desktop μου απο πισω, 

    τελικος στοχος ειναι να εχω ακριβως το ιδιο αποτελεσμα με ενα desktop των windows! εικονιδια(το εχω), φοντο(το εχω),drag and drop εικονιδιο(το εκανα κι αυτο) παραθυρα να ανοιγουν μεσα σε αυτα τα ορια ΠΑΝΩ απο το desktop (αυτο παλευω να κανω)

    ελπιζω να καταλαβες τι θελω να πω.

    παντος σε ευχαριστω.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  29-12-2009, 12:47 56109 σε απάντηση της 56098

    Απ: Add Transparent Control in MDI with image background in runtime

    ειναι τελικα τοσο δυσκολο?Embarrassed......

    ελπιζω καποιος να ξερει πως μπορω να ανοιγω mdi child form Πανω απο ενα Panel που ειναι docked στο ΜDIParent....

    anyone?? δεν μπορει τοσυς mvp kai ctp εχουμε members....Crying


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  29-12-2009, 15:45 56110 σε απάντηση της 56109

    Απ: Add Transparent Control in MDI with image background in runtime

    Όχι τόσο δύσκολο,όσο το ότι είναι μπελάς.Για να το κάνεις αυτό θα πρέπει να τροποποιήσεις τη συμπεριφορά της MdiParent.Και τις περισσότερες φορές αν φτάσεις σε τέτοιο σημείο σημαίνει ότι δεν σε εξυπηρετεί αυτή η κλάση και καταφεύγει κανείς στο να χρησιμοποιήσει child windows.Μόλις βρω λίγο χρόνο θα σου γράψω τι μπορείς να κάνεις.

    Όσον αφορά για την εφαρμογή θες να την κάνεις να λειτουργεί "σαν desktop" ή "ως desktop";Γιατί στην δεύτερη περίπτωση υπάρχουν πολύ καλύτερες λύσεις.

  •  29-12-2009, 16:50 56112 σε απάντηση της 56110

    Απ: Add Transparent Control in MDI with image background in runtime


    βασικα ευχαριστω και θα περημενω για τον κωδικα που λες γιατι δεν ξερω πως να πειραξω την mdiparent. class

    δευτερον ειναι ΣΑΝ desktop, δεν θέλω να αντικαταστήσω το desktop απλα θελω ουσιαστικά μεσα στην εφαρμογή μου ο χρήστης να μπορει να κανει καποια μενου που κανει πολυ χρηση να τα εχει σε μια εσωτερικη στην εφαρμογη επιφανεια εργασιας ως συντομευσης. Τα εχω κανει ολα αυτα αλλα για να παιζουν τα ατοιμα transparency επρεπε να καταφυγω σε Panel docked to MDIparent.

    αλλα ετσι εχασα τα mdichildren...



    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  30-12-2009, 01:47 56115 σε απάντηση της 56112

    Απ: Add Transparent Control in MDI with image background in runtime

    Γιατι δεν πας σε wpf να του αλλαξεις τα φωτα? Directx vs win gui 1-0
  •  30-12-2009, 11:36 56120 σε απάντηση της 56115

    Απ: Add Transparent Control in MDI with image background in runtime

    object+:
    Γιατι δεν πας σε wpf να του αλλαξεις τα φωτα? Directx vs win gui 1-0

    μάλλον αδύνατον για την περίπτωση η εφαρμογή πρεπει να τρέχει άψογα σε μεσαίων δυνατοτήτων μηχανήματα με windows XP που εχει πλεον καθε υπολογιστης, μεχρι να πανε σε 7.

    εχω δει wpf εφαρμωγες να τρεχουν σε windows xp που δεν εχουν direct2d API και σερνεται! ακομα και αν εχεις καρτα 200ευρω ειναι σαν να παιζεις directx game σε window mode με 10fps!Stick out tongue

    se windows Svista kai 7 πεταει μια wpf αλλα ακομα ο κοσμος ειναι στα XP και δεν υπαρχουν ολα τα control ακομα σε wpf που θελω εγω και κανω χρηση της devexpress, ειναι νωρις ακομα για wpf  πιστευω.Wink


    εκτος και αν γινεται να κανω το mdi main interface moy se WPF και ολα τα αλλα σε GUI, hybrid....αραγε γινεται κατι τετοιο? μπα......

    το δοκιμασα Δε παιζει κατι τετοιο απο οσο ειδα, ασε που η "θολουρα" στα fonts σε κανουν να θες να ξερασεις....Tongue Tied σε xp


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  05-01-2010, 15:56 56228 σε απάντηση της 56110

    Απ: Add Transparent Control in MDI with image background in runtime

    @darklynx

    ανυπομονω για τον κωδικα που ελεγες πως να πειραξω την class mdi, και καλη χρονια. :)




    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems