wxWindows: Hjælp til begynder program.

Tags:    c++

<< < 123 > >>
Jeg har valgt at lave GUI-programmer i wxWindows framework'et..håber ik det er et dårligt valg!?

Jeg har læst følgende artikel:
http://www.bzzt.net/~wxwidgets/icpp_wx1.html

For lige som at komme i gang med wxWindows, har jeg bestemt mig for, at jeg vil lave et lille "andengradslignings-løser" program.

Jeg er dog meget hurtigt gået i stå. Jeg har fået lave et vindue, og en tekst kontrol hvor der står lidt tekst i:
http://www.demaweb.dk/cpp/frame.jpg

Men hvordan kommer jeg nu videre herfra? Jeg skal have lavet nogle text-felte hvor man kan indtaste a, b og c. Hvordan går man det? Håber der er en ekspert derude, som vil hjælpe mig med at få lavet et funktionelt program.

Jeg bruger dev-c++ compileren, og min projekt-fil ligger her:
http://www.demaweb.dk/cpp/project.zip

På forhånd tak.

Mvh Dennis Madsen
http://www.demaweb.dk



25 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
<pre>
#include "wx/wx.h"
#include <sstream>
#include <string>

// The panel, a panel is what make it behave as a dialog box
class PanelClass: public wxPanel
{
public:
PanelClass(wxFrame *frame, int x, int y, int w, int h) : wxPanel(frame, wxID_ANY, wxPoint(x, y), wxSize(w, h))
{
Label1 = new wxStaticText(this, -1, "Med dette program kan du løse en andengradsligning af typen: ax^2+bx+c=0", wxPoint(5, 5), wxSize(290, 25));
Label2 = new wxStaticText(this, -1, "Indtast a:", wxPoint(5, 35), wxSize(60, 20));
a = new wxTextCtrl(this, Text1Id, "", wxPoint(60, 35), wxSize(50, 20));
Label3 = new wxStaticText(this, -1, "Indtast b:", wxPoint(5, 60), wxSize(60, 20));
b = new wxTextCtrl(this, Text2Id, "", wxPoint(60, 60), wxSize(50, 20));
Label4 = new wxStaticText(this, -1, "Indtast c:", wxPoint(5, 85), wxSize(60, 20));
c = new wxTextCtrl(this, Text3Id, "", wxPoint(60, 85), wxSize(50, 20));
Button1 = new wxButton(this, ButtonId, "Beregn", wxPoint(5, 110), wxSize(100, 20));
}
~PanelClass()
{
delete a;
delete b;
delete c;
delete Button1;
}
private:
// Some id's for my controls
enum CtrlId
{
Text1Id = 1001,
Text2Id,
Text3Id,
ButtonId
};

wxTextCtrl *a;
wxTextCtrl *b;
wxTextCtrl *c;
wxStaticText *Label1;
wxStaticText *Label2;
wxStaticText *Label3;
wxStaticText *Label4;
wxButton *Button1;
void OnAddButton(wxCommandEvent &event);
DECLARE_EVENT_TABLE()
};

// The event table for the panel, this routes messages/events to functions
BEGIN_EVENT_TABLE(PanelClass, wxPanel)
EVT_BUTTON(ButtonId, PanelClass::OnAddButton)
EVT_SIZE(PanelClass::OnSize)
END_EVENT_TABLE()

// The Frame, this is the topleve windows, which hosts the panel
class FrameClass : public wxFrame
{
public:
FrameClass(wxFrame *frame, const wxChar *title, int x, int y, int w, int h) :
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{
Panel = new PanelClass(this, x, y, w, h);
}
~FrameClass()
{
delete Panel;
}
PanelClass *Panel;
};

// The application, all applications has one
class AppClass: public wxApp
{
public:
bool OnInit()
{
Frame = new FrameClass(0, "Andengradsligning", 100, 100, 300, 200);
Frame->Show(true);
SetTopWindow(Frame);
return true;
}
FrameClass *Frame;
};

IMPLEMENT_APP(AppClass)

// The function that is called when the user hits the Add button.
void PanelClass::OnAddButton(wxCommandEvent &WXUNUSED(event))
{ }
</pre>

Sådan, nu ser det godt ud :)
Så er mit næste problem, hvordan jeg får lavet mine udregninger, og printet dem i et nye vindue?



Du skal vel "bare" lave det i OnAddButton funktionen, lidt lige som i mit eksempel, og skrive resultatet til til en wxTextCtrl (som i mit eksempel) eller til en wxStaticText

Du kan bruge følgende til at sætte text på en static-text:
StaticText1->SetLabel("Some text");



Nu får jeg en fejl.
Jeg har sad følgende:
Label5 = new wxStaticText(this, -1, "", wxPoint(150, 35), wxSize(145, 75));

Når jeg trykker på knappen, har jeg følgende:
label5->SetLabel("d=");

Men denne linie, giver en fejl. Hvad er der galt?



Det hedder:
Label5->SetLabel("d=");
og ikke
label5->SetLabel("d=");



Nåhr ja, selvfølgelig :)

Nu skal jeg have beregnet d.
derfor sætter jeg variablen d:
int d;

Men hvordan tildeler jeg den dens værdi? Altså, hvordan henter jeg værdien af mine text-felter?

d=b^2-4ac





prøv at kikke på mit eksempel igen.

Du skal bruge GetValue() og FromString().



Jeg gør nu følgende:

int a, b, c;
a = a->GetValue();
b = b->GetValue();
c = c->GetValue();

Min mening med dette, er at hente værdierne af boksene til variablerne a, b og c. Hvorfor får jeg en fejl i dette?



GetValue giver en streng, ikke en int. Du er nødt til selv at konvertere til en int:

std::string S1;
S1 = a->GetValue();
int a;
FromString(a, S1);

Du skal inkludere FromString fra mit eksempel.



<pre>
std::string S1;
S1 = a->GetValue();
int a;
FromString(a, S1);
std::string S2;
S2 = b->GetValue();
int b;
FromString(b, S2);
std::string S3;
S3 = c->GetValue();
int c;
FromString(c, S3);
int d = b^2-4*a*c;
Label5->SetLabel("d="+d);
</pre>

Det er hvad jeg har nu. Men når jeg trykker på knappen, så bliver der ikke skrevet noget til Label5. Er det min beregning af d, som der er en fejl i?

Mvh Dennis Madsen
http://www.demaweb.dk



I nogle sprog giver "Hello world" + 1 "Hello world1", det gør det ikke i C og C++, her giver det "ello world"
Det skyldes at "Hello world er en char pointer, som man lægger 1 til, derved får man addressen på det andet element (index 1).

For at få det du ønsker skal du bruge:

std::string Text = "d=";
Text += ToString(d);
Label5->SetLabel(Text.c_str());

Funktionen ToString kan du finde i mit eksempel.

Jeg vil iøvrigt anbefale at du følger en tutorial i grundlæggende C++



<< < 123 > >>
t