D
Hallo, da bin ich wieder... so wirklich klappen tut das alles noch nicht...
Jochen Kalmbach schrieb:
Du musst eine *eigene* Klasse z.B. von Panel ableiten. Darin dann im Konstruktor das DoubleBufering aktivieren (SetStyle) und in OnPaint zeichnen.
Ersetze das das "Panel1" durch Dein eigenes...
Das hatte ich schon so gemacht, bin hatte da aber das Problem dass ich trotzdem noch mit der "panel1_paint" darauf malen wollte und nicht in der OnPaint.
majin schrieb:
ich würde nicht von Panel ableiten, sondern direkt nen CustomUserControl dafür anlegen... dort kannst du WMIPaint, DoubleBuffered, etc. anschalten wie du willst.
[...]
control.CreateGraphics() weglassen
Wegen der Systemresourcenfresserei (was ein Wort oO) die Pens, Brushes, etc. disposen...
Das mache ich jetzt so, ich hab mir eine Klasse erstellt, die cpp dazu ist leer bis auf die #includes
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
namespace Schwingung {
/// <summary>
/// Zusammenfassung für BufferedPanel
/// </summary>
public ref class BufferedPanel : public System::Windows::Forms::UserControl
{
public:
BufferedPanel()
{
InitializeComponent();
//
//TODO: Konstruktorcode hier hinzufügen.
//
this->SetStyle(
ControlStyles::UserPaint |
ControlStyles::AllPaintingInWmPaint |
ControlStyles::DoubleBuffer, true);
}
protected:
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
~BufferedPanel()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
void InitializeComponent(void)
{
this->SuspendLayout();
//
// BufferedPanel
//
this->Name = L"BufferedPanel";
this->Size = System::Drawing::Size(720, 506);
this->ResumeLayout(false);
this->BackColor = System::Drawing::Color::White;
}
#pragma endregion
protected:
virtual void OnPaint(PaintEventArgs ^e) override
{
koordinatenSys(e->Graphics);
graphZeichnen(e->Graphics);
}
private: System::Void koordinatenSys(System::Drawing::Graphics ^graph){
//Achse(n) zeichnen
System::Drawing::Pen ^penBlack = gcnew Pen(System::Drawing::Color::Black);
int seitenAbstand = 10;
graph->DrawLine(penBlack, seitenAbstand, this->Height/2, this->Width-seitenAbstand, this->Height/2);
graph->DrawLine(penBlack, this->Width/2, seitenAbstand, this->Width/2, this->Height-seitenAbstand);
delete(penBlack);
}
private: System::Void graphZeichnen(System::Drawing::Graphics ^graph){
System::Drawing::Pen ^penRed = gcnew Pen(Color::Red);
System::Drawing::Pen ^penBlue = gcnew Pen(Color::Blue);
System::Drawing::Pen ^penGreen = gcnew Pen(Color::Green);
System::Drawing::Pen ^penPink= gcnew Pen(Color::Pink);
int yKoord = 0;
int xVal = this->Width;
for (int i = 0; i < this->Width; i++)
{
CMesswert* messung = new CMesswert(); //werteListe->getMessungXvorEnde(i*40);
//Kanal 1 zeichnen
//if (form->kanal1->Checked)
{
yKoord = this->Height/2 + (int)((messung->getKanal1())*30);
graph->DrawRectangle(penRed,xVal,yKoord,1,1);
}
//Kanal 2 zeichnen
//if (form->kanal2->Checked)
{
yKoord = this->Height/2 + (int)((messung->getKanal2())*30);
graph->DrawRectangle(penBlue,xVal,yKoord,1,1);
}
//Kanal 3 zeichnen
//if (form->kanal3->Checked)
{
yKoord = this->Height/2 + (int)((messung->getKanal3())*30);
graph->DrawRectangle(penGreen,xVal,yKoord,1,1);
}
//Kanal 4 zeichnen
//if (form->kanal4->Checked)
{
yKoord = this->Height/2 + (int)((messung->getKanal4())*30);
graph->DrawRectangle(penPink,xVal,yKoord,1,1);
}
xVal--;
}
delete(penRed);
delete(penBlue);
delete(penGreen);
delete(penPink);
}
};
}
Die tut auch soweit was sie soll, ich muss sie aber per Hand in meine Form1 hinzufügen, da sie in der Toolbox nicht auftaucht... funktioniert beim ausführen der Applikation zwar, aber der "Forms Designer" ist dann tot und meldet sich mit dieser Meldung.
Ich kann ihn also so nicht verwenden. Woher kommt das? Die Komponente funktioniert ja soweit erst einmal und befindet sich doch auch in den Namensraum.
Ich hab vorsichtshalber auch mal das ganze Projekt gepackt hochgeladen. (~2Mb wegen der Intellisense DB)
---------
Damit ich nicht was tue, was man nicht tun soll - mehrere Probleme in einem Thread ansprechen und mischen - setz ich mal noch einen Link auf den zweiten Thread den ich gleich aufmachen werde...
Gleiches Projekt, anderes Problem -> anderer Thread
Danke, dass ihr euch mit meinem Mist beschäftigt.
dridde