Name und Position vom Button ändern!!
-
Hallo,
ich möchte eine einfache MFC-Anwendung mit 2 oder 3 Buttons erstellen,
wobei der Benutzer die Möglichkeit hat, den Namen und Position der Buttons zu ändern.
Wie macht man sowas?
-
Ein CButton ist von CWnd abgeleitet. Man hat also MoveWindow zur Verfügung und SetWindowText bzw. GetWindowText.
Grüssli
-
Kann ich eigentlich diese Buttons-Eigenschaften (Name und Position) in einer Datei ablegen, wo dann der Benutzer diese Änderungen vornehmen kann!!?
Wie binde ich dann dieser Datei im Programm ein?Grüsse
-
Man kann alles mit C++ ^^
Du kannst dir selber was schreiben, z.b. eine Textdatei, welche dein Programm auslesen kann und verwerten. Oder du probierst es mit XML und holst dir eine XML-Lib. Usw.
Vielleicht findest sogar schon eine fertig Klasse unter www.codeproject.com oder eine Anleitung unter www.codeguru.comZum Dateien Lesen und Schreiben mit der MFC schau dir mal CFile und CArchive in der MSDN an. Eine CButton-Klasse ist wie gesagt abgeleitet von CWnd. Schau dir also die CWnd und die CButton Klasse in der MSDN an. Dann musst du entscheiden, welche Werte du speichern willst, bzw. laden. Usw.
Grüssli
-
Bis jetzt kam ich noch nie in Berührung weder mit xml noch mit ini oder so ähnliches als Konfigurations-Datei.
Was würdest Du (ihr) dann einem Anfänger empfehelen? xml, ini, txt etc.?
Ich wäre Dir sehr dankbar, wenn Du mir bitte vielleicht einen Link für ein Beispiel mit veränderbaren Steuerelementen schicken würdest (falls Du einen hast oder kennst)!!?
DankeGruß, Pox
-
Hallo
Versuch es doch zuerst mal mit der txt-Datei. Zum Programmstart holst du dir die Daten aus der Datei und rufst dann die genannten Funktionen auf.
chrische
-
Hallo,
eine txt-Datei würde dann z.B. für 2 Butons (Senden und Empfangen) so ausschauen:
[Button] Name: "senden" // Name vom Button PositionX: "10" // X-Asche PositionY: "20" // Y-Asche Groesse: "100" // Die Grösse vom Button [Button] Name: "Empfangen" // Name vom Button PositionX: "10" // X-Asche PositionY: "80" // Y-Asche Groesse: "100" // Die Grösse vom Button
Ok, ich weiss der Syntax ist ziemlich unstrukturiert, aber für den Vesrtändnis würde schon reichen
1-wie hole ich diese txt-Datei im Programm?
2-wie rufe ich die Eelemente und Attribute der Buttons auf?Für eine kleine Erklärung wäre ich sehr Dankbar.
Gruß, Pox
-
Öffne die Datei... geh bis zum 1. [Button] guck dann ob darunter der Name: kommt... wenn nicht brichst de ab und suchst nach dem nächsten [Button] usw...
-
Hallo,
meine Antwort kommt ein bißchen spät, da ich in den letzten Tagen Probleme mit meinem PC hatte.
Die Datei kann ich mittlerweile im Programm holen und kann auf die verschiedenen Attributen (Name, Position etc..) des Elementes "Button" zugreifen, aber ich kann leider immer noch keinen Button aus diesen Attributen erstellen.
Für eine kleine Hilfe wäre ich sehr dankbar.Gruß, Pox
-
Wieso... wie sieht denn dein Ansatz aus? Du musst ja nur nen CButton erstellen...
-
Die Attributte wurden zuerst in den Variablen Button-Name, X, Y, Breite und Hoehe geholt. dann habe ich flogendes im Proramm eingefügt:
class CMainFrame : public CFrameWnd { ...... protected: CButton *m_pButton; };
CMainFrame::CMainFrame() { m_pButton = new CButton; } CMainFrame::~CMainFrame() delete m_pButton; }
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ..... CRect rectButton(X,Y,Breite,Hoehe); m_pButton->Create("Button-Name", WS_Broder | WS_VISIBLE, rectButton, this, IDC_Button); }
-
Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
Zweitens du musst das Objekt nicht unbedingt auf dem Heap erstellen. Man darf ruhig eine CButton Variable in den Members der Klasse anlegen. Gerade da CMainFrame als Klasse auf dem Heap angelegt wird soweit ich weiss. Wie auch die CView Klasse usw.Also ich bleib aber mal bei deinem Beispiel. Dann müsste das so aussehen:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // ... if(!m_pButton->Create(_T("Button-Name"), WS_CHILD | WS_VISIBLE, CRect(X, Y, X + Breite, Y + Hoehe), this, IDC_BUTTON)) { TRACE(_T("Couldn't create the Button!\n")); return -1; } // ... }
Und wenn immer noch ein Problem besteht, bitte sagen was für eins. Also gibt der Compiter ein Fehler aus? Wenn ja welchen? Oder gibt es einen Laufzeitfehler? Angaben? usw.
Geht nicht, gibts nicht!Grüssli
-
Nur eine Button erstellen bringt nicht viel. Man muss ihn auch anzeigen.
Siehe member von CButton. (ShowWindow() oder so ähnlich)
-
ShowWindow wird nicht benötigt, wenn WS_VISIBLE gesetzt ist!
-
ich habe hier was gefunden, vielleicht hilft Dir weiter:
1-Button anlegen
CButton neu_button; neu_button.Create( "Button-Name", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this,CButton neu_button);
2-Nachricht vom Button verarbeiten
class CMainWindow : public CFrameWnd { public: CMainWindow(); CButton neu_button; protected: afx_msg void OnPaint(); afx_msg void OnSize( UINT nType, int cx, int cy ); afx_msg void OnNeuButtonClicked(); DECLARE_MESSAGE_MAP() };
#include <afxwin.h> #include „CMainWindow.h“ BEGIN_MESSAGE_MAP(CMainWindow, CFrameWindow) ON_WM_PAINT() ON_WM_SIZE() ON_BN_CLICKED(IDC_BUTTON_START, OnNeuButtonClicked) END_MESSAGE_MAP() CMainWindow::CMainWindow() : :
-
ups, ich habe mich beim letzten Parameter vertippt
CButton neu_button; neu_button.Create( "Button-Name", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect, this, IDC_neu_button);
-
@Nixet: Schwachsin. In deinem Code sind soooo viele Fehler...
@Pox: Am besten ließt du beim start die Anzahl an Buttons aus und erstellst dann einen Array mit der Größe... und rufst dem enstprechend dann auch die Create Function jeweils auf...
-
Hallo,
Die Anwendung habe ich neu erstellt, danach ging 1. Methode und konnte einen Button erstellen.
@Draverse: Deine Schreibweise ging auch.Dravere schrieb:
Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
...Wie macht man das sonst?
(D)Evil schrieb:
Öffne die Datei... geh bis zum 1. [Button] guck dann ob darunter der Name: kommt... wenn nicht brichst de ab und suchst nach dem nächsten [Button] usw...
Einen wietern Button kann ich leider nicht erstellen.
Es geht nur mit dem ersten defenierten Button.
Ich habe's mit xml und tinyxml probiert, aber leider ohne Erfolg... ich kriege das einfach nicht hin. Ich bin echt am verzweifeln.
-
Dann zeig deinen Code... da wird der Fehler sein
-
Pox schrieb:
Hallo,
Die Anwendung habe ich neu erstellt, danach ging 1. Methode und konnte einen Button erstellen.
@Draverse: Deine Schreibweise ging auch.Dravere schrieb:
Also erstens ist mir ein wenig ein Rätsel was du mit dem Button im Mainframe machen willst, aber ok, ich meine das geht auch.
...Wie macht man das sonst?
Es geht nicht darum, dass dies falsch ist. Es geht darum, wo du deine Buttons haben willst. Es kann natürlich schon sein, dass du deine Buttons im Mainframe haben willst. Aber wenn du sie in der View haben willst, dann ist das erstellen im Mainframe natürlich komplett falsch. Und gerade weil du dem Benutzer die Möglichkeit geben willst, selber die Koordinaten und co der Buttons zu definieren, sehe ich das Mainframe irgendwie gar nicht als korrekte Stelle. Denn entweder ist am Ende kein Platz mehr für das View oder das View versteckt die Buttons, da es über ihnen gezeichnet wird. Also es kommt halt eben drauf an, was du am Ende willst.
Pox schrieb:
Einen wietern Button kann ich leider nicht erstellen.
Es geht nur mit dem ersten defenierten Button.
Ich habe's mit xml und tinyxml probiert, aber leider ohne Erfolg... ich kriege das einfach nicht hin. Ich bin echt am verzweifeln.(D)Evil schrieb:
Dann zeig deinen Code... da wird der Fehler sein
Grüssli