Bitmap Hintergrundfarbe im Static Control?



  • Hi Community,
    ich verwende ein in einem Dialog ein Image Static Control (also ein Static Control mit Style "SS_BITMAP").
    Geladen wird ein Monochrom-Bitmap (schwarz/weiß, 236x47 Pixel)

    Auszug aus MyApp.rc:

    // Dialog
    //
    CONTROL  115,IDC_BITMAP_PINBELEGUNG,"Static",SS_BITMAP | SS_NOTIFY | SS_CENTERIMAGE,252,176,157,29
    
    ...
    
    // Bitmap
    //
    IDB_SUBD25POLIG   BITMAP DISCARDABLE "res\\SUB-D 25polig.bmp"
    

    IDB_SUBD25POLIG ist 115, definiert in resource.h

    Wie kann ich die Hintergrundfarbe dieses Static Controls beeinflussen?
    (Eine harmlose Frage, aber sehr nervig, da ich nicht vorwärts komme!)

    Auszug aus meiner Dialog-Prozedur:

    case WM_CTLCOLORSTATIC:
    //hdcStatic = (HDC)wParam;   //Handle to display context.
    //hwndStatic = (HWND)lParam; //Handle to static control.
    switch ( GetWindowLong( (HWND)lParam, GWL_ID ) )        //Resourcen-ID ermitteln.
    {
      case IDC_BITMAP_PINBELEGUNG:
      SetTextColor( (HDC)wParam, RGB( 0x00, 0x80, 0x00 ) ); //grün.
      SetBkMode( (HDC)wParam, OPAQUE );
      SetBkColor( (HDC)wParam, RGB( 0xFF, 0xFF, 0x00 ) );   //gelb.
      return( (LRESULT)GetSysColorBrush( COLOR_BTNFACE ) ); //The return value is a handle to a brush that the system
                                                            //uses to paint the background of the static control.
    }
    

    (Ich habe hier bewußt die knalligen Farben gewählt, um die Effekte deutlich demonstrieren zu können)

    Was hier die ganze Sache noch komplizierter macht: Es kommen völlig unterschiedliche Ergebnisse unter WinXP und Win2000 zu Tage!
    Unter Win XP:
    Farbe ("Schrift") Bitmap = grün
    Hintergrund Bitmap = Dialog-Hintergrundfarbe // <-- ⚠ sollte gelb sein! ⚠
    Hintergrund um Bitmap herum = Dialog-Hintergrundfarbe

    Unter Win 2000 (und älter) beobachte ich dagegen folgendes:
    Farbe ("Schrift") Bitmap = grün
    Hintergrund Bitmap = gelb
    Hintergrund um Bitmap herum = weiß // <-- ⚠ sollte Dialog-Hintergrundfarbe sein! ⚠

    Nun, meine zusammengefaßte Erkenntnisse:
    - Windows XP ignoriert offensichtlich meine gewünschte Hintergrundfarbe (hier: gelb gewünscht).
    - Windows 2000 ist offensichtlich nicht imstande, den Leerraum um den Bitmap herum mit irgendwas sinnvollem zu füllen (hier: Dialog-Hintergrundfarbe gewünscht).

    Was mache ich da falsch? Ich hoffe, Ihr könnt mir weiterhelfen?
    Martin

    P.S.: Ich verwende Visual Studio 6.0 mit SP6.



  • Bitte um einen Tipp, worin diese "falschen" Farben ihre Ursache haben könnten?

    Habt Ihr auch das gleiche Problem?

    Bleibt es mir möglicherweise nichts anderes übrig, als den Bitmap per Ownerdraw (mittels WM_DRAWITEM) in das Static Control zu zeichnen?
    Dann wäre ja der Sinn von Bitmap Static Control (mit SS_BITMAP) hinüber, wenn man es nicht vernünftig einsetzen kann.

    Martin



  • hast du es mal mit SetBkMode( (HDC)wParam, TRANSPARENT); probiert?

    Nur so eine Idee...



  • Hi Der_Knob,
    ja, das habe ich auch schon ausprobiert.
    Es zeigt sich kein Unterschied, ob ich

    SetBkMode( (HDC)wParam, TRANSPARENT );
    

    oder

    SetBkMode( (HDC)wParam, OPAQUE );
    

    verwende. 😮

    In der Zwischenzeit habe ich etwas "Kleingedrucktes" in der MSDN http://msdn2.microsoft.com/en-us/library/bb760773.aspx gelesen:

    SS_CENTERIMAGE
    Specifies that a bitmap is centered in the static control that contains it. The control is not resized, so that a bitmap too large for the control will be clipped. If the static control contains a single line of text, the text is centered vertically in the client area of the control.
    Microsoft Windows XP: This style bit no longer results in unused portions of the control being filled with the color of the top left pixel of the bitmap or icon. Unused portions of the control will remain the background color.

    Besteht da ein Zusammenhang mit meiner Beobachtung? Bei genauem Hinlesen bezieht sich "unused portions" eigentlich auf den Bereich um den Bitmap herum, oder nicht? 😕

    Martin


Anmelden zum Antworten