Auswahlrahmen mit Win32-API-Mitteln erstellen
-
Da es in meinem vorherigen Thread (http://www.c-plusplus.net/forum/viewtopic-var-t-is-175423.html) zu allgemein war, nöchte ich jetzt direkt fragen wie man so einen Auswahlrahnem (ist das überhaupt der richtige Name, wenn nicht wie heißt das überhaupt richtig?) nit Win32-API Mitteln erstellt.
Bisher habe ich folgendes:
case WM_LBUTTONDOWN: // aktuelle Mausposition ermitteln x = LOWORD(lParam); y = HIWORD(lParam); x_Start = x; y_Start = y; isDrawing = true; break;damit merke ich mir den Startpunkt. So, dann behandel ich die WM_MOUSEMOVE Message:
case WM_MOUSEMOVE : if (isDrawing) // Rechteck wird gewähk und wird gezeihnet { SelectObject(hDC, Brush); SelectObject(hDC, Pen); x = LOWORD(lParam); y = HIWORD(lParam); Rectangle(hDC, x_Start, y_Start, x * Programminfo.Raster, y * Programminfo.Raster / 2); } break;case WM_LBUTTONUP : isDrawing = false; break;Meine Pen habe ich mit
Pen = CreatePen(PS_DASH,1,RGB(255,255,255));erstellt, damit der unterbrochene Stricheffekt erzeugt wird. Nur wird nirgends das Rechteck gezeichnet. Als Nob in Win32-API Programmierung stehe ich grad völlig auf dem Schlauch

Hat jemand von Euch einen Tipp oder kann mir sagen wie dieses Auswahl-Dinges überhaupt richtig heißt, damit ich bei google was dazu finde?
Danke.
-
wo bekommst du denn hDC her?
-
Malen darfst du nur während der Behandlung von WM_PAINT. Da hast du dann auch einen DC, mit dem das funktionieren sollte. Wo deiner (hDC) herkommt, sieht man ja nicht.
-
den hDC hab ich mir so geholt:
hDC = GetDC(Programminfo.handles.Zeichnenfenster);Darf man nur bei WM_PAINT malen? Wenn ja wie löse ich das aus, dass ich hier die Werte kriege und dann bei Paint das Rechteck zeichne?
-
Bard00 schrieb:
Darf man nur bei WM_PAINT malen?
Ja.
Wenn ja wie löse ich das aus, dass ich hier die Werte kriege und dann bei Paint das Rechteck zeichne?
Du kannst dir doch bei WM_MOUSEMOVE auf dieselbe Art und Weise die aktuelle Endposition merken, wie die Startposition bei WM_LBUTTONDOWN.
-
Du kannst dir doch bei WM_MOUSEMOVE auf dieselbe Art und Weise die aktuelle Endposition merken, wie die Startposition bei WM_LBUTTONDOWN.
bei LButtondown muss ich mir doch die Startkoordinaten des Rechtecks merken, oder etwa nicht?
-
MFK schrieb:
Bard00 schrieb:
Darf man nur bei WM_PAINT malen?
Ja.
Warum macht es MS in dem Beispiel anders?
http://msdn2.microsoft.com/en-us/library/ms536133.aspx
case WM_MOUSEMOVE: // Draw a target rectangle or drag the bitmap rectangle, // depending on the status of the fDragRect flag. if ((wParam && MK_LBUTTON) && !fDragRect) { // Set the mix mode so that the pen color is the // inverse of the background color. The previous // rectangle can then be erased by drawing // another rectangle on top of it. hdc = GetDC(hwnd); SetROP2(hdc, R2_NOTXORPEN); // If a previous target rectangle exists, erase // it by drawing another rectangle on top of it. if (!IsRectEmpty(&rcTarget)) { Rectangle(hdc, rcTarget.left, rcTarget.top, rcTarget.right, rcTarget.bottom); } // Save the coordinates of the target rectangle. Avoid // invalid rectangles by ensuring that the value of // the left coordinate is greater than that of the // right coordinate, and that the value of the bottom // coordinate is greater than that of the top. if ((pt.x < (LONG) LOWORD(lParam)) && (pt.y > (LONG) HIWORD(lParam))) { SetRect(&rcTarget, pt.x, HIWORD(lParam), LOWORD(lParam), pt.y); } else if ((pt.x > (LONG) LOWORD(lParam)) && (pt.y > (LONG) HIWORD(lParam))) { SetRect(&rcTarget, LOWORD(lParam), HIWORD(lParam), pt.x, pt.y); } else if ((pt.x > (LONG) LOWORD(lParam)) && (pt.y < (LONG) HIWORD(lParam))) { SetRect(&rcTarget, LOWORD(lParam), pt.y, pt.x, HIWORD(lParam)); } else { SetRect(&rcTarget, pt.x, pt.y, LOWORD(lParam), HIWORD(lParam)); } // Draw the new target rectangle. Rectangle(hdc, rcTarget.left, rcTarget.top, rcTarget.right, rcTarget.bottom); ReleaseDC(hwnd, hdc); }

-
Du kannst auch außerhalb der WM_PAINT malen, nur sendet Windows gerne WM_PAINT-Nachrichten (z.B. wenn ein anderes Fenster über dein Fenster gezogen wird, sich die Fenstergröße ändert, etc.) und WM_ERASEBKGND-Nachrichten.
D.h.: Wenn du außerhalb von WM_PAINT zeichnest verschwindet sehr wahrscheinlich dein Auswahlrahmen wenn WM_PAINT/WM_ERASEBKGND an dein Fenster geschickt wird

-
Hast du x_Start und y_Start als "static int" oder alternativ global definiert?
Wenn nein, dann verliert die Funktion den Wert, wenn die Maus bewegt wird.Bard00 schrieb:
Da es in meinem vorherigen Thread (http://www.c-plusplus.net/forum/viewtopic-var-t-is-175423.html) zu allgemein war, nöchte ich jetzt direkt fragen wie man so einen Auswahlrahnem (ist das überhaupt der richtige Name, wenn nicht wie heißt das überhaupt richtig?) nit Win32-API Mitteln erstellt.
Bisher habe ich folgendes:
case WM_LBUTTONDOWN: // aktuelle Mausposition ermitteln x = LOWORD(lParam); y = HIWORD(lParam); x_Start = x; y_Start = y; isDrawing = true; break;damit merke ich mir den Startpunkt. So, dann behandel ich die WM_MOUSEMOVE Message:
case WM_MOUSEMOVE : if (isDrawing) // Rechteck wird gewähk und wird gezeihnet { SelectObject(hDC, Brush); SelectObject(hDC, Pen); x = LOWORD(lParam); y = HIWORD(lParam); Rectangle(hDC, x_Start, y_Start, x * Programminfo.Raster, y * Programminfo.Raster / 2); } break;case WM_LBUTTONUP : isDrawing = false; break;Meine Pen habe ich mit
Pen = CreatePen(PS_DASH,1,RGB(255,255,255));erstellt, damit der unterbrochene Stricheffekt erzeugt wird. Nur wird nirgends das Rechteck gezeichnet. Als Nob in Win32-API Programmierung stehe ich grad völlig auf dem Schlauch

Hat jemand von Euch einen Tipp oder kann mir sagen wie dieses Auswahl-Dinges überhaupt richtig heißt, damit ich bei google was dazu finde?
Danke.