2013-05-26 63 views
1

這是代碼:如何在鼠標光標的當前位置顯示新窗體?

private void hsMagnfier_OnMouseDown(object sender) 
{ 
    int x = mLastCursorPosition.X; 
    int y = mLastCursorPosition.Y; 
    MagnifierForm magnifier = new MagnifierForm(mConfiguration, System.Windows.Forms.Cursor.Position);//mLastCursorPosition); 
    magnifier.Show(); 
} 

上面這個代碼是在Form我可以拖過屏幕。

然後,當我點擊一個圖標時,它正在做magnifier.Show();,放大鏡形式顯示在鼠標當前位置所在的位置。

但是,如果我再次點擊它,所以現在新形式放大鏡的位置在我的Form1中心。而不是在第一次鼠標當前的位置。

這是MagnifierForm代碼可能是第一次在當前鼠標位置,但在下一次/ s它在Form1的中心?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing.Drawing2D; 
using System.IO; 
using System.Drawing.Imaging; 

namespace ScreenVideoRecorder 
{ 
    public partial class MagnifierForm : Form 
    { 

     public MagnifierForm(Configuration configuration, Point startPoint) 
     { 
      InitializeComponent(); 

      //--- My Init --- 
      mConfiguration = configuration; 
      FormBorderStyle = FormBorderStyle.None; 

      ShowInTaskbar = mConfiguration.ShowInTaskbar; 
      TopMost = mConfiguration.TopMostWindow; 
      Width = mConfiguration.MagnifierWidth; 
      Height = mConfiguration.MagnifierHeight; 

      // Make the window (the form) circular 
      GraphicsPath gp = new GraphicsPath(); 
      gp.AddEllipse(ClientRectangle); 
      Region = new Region(gp); 

      mImageMagnifier = Properties.Resources.magnifierGlass; 

      mTimer = new Timer(); 
      mTimer.Enabled = true; 
      mTimer.Interval = 20; 
      mTimer.Tick += new EventHandler(HandleTimer); 

      mScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height); 

      mStartPoint = startPoint; 
      mTargetPoint = startPoint; 

      if (mConfiguration.ShowInTaskbar) 
       ShowInTaskbar = true; 
      else 
       ShowInTaskbar = false; 
     } 

     protected override void OnShown(EventArgs e) 
     { 
      RepositionAndShow(); 
     } 

     private delegate void RepositionAndShowDelegate(); 

     private void RepositionAndShow() 
     { 
      if (InvokeRequired) 
      { 
       Invoke(new RepositionAndShowDelegate(RepositionAndShow)); 
      } 
      else 
      { 
       // Capture the screen image now! 
       Graphics g = Graphics.FromImage(mScreenImage); 
       g.CopyFromScreen(0, 0, 0, 0, new Size(mScreenImage.Width, mScreenImage.Height)); 
       g.Dispose();     

       if (mConfiguration.HideMouseCursor) 
        Cursor.Hide(); 
       else 
        Cursor = Cursors.Cross; 

       Capture = true; 

       if (mConfiguration.RememberLastPoint) 
       { 
        mCurrentPoint = mLastMagnifierPosition; 
        Cursor.Position = mLastMagnifierPosition; 
        Left = (int)mCurrentPoint.X - Width/2; 
        Top = (int)mCurrentPoint.Y - Height/2; 
       } 
       else 
       { 
        mCurrentPoint = Cursor.Position; 
       } 
       Show(); 
      } 
     } 

     void HandleTimer(object sender, EventArgs e) 
     { 
      float dx = mConfiguration.SpeedFactor * (mTargetPoint.X - mCurrentPoint.X); 
      float dy = mConfiguration.SpeedFactor * (mTargetPoint.Y - mCurrentPoint.Y); 

      if (mFirstTime) 
      { 
       mFirstTime = false; 

       mCurrentPoint.X = mTargetPoint.X; 
       mCurrentPoint.Y = mTargetPoint.Y; 

       Left = (int)mCurrentPoint.X - Width/2; 
       Top = (int)mCurrentPoint.Y - Height/2; 

       return; 
      } 

      mCurrentPoint.X += dx; 
      mCurrentPoint.Y += dy; 

      if (Math.Abs(dx) < 1 && Math.Abs(dy) < 1) 
      { 
       mTimer.Enabled = false; 
      } 
      else 
      { 
       // Update location 
       Left = (int)mCurrentPoint.X - Width/2; 
       Top = (int)mCurrentPoint.Y - Height/2; 
       mLastMagnifierPosition = new Point((int)mCurrentPoint.X, (int)mCurrentPoint.Y); 
      } 

      Refresh(); 
     } 


     protected override void OnMouseDown(MouseEventArgs e) 
     { 
      mOffset = new Point(Width/2 - e.X, Height/2 - e.Y); 
      mCurrentPoint = PointToScreen(new Point(e.X + mOffset.X, e.Y + mOffset.Y)); 
      mTargetPoint = mCurrentPoint; 
      mTimer.Enabled = true; 
     } 

     protected override void OnMouseUp(MouseEventArgs e) 
     { 
      if (mConfiguration.CloseOnMouseUp) 
      { 
       Close(); 
       mScreenImage.Dispose(); 
      } 

      Cursor.Show(); 
      Cursor.Position = mStartPoint;    
     } 

     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       mTargetPoint = PointToScreen(new Point(e.X + mOffset.X, e.Y + mOffset.Y)); 
       mTimer.Enabled = true; 
      } 
     } 

     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      if (mConfiguration.DoubleBuffered) 
      { 
       // Do not paint background (required for double buffering)! 
      } 
      else 
      { 
       base.OnPaintBackground(e); 
      } 
     } 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      if (mBufferImage == null) 
      { 
       mBufferImage = new Bitmap(Width, Height); 
      } 
      Graphics bufferGrf = Graphics.FromImage(mBufferImage); 

      Graphics g; 

      if (mConfiguration.DoubleBuffered) 
      { 
       g = bufferGrf; 
      } 
      else 
      { 
       g = e.Graphics; 
      } 

      if (mScreenImage != null) 
      { 
       Rectangle dest = new Rectangle(0, 0, Width, Height); 
       int w = (int)(Width/mConfiguration.ZoomFactor); 
       int h = (int)(Height/mConfiguration.ZoomFactor); 
       int x = Left - w/2 + Width/2; 
       int y = Top - h/2 + Height/2; 

       g.DrawImage(
        mScreenImage, 
        dest, 
        x, y, 
        w, h, 
        GraphicsUnit.Pixel); 
      } 

      if (mImageMagnifier != null) 
      { 
       g.DrawImage(mImageMagnifier, 0, 0, Width, Height); 
      } 

      if (mConfiguration.DoubleBuffered) 
      { 
       e.Graphics.DrawImage(mBufferImage, 0, 0, Width, Height); 
      }  
     } 


     //--- Data Members --- 
     #region Data Members 
     private Timer mTimer; 
     private Configuration mConfiguration; 
     private Image mImageMagnifier; 
     private Image mBufferImage = null; 
     private Image mScreenImage = null; 
     private Point mStartPoint; 
     private PointF mTargetPoint; 
     private PointF mCurrentPoint; 
     private Point mOffset; 
     private bool mFirstTime = true; 
     private static Point mLastMagnifierPosition = Cursor.Position; 
     #endregion 
    } 
} 

新窗體放大鏡第一次出現在我的鼠標光標處。 下一次我點擊它顯示Form1中心的放大鏡窗體,而不是鼠標光標的位置。

這是爲什麼?當我再次在圖標上點擊它時,它仍在做

System.Windows.Forms.Cursor.Position 

再次。奇怪。

+0

經過再次第一時間內它顯示在鼠標cursour但下一次的當前位置的放大鏡形式/ s的它顯示的位置,新的放大鏡形式放大鏡的形式是最後一次。如果我在屏幕上移動放大鏡的形狀,並在下一次將它放在某處,我將再次顯示放大鏡,它將放在最後放置的位置,而不是放在鼠標光標所在的位置。我再次檢查每次我點擊以顯示它正在做System.Windows.Forms.Cursor.Position的放大鏡形式,但顯示它在最後的地方,而不是鼠標cursour是。 –

+0

有些東西可以防止放大鏡窗體顯示鼠標光標所在的位置,並使其顯示放大鏡上一次放置的位置。有些東西需要重新設置,可能是配置中的東西。 –

回答

0

好發現的部分,這樣做是在這裏的放大鏡形式:

mConfiguration.RememberLastPoint = false; 
if (mConfiguration.RememberLastPoint) 
{ 
    mCurrentPoint = mLastMagnifierPosition; 
    Cursor.Position = mLastMagnifierPosition; 
    Left = (int)mCurrentPoint.X - Width/2; 
    Top = (int)mCurrentPoint.Y - Height/2; 
} 
else 
{ 
    mCurrentPoint = Cursor.Position; 
} 

所以我說,現在行:mConfiguration.RememberLastPoint = false;該做的工作現在。

0

考慮你有兩種形式 - MasterChild

如果您在MouseUp事件(例如)調用從主的孩子,把代碼寫在事件的Master形式MouseUp

ChildForm obj=new ChildForm(); 
obj.pntLocation = new Point(Cursor.Position.X, Cursor.Position.Y); 
obj.ShowDialog(); 

聲明一個可變兒童內部位置

public Point pntLocation; 

現在設定位置離子 Child

this.Location = pntLocation; 
相關問題