2012-04-25 86 views
0

我有一個圖片大於PictureEdit框的問題,當用鼠標創建矩形時圖片上的正確點沒有被選中。它似乎是在PictureEdit中選擇點而不是它自己的圖像。我正在嘗試裁剪圖像並將裁剪後的圖像放置在新的Pictureedit中。下面的示例代碼。Devexpress PictureEdit裁剪問題

private void originalPictureEdit_MouseDown(object sender, MouseEventArgs e) 
{ 
    //Point TextStartLocation = e.Location; 
    Cursor = Cursors.IBeam; 

    if (_drawStarted == false) 
    { 
     _drawStarted = true; 

     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      Cursor = Cursors.Cross; 

      _cropX = e.X; 
      _cropY = e.Y; 
      _selection = new Rectangle(new Point(e.X, e.Y), new Size()); 
      _cropPen = new Pen(Color.Black, 1); 
      _cropPen.DashStyle = DashStyle.DashDotDot; 
     } 
    } 

    originalPictureEdit.Refresh(); 
} 

private void originalPictureEdit_MouseMove(object sender, MouseEventArgs e) 
{ 

    if (originalPictureEdit.Image == null) 
     return; 

    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     originalPictureEdit.Refresh(); 
     _selection.Width = e.X - _selection.X; 
     _selection.Height = e.Y - _selection.Y; 
     originalPictureEdit.CreateGraphics().DrawRectangle(_cropPen, _cropX, _cropY, _selection.Width, _selection.Height); 

    }   
} 

private void originalPictureEdit_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left && _drawStarted && _selection.Size != new Size()) 
    { 
     _croppedImage = (_displayedImage as Bitmap).Clone(_selection, _displayedImage.PixelFormat); 

     modifiedPictureEdit.Image = _croppedImage; 
     modifiedPictureEdit.Width = _croppedImage.Width; 
     modifiedPictureEdit.Height = _croppedImage.Height; 
    } 

    Cursor = Cursors.Default; 

    _drawStarted = false; 
} 

回答

1

我需要找到滾動條的位置。以下是MouseUp的工作代碼:

private void pictureEdit1_MouseUp(object sender, MouseEventArgs e) 
{ 
     if (e.Button == MouseButtons.Left && _drawStarted && _selection.Size != new Size()) 
     { 
      PictureEditViewInfo viewInfo = originalPictureEdit.GetViewInfo() as PictureEditViewInfo; 
      PropertyInfo pr = viewInfo.GetType().GetProperty("HScrollBarPosition", BindingFlags.Instance | BindingFlags.NonPublic); 
      int fHScrollBarPosition = (int)pr.GetValue(viewInfo, null); 
      pr = viewInfo.GetType().GetProperty("VScrollBarPosition", BindingFlags.Instance | BindingFlags.NonPublic); 
      int fVScrollBarPosition = (int)pr.GetValue(viewInfo, null); 
      _selection.X += fHScrollBarPosition; 
      _selection.Y += fVScrollBarPosition; 

      Crop(); 
     } 

     Cursor = Cursors.Default; 

     _drawStarted = false; 
} 
0

PictureEdit控制可以抵消或放大顯示圖像,所以你應該接受在計算這些因素。我相信下面的方法可以幫助你:

PictureEditViewInfo viewInfo = GetViewInfo(originalPictureEdit); 
Rectangle cropRect = new Rectangle(
    _selection.X - viewInfo.PictureStartX, 
    _selection.Y - viewInfo.PictureStartY, 
    _selection.Width, 
    _selection.Height); 
_croppedImage = (originalPictureEdit.Image as Bitmap).Clone(cropRect, 
    originalPictureEdit.Image.PixelFormat); 
//... 
static PictureEditViewInfo GetViewInfo(PictureEdit edit) { 
    PropertyInfo pInfo = typeof(BaseEdit).GetProperty("ViewInfo", 
     BindingFlags.Instance | BindingFlags.NonPublic); 
    return (PictureEditViewInfo)pInfo.GetValue(edit, new object[] { }); 
} 

此外,我建議你用下面的更換pictureedit graphich直接繪圖:

//... 
Point frameLocation = originalPictureEdit.PointToScreen(_selection.Location); 
ControlPaint.DrawReversibleFrame(
    new Rectangle(frameLocation, _selection.Size), Color.Black, FrameStyle.Dashed);