WICHTIG - TEXTOUT - PROBLEME
-
Hallo an alle die sich auskennen mit der Windows-Programmierung,
bitte helft mir.
PROBLEM :
---------Ich habe ein Unterfenster indem ich das Handle des Hauptfensters
angebe. Soweit so gut, alles funktioniert.- Jetzt befinde ich mich im Unterfenster im "case WM_PAINT :"- Teil.
Verstanden ? Ok..
-
Ich habe ein zweidimensionales Array (int** akkumulator), das vollständig
mit Werten initialisiert ist. -
Dieses Array will ich zeichnen im Fenster. Wie geht das ? Mit Java ist das einfach.
Vorschlag :
Meine Idee war, jedes int-Element im Array mittels string-Funktionen von (int in char) umzuwandeln, und dann den ganzen neuen char-String mittels TextOut
auszugeben. Aber es funktioniert nicht richtig.
inFALLS JEMAND VON EUCH SICH GUT AUSKENNT, BITTE HELFT MIR.
Gruss
SmartyShark
-
Was soll da nicht richtig Funktionieren?
-
Klare Sache, wer rumschreibt kriegt hier keine Hilfe.
Thread closed.
-
Hallo an alle die sich auskennen mit der Windows-Programmierung,
bitte helft mir.
PROBLEM :
---------Ich habe ein Unterfenster indem ich das Handle des Hauptfensters
angebe. Soweit so gut, alles funktioniert.- Jetzt befinde ich mich im Unterfenster im "case WM_PAINT :"- Teil.
Verstanden ? Ok..
-
Ich habe ein zweidimensionales Array (int** akkumulator), das vollständig
mit Werten initialisiert ist. -
Dieses Array will ich zeichnen im Fenster. Wie geht das ? Mit Java ist das einfach.
Vorschlag :
Meine Idee war, jedes int-Element im Array mittels string-Funktionen von (int in char) umzuwandeln, und dann den ganzen neuen char-String mittels TextOut
auszugeben. Aber es funktioniert nicht richtig.
inFALLS JEMAND VON EUCH SICH GUT AUSKENNT, BITTE HELFT MIR.
Gruss
SmartyShark
-
Das hats jetzt gebracht...
-
Hat dein Post irgend einen geistigen Nährwert (siehe auch (D)Evil's Frage!) ?
SmartyShark schrieb:
Meine Idee war, jedes int-Element im Array mittels string-Funktionen von (int in char) umzuwandeln, und dann den ganzen neuen char-String mittels TextOut
auszugeben.jo gute Idee. -lol-
SmartyShark schrieb:
Aber es funktioniert nicht richtig.
d.h. ? WAS funktioniert denn nicht richtig ? Was sagt der Compiler(Error/Warnungen) ? Was sagt der Debugger ?

SmartyShark schrieb:
Mit Java ist das einfach.
Was willst du denn damit zum Ausdruck bringen ?
-
Hi,
danke für die Antwort erstmal. Die unregestrierten schreiben total komisches zeug..
Das sind meine For-Schleifen :
for(i=0;i<480;i++)
{
for(j=0;j<HALFPI;j++)
{
sprintf(&buffer[i], "%d", akkumulator[i][j]);
strcat(&buffer[i], " ");
}
}for(i=0;i<480;i++)
{
for(j=0;j<HALFPI;j++)
{
TextOut(hdc, j, i, &buffer[i * HALFPI + j], 480);
}
}Es gibt keinen Compiler-Fehler und auch keinen Speicherfehler.
Alles wird normal durchgegangen, das sehe ich daran das im Fenster Zahlen
auftauchen bis zum Ende des Fensters und normal terminiert wird.PROBLEM :
---------Die Zahlen bleiben nicht auf dem Bildschirm bestehen. Nur das letzte geschriebe.

Verstehst du ?
Gruss
SmartyShark
-
Die Zahlen bleiben nicht auf dem Bildschirm bestehen. Nur das letzte geschriebe.

Darunter versteh ich mal das sie übermalt werden, nicht aber, dass sie dir 'weglaufen' ...

Hmm an welchen Zeitpunkt deines Programms (Funktion, Nachricht) zeichnest du denn ? Wie holst du dir den hdc ?
PS: Benutz mal Code TAGS!

-
Neben bei... ein char ist wenn du es ausgibtst breiter als 1px ...
-
(D)Evil schrieb:
Neben bei... ein char ist wenn du es ausgibtst breiter als 1px ...
Muhahaha
, jo hab ich gar nicht drauf geachtet...
LOL...guckst du hier
: GetTextMetrics() bzw. GetTextExtentPoint32()
-
Hi,
also... Den HDC bekomme ich über :
LRESULT CALLBACK htWindow(HWND hWndVorschau, UINT message, WPARAM wParam, LPARAM lParam)
{...
case WM_PAINT:
hdc = BeginPaint(hWndVorschau, &ps);
//fg->ZeichneFrame(2,hWndVorschau);/*
Hough-Matrix
*/
buffer = (char
malloc(86400 * sizeof(char));
...
}Wie du siehst habe ich den buffer auch schon allokiert...
Die Frage ist :
----------------
Was hilft mir GetTextMetrics(..) ?
-
Könnt Ihr mir nicht einfach den Code umschreiben so damit es funktioniert ??
Das wäre seeehr nett...
Gruss
SmartyShark
-
-
Sind wir hier die "Hausaufgaben - Kostenlos - Community" ?!
Pass auf, rel einfach... du hast bei TextOut(hdc, j, i, &buffer[i * HALFPI + j], 480); nicht beachtet, das j und i immer nur um 1 erhöht werden... ein char aber wesentlich größer ist als 1 ... d.h. solltest du dir die Breite und Höhe eines chars holen... und die mit j bzw i multiplizieren

-
Hi,
hmm... hört sich gut an. Ich probiere es.
Es ist keine Hausaufgaben-Community, aber ein Forum indem sich
Leute gegenseitig Wissen austauschen oder Fragen beantworten.Ausserdem sieht es so aus als ob dir das Helfen spass macht :-)!!!
Also warum so zickig ?
Vielen Dank
Gruss
SmartyShark
-
Hi ich bins nochmal:-),
also es funktioniert besser aber noch nicht optimal

Mein Code ist jetzt so:
...
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm; // Struktur für Textmetrikstatic DWORD dwCharX; // average width of characters
static DWORD dwCharY; // height of characterschar* buffer;
int i=0,j=0,count=0;switch (message)
{
// wird beim Erzeugen des Fensters verschickt
case WM_CREATE:
hdc = GetDC(hWndVorschau);
GetTextMetrics(hdc, &tm);
ReleaseDC(hWndVorschau, hdc);dwCharX = tm.tmAveCharWidth;
dwCharY = tm.tmHeight;return 0;
break;
...
TextOut(hdc, j*dwCharX, i*dwCharY, &buffer[i * HALFPI + j], 1);Wo ist den noch der Fehler ? Die Ausgabe sind viele Nullen (Könnte sein),
aber dann 3/4 des Bildschirms sind solche Zeichen --> |???
Wäre nett auf diese Frage noch zu antworten..
Danke
Gruss
-
Mach ich
aber:
Poste bitte den ganzen Code UND BENUTZ ENDLICH C++CODE-TAGS!!, Bitte!Damit kannst du den Code formatieren...
einfach den Code mit "[ cpp] DEIN CODE[/cpp ]" einschließen (ohne Leerzeichen
) 
-
Vielen Dank,
C++-Tags
?? Sorry ich bin leider noch nicht so geübt mit der 100%-igen Unterscheidung zwischen C-Tags und C++-Tags.... Das liegt daran das ich nicht erfahren bin mit C/C++-Programmierung. Habe ein Jahr Java programmiert da ist das viel einfacher.ZUR INFO :
----------
Mein Fenster hat eine Auflösung von 768 * 576. Das Akkumulator-Array
hat eine Größe von --> 960 * 180. Mit 480 * 180 wäre ich auch zufrieden.
Deswegen ist in meiner Schleife 480 angegeben.Mein Code ist :
---------------
LRESULT CALLBACK htWindow(HWND hWndVorschau, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm; // Struktur für Textmetrikstatic DWORD dwCharX; // average width of characters
static DWORD dwCharY; // height of characterschar* buffer;
int i=0,j=0,count=0;switch (message)
{
// wird beim Erzeugen des Fensters verschickt
case WM_CREATE:
hdc = GetDC(hWndVorschau);
GetTextMetrics(hdc, &tm);
ReleaseDC(hWndVorschau, hdc);dwCharX = tm.tmAveCharWidth;
dwCharY = tm.tmHeight;return 0;
break;
// wird z.B. beim druecken des Close Buttons des Fensters verschickt
case WM_DESTROY:
EnableWindow( hwndmain, TRUE );
SetForegroundWindow( hwndmain );
return 0;
break;
// wird versendet wenn das Fenster neu gezeichnet werden soll
case WM_PAINT:
hdc = BeginPaint(hWndVorschau, &ps);//fg->ZeichneFrame(2,hWndVorschau);
/*
Hough-Matrix
*/
buffer = (char
malloc(86400 * sizeof(char));count=0;
// Zeichnen der Werte der Hough-Matrix
for(i=0;i<480;i++)
{
for(j=0;j<HALFPI;j++)
{
sprintf(&buffer[i], "%d", akkumulator[i][j]);
strcat(&buffer[i], " ");
}
}for(i=0;i<480;i++)
{
for(j=0;j<HALFPI;j++)
{
TextOut(hdc, j*15, i*15, &buffer[i * HALFPI + j], 3);
}
}EndPaint(hWndVorschau, &ps);
break;
// wenn Menuepunkte angewaelt werden
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_BILD_UEBERNEHMEN:
fg->SchreibeFrame(1,puffer2);
DestroyWindow(hWndVorschau);
EnableWindow( hwndmain, TRUE );
SetForegroundWindow( hwndmain );
break;
case ID_BILD_VERWERFEN:
DestroyWindow(hWndVorschau);
EnableWindow( hwndmain, TRUE );
SetForegroundWindow( hwndmain );
return 0;
break;
default: // Nachrichten weiterleiten
return DefWindowProc(hWndVorschau, message, wParam, lParam);
}default: // Nachrichten weiterleiten
return DefWindowProc(hWndVorschau, message, wParam, lParam);}
return 0;
}Hoffentlich kannst du mir helfen...
Vielen Dank nochmal. ich warte dann mal...
Gruss
-
Es geht mir doch NUR
darum, dass ich deinen Post besser entziffern kann *am-verzweifeln-sein*pass auf so sieht ein Code Tag aus:
#include <iostream> int main() { return (0); }oder ohne, würde es so aussehen:
#inlclude <iostream>
int main()
{
return (0);
}die erstellt man, indem man vor den Code (ALSO HIER IN DEINEM POST!, nicht im Compiler!) ein [cpp] schreibt und nach den Code ein [/cpp ] (ohne das Leerzeichen vor der eckigen Klammer
)PS: Editier mal deinen letzten Post und füg Code Tags hinzu, dann werd ich mir ihn angucken
dann gehts einfacher/schneller! 
Verstehst du, was ich meine
?
-
Vielen Dank,
C++-Tags
?? Sorry ich bin leider noch nicht so geübt mit der 100%-igen Unterscheidung zwischen C-Tags und C++-Tags.... Das liegt daran das ich nicht erfahren bin mit C/C++-Programmierung. Habe ein Jahr Java programmiert da ist das viel einfacher.ZUR INFO :
----------
Mein Fenster hat eine Auflösung von 768 * 576. Das Akkumulator-Array
hat eine Größe von --> 960 * 180. Mit 480 * 180 wäre ich auch zufrieden.
Deswegen ist in meiner Schleife 480 angegeben.Mein Code ist :
---------------LRESULT CALLBACK htWindow(HWND hWndVorschau, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; // Struktur für Textmetrik static DWORD dwCharX; // average width of characters static DWORD dwCharY; // height of characters char* buffer; int i=0,j=0,count=0; switch (message) { // wird beim Erzeugen des Fensters verschickt case WM_CREATE: hdc = GetDC(hWndVorschau); GetTextMetrics(hdc, &tm); ReleaseDC(hWndVorschau, hdc); dwCharX = tm.tmAveCharWidth; dwCharY = tm.tmHeight; return 0; break; // wird z.B. beim druecken des Close Buttons des Fensters verschickt case WM_DESTROY: EnableWindow( hwndmain, TRUE ); SetForegroundWindow( hwndmain ); return 0; break; // wird versendet wenn das Fenster neu gezeichnet werden soll case WM_PAINT: hdc = BeginPaint(hWndVorschau, &ps); //fg->ZeichneFrame(2,hWndVorschau); /* Hough-Matrix */ buffer = (char *) malloc(86400 * sizeof(char)); count=0; // Zeichnen der Werte der Hough-Matrix for(i=0;i<480;i++) { for(j=0;j<HALFPI;j++) { sprintf(&buffer[i], "%d", akkumulator[i][j]); strcat(&buffer[i], " "); } } for(i=0;i<480;i++) { for(j=0;j<HALFPI;j++) { TextOut(hdc, j*15, i*15, &buffer[i * HALFPI + j], 3); } } EndPaint(hWndVorschau, &ps); break; // wenn Menuepunkte angewaelt werden case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BILD_UEBERNEHMEN: fg->SchreibeFrame(1,puffer2); DestroyWindow(hWndVorschau); EnableWindow( hwndmain, TRUE ); SetForegroundWindow( hwndmain ); break; case ID_BILD_VERWERFEN: DestroyWindow(hWndVorschau); EnableWindow( hwndmain, TRUE ); SetForegroundWindow( hwndmain ); return 0; break; default: // Nachrichten weiterleiten return DefWindowProc(hWndVorschau, message, wParam, lParam); } default: // Nachrichten weiterleiten return DefWindowProc(hWndVorschau, message, wParam, lParam); } return 0; }Hoffentlich kannst du mir helfen...
Vielen Dank nochmal. ich warte dann mal...
Gruss
-
War mein Fehler, sorry... habs nicht bis zum Ende gelesen.
Windows-Programmierung gefällt mir richtig, obwohl es schwer ist.
Aber wenn man es kann, hat man viel Erfahrung gesammelt glaube ich.Das ist ein Vertiefungsfach in der Uni. Digitale Bildverarbeitung.
Bei mir happerts einfach an der Windowsprogrammierung.-
Ich habe eine ausgerechnete Matrix und die muss ich darstellen.
-
Dann muss ich Sinus-Cosinus-Kurven per Windowsprogrammierung darstellen.
Aber das könnte ich einfach mit MoveTo(..),LineTo(..) denke ich machen.
Die Pixel sind dann von 0 .. PI so nah, das man keine Zacken sehen müsste.
Falls doch mache ich einfach Anti-Aliasing:-) Gibt es das bei Win32?
Gruss
SmartyShark
-
-
Yippy, die CodeTags meinte ich
...buffer = (char *) malloc(86400 * sizeof(char));glaube du reservierst hier schon mehr als 64kByte und das packt die C-Funktion malloc nicht...aber du kannst mal mit ZeroMemory() den Speicher BEVOR du ihn verwendest auf 0 resetten....
Außerdem sowas ist noch seeehr wichtig:
free(buffer);