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.


Anmelden zum Antworten