WICHTIG - TEXTOUT - PROBLEME



  • 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.

    1. Jetzt befinde ich mich im Unterfenster im "case WM_PAINT :"- Teil.

    Verstanden ? Ok..

    1. Ich habe ein zweidimensionales Array (int** akkumulator), das vollständig
      mit Werten initialisiert ist.

    2. 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.
    in

    FALLS 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 :
    ---------------

    1. Was hilft mir GetTextMetrics(..) ?

    2. 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 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;
    ...
    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 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



  • 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.

    1. Ich habe eine ausgerechnete Matrix und die muss ich darstellen.

    2. 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);



    1. 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?

    Naja für sin() etc musst du math.h bzw cmath inkludieren...ich würd dir empfehlen dich mit Funktionen wie SetviewpointOrgEx() etc auseinander zu setzern bzw SetMapMode() etc....Damit kann man den Zeichenmodus anpassen...Bisher geht Windows bei WM_PAINT ja immer davon aus das P(0|0) immer in der linken oberen Ecke ist...das kann man ändern 😉

    Nein Anti-Aliasing nicht direkt...das musst du dann selbst implementieren siehe Hier ein paar Code Hilfen

    "Gibt es das bei Win32?", Aber in DirectX 😃



  • Hi,

    habe es so gemacht...

    case WM_PAINT:
            hdc = BeginPaint(hWndVorschau, &ps);
    
    		//fg->ZeichneFrame(2,hWndVorschau);
    		/* 
    			Hough-Matrix
    		*/
    
    		ZeroMemory(&buffer,86400 * sizeof(char));
    ...
    free(buffer);
    

    Resultat :
    ----------

    Kein Fehler, aber das Fenster wird einfach geschlossen.

    Es muss doch eine Möglichkeit geben dieses Array schön auszugeben.
    Ich bin verzweifelt.

    INFO (Ausgabe ohne ZeroMemory(...):
    -----------------------------------

    00000000000000000000000000000000775546444869897000
    ...
    ||||||||||||||||||||||||||||||||||||||||||||||||||

    und so weiter bis zum Ende des Fensters.

    Gruss
    SmartyShark


Anmelden zum Antworten