Bei Programmstart auf CTabCtrl-Feld zeichen
-
Hallo,
ich benutze Visual C++ .Net.
Ich habe mit dem Assistenten ein Dialog mit einen CTabCtrl-Feld erzeugt. Dem Feld habe ich eine Control Variable mit dem namen m_tab1 zugewiesen.
Ich möchte nun beim Programmstart in dieses Feld etwas zeichen. Zur Vereinfachung nur ein weisses Rechteck.
folgendermaßen bin ich vorgegangen:
In die Funktion OnInitDialog habe ich folgendes geschrieben:pDC = m_tab1.GetDC(); m_tab1.GetWindowRect( &rc ); ScreenToClient( &rc ); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(10600,-10600); pDC->SetWindowOrg(-300,10300); pDC->SetViewportExt(rc.right-rc.left,rc.bottom-rc.top-20); pDC->SetViewportOrg(0,20); CBrush lSolidBrush(RGB(255, 255, 255)); CRect ac(0,0,10000,10000); pDC->FillRect(ac,&lSolidBrush);
Lieder bleibt das Feld beim Programmstart grau.
pDC ist eine globale Variable. An jeder anderen Stelle im Programm funktioniert der Code (kann z.B. mit einem klick auf einen button das Feld zeichen).Wo ist der Fehler ? Steht der Code an der falschen Stelle ?
Danke schonmal im voraus.
edm
-
Exakt, der Code steht an der falschen Stelle.
OnInitDialog wird vor dem ersten OnPaint aufgerufen, d.h., OnPaint übermalt dein Rechteck wieder. Folgerung: Schreibe deinen Code in OnPaint.
-
Ich habe es schon in der OnPaint Methode versucht. Da passiert auch nichts. Wenn ich allerdings das Dialogfeld mit der Maus ein Stück aus dem Bildschrim und wieder zurück zieh, wird das rechteck gezeichnet.
D.h. wohl, dass kein OnPaint Ereignis ausgelöst wird, wenn der Dialog Initialisiert wird, oder ? Später funktioniert es ja.
-
Doch, es wird ein OnPaint-Ereigniss ausgelöst.
Zeig mal deine OnPaint.
-
An der OnPaint habe ich kaum was verändert:
void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext zum Zeichnen SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Symbol in Clientrechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CBrush lSolidBrush(RGB(255, 255, 255)); CRect ac(0,0,10000,10000); pDC->FillRect(ac,&lSolidBrush); CDialog::OnPaint(); } }
Wie gesagt, wenn ich das Dialogfeld verschiebe (ausserhalb des bildschrims und wieder zurück), wird das rechteck gezeichnet.
-
Wann, wo und wie wird pDC erstellt?
-
pDC ist global definiert und bekommt den wert in der OnInitDialog Fkt. zugewiesen:
pDC = m_tab1.GetDC();
-
Hm ... Die Methode gefällt mir nicht. Das ist so gehackt
Du solltest die Sachen immer in die OnPaint des Dialoges machen, auf den du malst ...
-
Wie könnte ich es sonst machen?
Ich will auf ein TabCtrl-Feld mehrere Kurven zeichen, d.h. je nachdem auf welche Registerkarte man klickt, wird eine andere Kurve angezeigt. Funktioniert auch alles wunderbar. Nur soll am Anfang, im Prinzip rein aus optischen Gründen, ein leeres Koordinatensystem gezeichnet werden.
-
Das Zeichnen eben in den Dialogen der einzelnen Registrierkarten erledigen.
-
Die Registerkarten haben keine Dialoge....
-
lol?
Dann kann ich dir auch nicht helfen.