[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    (*
    > I am trying to change the color of a static text item in a dialog
    > with no luck.  I tried to redefine the wmPaint method of the TStatic
    > control in the following manner:
    > ~~~~~~~~~~
    > procedure TUnits.wmPaint (var Msg : TMessage);
    > var
    >    DC : hDC;
    > begin
    >    DC := GetDC(hWindow);
    >    if not Updated  { <-- Updated is a boolean field in TUnits }
    >      then SetTextColor(DC,GetSysColor(COLOR_GRAYTEXT))
    >      else SetTextColor(DC,GetSysColor(COLOR_WINDOWTEXT));
    >    ReleaseDC(hWindow,DC);
    >    DefWndProc(Msg);
    > end;
    > It didn't work.  Any help would be greatly appreciated.

    You need to override the wmCtlColor method. You might also need to paint the
    background yourself. I have a unit which I use for these purposes. It can be
    used for any type of dialog object.

    From: "A.A. Olowofoyeku" <laa12@cc.keele.ac.uk>
    *)
    Unit CTL;

    Interface
    {$F+}

    uses
    Wintypes, WinProcs,OWindows;
    {//////////////////////////////////////////////////////////}
    {// generic wrapper procedure for wm_EraseBkGnd methods ///}
    {//////////////////////////////////////////////////////////}
    Procedure DoEraseBackGround
              (Var Message : TMessage; Wnd : HWnd; TheBrush : THandle);
    {
    Message  = the TMessage passed to the calling object method
    Wnd      = the window to paint (generally the object's hWindow)
    TheBrush = the brush to use to paint the background
               should be one of the xxxxxBrush constants
                  WHITE_BRUSH
                  LTGRAY_BRUSH
                  GRAY_BRUSH
                  DKGRAY_BRUSH
                  BLACK_BRUSH
               Ideally, should be the same as the one passed in the
               wmCtlColor method
    }

    {//////////////////////////////////////////////////////////}
    {// generic wrapper procedure for wmCtlColor methods  /////}
    {//////////////////////////////////////////////////////////}
    Procedure DoCtlColor
             (Var Message : TMessage; Const Caller : PWindowsObject;
              TheBrush : THandle; BackColor : TColorRef);
    {
    Message  = the TMessage passed to the calling object method
    Caller   = a pointer to the calling Object
    TheBrush = the brush to use to paint the background
               could be any of the colorxxxxxBrush constants
               Ideally, should be the same as that used in the
               wm_eraseBkGnd method
    Color    = the color to use to paint child controls
               should be an RGB value
                e.g., RGB(255,255,255) = for white
                      RGB(128,128,128) = for a shade of gray
    }

    Implementation

    {//////////////////////////////////////////////////////////}
    {// generic wrapper procedure for wm_EraseBkGnd methods ///}
    {//////////////////////////////////////////////////////////}
    Procedure DoEraseBackGround
              (Var Message : TMessage; Wnd : HWnd; TheBrush : THandle);
    Var
      aBrush,
      OldBrush : hBrush;
      DC       : HDC;
      tR       : tRect;

    Begin
      DC := hdc(Message.wParam);
      aBrush := GetStockObject(TheBrush);
      UnrealizeObject(aBrush);
      OldBrush := SelectObject(DC, aBrush);
      GetClientRect(Wnd, tR);
      With tR Do PatBlt(DC, left, top, right-left, bottom-top, PatCopy);
      DeleteObject(SelectObject(DC, OldBrush));
      SelectObject(DC, OldBrush);
    End;

    {//////////////////////////////////////////////////////////}
    {// generic wrapper procedure for wmCtlColor methods  /////}
    {//////////////////////////////////////////////////////////}
    Procedure DoCtlColor
             (Var Message : TMessage; Const Caller : PWindowsObject;
              TheBrush : THandle; BackColor : TColorRef);
    Begin
      Caller^.DefWndProc(Message);
      Case HiWord(Message.lParam) of
        CtlColor_Dlg,
        CtlColor_Edit,
        CtlColor_MsgBox,
        CtlColor_STATIC,
        CtlColor_ListBox,
        CtlColor_BTN : Begin
                         Message.Result := GetStockObject(TheBrush);
                         SetBkColor(Message.wParam, BackColor);
                       End;
        CtlColor_LISTBOX : Message.Result := GetStockObject(TheBrush);
      End;
    End;
    {/////////////////////////////////////////////////////////////////}
    END.
    {/////////////////////////////////////////////////////////////////}
    {/////////////////////////////////////////////////////////////////}
    {////  TEST DIALOG   ////////}
      Type
      PTestDialog = ^TestDialog;
      TestDialog  = Object(TDialog)
         Procedure wm_eraseBkGnd(Var Message : TMessage);
                   Virtual wm_First+wm_eraseBkGnd;
         Procedure WmCtlColor(Var Message : TMessage);
                   Virtual wm_first+wm_CtlColor;
      End;

    {///////////////////////////////////////}
    Procedure  TestDialog.wm_eraseBkGnd(Var Message : TMessage);
    Begin
       DoEraseBackGround(Message, HWindow, LTGRAY_BRUSH);
    End;
    {///////////////////////////////////////}
    Procedure  TestDialog.WmCtlColor(Var Message : TMessage);
    Begin
       DoCtlColor(Message, @Self, LTGRAY_BRUSH, RGB(192,192,192));
    End;

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]