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