void CHistogramCtrl::DrawSpike()
{
UINT nRange = m_nUpper - m_nLower;
CRect rcClient;
GetClientRect(rcClient);
if (m_MemDC.GetSafeHdc() != NULL)
{
m_MemDC.BitBlt(0, 0, rcClient.Width(),
rcClient.Height(),
&m_MemDC, 4, 0, SRCCOPY);
Die Breite eines Werts ist auf 4 Pixel inkl. Separatorfläche festgelegt. Die Anzeigefläche und Werthöhe ergibt sich aus:
CRect rcTop(rcClient.right - 4, 0,
rcClient.right - 2, rcClient.bottom);
rcTop.top = (long) (((float) (m_nPos - m_nLower) / nRange) *
rcClient.Height());
rcTop.top = rcClient.bottom - rcTop.top;
Hierin läßt sich die Skala kurzerhand einzeichnen.
CRect rcRight = rcClient;
rcRight.left = rcRight.right - 4;
m_MemDC.SetBkColor(RGB(0,0,0));
CBrush bkBrush(HS_HORIZONTAL,RGB(0,128,0));
m_MemDC.FillRect(rcRight,&bkBrush);
Das abschließende Zeichnen des Werts erfolgt durch Ausgabe eines Rechtecks in den Koordinaten von rcTop, die zuvor bestimmt wurden.
CBrush brush(RGB(0,255,0));
m_MemDC.FillRect(rcTop, &brush);
}
}
Als Farbe ist hier gelb vorgegeben, was an sich auch problemlos variabel zu gestalten wäre. Man bräuchte nur ein Member zur Verwaltung der gewünschten Farbe einzuführen.
Einbinden läßt sich die Control in einen Dialog beispielsweise durch Integrieren der nachfolgenden Anweisungen in der Methode OnInitDialog().
CRect rect;
GetDlgItem(IDC_STATIC_HISTOGRAM)->GetWindowRect(rect);
ScreenToClient(rect);
m_HistogramCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this, 100);
m_HistogramCtrl.SetRange(0,100);
Wobei m_HistogramCtrl in der Klasse als Member der Anwendungsklasse zu definieren ist. Anschließend brauchen nur noch mittels SetPos() Werte übergeben zu werden.
|