Handle auf ein Fenster, dass in einer anderen Funktion benutzt wird?
-
Also ich schreibe für ein Programm, was ursprünglich für die Konsole geschrieben wurde, ein Oberfläche. Jetzt bin ich gerade dabei die "cout" Nachrichten umzuschreiben. Und zwar habe ich ein Fenster erstellt, indem ich jetzt die Nachrichten genauso wie vorher in der Konsole ausgeben möchte. Ich habe also eine Prozedur für das Hauptfenster und eine für das Ausgabefenster. Noch dazu gibt es ganz viele andere Funktionen, die das eigentliche Berechnugsprogramm darstellen. Die "Hauptfunktion" des Berechnungsprogramms ruft logischerweise all die anderen Berechnungsfunktionen auf. Jetzt möchte ich aus einer dieser Berechnungsfunktionen eine Nachricht an die Prozedur für das Ausgabefenster schicken à la "gib jetzt irgendwas aus".
Problem: dazu brauche ich ein Handle auf das Fenster, was natürlich in der Berechnungsfunktion nicht bekannt ist. Und ein "globales Handle" hab ich auch noch nicht gesehen...geht das überhaupt?
Hat jemand eine Idee, wie ich das Lösen könnte? Wenn jemand meinen Ausführungen nicht ganz folgen kann, erklär ichs auch gern nochmal
Ich versuch das ganze mal mit etwas Code zu untermalen://Prozedur für das Hauptfenster LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { . . . case WM_CREATE: { hChild = CreateWindowEx(WS_EX_CLIENTEDGE, lpszChildName, NULL, WS_CHILD, 500,30,300,300, hWnd, NULL, NULL, NULL); } case WM_COMMAND: { if(lParam == (LPARAM)hButtonStart) if(HIWORD(wParam) == BN_CLICKED) { //startet die eigentliche Berechnung start(); } } . . . return 0; } //Prozedur für das Ausgabefenster (hChild) LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_IRGENDWAS: { //hier steht dann Ausgabeanweisung... } . . . } return DefWindowProc(hWnd, message, wParam, lParam); } //Die Berechnung //Der Code ist unwesentlich, wichtig ist nur, dass die Nachricht aus einer //For-Schleife gesendet werden soll... int start() { register int t,s; char tmp[5]; double Energy; Mesh(); Time(); Initialisation(); TemperatureCoefficients(); for (t=1; t<=N5; t++) { IntensityDistribution(t); ComputeEnergy(t); s=Temperature(); //hier soll jedesmal die bewusste //Nachricht gesendet werden: SendMessage(hChild, WM_IRGENDWAS,0,0); sprintf(tmp,"%d",t); string number=tmp; if(!SaveData("./data/main"+number+".dat")) return -1; } video(); return 0; }Vielleicht kann mir ja jemand weiterhelfen. Ich bin gespannt

-
Mach dsa fenster handle einfach eine globale variable dann kannst du es in jeder funktion benutzen, das geht schon
oder schreib dir gleich eine bequemere funktion log() die formatierten text ins log fenster schreibt so wie printf, dann musst du das fensterhandle nur in der funktion nutzen.
-
schreibe doch einen eigenen streambuffer der auf das hwnd die nachricht umleitet, somit bräuchtest die cout nicht umleiten.
-
@ Lobster: Ja stimmt, wobei ich das dann doch als die Notlösung nehmen würde oder?
@ miller_m: Ich hab noch nie einen Streambuffer geschrieben, aber es klingt interessant und so, als ob es nützlich wäre ( und für das cout-Problem liegt der Sinn auf der Hand ). Ich hab grad die Suche und gogle mal gefragt, aber so richtig etwas zum Streambuffer wollten die mir nicht verraten. Hast du einen Tip, wo ich mir was dazu anlesen könnte?
-
Frage an die, die etwas mehr Ahnung haben als ich: gibt es etwas dagegen einzuwenden, der Funktion start beim Aufruf das Handle auf das entsprechende Fenster zu übergeben? Dann funktioniert es nämlich, hab ich gerade festgestellt. Ich hatte irgendwie gedacht, mit einem Handle würde das nicht funktionieren. Kann man sich ein Handle genauso wie eine beliebige Variable vorstellen? Oder wo ist der Unterschied?
-
bsp: http://www.olaf-groeger.de/prog_str.html
hat mich jetzt so stark interessiert das ich schnell was geschrieben habe.
denk dran quick&dirty, nicht optimiert, usw usw ist nur zur verdeutlichung.class windowsguilogstream : public std::streambuf { public: explicit windowsguilogstream(HWND hwnd) : m_hWnd(hwnd) { } virtual ~windowsguilogstream() { sync(); } protected: int overflow(int c) { if(!traits_type::eq_int_type(c, traits_type::eof())) { if(pbase() == epptr()) m_strBuffer += c; else sputc(c); } return traits_type::not_eof(c); } int sync() { int nLen = (SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0)) + 1; char *pszTemp = new char[nLen + m_strBuffer.size()]; SendMessage(m_hWnd, WM_GETTEXT, (WPARAM)nLen, (LPARAM)pszTemp); strncat(pszTemp, m_strBuffer.c_str(), m_strBuffer.size()); SendMessage(m_hWnd, WM_SETTEXT, 0, (LPARAM)pszTemp); delete [] pszTemp; m_strBuffer.clear(); return 0; } private: HWND m_hWnd; std::string m_strBuffer; }; // --------- case WM_CREATE: hEdit1 = CreateWindow("edit", // ... // ich weis memleak, hier bietet sich nen smartpointer an std::cout.rdbuf(new util::windowsguilogstream(hEdit1));
-
BeNNeR schrieb:
Frage an die, die etwas mehr Ahnung haben als ich: gibt es etwas dagegen einzuwenden, der Funktion start beim Aufruf das Handle auf das entsprechende Fenster zu übergeben?
keine einwände
BeNNeR schrieb:
Kann man sich ein Handle genauso wie eine beliebige Variable vorstellen?
ja
BeNNeR schrieb:
Oder wo ist der Unterschied?
gibt in der regel keinen
ps: vergiss meinen obrigen code und mache es so, habe zu kompliziert gedacht

-
Danke für deine Antworten. Und ich bin offen gestanden froh, dass meine Variante in diesem Fall sogar günstiger ist. Ich hatte mir nämlich fest vorgenommen, mich mit deinem Code auseinanderzusetzen, wenn du dir schon die Mühe gemacht hast, verstanden hab ich nämlich davon auf den ersten Blick gar nichts...
Ist ja jetzt nicht mehr nötig.
Naja..ein blindes Huhn findet auch mal ein Korn