Kreslení do titulku okna je méňě často používaný, avšak o
to zajímavější programátorský problém. Titulek okna je zajištěn stylem WM_CAPTION
a představuje speciální ne-klientskou plochu, do které lze libovolně kreslit.
Grafický výstup do titulku okna se provádí v reakci na čtyři zprávy: WM_NCPAINT,
WM_NCACTIVATE, WM_SETTEXT a WM_SYSCOMMAND.
Pokud potřebujeme vykreslit další informaci, předáme zprávy standardní okénkové
proceduře, poté pomocí speciálního kontextu kreslíme. Podívejme se na
následující metodu, která vypisuje do titulku okna text.
void CDrawCaptionDlg::DrawCaption()
{
CWindowDC dc(this);
CRect rcWindow;
GetWindowRect(&rcWindow);
// Výpočet polohy titulku.
int x = ::GetSystemMetrics(SM_CXSIZE) +
::GetSystemMetrics(SM_CXBORDER) +
::GetSystemMetrics(SM_CXFRAME);
int y = ::GetSystemMetrics(SM_CYFRAME);
CRect rcCaption(x, y, rcWindow.right - rcWindow.left
- 2 * x - ::GetSystemMetrics(SM_CXFRAME),
::GetSystemMetrics(SM_CYSIZE));
// Vypsání textu do titulku okna.
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(255, 255, 255));
dc.DrawText("Ahoj světe", &rcCaption, DT_RIGHT);
}
|
Pomocí třídy CWindowDC získáme speciální kreslicí
kontext, který nám umožňuje kreslit do ne-klientské plochy (tj, mimo klientskou
plochu) okna. Tato třída stejně jako CClientDC dědí ze třídy CDC a
její použití je tedy stejné. Metodou GetWindowRect získáme obrazovkové
souřadnice okna, ketré později použijeme pro výpočet polohy titulku. Další
metodou, která je předchozí ukázce použita je GetSystemMetrics. Tato metoda
slouží pro zjišťování systémových rozměrů (v pixlech), které identifikujeme
parametrem. Vypsání textu pak provedeme jednoduše pomocí metody DrawText,
před jejíž voláním ještě nastavíme průhlednost a barvu.
Volání předchozí funkce pak budeme provádět v reakci na všechny
zmíněné zprávy, ve kterých se manipuluje s obsahem titulku. Následující kód
ukazuje implementaci metody WindowProc.
LRESULT CDrawCaptionDlg::WindowProc(UINT message,
WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = CDialog::WindowProc(message,
wParam, lParam);
switch (message)
{
case WM_NCPAINT:
case WM_NCACTIVATE:
case WM_SETTEXT:
case WM_SYSCOMMAND:
DrawCaption();
break;
}
return lResult;
}
|

|