Bei VC6 werden mehr oder weniger automatisch die Wrapper (als Header- und Source-Dateien) generiert. Wenn man bei VC7 wie beschrieben vorgeht, erhält man nur eine Pseudo-Sourcedatei; der eigentliche Code steht in den ganzen Header-Dateien (alles inline).
[Wenn Du diese Dateien nicht hast:
Als Du den Klassenassistenten aufgerufen hast, um die Variable m_cDiagram erzeugen zu lassen, müsste eine solche Meldung angezeigt worden sein:
Das ActiveX-Steuerelement Microsoft Chart Control ... wurde nicht in Ihr Projekt eingefügt. Developer Studio wird dies jetzt vornehmen und eine C++-Wrapper-Klasse dafür erstellen.
Danach kannst Du Häkchen bei den Klassen setzen, die generiert werden sollen. Zuerst steht da die Klasse, welche auf jeden Fall benötigt wird: CMSChart. Darunter dann eine ganze Menge Klassen, die mit CVc beginnen. Diese (bzw. einige davon) benötigst Du hier auch, nicht nur CMSChart.
Wenn Du auf OK klickst, werden cpp- und h-Dateien erzeugt und in Dein Projekt eingefügt. Wenn unten alles klappt, kannst sie sicher teilweise auch wieder aus dem Projekt nehmen bzw. von Hand in einen eigenen Unterordner verschieben, damit es übersichtlicher ist.]
Ansonsten gleiche Vorgehensweise wie bei VC7, nur die Funktionen heißen anders (wie gesagt): Statt put_ Set als Prefix und statt get_ dann Get. Kleiner Schönheitsfehler bei VC6: Es sind keine enums für die Konstanten vorhanden.
So sollte es mit VC6 klappen (ist aber relativ unflexibel; Du kannst Dich ja an dem Code oben orientieren, wenn es erst mal funktioniert):
Code:
// ...
#include mschart.h // bzw. der gewählte Dateiname
#include vcplot.h
#include vcseriescollection.h
#include vcseries.h
#include vcdatapoints.h
#include vcdatapoint.h
#include vcdatapointlabel.h
#include vcfont.h
// ...
enum
{
VtChLabelLocationTypeNone = 0,
VtChLabelLocationTypeAbovePoint = 1,
VtChLabelLocationTypeBelowPoint = 2,
VtChLabelLocationTypeCenter = 3,
VtChLabelLocationTypeBase = 4,
VtChLabelLocationTypeInside = 5,
VtChLabelLocationTypeOutside = 6,
VtChLabelLocationTypeLeft = 7,
VtChLabelLocationTypeRight = 8
} VtChLabelLocationType;
enum
{
VtChLabelComponentValue = 1,
VtChLabelComponentPercent = 2,
VtChLabelComponentSeriesName = 4,
VtChLabelComponentPointName = 8
} VtChLabelComponent;
// ...
void CDeinIrgendwas::SetChart(const CString& name, bool dispPercent, float componentFntSize, int gruen, int gelb, int rot) {
COleSafeArray saDiagram; // Hilfsobjekt zum Füllen des Diagramms
DWORD numElements[] = {1, 3}; // 1(Kreisdiagramm) x 3(Kreisabschnitte)
long index[2];
saDiagram.Create(VT_I4, 2, numElements);
// index[0] = row index = 0
// In diesem Fall haben wir immer nur ein Diagramm gleichzeitig, also ist der row index immer gleich 0.
index[0]=0;
// index[1] (column) bestimmt, um welchen Kreisabschnitt es geht; also hier 0 bis 2 index[0]=0;
index[1]=0;
saDiagram.PutElement(index, &gruen);
index[1]=1;
saDiagram.PutElement(index, &gelb);
index[1]=2;
saDiagram.PutElement(index, &rot);
// Diagramm mit Werten belegen
m_cDiagram.SetChartData(saDiagram.Detach());
m_cDiagram.SetRowLabel(name);
// Legende setzen
m_cDiagram.SetColumn(1);
m_cDiagram.SetColumnLabel(fertige Projekte);
m_cDiagram.SetColumn(2);
m_cDiagram.SetColumnLabel(laufende Projekte);
m_cDiagram.SetColumn(3);
m_cDiagram.SetColumnLabel(geplante Projekte);
// Dem Chart-Control mitteilen, ob bzw. wie es Prozente/Werte der Kreisabschnitte anzeigen soll
CVcPlot plot(m_cDiagram.GetPlot());
CVcSeriesCollection serCol = plot.GetSeriesCollection();
CVcSeries ser;
CVcDataPoints dps;
CVcDataPoint dp;
CVcDataPointLabel dpl;
for(int idx = 1; idx <= 3; ++idx) {
ser = serCol.GetItem(idx);
dps = ser.GetDataPoints();
dp = dps.GetItem(-1);
dpl = dp.GetDataPointLabel();
if(dispPercent) {
// Prozente anzeigen
dpl.SetPercentFormat(0%);
dpl.SetLocationType(VtChLabelLocationTypeInside);
dpl.SetComponent(VtChLabelComponentPercent);
} else {
// Werte selbst anzeigen
dpl.SetLocationType(VtChLabelLocationTypeInside);
dpl.SetComponent(VtChLabelComponentValue);
}
// Größe der Prozent- bzw. Wertedarstellung setzen (ist sonst wahrscheinlich etwas zu klein)
CVcFont dFnt(dpl.GetVtFont());
dFnt.SetSize(componentFntSize);
}
m_cDiagram.Refresh();
}
// Mit Anzeige der Prozente (hier 25%, 33%, 42%)
SetChart(Nikolay Nenov, true, 10.0f, 3, 4, 5);
// Mit Anzeige der Werte (hier 3, 4, 5)
SetChart(Nikolay Nenov, true, 10.0f, 3, 4, 5);
Die Farben des Diagramms musst Du natürlich noch auf grün, gelb und rot ändern. Standard ist rot, grün, blau. Auch die Möglichkeit des Selektierens etc. würde ich ausschalten (in den Eigenschaften/Properties).