如果已经提出要求,我会事先道歉。搜索stackoverflow和互联网并没有提供任何有用的例子。
在正在运行的程序中,我有一个图片框,我需要能够从一个GroupBox单击并拖动到另一个GroupBox。我知道如何在WinForm本身周围拖动图片框(即没有涉及任何GroupBox)。 我找不到任何如何做到这一点的例子。
我为组合框/鼠标交互相关的每个事件创建了代码(请参阅代码的结尾)。
注意:感谢您对需要代码的反馈。我是新的Stack Overflow。
INTERFACE: Initial Interface
问题: 当我在组框上单击并拖动pbxMoveIt时,组框事件永远不会根据状态标签中的文本触发。
Dragging image over group box doesn't trigger group box enter, hover or other events
当我在不拖动任何内容的情况下移动鼠标时,组框鼠标悬停事件将触发。
Group box mouse hover event fires when not dragging anything.
ADDED代码:
namespace MoveControlsOnFormBetweenGroupBoxes {
public partial class frmMain : Form {
private Point m_MouseDownLocation;
private bool m_IsDragging;
public frmMain ( ) {
InitializeComponent ( );
pbxMoveIt.BringToFront ( );
gbx1.AllowDrop = true;
gbx2.AllowDrop = true;
lblStatus.Text = "GUI Status: Started";
}
#region Picture Box Related Methods
// Picture Related Methods
private void pbxMoveIt_MouseDown ( object sender, MouseEventArgs e ) {
lblStatus.Text = "GUI Status: pbxMoveIt - MouseDown";
if ( e.Button == MouseButtons.Left ) {
m_MouseDownLocation = e.Location;
m_IsDragging = true;
}
}
private void pbxMoveIt_MouseMove ( object sender, MouseEventArgs e ) {
int newX;
int newY;
int minX = 10;
int minY = 10;
int maxX = this.Width - (25 + pbxMoveIt.Width);
int maxY = this.Height - (45 + pbxMoveIt.Height);
if ( e.Button == MouseButtons.Left ) {
lblStatus.Text = "GUI Status: pbxMoveIt - MouseMove";
newX = e.X + pbxMoveIt.Left - m_MouseDownLocation.X;
newY = e.Y + pbxMoveIt.Top - m_MouseDownLocation.Y;
if ( m_IsDragging ) {
if ( ( newX >= minX ) && ( newX <= maxX ) ) {
pbxMoveIt.Left = newX;
}
if ( ( newY >= minY ) && ( newY <= maxY ) ) {
pbxMoveIt.Top = newY;
}
}
}
}
private void pbxMoveIt_MouseUp ( object sender, MouseEventArgs e ) {
lblStatus.Text = "GUI Status: pbxMoveIt - MouseUp";
if ( e.Button == System.Windows.Forms.MouseButtons.Left ) {
m_IsDragging = false;
}
}
#endregion
#region Group Box Related
// Group Box Related Methods
private string Gbx_Title ( object sender ) {
string boxTitle = "Unknown";
if ( sender == gbx1 ) {
boxTitle = "Group Box 1";
}
if ( sender == gbx2 ) {
boxTitle = "Group Box 2";
}
return boxTitle;
}
private void gbx_DragDrop ( object sender, DragEventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - DragDrop", Gbx_Title ( sender ) );
}
private void gbx_DragEnter ( object sender, DragEventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - DragEnter", Gbx_Title ( sender ) );
}
private void gbx_DragLeave ( object sender, EventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - DragLeave", Gbx_Title ( sender ) );
}
private void gbx_DragOver ( object sender, DragEventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - DragOver", Gbx_Title ( sender ) );
}
private void gbx_Enter ( object sender, EventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - Enter", Gbx_Title ( sender ) );
}
private void gbx_Leave ( object sender, EventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - Leave", Gbx_Title ( sender ) );
}
private void gbx_MouseHover ( object sender, EventArgs e ) {
lblStatus.Text = String.Format ( "GUI Status: {0} - MouseHover", Gbx_Title ( sender ) );
}
#endregion
}
}
答案 0 :(得分:0)
将我的课程添加到您的项目中
using System;
using System.Windows.Forms;
namespace Hector.Framework.Utils
{
public class Drag : Form
{
private bool isDraggable;
private Control target;
private int a, b;
public Drag(){}
public void Grab(Control control)
{
try
{
this.isDraggable = true;
this.target = control;
this.a = Control.MousePosition.X - this.target.Left;
this.b = Control.MousePosition.Y - this.target.Top;
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
public void MoveObject(bool Horizontal = true, bool Vertical = true)
{
try
{
if (this.isDraggable)
{
int x = Control.MousePosition.X,
y = Control.MousePosition.Y;
if (Horizontal)
{
this.target.Left = x - this.a;
}
if (Vertical)
{
this.target.Top = y - this.b;
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public void Release()
{
this.isDraggable = false;
}
}
}
然后,调用PictureBox事件
public partial class Form1 : Form
{
private Hector.Framework.Utils.Drag drag = new Hector.Framework.Utils.Drag();
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
drag.Grab(pictureBox);
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
drag.Release();
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
drag.MoveObject();
}
}