INFO: Verwenden von WM_CTLCOLOR-Nachricht

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

3,00 3.10 WINDOWS Kbprg

Zusammenfassung

Eine WM_CTLCOLOR zu einem Fenster jeder Nachricht ist der untergeordneten Fenstersteuerelemente (Optionsfeld, Kontrollkästchen, Bildlaufleiste usw.) auf dem Bildschirm gezeichnet wird. Diese Meldung geht das Zeichnen des Steuerelements. Die Darstellung von Steuerelementen geändert werden, kann dies durch die WM_CTLCOLOR-Nachricht verarbeitet.

Weitere Informationen

WParam enthält WM_CTLCOLOR gesendet wird, ein Handle für den Anzeigekontext für das untergeordnete Fenster (in diesem Fall das Steuerelement). LOWORD lParam identifiziert das untergeordnete Fenster durch die Nummer und HIWORD lParam enthält einen der folgenden Werte, die den Typ des Steuerelements gezeichnet werden soll:

   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

Wenn WM_CTLCOLOR verarbeitet wird, muss ein Handle zu einem Pinsel zurückgegeben. Fehler Pinsel Handle zurückgegeben führt eine FatalExit Windows debugging Monitor in der Debugversion von Windows.


Diese Meldung gibt DefWindowProc() bereits ein Handle; Allerdings kann eine Anwendung einen Griff zum Anpassen der Farbe von Steuerelementen zurück. Das zurückgegebene Handle gibt den Pinsel zum Zeichnen des Steuerelements verwendet werden. In Windows 2.x, der folgende Code zeichnet den Hintergrund des alle Schaltflächen hellgrau:

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

return (GetStockObject(WHITE_BRUSH));

In diesem Fall werden die Hintergründe für alle anderen Steuerelemente weiß gezeichnet. Beachten Sie, dass GetStockObject() ein Handle an vordefinierten Pinsel Parameter angegeben. Ändern Sie die Hintergrundfarbe des Button-Steuerelements in Windows 3.0 und höher ist es erforderlich, eine Schaltfläche Besitzer zeichnen erstellen.


Ein Pinsel Handle zurückgeben stellt einige interessanten Möglichkeiten, da Pinsel behandelt nicht nur von GetStockObject()zurückgegeben werden. Musterpinsel können aus Bitmaps erstellt werden. Wenn ein Muster Pinsel Handle WM_CTLCOLOR-Meldung zurückgegeben wird, würde der Pinsel verwendet Hintergrundes Steuerelemente.


Der folgende Code ändert zeichnen eine Bildlaufleiste Ziehpunkt Spurbereich Warenkorb Gewebe Muster gefunden in Paint:

   /* 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 Nachricht gilt auch für die folgenden fünf Klassen von Steuerelementen:


  1. Kontrollkästchen, Optionsfelder und Schaltflächen: Zeichnet den rechteckigen Bereich auf dem Steuerelement, mit ausgewählten platziert; Form-Steuerelements und Text wird über das gezeichnete Muster gezeichnet.
  2. Eingabefeld: Zeichnet den Bearbeitungsbereich.
  3. Gruppe: Zeichnet den rechteckigen Bereich hinter dem Titel.
  4. Bildlaufleisten: Zeichnet Umgebung Daumen verfolgen.
  5. Listenfeld: Angebotsbereichs zeichnet.
Statischer Text, Bilder und Rechtecke sind WM_CTLCOLOR unberührt.


Hinweis: In Windows 3.0 und höher eine Anwendung kann nicht die Farbe einer Schaltfläche ändern. Jedoch können Benutzer Steuerungsbedienfeld Sie Farben für alle im System ändern. Dies kann auch durch Ändern des Abschnitts [Farben] der Datei WIN erfolgen. INI-Datei eine "ButtonFace =" Zeile, die den RGB-Wert für die Schaltfläche Flächenfarbe angibt.


Verarbeitung der Nachricht WM_CTLCOLOR ändert nur die Farbe von untergeordneten Fenstern, die von einer Anwendung erstellt. Windows sendet WM_CTLCOLOR-Meldung an das übergeordnete Fenster der einzelnen Steuerelemente. Bildlaufleisten, die als Teil von Windows enthaltenen Steuerelemente bearbeiten oder Listenfelder sind nicht betroffen. Bereich Track Daumen systemgenerierte Bildlaufleisten kann nur in WIN geändert werden. INI oder über das Bedienfeld.


Es kann auch den Hintergrund eines Dialogfelds gezeichnet. Der folgende Code kann zu einem Dialogfeld Farbe verwendet werden:

   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);

...

Dieser Code wird sichergestellt, dass eine gemusterte Bitmap ordnungsgemäß über das Dialogfeld angeordnet werden. "MyPatternBrush" ist der Name einer Bitmap mit SDKPaint erstellt. Diese Bitmap beigefügt der. RC-Datei.
Eigenschaften

Artikelnummer: 32685 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback