Announcement

Collapse
No announcement yet.

Auswahlrahmen mit Win32-API-Mitteln erstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Auswahlrahmen mit Win32-API-Mitteln erstellen

    Ich stehe vor der Aufgabe ein Auswählrechtecht zu erstellen so wie es Paint geht. Nur klappt das nicht so wie ich das gerne hätte.

    Ich erzeuge mir einen Pen beim WM_Create:

    Code:
    Pen = CreatePen(PS_DASH,1,RGB(0,0,0));
    Wenn nun der linke Mausbutton gedrückt wird, dann merke ich mir die Koordinaten der linken oberen Ecke des späteren Rechtecks.

    Code:
    case WM_LBUTTONDOWN:
        // aktuelle Mausposition ermitteln
       x = LOWORD(lParam);
       y = HIWORD(lParam);
    
       x_Start = x;
       y_Start = y;
    
       isDrawing = true;
    
       break;
    So nun behandel ich die WM_MOUSEMOVE - Message:

    Code:
    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;
    Code:
    case WM_LBUTTONUP :
        isDrawing = false;
        break;
    Nur wird nix gezeichnet

    Hat jemand eine Idee?
    Zuletzt editiert von Board00; 12.03.2007, 14:05.

  • #2
    a) um solch simplen Sachverhalt darzustellen ist es notwendig solch Riesengrafik einzubinden??

    :-(

    b) Welche Parameter erwarter rectangel?Startpunkt x und y sowie Breite und Höhe. Die ergeben sich aus

    x * Programminfo.Raster, y * Programminfo.Raster / 2

    ???

    Mitnichten wird die Mausposition erwartet....
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      a) um solch simplen Sachverhalt darzustellen ist es notwendig solch Riesengrafik einzubinden??

      :-(
      ist geändert Besser so?

      Originally posted by Christian Marquardt View Post
      b) Welche Parameter erwarter rectangel?Startpunkt x und y sowie Breite und Höhe.
      BOOL Rectangle(
      HDC hdc, // handle to device context
      int nLeftRect, // x-coord of bounding rectangle's upper-left corner
      int nTopRect, // y-coord of bounding rectangle's upper-left corner
      int nRightRect, // x-coord of bounding rectangle's lower-right corner
      int nBottomRect // y-coord of bounding rectangle's lower-right corner
      );

      wo ist da höhe und Breite? Ich sehe nur vier Punkte. Und Sorry, jeder fängt mal klein an

      Comment


      • #4
        Das rectangle ist definiert mit

        x,y,Breite (nRight), Höhe(nBottom)

        Ein Rechteck beginnend an Position 10/10 mit der Höhe 20 und der Breite 20 wird dann

        10,10,20,20

        erstellt

        Jedoch ein Rechteckt an Positon 10/10 bis zur Position 50/50 (ggf. Mausposition)wird dann mit

        10,10,40,40

        erstellt. Wenn es bis zur Position 50 gehen soll und bei 10 startet, ist es eben nur 40 breit

        Es ist ein Unterschied, ob die beiden letzten Angaben die Breite und Höhe bezogen auf den Startpunkt sind oder Positionen bezogen auf das Koordinatensystem (in diesem Falle Mauspositionen)

        Siehe auch

        http://msdn2.microsoft.com/en-us/library/ms536133.aspx
        Zuletzt editiert von Christian Marquardt; 12.03.2007, 14:26.
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Jedoch ein Rechteckt an Positon 10/10 bis zur Position 50/50 (ggf. Mausposition)wird dann mit

          10,10,40,40

          erstellt.
          nee, das stimnmt leider nicht. Wenn ich es nach deinem Weg mache, dan stimmt es nicht.

          so habe ich es nun hinbekommen:

          Code:
          case WM_LBUTTONDOWN:
                  {
          
          			if (NULL == SetCursor(LoadCursor(NULL,IDC_CROSS)))
          			{
          				MeldeFehler();				
          			}
          
          
                      Last.x = LOWORD(lParam);
                      Last.y = HIWORD(lParam);
          
          			sprintf(szKoordinaten, "%s xSTART: %d, ySTART: %d", szTitle, Last.x, Last.y);
          
          			if (!SetWindowText(hWnd, szKoordinaten))
          			{
          				MeldeFehler();
          			}
          
          			UpdateWindow(hWnd);
          
                      return 0;
                  }
          Code:
          case WM_MOUSEMOVE:
                  {
          
          	    tempx = LOWORD(lParam);
                      tempy = HIWORD(lParam);
          
                      if (Last.x != 0 && Last.y != 0 && wParam == MK_LBUTTON)
                      {
          				
          				if (NULL == SetCursor(LoadCursor(NULL,IDC_CROSS)))
          				{
          
          					MeldeFehler();
          				}
          
                          HDC hDC = GetDC(hWnd);				
          
          				SetROP2(hDC, R2_WHITE);
          
                          int i= Rectangle(hDC,rcClient.top,rcClient.left,rcClient.right,rcClient.bottom);
          
          				SetROP2(hDC, R2_NOTXORPEN );
          
          				i= Rectangle(hDC,Last.x,Last.y,	tempx, tempy );
          
                          ReleaseDC(hWnd,hDC);
                      
          			}
          
          			sprintf(szKoordinaten, "%s xSTART: %d, ySTART: %d, x: %d, y: %d", szTitle, Last.x, Last.y, tempx, tempy);
          
          			if (!SetWindowText(hWnd, szKoordinaten))
          			{
          				MeldeFehler();
          			}
          
          			UpdateWindow(hWnd);
          
                      return 0;
                  }
          Code:
          case WM_LBUTTONUP:
                  {
                      Last.x = Last.y = 0;
          
          			if (NULL == SetCursor(LoadCursor(NULL,IDC_ARROW)))
          			{
          				MeldeFehler();
          			}					
          
          			if (!SetWindowText(hWnd, szTitle))
          			{
          				MeldeFehler();
          			}
          
                      UpdateWindow(hWnd);
                      return 0;
                  }
          So klappt es, wenn ich wie du sagtest die Höhe und Breite errechnet habe und es zeichnen wollte, wurde das Rechteck immer vom der oberen Fensterleiste bis zu den Startkoordinaten gezeichnet, dann hat sich das Recheckt umgedreht und wurde nach unten weitergezeichnet, aber mit einem Versatz, d.h. der Eckpunkt war nie unter der Maus.

          Trotzdem danke für deine "Hilfe" und sei das nächste mal bitte etwas freundlicher zu den Neuen

          Comment


          • #6
            Wo war ich unfreundlich

            :-((

            Weil ich bemängelt habe, dass du eine Riesengrafik ohne Sinn eingebunden hast?

            Hinsichtlich des Rechtecks hast du Recht ->sry->hätte nur auf meiner eigenen Site lesen müssen

            http://www.marquardtnet.info/cecke/q...quicky_41.html
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              a) um solch simplen Sachverhalt darzustellen ist es notwendig solch Riesengrafik einzubinden??

              :-(

              b) Welche Parameter erwarter rectangel?Startpunkt x und y sowie Breite und Höhe. Die ergeben sich aus

              x * Programminfo.Raster, y * Programminfo.Raster / 2

              ???

              Mitnichten wird die Mausposition erwartet....

              es klang so für mich wie etwas überheblich rübergbracht falls es nicht so war sorry

              Comment

              Working...
              X