OWL Fonts und Farben

Willemers Informatik-Ecke

Ändern des Fonts für Kontrollelemente

An der Stelle, wo der Font geändert werden soll.

MyFont = new TFont ("Times New Roman", 10);

    MyStatic->SetWindowFont (*MyFont, TRUE);

Es ist wichtig, daß die TFont-Variable nicht eliminiert wird, bevor eine neues SetWindowFont aufgerufen wird. Damit entsteht die Gefahr von Speicherlöchern. Um dies zu vermeiden, kann man die alte TFont löschen, bevor sie neu besetzt wird.

static TFont *MyFont = 0;

      if (MyFont) delete MyFont;
      MyFont = new TFont(FontName, FontSize);
      MeinElement->SetWindowFont(*MyFont, TRUE);

Das Verfahren ist mit TStatic, TEdit und TListBox unter Windows getestet.

Um die korrekte Größe zu erreichen, muß der Device Context des Bildschirms oder eines der Fenster erzeugt und die logischen Pixel pro Zoll ermittelt werden.

LONG yLogPixelsPerInch;
LOGFONT LogFont = {0};

	TClientDC dc(*Element);
	yLogPixelsPerInch = dc.GetDeviceCaps(LOGPIXELSY);
	LogFont.lfHeight = -MulDiv(FontSize, yLogPixelsPerInch, 72);
        strcpy(LogFont.lfFaceName, FontName);

	if (pTFont) delete pTFont;
	pTFont = new TFont(&LogFont);
	Element->SetWindowFont(*pTFont, TRUE);

Aus diesem Wert und der Punktgröße wird beim Teilen durch 72 (72 Punkt sind ein Zoll!) die Höhe des Bildschirmzeichens. Aus diesem LOGFONT wird dann per Konstruktor der TFont erstellt.

Ermitteln der Font-Metrics in einem Fenster

TEXTMETRIC tm;
TFont Schrift(GetWindowFont());

   // Berechne die Schriftgroesse
   Schrift.GetTextMetrics(tm);
   // in tm.tmHeight befindet sich z. B: die Höhe

Vorder- und Hintergrundfarben

Die einfachste Methode, die Farbe in einem von TWindow abgeleiteten Element zu ändern, ist SetColor für die Vordergrundfarbe und SetBkgndColor für die Hintergrundfarbe aufzurufen. In einer SetupWindow-Funktion einer Dialogbox könnte beispielsweise stehen:

#include <owl\color.h>

  // ...

static TBrush Farbe = TBrush(TColor::LtRed);

    EditName->SetBkgndColor(TColor::LtGray);
    EditName->SetColor(&Farbe);

Dadurch würde rote Schrift auf hellgrauem Grund erscheinen.

Das TBrush-Element muß statisch sein! Wird es bei Erstellen der Dialogbox erzeugt, sollte es im Destruktor wieder vernichtet werden.

    // Add this to your response table:
    EV_WM_CTLCOLOR,
    // define a TBrush 
   BkBrush = new TBrush(::GetSysColor(COLOR_BTNFACE));

HBRUSH PVdlistDlg::EvCtlColor(HDC hDC, HWND hWndChild, UINT ctlType)
{ 
  POINT point;
  UINT cid;

  cid = ::GetDlgCtrlID(hWndChild);
  if(cid == IDC_LISTBOX1)
  { 
    SetTextColor(hDC, TColor(0,0,255));
    SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE));
    return *BkBrush;
  } 
  return (TDialog::EvCtlColor(hDC,hWndChild,ctlType));  // No special action required 
} 

Die Funktion EvCtlColor scheint aber unter OS/2 nicht angesprochen zu werden.


Homepage - OWL-Index 22.9.2001 (C) Copyright 1999, 2001 Arnold Willemer