Hej! Hej igen! Till sist..:) Hoppsan! Jag hade glömt lägga till:Refresh! - "graphics" objekt
En ganska enkel newbie-fråga kanske men jag tror att jag har målat in mig lite i ett hörn, alla förslag är välkomna.
Bakgrund:
Jag har sedan en tid tillbaka jobbat en del med generera XML med hjälp av olika enkla gränssnitt jag gjort med hjälp av Forms. Nu har jag beslutat mig för att tuffa till det hela lite och försöka göra något jag kan ha nytta av. Alltså håller jag på med en applikation, ett UI som med hjälp av olika standard komponenter, knappar, olika lister m.m. ska spara inställningar (Skript) till den "riktiga" applikationen.
Jag har också valt att skapa en egen "komponent" ungefär som en kompassros med fyra pilar som man kan ändra riktning på genom att dra i en "slider control".
Hur jag gjort:
Jag skapar ett "graphics" objekt och sedan använder jag "Pen" för att rita mina pilspetsar. Problemet är att jag måste trigga mina spetsar på samma sätt som andra objekt te.x. knappar, lister. Som det ser ut nu så triggas enbart pilarna när jag drar i min "slide controller", alltså de syns inte vid uppstart av fönstret eller när fönstret varit minimerat eller varit gömt under ett annat fönster, allt annat "refreshas" dock.
Jag måste använda någon form av Control objekt gissar jag men frågan är hur gör jag det med nedan funktion?
ALLTSÅ, finns det ett sätt att dra nytta av nedan kod som den ser ut eller måste jag tänka om??
Spetsarna:
Tre linjer som följer en given cirkel där den yttre radien är 75 pix och den inre är 50. Genom att skicka in nya värden på "angle" så kan jag vrida mina pilar mot- eller med- urs.
Med vänliga hälsningar
Kennet
//
//HÄR RITAS MINA PILAR:
//
void SimpleForm::Draw_line(double angle)
{
double radiusPtr = 75; //Radien för den tänkta cirkeln
int locationX = 100; //X och Y koordinaterna för cirkelns centrum placering
int locationY = 100;
Graphics *pg = CreateGraphics();
pg->Clear(Color::FromArgb(239,236,219)); //Radera den gamla pilplaceringen.
for(int count=0;count<4;count++) //Fyra spetsar d.v.s. 90 graders förskjutning!
{
//Spetspunkten
double angle_calc = ((PI/2)*count)+(angle/360)*2*PI;
int PX = (int)(radiusPtr * Math::Cos(angle_calc) + locationX);
int PY = (int)(radiusPtr * Math::Sin(angle_calc) + locationY);
//Nedre till höger om spetspunkten
double angle_calc1 = ((PI/2)*count)+((angle-5)/360)* 2*PI;
int PX1 = (int)((radiusPtr - 15) * Math::Cos(angle_calc1) + locationX);
int PY1 = (int)((radiusPtr - 15) * Math::Sin(angle_calc1) + locationY);
//Övre till vänster om spetspunkten
double angle_calc2 = ((PI/2)*count)+((angle+5)/360)* 2*PI;
int PX2 = (int)((radiusPtr - 15) * Math::Cos(angle_calc2) + locationX);
int PY2 = (int)((radiusPtr - 15) * Math::Sin(angle_calc2) + locationY);
//Rita upp linjerna, tre linjer som bildar pilspetsarna
pg->set_SmoothingMode(SmoothingMode::AntiAlias);
Pen *Red_pen = new Pen(Color::Red);
pg->DrawLine(Red_pen,PX,PY,PX1,PY1);
pg->DrawLine(Red_pen,PX1,PY1,PX2,PY2);
pg->DrawLine(Red_pen,PX2,PY2,PX,PY);
}
pg->Dispose();
}
//
//SKICKAR AKTUELLT VÄRDE TILL OVAN FUNKTION
//
void SimpleForm::trackBar1_Scroll(Object * sender, EventArgs * e)
{
Draw_line(18 * trackBar1->Value); //20 är skalfaktor för att passa graderingen på draglisten
}Sv: Refresh! - "graphics" objekt
Just nu är statusen den att jag insett att jag måste skapa mig en struktur i vilken jag lagrar de senaste värdena som min slide controller avger. Om ett fönster har skuggat mina pilar alt. att jag har minimerat min applikation då ska en redraw funktion triggas som hämtar pilarnas positioner från strukturen när fönstret återfår kontrollen. Jag återkommer förhoppningsvis med detaljer när jag har en definitiv lösning.
Rätta mig gärna eller kom med förslag! Forumen är ju till för att vi sk kunna hjälpa varann och bli bättre på programmering.
mvh.
KennetSv:Refresh! - "graphics" objekt
Glöm snacket om en struktur ovan, finns i detta fall ingen som helst anledning till dylik lösning. Här handlar det om att trigga en omritning av fönstret när andra komponentobjekt ritas om som tex. knappar o dyl. Nedan fungerar bra.
Alla synpunkter mottages för min del och andras del med tacksamhet
-----------------------------------------------------------------------------------------------------------------
#using <mscorlib.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::ComponentModel;
using namespace System::Drawing;
using namespace System::Drawing::Drawing2D;
using namespace System::Windows::Forms;
#define PI 3.14159265359;
__gc class SimpleForm : public Form
{
public:
SimpleForm();
private:
* * *
* * *
static double angle;
void Draw_line(double);
void ReDraw_line(Object *pSender, PaintEventArgs *pe);
};
SimpleForm::SimpleForm()
{
// Fönstret med rubrik
this->Text = S"Environment";
this->FormBorderStyle = FormBorderStyle::Fixed3D;
* * *
* * *
Setup_environment();
double angle = 90;
}
void SimpleForm::Setup_environment(void)
{
* * *
* * *
// "Refreshar" applikationen efter att den varit dold eller minimerad.
Paint += new PaintEventHandler(this, &SimpleForm::ReDraw_line);
}
void SimpleForm::Draw_line(double angle)
{
Graphics *pg = CreateGraphics();
//Radera den gamla pilplaceringen.
pg->Clear(Color::FromArgb(236,233,216));
//Fyra spetsar d.v.s. 90 graders förskjutning!
for(int count=0;count<4;count++)
{
//Spetspunkten
double angle_calc = ((3.14/2)*count)+(angle/360)*2*PI;
int PX = (int)(radiusPtr * Math::Cos(angle_calc) + locationX);
int PY = (int)(radiusPtr * Math::Sin(angle_calc) + locationY);
//Till höger om spetspunkten
double angle_calc1 = ((3.14/2)*count)+((angle-5)/360)* 2*PI;
int PX1 = (int)((radiusPtr - 15) * Math::Cos(angle_calc1) + locationX);
int PY1 = (int)((radiusPtr - 15) * Math::Sin(angle_calc1) + locationY);
//Till vänster om spetspunkten
double angle_calc2 = ((3.14/2)*count)+((angle+5)/360)* 2*PI;
int PX2 = (int)((radiusPtr - 15) * Math::Cos(angle_calc2) + locationX);
int PY2 = (int)((radiusPtr - 15) * Math::Sin(angle_calc2) + locationY);
//Rita upp linjerna, Pilspetsarna
pg->set_SmoothingMode(SmoothingMode::AntiAlias);
Pen *Red_pen = new Pen(Color::Red);
pg->DrawLine(Red_pen,PX,PY,PX1,PY1);
pg->DrawLine(Red_pen,PX1,PY1,PX2,PY2);
pg->DrawLine(Red_pen,PX2,PY2,PX,PY);
}
pg->Dispose();
}
void SimpleForm::ReDraw_line(Object *pSender, PaintEventArgs *pe)
{
Draw_line(18 * trackBar1->Value);
}
void SimpleForm::trackBar1_Scroll(Object * sender, EventArgs * e)
{
lblPosition->Text = trackBar1->Value.ToString();
//20 är skalfaktor för draglisten.
Draw_line(18 * trackBar1->Value);
}Sv: Refresh! - "graphics" objekt
Rectangle *ClipRec = __nogc new Rectangle(17, 17, 160, 160);
pg->SetClip(*ClipRec);
Utna ovan rader uppdaterades hela fönstret när jag ändrade pilarnas riktning med hjälp av slidern, inte bra! Ovan två rader läggs in mellan raderna:
Graphics *pg = CreateGraphics();
och
//Radera den gamla pilplaceringen.
I funktionen: void SimpleForm::Draw_line(double angle)