Konsolenanwendung und Windows Forms
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Tut mir leid, dass ich ins falsche Forum gepostet habe! Vielen Dank für den ersten Tipp!
Es stimmt, dass ich die Konsole nicht als IO-Medium brauche, aber das eigentliche Problem ist, dass sich die genaue Zusammenstellung des Formulars eigentlich erst ergibt, nachdem ich die Datei eingelesen habe (z.B. Bezeichnung und Anzahl von Elementen in einem Drop-Down Menü).
Gibt es denn eine Möglichkeit so ein Formular wie aus Windows Forms dynamisch zu erstellen (am besten aus einer Konsolenanwendung heraus, da ich danach noch auf andere Klassen zugreifen muss)?
-
Du kannst Dir ja aus den Windows Forms Anwendung heraus vor dem Aufruf Application::Run(...) dein GUI zusammenstellen (nach welchen Plänen auch immer).
Ich verstehe nicht warum Du eine Konsole brauchst...
Simon
-
Hmm, das war ja meine Frage, ob das auch ohne diese Konsolenanwendung klappt.
Wie funktioniert das denn mit dem Einfügen vor dem Run(...)-Aufruf?
Ich hab jetzt mal schnell ein ganz einfaches Formular erstellt, das nur eine Combo-Box mit zwei Einträgen (Test1 und Test2) enthält.
Die beiden Codebeispiele bestehen also nur aus dem von Visual C++ erzeugten Code.
Wie kann ich jetzt zum Beispiel noch einen dritten Eintrag in der Combo-Box erzeugen? Vielleicht gibt mir das den richtigen Schubs, wie ich das hinbekomme!
Schon mal Danke!
#pragma once namespace test { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Summary for Form1 /// /// WARNING: If you change the name of this class, you will need to change the /// 'Resource File Name' property for the managed resource compiler tool /// associated with all .resx files this class depends on. Otherwise, /// the designers will not be able to interact properly with localized /// resources associated with this form. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // } protected: /// <summary> /// Clean up any resources being used. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::ComboBox^ comboBox1; protected: protected: private: /// <summary> /// Required designer variable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> void InitializeComponent(void) { this->comboBox1 = (gcnew System::Windows::Forms::ComboBox()); this->SuspendLayout(); // // comboBox1 // this->comboBox1->FormattingEnabled = true; this->comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(2) {L"Test1", L"Test2"}); this->comboBox1->Location = System::Drawing::Point(100, 116); this->comboBox1->Name = L"comboBox1"; this->comboBox1->Size = System::Drawing::Size(121, 21); this->comboBox1->TabIndex = 0; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(331, 318); this->Controls->Add(this->comboBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); } #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } }; }
// test.cpp : main project file. #include "stdafx.h" #include "Form1.h" using namespace test; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Enabling Windows XP visual effects before any controls are created Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it Application::Run(gcnew Form1()); return 0; }
-
Hallo,
Wenn Du sowiso immer eine Form hast (was ich denke), dann kannst Du den Code um Application::Run(..) so lassen wie er ist.
Wenn Du die GUI Elemente wie Buttons, ComboBoxen etc. dynamisch hinzufügen möchtest, dann musst Du eigentlich nicht viel anderen Code erzeugen als der Designer es tun würde. Mit der Ausnahme, dass dann (wahrscheinlich) keine Member- Variablen der Controls erzeugt werden.
Ich würde am Anfang wie folgt vorgehen:
Um zu schauen, was für Code Du erzeugen musst, würde ich im Designer das gewünschte Control platzieren wo Du es haben möchtest (z.B. einen Button rechts oben). Dann den von Desginer generierten Code abgucken (er befindet sich in void Form1::InitializeComponent(void), vorausgesetzt deine Form heisst Form1).Diesen Code fügst Du dann z.B. im Konstruktor von Form1 ein (nach InitializeComponent), aber natürlich kannst Du, mit ein paar Ausnahmen, die Controls erzeugen wann und wo Du möchtest.
Dann, wenn das Control erzeugt ist, musst Du es noch deiner Form bekanntmachen (mit this->Controls->Add(...).
Die nächste Hürde wird für dich dann sein, entsprechende Event Handler zu erzeugen und die Controls wieder anzusprechen. Findest Du aber bestimmt raus.
Hier ein Bsp. für einen Button:
Form1(void) { InitializeComponent(); Button^ button = gcnew Button(); button->Location = System::Drawing::Point(25, 25); button->Name = L"button1"; button->Size = System::Drawing::Size(75, 23); button->TabIndex = 0; button->Text = L"button1"; button->UseVisualStyleBackColor = true; this->Controls->Add(button); }
Darf ich fragen, warum Du gleich mit C++/CLI einsteigst?
Grüsse
Simon
-
Nein darfst Du nicht.
Darf ich fragen warum Du Grüße mit doppelt s schreibst.
-
weiss nid, schriibts mer nid so?
-
Die letzte Nachricht war nicht von mir!
-
Hab noch vergessen, dir zu danken, Simon!!!
-
Ist gern geschehen...