Buttons vom Programm erzeugen?ß
-
schau doch mal in der MSDN was für Parameter die Funktion Create bekommt, dann weißt du auch was My Button ist! Ich nimm an wenn du ab und zu mal in die MSDN schaust bist du viel schneller als hier immer wieder das gleiche zu fragen. Wenn du keine MSDN hast dann schau hier
-
Wie ist es möglich die Button jetzt anzusteuern. Ich möchte den Namen (ID) anzeigen lassen wenn jemand auf einen dieser Dynamischen Button klickt.
-
ich denke es ist aber, läuf auch aber wie kann ich mit einem dynamischen
Button erstellt arbeiten. Ich möchte wenn ihn angeklickt das der Name des Buttons in meine MessageBox kommt und anzeiget wird.. kannst mir nocheinmal helfen??
-
Du musst dich in die Nachrichtenschleife einklinken
und dann schauen wann eine click-message an das Fenster
mit der ID deines Buttons geschickt wird.Dann rufst du an der Stelle einfach die Funktion auf die
der Button ausführen soll..
-
Und wie geht das? Bitte gebe mir ein Beispiel
-
Dazu musst du die PreTranslateMessage-Funktion überschreiben.
Müsste ungefähr so aussehen:
BOOL DeinProggi::PreTranslateMessage(MSG* pMsg) { if(pMsg->hwnd == (GetDlgItem(DeineButtonID))->m_hWnd) if(pMsg->message == WM_LBUTTONUP) AfxMessageBox("Mach was drauf"); return CDialog::PreTranslateMessage(pMsg); }
-
Hallo beisammen,
als doofer Anfänger mit MFC ist mir immer noch so einiges nicht klar...
Das_T("My button")
nicht die ID ist, sondern der Text auf dem Control ist schon angekommen. Nur nicht der zweite Beitrag von Airdamm. Ich habe das jetzt ca. 2 Wochen durchgekaut, aber kein Erfolg.
Was ich geschafft habe: In einer Dialogfeld basierenden Anwendung alles über den Resource-Editor zusammenstellen. Und auch das hat geklappt:RECT rc; rc.left = 10; rc.top = 20; rc.right = 70; rc.bottom = 40; for (int a=0; a<=4; a++) { const int ID_BUTTON1 = 9000+a; CButton* pBtn = new CButton; pBtn->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, rc, this, 9000+a); SetDlgItemText(9000+a, "Test"); rc.top = rc.top+30; rc.bottom = rc.bottom+30; }
Im obigen Code werden die Buttons ja auch dynamisch während der Laufzeit erzeugt.
Das "beste" was ich aus den Code-Fragmenten von Airdamm erstellen konnte, war ein einziger Fehler C2440...Jetzt könnte ich eigentlich meine Lösung verwenden, aber ich möchte es VERSTEHEN! Die einzelnen Code-Zeilen sind mir zwar verständlich - der große Zusammenhang geht mir jedoch ab.
Hat jemand noch einen Tipp für mich?!?
Liebe Grüße,
Alex
P.S.
Ich habe extra kein neues Posting aufgemacht, da offensichtlich bei diesem Thema der Blutdruck bei manchen gefährliche Werte erreicht hat...
AlexP.P.S.
Scheinbar bin ich sogar zu blöd zum Syntax-Coloring. Ich habe das
http://www.c-plusplus.net/forum/viewtopic.php?t=39411
zwar gelesen, aber er mag nicht richtig... Sorry!
Alex
-
Erstens: C2440 ist nach meinen Informationen eine fehlerhafte Typkonvertierung - in welcher Zeile tritt der Fehler denn auf?
Zweitens: Schalt doch einfach die Option "BBCode in diesem Beitrag deaktivieren aus, dann sollte es auch mit den CPP-Tags klappen
Drittens: Wozu hast du in dem Code die "const int ID_BUTTON1 definiert, wenn du sie dann doch nicht benutzt?
-
Hallo!
Zuerst einmal vielen Dank für Dein Echo!!
Zu 2.
Ich habe im Profil den BBCode erst NACH dem Erstellen meines Beitrags eingeschaltet...
btw Warum kann ich eigentlich innerhalb der Code-Tags keine weiteren (z.B. fett) setzen?!?Zu 3.
Was ist dann das:SetDlgItemText(9000+a, "Test");
Ich möchte mit meiner Dialog-Anwendung nur verschiedene Programme über die einzelnen Buttons starten. Die Anwendung kommt auf eine Boot-CD (BartPE) drauf. Mit GetFileAttributes überprüfe ich ob die einzelnen Programme überhaupt auf der CD vorhanden sind. Falls ja, dann kommt ein neuer Icon-Button dazu.
Dazu brauche ich doch für die einzelnen Buttons eine ID?!?
Aber meine Lösung hat jetzt so auch nicht viel mit dem Beitrag von Airdamm zu tun.Zu 1.
Da ich mich jetzt schon länger im Kreis bewege - das ganze von vorne dargelegt:
In der <AppName>Dlg.h steht das// Implementierungprotected: HICON m_hIcon; CButton m_pButtons;
In BOOL <AppName>Dlg::OnInitDialog() steht das
{ CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // TODO: Hier zusätzliche Initialisierung einfügen CButton* pButton = m_pButtons[0]; pButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 1); return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten }
In der Zeile
CButton* pButton = m_pButtons[0];
kommt dann der
error C2440: 'Initialisierung': 'HWND__' kann nicht in 'CButton *' konvertiert werden
Den Code habe ich jetzt schon überall herumgeschoben, aber mir fehlt einfach das Verständnis. Und das trotz des vielen Lesens von Büchern und Forumsbeiträgen. Der Mr. Petzold hat geschrieben
Windows ist ein überaus komplexes System
Vielleicht sollte ich dann doch zuerst mit einer anderen - einfacheren - Programmiersprache anfangen. Oder ich habe mich damit nur über 100 Stunden auseinandergesetzt und brauche noch ca. 1.300 weitere...
Leider kann ich aber .NET unter BartPE nicht gebrauchen.
Alex
-
AlexH schrieb:
Hallo!
Zuerst einmal vielen Dank für Dein Echo!!
Zu 2.
Ich habe im Profil den BBCode erst NACH dem Erstellen meines Beitrags eingeschaltet...
btw Warum kann ich eigentlich innerhalb der Code-Tags keine weiteren (z.B. fett) setzen?!?Das mußt du die örtlichen Admins fragen
Zu 3.
Was ist dann das:SetDlgItemText(9000+a, "Test");
Das setzt den Text des Dialogelements '9000+a' (das du eine Zeile höher mit dem Create erzeugt hast) auf "Test".
Ich möchte mit meiner Dialog-Anwendung nur verschiedene Programme über die einzelnen Buttons starten. Die Anwendung kommt auf eine Boot-CD (BartPE) drauf. Mit GetFileAttributes überprüfe ich ob die einzelnen Programme überhaupt auf der CD vorhanden sind. Falls ja, dann kommt ein neuer Icon-Button dazu.
Dazu brauche ich doch für die einzelnen Buttons eine ID?!?Ja, brauchst, du - in deinem Fall werden die IDs von 9000 aufwärts deinen Buttons zugeordnet. Außerdem benötigst du noch einen Kommando-Handler, der auf diese Buttons reagiert (am besten auf den gesamten Bereich 9000 bis 900x).
Zu 1.
Da ich mich jetzt schon länger im Kreis bewege - das ganze von vorne dargelegt:
In der <AppName>Dlg.h steht das// Implementierungprotected: HICON m_hIcon; CButton m_pButtons;
In BOOL <AppName>Dlg::OnInitDialog() steht das
{ CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // TODO: Hier zusätzliche Initialisierung einfügen CButton* pButton = m_pButtons[0]; pButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 1); return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten }
In der Zeile
CButton* pButton = m_pButtons[0];
kommt dann der
error C2440: 'Initialisierung': 'HWND__' kann nicht in 'CButton *' konvertiert werden
'm_pButtons' ist (trotz des Namens) ein einzelner Button, da macht der Subscript nicht viel Sinn - du benötigst entweder ein Array von oder einen Pointer auf einen Button(array):
//a - Array: const int maxBtn=...; CButton m_pButtons[maxBtn]; //->Direkt verwenden im OnInitDialog() //b - Pointer: CButton*m_pButtons; MyClass(){m_pButtons=NULL;} ~MyClass(){delete[]m_pButtons;} //-> reserviert in OnInitDialog() int BtnCount=/*Zähle die benötigten Buttons*/; m_pButtons=new CButton[BtnCount]; //weiterverwenden
PS: In der Fehlerzeile muß es dann heißen:
CButton* pButton = &m_pButtons[0];
-
Jetzt hat es etwas länger gedauert - Essen ist wichtiger...
Aber die meiste Zeit habe ich nicht mit dem Essen, sondern verstehen Deiner Antwort verbracht!
Das meine ZeileCButton m_pButtons;
keinen Sinn macht, habe ich jetzt verstanden - Dankeschön!!
Dann hast Du mir zwei Lösungen (a und b) angeboten:du benötigst entweder ein Array von oder einen Pointer auf einen Button(array)
Wenn ich nun die Lösung a wähle und meine Zeile in der Header-Datei auf
//a - Array: const int maxBtn=30; CButton m_pButtons[maxBtn];
ändere, dann kommt es in der 1. Zeile zu einem Fehler C2864. Also habe ich einfach static davor gesetzt. Dann wird die Anwendung ausgeführt.
Deine zweite Lösung:
//b - Pointer: CButton*m_pButtons; MyClass(){m_pButtons=NULL;} ~MyClass(){delete[]m_pButtons;}
Die 1. Zeile ist der Zeiger, dann folgen Kon- und Destruktor. Soweit kann ich es noch nachvollziehen.
Was mich aber mehr stört: Was ist jetzt richtig bzw. besser - a oder b. Ich meine irgendwo gelesen zu haben, daß der Einsatz von new/delete nicht "best practice" ist?!? Oder anders gefragt: Es haben sich doch sicherlich ein paar schlaue Köpfe Gedanken dazu gemacht und das schriftlich festgehalten. Wo gibt es solche Sammlungen!?!
Denn jetzt stehe ich noch sehr am Anfang mit der Programmiererei, da können die schlechte Angewohnheiten noch besser niedergekämpft werden...Liebe Grüße
Alex
-
1. die MSDN liefert auch gute Beschreibungen zu den Fehlern - maxBtn muß entweder als static Member deklariert werden oder als globale Konstante (sprich: vor deiner Klassendeklaration)
2. ein Array ist auf der einen Seite einfacher zu handhaben, hat allerdings auch eine fest vorgegebene Größe - mit new/delete reservierst du zur Laufzeit Speicher in der Größe, die du brauchst, mußt dich dann aber selber um die Freigabe kümmern. Als dritte Möglichkeit würde es sich übrigens noch anbieten, einen STL- oder MFC-Container zu verwenden, damit ersparst du dir den Aufwand der Speicherverwaltung.
-
Die Taste F5 hat im Forum eine interessante Wirkung...
Eigentlich wollte ich nur Dankeschön sagen und meine 1. Anwendung weiterschreiben. Dabei tauchen sicherlich noch ein paar ??? auf...Liebe Grüße
Alex