Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 23:14

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 12:01 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Hallo zusammen,

ich möchte gerne zu Laufzeit ein Dialogfenster öffnen und damit globale Variablen einstellen.

Das ist doch bstimmt ein Standartproblem, dass schon jemand gelöst hat.

Selber ein Fenster zu erstellen mi Combobox und Textfeldern und solchen sachen ist zwar möglich, aber zu kompliziert.


Ich stelle mir das ähnlich wie die Verwendng von Messageboxen vor.
Durch einen einzgen Befehl kann eine Messagebox angezeigt weren.
Geht das mit Dialogfenstern nicht auch irgendwie?


So stelle ich mir das vor:
Befehl_öffne_DialogBOX(float * Zeiger_auf_zu-verändernde_variable, weitere argumente );


Gibt es so etwas nicht bereits?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Unter Delphi gibts dafür InputQuery, das öffnet einen kleinen Dialog mit Eingabe und liefert einen String zurück den man dann entsprechend umwandeln kann.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 12:24 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Hallo Sascha,

Vielen Dank für deine schnelle antwort.

Leider arbeite ich mit c++.

Gibt es da auch etwas entsprechendes?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Leider arbeite ich mit c++.

Gibt es da auch etwas entsprechendes?

Welches GUI-Framework und welche Platform (*) benutzt du den?


(*) Windows, Linux, Mac?



Edit: Wenn du Qt verwendest käme z.B. der QInputDialog in Frage. Aber nur für den Dialog Qt zu verwenden wäre natürlich Kanonen auf Spatzen...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 13:26 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
ich arbeite mit winows


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 13:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das waren zwei Fragen von mir in einem, das Betriebssystem war die weniger wichtige ;)

Es wäre auch möglich, dass du gar kein GUI-Framework benutzt und selbst direkt auf die Windows-API zugreifst? Da wäre dann die Windows-Version interessant.

(Oder ist das kein Tippfehler und "winows" ist irgendein kleines Framework das Google/Wikipedia nicht kennt?)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 14:14 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Ja, soviel ich das verstehe, greife ich direkt auf die API,
verstehe aber zu wenig davon.

Ich benütze jetzt windows XP, möchte aber das Programm auf verschiedenen Computern laufen lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Gut...ich arbeite in der Regel unter Linux mit Qt...entsprechend hab ich von der WinAPI keine Ahnung. Aber ich bin sicher das sich hier noch jemand mit Ahnung melden wird :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 15:08 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Naja für C++ spezifische API Fragen ist vermutlich eins der gut besuchten C++ Foren die bessere Wahl. Dort rennen dann auch bestimmt zu jeder zeit mehr als 100User rum die sowas schonmal gemacht haben. Hier bist du diesbezüglich etwas außerhalb der HotTopic-Zone. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 23:40 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Dieses Dialogfeld selber zu machen ist interessant und lehrreich, aber ich brauche eure Hilfe, sonst klappt das nicht.

Ich habe schwierigkeiten das zweite Fenster zum funktionieren zu bringen.
Das Endergebnis soll so aussehen:

MeinDialog(&a,&b,&c...);

wobei a,b,c variablen vom Typ float sind, die ich verändern will.

Vorerst bin ich jedoch nur damit beschäftigt das fenster öffnen und schliessen zu können.
Unfreiwilligerweise hat sich die Funktion um zwei Argumente erweitert:

MeinDialog(hInstance,hWnd);

Die Funktion sieht bis jetzt so aus:


LRESULT CALLBACK WndProc_dialog (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
return 0;

case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}




void MeinDialog(HINSTANCE hI,HWND hWnd)
{

char szName[] = "Fensterklasse";
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc_dialog;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hI;
wc.hIcon = LoadIcon (NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;

RegisterClass (&wc);

HWND hwnd = CreateWindow (szName, "", WS_SYSMENU | WS_THICKFRAME,
0, 0, 200, 100, hWnd, NULL, hI, NULL);

ShowWindow (hwnd, SW_SHOWNORMAL);
UpdateWindow (hwnd);


MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);

}
}







Aufgerufen wir die Funktion in der Hautschleife in WinMain()

if(keys['U'])MeinDialog(hInstance,hWnd);






Es tritt folgendes Problem auf: weil ich die Taste 'U' zu lange gedrückt halte, wird die Funktion mehrfach aufgerufen.


Wenn ich das Dialgfenster auf dem Hautvenster verschiebe, wird das Hauptfenster nicht neu gezeichnet.
Wie löst man dieses Problem fachgerecht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Fr Jul 02, 2010 23:43 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Dieses Dialogfeld selber zu machen ist interessant und lehrreich, aber ich brauche eure Hilfe, sonst klappt das nicht.

Ich habe schwierigkeiten das zweite Fenster zum funktionieren zu bringen.
Das Endergebnis soll so aussehen:

MeinDialog(&a,&b,&c...);

wobei a,b,c variablen vom Typ float sind, die ich verändern will.

Vorerst bin ich jedoch nur damit beschäftigt das fenster öffnen und schliessen zu können.
Unfreiwilligerweise hat sich die Funktion um zwei Argumente erweitert:

MeinDialog(hInstance,hWnd);

Die Funktion sieht bis jetzt so aus:


LRESULT CALLBACK WndProc_dialog (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
return 0;

case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}




void MeinDialog(HINSTANCE hI,HWND hWnd)
{

char szName[] = "Fensterklasse";
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc_dialog;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hI;
wc.hIcon = LoadIcon (NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;

RegisterClass (&wc);

HWND hwnd = CreateWindow (szName, "", WS_SYSMENU | WS_THICKFRAME,
0, 0, 200, 100, hWnd, NULL, hI, NULL);

ShowWindow (hwnd, SW_SHOWNORMAL);
UpdateWindow (hwnd);


MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);

}
}






Aufgerufen wir die Funktion in der Hautschleife in WinMain()

if(keys['U'])MeinDialog(hInstance,hWnd);






Es tritt folgendes Problem auf: weil ich die Taste 'U' zu lange gedrückt halte, wird die Funktion mehrfach aufgerufen.


Wenn ich das Dialgfenster auf dem Haupfenster verschiebe, wird das Hauptfenster nicht neu gezeichnet.
Wie löst man dieses Problem fachgerecht, sodass mein Dialogfeld so zu handhaben ist, wie man das von den Messageboxen auch kennt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Sa Jul 03, 2010 08:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Wäre das eine Möglichkeit? In einer Variablen speichern ob das Fenster bereits offen ist? :
Code:
bool MeinDialogOffen = false;
if(keys['U'] && !MeinDialogOffen) { MeinDialogOffen = true; MeinDialog(hInstance,hWnd); }

Code:
case WM_DESTROY:
PostQuitMessage (0);
MeinDialogOffen = false;
return 0;


Btw: es gibt eine Edit Funktion.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Sa Jul 03, 2010 08:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Btw: es gibt eine Edit Funktion.

Und einen Code-Tag: einfach [*code] ....dein Quellcode....[*/code] ohne die Sternchen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Sa Jul 03, 2010 08:53 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Hallo damadmax,

vielen Dank für deine Antwort.
Was du vorschlägst habe ich auch schon versucht.

Leider ist es darangescheitert, dass ich die Meindialogfunktion und deren Fensterprozedur
in eie andere Datei geschrieben habe. Deshalb hat die Fensterprzedur keinen Zugriff auf
MeindialogOffen.

Ich habe vrsucht der FUnktion einen boolschen Rückgabewert zu geben. Aber das hat irgendwie nicht geklappt.

Code:
bool MeinDialog()
{
....
...

MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
 DispatchMessage (&msg);

}   

if(GetMessage (&msg, NULL, 0, 0)==0) return true;
else return false;

}


Hat leider nicht funktioniert.



Zur anderen Frae: weisst du, was ich machen kann, dass mein Hauptfenster neu gezeichnet wird, wenn ich beispielsweise das Dialogfenster verschiebe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dialogox
BeitragVerfasst: Sa Jul 03, 2010 09:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Aufgerufen wir die Funktion in der Hautschleife in WinMain()
if(keys['U'])MeinDialog(hInstance,hWnd);

Es tritt folgendes Problem auf: weil ich die Taste 'U' zu lange gedrückt halte, wird die Funktion mehrfach aufgerufen.

Das Betriebssystem macht hier genau das, was Du von ihm verlangst: Taste "U" ist gedrückt, also Fenster aufmachen. Besser wäre es, das Fenster auf Mausklick aufzumachen, denn dann hat der Benutzer eine Chance, zu merken, dass er selber schuld ist: wenn er zweimal klickt, macht er eben zwei Fenster auf.


Zitat:
Wenn ich das Dialgfenster auf dem Haupfenster verschiebe, wird das Hauptfenster nicht neu gezeichnet.

Das hängt vermutlich damit zusammen, dass Du während das Fenster offen ist, Folgendes machst:
Code:
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

Du machst da quasi eine neue Hauptschleife auf. Möglicherweise lässt Du damit dem Betriebssystem gar keine Zeit, dem Hauptfenster eine "Paint"-Nachricht zu schicken. Entweder Du machst wirklich einen neuen Thread (da weiß ich aber nicht Bescheid) , dann fährt das BS wirklich zweigleisig, oder Du steuerst alles über die eine Hauptschleife, dann muss man gewährleisten, dass jedes Fensterchen seine Botschaften noch zugestellt bekommt.

Und Du solltest Dich nicht wundern, wenn Du dann in diesem neuen Fenster nicht zeichnen kannst, es ist sehr wahrscheinlich, dass ein neues Fenster einen neuen Rendering Context braucht (Windows und Linux verhalten sich in diesem Aspekt ziemlich gleich :wink: )

Alles in allem wäre es vielleicht gut, die Motivation zu überdenken: willst Du wirklich nur einen kleinen Dialog ablaufen lassen, oder willst Du etwas über Betriebssysteme lernen. Denn im zweiten Fall muss man VIEL mehr Zeit einplanen. Ich finde, das sollte man sich bewußt machen. Klar, das ist interessant, aber möglicherweise rechnet es sich nicht.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]