Programmieren mit C++

Code-Beispiele & Lösungen

Allgemeine visuelle Objektklassen

Histogramme anzeigen

Die Klasse CHistogramCtrl ist von CWnd abgeleitet und leistet das Anzeigen von aufeinanderfolgenden Werten in einer Zeitreihe in bezug auf eine Skala. Die Werte laufen dabei von rechts nach links in das Display, so daß jeder neue Wert rechts eingefügt wird, während der jeweils äußerst linke Wert abgeschnitten wird, wenn nicht alle Werte gleichzeitig darstellbar sind.

Abbildung 7/2.1.1.35-1: Anzeige von Meßwerten als Histogramm

CHistogramCtrl ();

Der Konstruktor CHistogramCtrl() erzeugt eine Instanz der Klasse und initialisiert den Wertebereich auf 0..100 sowie den aktuellen Wert mit 0, was unsichtbar bedeutet.

Konstruktor CHistogramCtrl

BOOL CHistogramCtrl::Create(
    DWORD dwStyle, const RECT& rect, 
    CWnd* pParentWnd, UINT nID, 
    CCreateContext* pContext);

Der Konstruktor Create() erzeugt das Fenster, das der Control zugrunde liegt, unter Verwendung der Standard-Aufrufparameter.

CWnd::CreateEx() übergibt dabei als Stil die Kombination

WS_EX_CLIENTEDGE | WS_EX_STATICEDGE

Als Funktionsergebnis wird die Rückgabe von CWnd:CreateEx() returniert.

Konstruktor Create

UINT SetPos(UINT nPos);

SetPos() setzt den aktuellen Wert an der Anzeigeposition 0, ganz rechts im Anzeigefenster des Histogramms. Nach dem Setzen des Werts wird ein Neuzeichnen der Anzeige veranlaßt. Als Funktionsergebnis wird der zuletzt gesetzte Wert returniert. Dieser wird dann automatisch zum vorletzten Wert, der links neben dem aktuellen Wert steht.

Methode SetPos

void SetRange(UINT nLower, UINT nUpper);

Die Methode SetRange() legt den Skalierungsbereich für die Anzeige der Werte fest. nLower und nUpper beschreiben dabei den logischen Bereich, innerhalb dessen SetPos() Werte setzen kann. Zur Anzeige des Werts wird die Skala dann auf die tatsächlich verfügbare Anzeigehöhe normiert und der Wert unter Berücksichtigung der Gesamtskalenbreite auf die Anzeigehöhe skaliert.

Methode SetRange

void InvalidateCtrl();

Mittels InvalidateCtrl() versucht die Klasse die Ausgabegeschwindigkeit zu erhöhen, indem die reine Anzeigefläche als Updatebereich spezifiziert wird, während Fenstertitel und der Rest der Control für die Aktualisierung der Anzeigewerte nicht neu gezeichnet werden muß.

Methode InvalidateCtrl

void DrawSpike();

DrawSpike() zeichnet den aktuellen Wert neu als äußerst rechten Wert der Anzeige.

Implementation

Methode DrawSpike

Die Klasse bietet reichlich Ansätze zur Erweiterung. Mögliche Erweiterungen wären z.B. das Ändern der Laufrichtung wie auch das konstante Ausgeben von Werten auf einer Anzeigefläche, die nicht vorwärts läuft. Dies kann bei Bedarf relativ einfach anhand der vorliegenden Quelltexte implementiert werden, die möglichst überschaubar bleiben sollten. Die Funktion DrawSpike() bildet das Herzstück der Klasse. Sie leistet die komplette Ausgabe der Control, wobei zunächst die aktuelle Ausgabe um 4 Pixel nach links verschoben wird.

Erweiterungen

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.

Methode DrawSpike





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:19:38 von textarchiv.alojado.de