HDC global... GetDC überschreibt alles?
-
Na endlich mal ein bißchen mehr Code... :p
Unter WM_MOUSEMOVE fragst Du keine Koordinaten ab, sondern ordnest nur MouseKoord an MyPoint zu. Das bringt nichts.
Dieser Abschnittif( LOWORD(lParam) != 0 || HIWORD(lParam) != 0) { mouseKoord.X = LOWORD(lParam); //took the mouse-coordinates into a COORD variable (perfomance) mouseKoord.Y = HIWORD(lParam); }gehört auch unter WM_MOUSEMOVE. Sonst werden die aktuellen Koordinaten nicht aus der WM_MOUSEMOVE-Message genommen.
Danach verschiebst Du die Maus und speicherst die neuen Koordinaten in myPoint. Damit hast Du zwei Punkte, die unter WM_PAINT abgefragt werden können.
-
Elektronix schrieb:
Sonst werden die aktuellen Koordinaten nicht aus der WM_MOUSEMOVE-Message genommen.
Diese Koordinaten sollen immer aktuell sein, ob mousemove oder nicht... sie werden überall wieder verwednet, damit ich nicht immer auf LO und HIWORD zurückgreife...
Ob sie da stehen oder in Mousemove... macht dass einen Unterschied?
-
lippoliv schrieb:
Elektronix schrieb:
Sonst werden die aktuellen Koordinaten nicht aus der WM_MOUSEMOVE-Message genommen.
Diese Koordinaten sollen immer aktuell sein, ob mousemove oder nicht... sie werden überall wieder verwednet, damit ich nicht immer auf LO und HIWORD zurückgreife...
Wieso, das tust Du doch ohnehin. Nur eben permanent und ohne Zusammenhang.
Ob sie da stehen oder in Mousemove... macht dass einen Unterschied?
Ja. Das Fenster wird noch mit einem Haufen anderer WM-Nachrichten bombardiert, die in lParam immer andere (oder auch gar keine) Werte enthalten. Damit kannst Du beim Zeichnen nichts anfangen. Die aktuellen Koordinaten bekommst Du nur mit den Mouse- oder Button-Nachrichten (oben aufgezählt), dazu sind die da!
-
Ja ist ja kein Problem oder?
Ich nehme ja nur welche an wo HO oder LO != 0 ist/sind.
Und fürs Zeichnen bekomme ich dann ja immer die Aktuellsten Koordinaten...Ich habe es jetzt umgebaut, und selbst da funktioniert es nicht.
1. Ich kriege keine striche,
2. es zuckt...
-
Programmier doch mal ein Textfeld, wo Du Dir die angeblichen Koordinaten anzeigen läßt. Dann wirste es ja sehen.
-
Ich soll, weil mein Form zuckt und keine Striche erscheinen, ein Textfeld Programmieren?
Ich bin -glaube ich- auf dem so ziemlich untesten Level der Fensterprogrammierung.. ein Textfeld ist da noch weit weg glaube ich.
-
Nö, ein Textfeld ist genau auf dem untersten Level

http://msdn2.microsoft.com/en-us/library/ms632679.aspx
mit EDIT als lpClassName. Ganz einfach, oder?
-
Trotzdem, was sollte mir das Helfen? Das Problem vergeht nicht, während ich ein anderes Programm schreibe.
-
Du kannst auch ein ChildWindow erstellen und darin die Koordinaten per TextOut() ausgeben.
Allerdings scheint es mir, daß Du Dich mit Deinem Malprogramm etwas übernommen hast. Du solltest vielleicht doch noch mal die Tutorials durchackern.

-
Frage: Wieso zeigt mein WM_PAINT nichts an?
Ich habe es genau so gemacht wie ihr es mir verdeutlich habt, also damit nichts verloren geht.Ich speichere die letzte, und die Aktuelle aus WM_MOUSEMOVE und ziehe von der einen zur anderen einen strich.
Wenn ich direkt nach LineTo ein printf( "." ) mache, zeigt er dass in der Konsole auch an...
Wieso malt er dann nicht?
Darauf brauche ich eine antwort, nicht wie ich ein ChildWindow erstelle, Koordinaten ausgebe oder so... << klingt scheiße und aggresiv, ist es aber nicht.
Mich wundert dieser Fehler. Wenn er ja schon in der IF bedingung ist, wieso tut er nicht seine aufgaben....
@Elektronix meintest du ich solle mir Testhalber die Koords ansehen?
myPoint | mousePointForPaint x | y ||| x | y 324 | 430 => 324 430 318 | 413 => 318 413 314 | 401 => 314 401 304 | 372 => 304 372 292 | 336 => 292 336 284 | 320 => 284 320 269 | 276 => 269 276 258 | 244 => 258 244 248 | 214 => 248 214 245 | 204 => 245 204 240 | 189 => 240 189 235 | 175 => 235 175 234 | 168 => 234 168 232 | 156 => 232 156 229 | 145 => 229 145 226 | 135 => 226 135 223 | 126 => 223 126 221 | 122 => 221 122 219 | 114 => 219 114 217 | 110 => 217 110 216 | 106 => 216 106 214 | 104 => 214 104 213 | 101 => 213 101 211 | 100 => 211 100scheint die richtigen coords zu haben
warum sind die alle gleich??
-
1. Das ist falsch:
SendMessage( myAppWnd, WM_PAINT, 0, 0 );Du musst einfach InvalidateRect verwenden.
2. Zeig mal wie Du zeichnest. Ich verstehe nicht ganz warum Du zwei Koordinaten hast. In Deinem Aray musst Du doch immer nur eine neue Mausposition hinten anstellen. Zeichnen tust Du dnan von Punkt zu Punkt.
Zeig mal wie Du WM_MOUSEMOVE und WM_PAINT gebaut hats.
-
scheint die richtigen coords zu haben
warum sind die alle gleich??
Deswegen:
else { if( myPoint.x != -1 ) { SendMessage( myAppWnd, WM_PAINT, 0, 0 ); //send WM_PAINT so that the painting is just standing, if the window will be resized myPoint.x = mouseKoord.X; //set new coordinates myPoint.y = mouseKoord.Y; } else { myPoint.x = mouseKoord.X;//The first coordinates myPoint.y = mouseKoord.Y;@Martin: Er hat den Code eine Seite vorher gepostet.
-
Der Code hat sich verändert:
PAINTSTRUCT myPaint; static POINT myPoint, mousePointForPaint; static RECT myRect; static BOOL isPainting; static COORD mouseKoord; HANDLE backUp; if( LOWORD(lParam) != 0 || HIWORD(lParam) != 0) { mouseKoord.X = LOWORD(lParam); //took the mouse-coordinates into a COORD variable (perfomance) mouseKoord.Y = HIWORD(lParam); } [...] case WM_PAINT: //zum Zeichnen anmelden myHdc = BeginPaint( myWnd, &myPaint ); { if( myPoint.x != -1 ) { backUp = SelectObject( myHdc, *aktPen ); MoveToEx( myHdc, //Zeichenfläche myPoint.x, //X-Koordinate myPoint.y, //Y-Koordinate NULL //old-Koordinate ); LineTo( myHdc, //Zeichenfläche mousePointForPaint.x, //X-Koordinate mousePointForPaint.y //Y-Koordinate ); SelectObject( myHdc, backUp ); } } EndPaint( myWnd, &myPaint ); visitMsg = TRUE; break; case WM_MOUSEMOVE: myHdc = GetDC( myWnd ); //open device-context (paintplace) { if( !isPainting ) //Wenn der { if( inRect( mouseKoord, blackColor ) ) { aktPen = &blackPen; //slect black pen R = 0; G = 0; B = 0; } else if( inRect( mouseKoord, whiteColor ) ) { aktPen = &whitePen; //select white pen R = 255; G = 255; B = 255; } else if( inRect( mouseKoord, smallSize ) ) { DeleteObject( aktPen ); *aktPen = CreatePen( PS_SOLID, 1, RGB( R, G, B ) ); } else if( inRect( mouseKoord, middleSize ) ) { DeleteObject( aktPen ); *aktPen = CreatePen( PS_SOLID, 3, RGB( R, G, B ) ); } else if( inRect( mouseKoord, bigSize ) ) { DeleteObject( aktPen ); *aktPen = CreatePen( PS_SOLID, 4, RGB( R, G, B ) ); } } else { if( myPoint.x != -1 ) { mousePointForPaint.x = mouseKoord.X; mousePointForPaint.y = mouseKoord.Y; InvalidateRect( myWnd, NULL, TRUE); //send WM_PAINT so that the painting is just standing, if the window will be resized myPoint.x = mouseKoord.X; //set new coordinates myPoint.y = mouseKoord.Y; } else { myPoint.x = mouseKoord.X;//The first coordinates myPoint.y = mouseKoord.Y; } } visitMsg = TRUE; } ReleaseDC( myWnd, myHdc ); break;
-
Wo wird isPainting gesetzt?

Die DeleteObject-Blöcke finden nur bei !isPainting statt. Da isPainting nirgends gesetzt wird, ist es vorläufig offenbar immer 0.
-
case WM_LBUTTONDOWN: isPainting = TRUE; visitMsg = TRUE; break; case WM_LBUTTONUP: isPainting = FALSE; myPoint.x = -1; myPoint.y = -1; visitMsg = TRUE; break;
-
Mein Gott, machst du es kompliziert!
Wenn WM_LBUTTONDOWN kommt, wird isPainting auf TRUE gesetzt- aber gleich danach, beim Loslassen (WM_LBUTTONUP) wieder auf FALSE. Was soll das denn?
isPainting ist damit völlig überflüssig.Wenn Du während der Mausbewegung zeichnen willst, kannst Du wParam von WM_MOUSEMOVE abfragen:
WM_MOUSEMOVE fwKeys = wParam; // key flags xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor Parameters fwKeys Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values: Value Description MK_CONTROL Set if the CTRL key is down. MK_LBUTTON Set if the left mouse button is down. MK_MBUTTON Set if the middle mouse button is down. MK_RBUTTON Set if the right mouse button is down. MK_SHIFT Set if the SHIFT key is down.
-
Du redest so als müsste ich ein API-King sein, und dann hättest du auch das recht so über meinen Code zu reden...
Ich wusste nicht das bei WM_MOUSEMOVE wParam einer aus der netten liste sein kann..
Habe es umgeschrieben... gleiche symtome wie vorher, dass heißt es klappt...
Also ich kann immer noch nicht zeichnen !? aber dass mit dem wParam klappt... 7 Zeilen code eingespart

LRESULT CALLBACK StaticProc[...]scheint ja wohl messages von
[...]= CreateWindow( "STATIC", *INHALT*, WS_CHILD | WS_VISIBLE | WS_DLGFRAME , *POSX*, *POSY*, *WIDTH*, *HEIGHT*, *PARENT*, NULL, *INSTANCE*, NULL );zu bekomme richtig!?
Bei mir nicht... http://msdn2.microsoft.com/en-us/library/bb760769(VS.85).aspx->using static controls sagt das soll so gehen...
[edit]Danke trotzdem für deinen Post, vereinfacht den Code

-
lippoliv schrieb:
Du redest so als müsste ich ein API-King sein, und dann hättest du auch das recht so über meinen Code zu reden...
Nichts für ungut. Ich bin auch kein Experte. Aber in Deinem Code treten nach und nach immer neue Fehler zu tage, weil Du 1. nicht den vollständigen Code postest, und 2. gar nicht weißt, welche Codeteile Du posten mußt, um den Fehler einzugrenzen. Das wiederum zeigt, daß Du von der WinAPI noch weniger verstanden hast als ich.
Deshalb habe ich Dir die Tutorials ans Herz gelegt, bevor Du Dich an solche Projekte wagst. Sind nicht der Weisheit letzter Schluß, aber man kann daraus einiges lernen, z. B. den Umgang mit den Maustasten oder die Zuordnung der richtigen Funktionen und Variablen an die WM-Nachrichten. Wichtig ist, daß Du Dich mit den darin behandelten WM-Nachrichten und Funktionen auseinandersetzt. Und wenn Du die Programme ein wenig variierst, kann das sehr interessant werden.
Ein Static Control hat nichts mit der Maus und nichts mit dem Schlüsselwort STATIC zu tun, sondern ist eine spezielle Art von Ausgabefenster.
LRESULT CALLBACK StaticProc[...]scheint ja wohl messages von
[...]= CreateWindow( "STATIC", *INHALT*, WS_CHILD | WS_VISIBLE | WS_DLGFRAME , *POSX*, *POSY*, *WIDTH*, *HEIGHT*, *PARENT*, NULL, *INSTANCE*, NULL );zu bekomme richtig!?
Falsch. CreateWindow liefert nur das hWnd zurück. Die Messages werden von der Nachrichtenschleife (TranslateMessage, DispatchMessage) in der WinMain an das jeweilige Fenster geleitet. Jede Message enthält das Handle des Zielfensters.
-
Ich lasse deinen Beitrag mal unkommentiert stehen da ich gerade nicht weiß ob ich mich total irre, oder du nicht ganz verstehst nach welcher art ich meine Codes poste, denn ich will euch nicht mit unsinnigem Code überfluten. Ich mache mir stets gedanken, welche codes ihr braucht und Poste diese dann, ich hatte halt eben nur diesen teil mit dem setzen der Maus vergessen.
Ist in den Tutorials wirklich dass mit WM_LBUTTON drinne? *nochmal nachschau*
Elektronix schrieb:
Falsch. CreateWindow liefert nur das hWnd zurück. Die Messages werden von der Nachrichtenschleife (TranslateMessage, DispatchMessage) in der WinMain an das jeweilige Fenster geleitet. Jede Message enthält das Handle des Zielfensters.
So wie ich dass von MSDN verstanden habe ist dass Falsch.
Die Messages gehen nicht an das Handle, sondern an die klasse die mit dem Handle zusammen hängt.Bei STATIC soll das dieses sein was ich gepostet habe denn:
http://msdn2.microsoft.com/en-us/library/ms632679.aspx => weiter unten LINK "Static Controls"
http://msdn2.microsoft.com/en-us/library/bb760769(VS.85).aspx => uiui...
Notifications sind keine Messages ne!? Wie erhalte ich denn "STN_CLICKED" was dort unter Notification steht...
Ich kann doch nicht einfach:LRESULT CALLBACK WndProc( HWND myWnd, UINT givenMessage, WPARAM wParam, LPARAM lParam ) /* This function recieves the Messages, wich are given from MS-Windows to the program. So the program can do message specific actions, if this message is incoming. */ { switch( givenMessage ) { [...] case WM_COMMAND: if( myWnd == whiteBtn ) printf( "." ); break; [...]schreiben, da zeigt er auch keinen "." an.
whiteBtn = ein STATIC wnd.
auchg wenn ichLRESULT CALLBACK WndProc( HWND myWnd, UINT givenMessage, WPARAM wParam, LPARAM lParam ) /* This function recieves the Messages, wich are given from MS-Windows to the program. So the program can do message specific actions, if this message is incoming. */ { switch( givenMessage ) { [...] case WM_COMMAND: printf( "." ); break; [...]schreibe passiert nichts.
LÖSUNG:
^(nach genauem lesen, und weiterem überlegen fügte ich bei windowCreate nochmal SS_NOTIFY hinzu)^case WM_COMMAND: if( myWnd = whiteBtn) printf( "." ); break;Jetzt verbleibt aber noch das problem mit dem malen, WOBEI ich herausgefunden habe, dass ich einen punkt hinbekomme... Wenn ich eine Farbe wähle, wird ein punkt gezogen und bei dem px wo WM_LBUTTONUP kommt, bleibt dieser PX (je nach width auch mehrere) in der gewählten farbe.
-
VERDAMMT....

if( myWnd = whiteBtn)kein wunder dass das klappt...
irgendwie haut das mit == nicht mehr hin... dabei sollte dass doch gehen?!?
[edit]
Elektronix schrieb:
Die Messages werden von der Nachrichtenschleife (TranslateMessage, DispatchMessage) in der WinMain an das jeweilige Fenster geleitet. Jede Message enthält das Handle des Zielfensters.
Kann es sein dass du "Parentfenster" meinst?
case WM_COMMAND: if( myWnd == myAppWnd ) { printf( "." ); aktPen = &whitePen; //select white pen R = 255; G = 255; B = 255; } else { printf( "%d != %d\n", myWnd, whiteBtn ); } break;myAppWnd == handle meines Hauptfensters...
Ich dachte es müste (zielgerichtet) an das Static genster gehen, was ich geklickt habe...
Also:
Ich habe STATIC fenster eingebaut, weil Buttons zu dick waren.
Wenn ein STATIC fenster geklickt wird, wird an das ParentWnd ein WM_COMMAND gesendet.NUR: wie kann ich jetzt rausbekommen welches STATIC geklickt wurde?
Anhand der Mauskoordinaten? währ ja umständlich, dann müsste ich ja immer wissen, wo gerade meine STATICs sind.MFG und danke für jeden post (auch wenns manchmal nicht so aussieht danke ich euch wirklich)
[edit2]
case WM_COMMAND: if( STN_CLICKED == wParam ) { if( whiteBtn == ? ) printf( "." ); } else { printf( "%d != %d\n", myWnd, whiteBtn ); } break;whiteBtn global HWND
ich bekomme jetzt schonmal mit dass ein STATIC geklickt wird.
http://msdn2.microsoft.com/en-us/library/bb760784(VS.85).aspx
lParam: Handle to the static control.STN_CLICKED.lParam //gibt es nicht whiteBtn == HI/LOWORD(lParam); //geht nicht comparission between pointer and integerwie kann ich jetzt also lParam(was ja anscheinend das handle des geklickten STATIC enthält) mit meinen STATICs vergelichen?