ΠΛΗΡΟΦΟΡΙΕΣ: Χρήση του μηνύματος WM_CTLCOLOR

Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής βάσης που έχει αποσυρθεί

Αυτό το άρθρο αφορά προϊόντα για τα οποία η Microsoft δεν παρέχει πλέον υποστήριξη. Συνεπώς, το παρόν άρθρο παρέχεται "ως έχει" και δεν θα ενημερώνεται πλέον.

3.00 3.10 kbprg των WINDOWS

Σύνοψη

WM_CTLCOLOR αποστέλλεται ένα μήνυμα σε ένα παράθυρο κάθε φορά που ένα από τα στοιχεία ελέγχου παραθύρων θυγατρικών (κουμπί επιλογής, πλαίσιο ελέγχου, γραμμή κύλισης και ούτω καθεξής) είναι να σχεδιαστεί στην οθόνη. Αυτό το μήνυμα προηγείται το χρωματισμό του στοιχείου ελέγχου. Όταν κρίνεται σκόπιμο, για να αλλάξετε την εμφάνιση των στοιχείων ελέγχου, αυτό μπορεί να γίνει με την επεξεργασία του μηνύματος WM_CTLCOLOR.

Περισσότερες πληροφορίες

Κατά την αποστολή του WM_CTLCOLOR, wParam περιέχει ένα δείκτη χειρισμού στο περιβάλλον οθόνης για το εξαρτημένο παράθυρο (σε αυτήν την περίπτωση, το στοιχείο ελέγχου). Το LOWORD του lParam προσδιορίζει το εξαρτημένο παράθυρο από έναν αριθμό Αναγνωριστικού και την HIWORD του lParam περιέχει μία από τις ακόλουθες τιμές, καθορίζει τον τύπο του στοιχείου ελέγχου που καθορίζονται:

   CTLCOLOR_BTN            button control
CTLCOLOR_DLG dialog box
CTLCOLOR_EDIT edit control
CTLCOLOR_LISTBOX list box
CTLCOLOR_MSGBOX message box
CTLCOLOR_SCROLLBAR scroll bar
CTLCOLOR_STATIC static text, frame, or rectangle

Κατά την επεξεργασία WM_CTLCOLOR, πρέπει να επιστραφεί ένα δείκτη χειρισμού σε ένα πινέλο. Αποτυχία για να επιστρέψετε ένα δείκτη χειρισμού πινέλο θα οδηγήσει σε ένα FatalExit των Windows στην οθόνη του εντοπισμού σφαλμάτων στην έκδοση εντοπισμού σφαλμάτων των Windows.


DefWindowProc() ήδη επιστρέφει ένα δείκτη χειρισμού ως απόκριση σε αυτό το μήνυμα. Ωστόσο, μια εφαρμογή μπορεί να επιστρέψει ένα διαφορετικό δείκτη χειρισμού για να προσαρμόσετε το χρώμα των στοιχείων ελέγχου. Ο δείκτης χειρισμού που επιστρέφει Καθορίζει το πινέλο που θα χρησιμοποιηθεί για να χρωματίσετε το στοιχείο ελέγχου. Για παράδειγμα, στα Windows 2.x, ο παρακάτω κώδικας χρωματίζει το φόντο της κάθε ανοιχτό γκρι κουμπιά:

   case WM_CTLCOLOR:      if (HIWORD(lParam) == CTLCOLOR_BTN)
return (GetStockObject(LTGRAY_BRUSH));

return (GetStockObject(WHITE_BRUSH));

Στην περίπτωση αυτή, το φόντο για όλα τα άλλα στοιχεία ελέγχου είναι χρωματισμένες λευκό. Σημειώστε ότι η GetStockObject() επιστρέφει ένα δείκτη χειρισμού για το πινέλο μετοχών που καθορίζεται από την παράμετρο. Για να αλλάξετε το χρώμα φόντου ενός στοιχείου ελέγχου κουμπιού στο Windows 3.0 και νεότερες εκδόσεις, είναι απαραίτητο να δημιουργήσετε ένα κουμπί σχεδίαση του κατόχου.


Επιστρέφει ένα δείκτη χειρισμού πινέλο παρουσιάζει μερικές ενδιαφέρουσες δυνατότητες επειδή λαβές πινέλου, δεν περιορίζονται σε αυτά επιστρέφονται από GetStockObject(). Πινέλα μοτίβου μπορούν να δημιουργηθούν από αρχεία bitmap. Εάν επιστραφεί ένα δείκτη χειρισμού πινέλο μοτίβου ως απόκριση σε ένα μήνυμα WM_CTLCOLOR, το πινέλο θα χρησιμοποιηθεί για το χρωματισμό του φόντου των στοιχείων ελέγχου.


Ο ακόλουθος κώδικας αλλάζει το χρωματισμό της περιοχής κομμάτι αντίχειρα μια γραμμή κύλισης στο καλάθι ύφανση μοτίβο που βρέθηκε στη Ζωγραφική:

   /* Add these global variables. The array of WORDs specifies the */    /* pattern for the brush                                        */ 
HBRUSH hBrush;
HBITMAP hBitmap;
WORD wWeave[]={0x0F, 0x8B, 0xDD, 0xB8, 0x70, 0xE8, 0xDD, 0x8E};

...

/* Add these lines to WinMain */
hBitmap = CreateBitmap(8, 8, 1, 1, (LPSTR)wWeave);
hBrush = CreatePatternBrush(hBitmap);

...

/* Add this case to the Windows procedure or wherever the */
/* messages are processed. */
case WM_CTLCOLOR:
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
return (hBrush);

return (GetStockObject(WHITE_BRUSH));

Το μήνυμα WM_CTLCOLOR ισχύει επίσης για τις ακόλουθες κλάσεις πέντε στοιχεία ελέγχου:


  1. Πλαίσια ελέγχου, κουμπιά επιλογής, και κουμπιά: χρωματίζει τα ορθογώνια περιοχή στην οποία το στοιχείο ελέγχου τοποθετείται με επιλεγμένο πινέλο. σχήμα ελέγχου και το κείμενο θα εμφανιστεί πάνω από το χρώμα μοτίβου.
  2. Επεξεργασία στοιχείου ελέγχου: χρωματίζει Αλυσ.
  3. Πλαίσιο ομάδας: χρωματίζει ορθογώνια περιοχή πίσω από το κείμενο του τίτλου.
  4. Γραμμές κύλισης: χρωματίζει την περιοχή γύρω από το κομμάτι αντίχειρα.
  5. Πλαίσιο λίστας: χρωματίζει την περιοχή της λίστας.
Στατικό κείμενο, πλαίσια και ορθογώνια επηρεάζονται από WM_CTLCOLOR.


ΣΗΜΕΊΩΣΗ: στα Windows 3.0 και νεότερες εκδόσεις, μια εφαρμογή δεν είναι δυνατό να αλλάξετε το χρώμα του κουμπιού όψη. Ωστόσο, ο χρήστης μπορεί να χρησιμοποιήσει τον πίνακα ελέγχου για να αλλάξετε τα χρώματα των κουμπιών για όλες τις εφαρμογές στο σύστημα. Αυτό μπορεί επίσης να πραγματοποιηθεί τροποποιώντας την ενότητα [χρώματα] του WIN. Το αρχείο INI για να προσθέσετε ένα "ButtonFace =" γραμμή που καθορίζει την τιμή χρώματος RGB για το χρώμα του κουμπιού όψη.


Επεξεργασία του μηνύματος WM_CTLCOLOR αλλάζει μόνο το χρώμα του εξαρτημένα παράθυρα που δημιουργούνται από μια εφαρμογή. Τα Windows στέλνουν το μήνυμα WM_CTLCOLOR στο γονικό παράθυρο καθενός από αυτά τα στοιχεία ελέγχου. Γραμμές κύλισης που περιλαμβάνονται ως τμήμα των Windows, επεξεργασία στοιχείων ελέγχου ή τα πλαίσια λίστας δεν επηρεάζονται. Στην περιοχή παρακολούθηση αντίχειρα των γραμμών κύλισης που δημιουργείται από το σύστημα μπορεί να αλλάξει μόνο στο WIN. INI ή μέσω του πίνακα ελέγχου.


Είναι επίσης πιθανό να χρωματίσετε ολόκληρο το φόντο του ένα παράθυρο διαλόγου. Ο ακόλουθος κώδικας μπορεί να χρησιμοποιηθεί για να παρέχει ένα χρώμα του πλαισίου διαλόγου:

   long FAR PASCAL MainWindowProc(....);
...

case WM_CREATE:
hTempBrush = LoadBitmap(hInst, (LPSTR)"MyPatternBrush");
hBrush = CreatePatternBrush(hTempBrush);
DeleteObject(hTempBrush);

...

case WM_DESTROY:
DeleteObject(hBrush);

...

BOOL FAR PASCAL
MyDialogProc(....);

...

case WM_CTLCOLOR:
if (bMonoChrome)
return (FALSE); // Do nothing if on a monochrome monitor
// bMonoChrome is a global set during
// initialization.

if (CTLCOLOR_DLG == HIWORD(lParam))
UnrealizeObject(hBrush);

SelectObject((HDC)wParam, hBrush);

if (CTLCOLOR_DLG == HIWORD(lParam))
SetBrushOrg((HDC)wParam, 0, 0);

SetBkMode((HDC)wParam, TRANSPARENT);

SetTextColor((HDC)wParam, RGB(0, 0, 0));

return(hBrush);

...

Αυτός ο κωδικός θα διασφαλίσει ότι ένα bitmap με μοτίβο θα εμφανίζονται σωστά σε ολόκληρο το παράθυρο διαλόγου. "MyPatternBrush" είναι το όνομα ενός bitmap που έχει δημιουργηθεί με τη χρήση SDKPaint. Αυτό το bitmap πρέπει να περιλαμβάνονται στο το. Αρχείο RC.
Ιδιότητες

Αναγνωριστικό άρθρου: 32685 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια