WICHTIG - TEXTOUT - PROBLEME
-
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);
-
- 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

- Dann muss ich Sinus-Cosinus-Kurven per Windowsprogrammierung darstellen.
-
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
-
Hi,
Sorry das ich gestern nicht mehr geschrieben hab, aber meine Internet-Verbindung
hat den Geist aufgegeben...und zu so später Stunde hatte ich keine Lust mehr
mich darum zu kümmern. -sry-
Naja als 'Entschuldigung', auch wenn ich dir die vllt. gar nicht schuldig bin

kannst mir ja mal dein Projekt schicken ( cpp-coding@arcor.de ) und ich werd dir
dein Projekt so basteln, dass es funktioniert...na ist das nicht ein Angebot ?Mal btw (das ist falsch):
ZeroMemory(&buffer,86400 * sizeof(char));das muss so heißen (hätte man aber spätestens beim kompilieren gemerkt!):
// wenn buffer so deklariert wurde: char *buffer... ZeroMemory(buffer, sizeof(char));PS: Mach mal bitte n Post, wenn du mir das schickt, da ich mein Postfach sehr
selten kontrolliere.