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

 

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

BackColor-ForeColor

Îåêßíçóå áðü ôï ìÝëïò SotirisPap. Τελευταία δημοσίευση από το μέλος SotirisPap στις 06-03-2008, 18:18. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-03-2008, 05:57 40650

    BackColor-ForeColor

    Friend WithEvents Dg0 As New System.Windows.Forms.DataGridView
    Private Sub Dg0_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Dg0.CellValueChanged
    If e.ColumnIndex > 1 AndAlso Dg0.Item(e.ColumnIndex, e.RowIndex).Value IsNot Nothing Then
    str = Dg0.Item(e.ColumnIndex, e.RowIndex).Value
    Dim Clr As Color = Color.FromName(str)
    Dg0.Item(e.ColumnIndex, e.RowIndex).Style.BackColor = Clr
    Dg0.Item(e.ColumnIndex, e.RowIndex).Style.ForeColor = Clr
    End If
    End Sub
    Μέσα σε ένα
    DataGridView υπάρχει  ένα  Cell  το οποίο έχει την τιμή "Black". Με τον παραπάνω κώδικα το χρωματίζω σε Μαύρο (Κοίτα Clr).Με τι πρέπει να είναι ίσον το ForeColor σε συνάρτηση με το Clr ούτως ώστε να χρωματίζει τα γράμματα με το αντίθετο πχ άσπρο.

    Ευχαριστώ
  •  03-03-2008, 17:52 40681 σε απάντηση της 40650

    Απ: BackColor-ForeColor

    Με είχε απασχολήσει αυτό το θέμα αλλά δεν είχα ασχοληθεί. Από ότι καταλαβαίνω θέλεις π.χ. να δίνεις στον χρήστη την δυνατότητα να επιλέξει φόντο και να επιλέγεις αυτόματα το χρώμα των γραμμάτων έτσι ώστε να είναι πάντα ευανάγνωστα. Το ίδιο κάνει και το word όταν έχεις επιλέξει σαν χρώμα το "automatic". Δοκίμασέ το. Θα δεις πως, αν π.χ. επιλέξεις "automatic" ως χρώμα για τα γράμματα, αυτά έχουν χρώμα ή μαύρο ή άσπρο, ανάλογα με το πόσο φωτεινό ή σκοτεινό είναι το φόντο.

    Δεν γνωρίζω αν υπάρχει έτοιμος αλγόριθμος αλλά σκέφτομαι το εξής: 

    Φαντάζομαι ότι το αν είναι άσπρα ή μαύρα καθορίζεται από το rgb του φόντου. Όπως ξέρεις φαντάζομαι, το κάθε χρώμα αναλύεται σε μια τριάδα τιμών rgb (red green blue). Σε γενικές γραμμές όσο πιο μεγάλες είναι αυτές οι τιμές τόσο πιο λευκό είναι το χρώμα. Τις τιμές rgb τις παίρνεις από τα properties R, G, B της κλάσης color. π.χ. Clr.B στον κώδικά σου. Οι πιθανές τιμές είναι από 0 έως 255. Το λευκό έχει και τα τρία 255 ενώ το μαύρο έχει και τα τρία 0.

    Δοκίμασε να πάρεις το άθροισμα Clr.R + Clr.G + Clr.B. Αν αυτό είναι αρκετά μεγάλο (π.χ. πάνω από 400 - το πόσο μεγάλο θα το βρεις με μερικές δοκιμές) τότε μπορείς να πεις ότι το χρώμα είναι σχετικά φωτεινό, οπότε το αντίθετό του είναι το μαύρο. Αλλιώς το χρώμα είναι σχετικά σκοτεινό και το αντίθετό του είναι το άσπρο.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  03-03-2008, 18:32 40682 σε απάντηση της 40681

    Απ: BackColor-ForeColor

    Κι εγώ είχα διαβάσει το post αλλά δεν είχα καταλάβει τι εννούσε ο φίλος μας. Αν είναι αυτό που λες Δημήτρη, τότε ένας πιο εύκολος τρόπος είναι να χρησιμοποιήσει την Color.GetBrightness  Δίνει έναν αριθμό από 0.0 (μαύρο) ως 1.0 (μαύρο) οπότε μπορεί να κάνει έναν απλό έλεγχο και να κάνει assign χρώμα με το κατάλληλο contrast.


    Vir prudens non contra ventum mingit
  •  03-03-2008, 18:44 40683 σε απάντηση της 40682

    Απ: BackColor-ForeColor

    KelMan:

    Κι εγώ είχα διαβάσει το post αλλά δεν είχα καταλάβει τι εννούσε ο φίλος μας. Αν είναι αυτό που λες Δημήτρη, τότε ένας πιο εύκολος τρόπος είναι να χρησιμοποιήσει την Color.GetBrightness  Δίνει έναν αριθμό από 0.0 (μαύρο) ως 1.0 (μαύρο) οπότε μπορεί να κάνει έναν απλό έλεγχο και να κάνει assign χρώμα με το κατάλληλο contrast.

    Πολύ καλό! Δεν είχα προσέξει την ύπαρξη αυτής της συνάρτησης! Ρίχνοντας μια ματιά στο reflector βλέπω ότι κάνει απλές συγκρίσεις και πράξεις μεταξύ των τιμών rgb.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  04-03-2008, 18:21 40709 σε απάντηση της 40682

    Απ: BackColor-ForeColor

    Σας Ευχαριστώ δούλεψε έτσι .
  •  04-03-2008, 18:24 40710 σε απάντηση της 40709

    Απ: BackColor-ForeColor

        Private Sub Dg0_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Dg0.CellValueChanged
            Try
                If e.ColumnIndex > 1 Then
                    If Dg0.Item(e.ColumnIndex, e.RowIndex).Value IsNot Nothing Then
                        Dim str As String = Dg0.Item(e.ColumnIndex, e.RowIndex).Value
                        Dim Clr As Color = Color.FromName(str)
                        Dg0.Item(e.ColumnIndex, e.RowIndex).Style.BackColor = Clr
                        If (Clr.GetBrightness()) >= 0.5 Then
                            Dg0.Item(e.ColumnIndex, e.RowIndex).Style.ForeColor = Color.Black
                        Else
                            Dg0.Item(e.ColumnIndex, e.RowIndex).Style.ForeColor = Color.White
                        End If
                        Fs0.sh1.Cells(e.RowIndex + 2, e.ColumnIndex + 1).Value = str
                    End If
                End If
            Catch
            End Try
        End Sub

  •  04-03-2008, 19:56 40712 σε απάντηση της 40710

    Απ: BackColor-ForeColor

    Πολύ ωραία!

    Αυτό το try/catch όμως που δεν κάνει τίποτα με το exception κάπως μου κάθησε. Καταλαβαίνω ότι δεν είναι και το πιο κρίσιμο σημείο της εφαρμογής σου, αλλά... τουλάχιστον ένα logging θα ήταν καλό, για να ξέρεις κι εσύ αν πάει κάτι στραβά γιατί πήγε. Όπως είναι, αν υπάρξει exception απλά ο κώδικάς σου θα δουλεύει περίεργα και αν έχεις ξεχαστεί θα ψάχνεις να βρεις αλλού το πρόβλημα.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  04-03-2008, 20:19 40715 σε απάντηση της 40710

    Απ: BackColor-ForeColor

    Ας κάνουμε λίγο refactoring

    Private Sub Dg0_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Dg0.CellValueChanged
       Try
          If e.ColumnIndex > 1 Then
             Dim cell As DataGridViewCell = Dg0.Item(e.ColumnIndex, e.RowIndex)
             If cell.Value IsNot Nothing Then
                cell.Style.BackColor = GetBackColor(cell)
                cell.Style.ForeColor = GetForeColor(cell)
                Fs0.sh1.Cells(e.RowIndex + 2, e.ColumnIndex + 1).Value = CType(DgvCell.Value, String)
             End If
          End If
       Catch
       End Try
    End Sub

    Private Function GetBackColor(ByVal DgvCell As DataGridViewCell) As Color
       Return Color.FromName(CType(DgvCell.Value, String))
    End Function

    Private Function GetForeColor(ByVal DgvCell As DataGridViewCell) As Color
       If Color.FromName(CType(DgvCell.Value, String)).GetBrightness() >= 0.5 Then
          Return Color.Black
       Else
          Return Color.White
       End If
    End Function

    Ti κερδίζουμε με το παραπάνω:

    • Πιο ευανάγνωστος κώδικας
    • Ταχύτερος κώδικας. Κάθε φορά που λέμε Dg0.Item(e.ColumnIndex, e.RowIndex) κάνουμε αναζήτηση μέσα σε όλα τα κελιά για να βρούμε αυτό που θέλουμε να δουλέψουμε, πράγμα που μπορούμε να αποφύγουμε αποκτώντας μία φορά ένα reference στο κελί και χρησιμοποιώντας αυτό σε όλες τις υπόλοιπες περιπτώσεις.

    Επίσης, συνήθησε να γράφεις κώδικα βάζοντας στην πρώτη γραμμή το "Option Strict On". Αν το είχες κάνει αυτό θα σου χτύπαγε το:

    Dim str As String = Dg0.Item(e.ColumnIndex, e.RowIndex).Value

    καθώς κάνει implicit μετατροπή από object σε string. Καλό είναι να αποφεύγεις τις implicit μετατροπές.

    Γενικά, ο κώδικας χρειάζεται διάφορα Try...Catch. Πχ, το

    CType(DgvCell.Value, String)

    είναι σίγουρο ότι θα γίνεται πάντα; Και αν τελικά γίνεται το CType, το string που θα επιστρέφει, θα είναι πάντοτε valid χρώμα ώστε να μην βγαίνει exception με το Color.FromName(CType(DgvCell.Value, String));

     

     

     


    Vir prudens non contra ventum mingit
  •  06-03-2008, 18:18 40756 σε απάντηση της 40715

    Απ: BackColor-ForeColor

    Πολύ καλή ενημέρωση.
    Σας Ευχαριστώ Πολύ.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems