hur.cn - 华软网

 热门搜索

鼠标拖拽事件怎么实现

  作者:未知    来源:网络    更新时间:2011/5/25
我动态创建了一组CSTATIC控件来显示图片,他们显示成一排,怎样实现拖拽任意一个进行位置变换、
例如:拖拽第一个控件到第五个控件的后面,那么这个被拖拽的控件放在了第五的位置,之前的2,3,4,5向前串,变成1,2,3,4。怎么实现、、

类似于在文件夹里用幻灯片模式查看图片,下面的图片可以按住进行随意的拖拽,变换位置,变换位置怎么实现?

高手们给的思路是:WM_LBUTTDOWN/WM_LBUTTONUP/WM_MOUEMOVE(),SetWindowPos/MoveWindow();
具体怎么做呢。。详细点
有实例更好
---华软 网友回答---
C++">BOOL m_bDown = FALSE;
CPoint m_ptStart;
CRect m_rcWnd;
BOOL CXXDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC1);
ASSERT(pStatic);
if(pMsg->hwnd == pStatic->GetSafeHwnd())
{
switch(pMsg->message)
{
case WM_LBUTTONDOWN:
{
m_bDown = TRUE;
m_ptStart.x = pMsg->pt.x;
m_ptStart.y = pMsg->pt.y;
pStatic->GetWindowRect(&m_rcWnd);
ScreenToClient(&m_rcWnd);
}
break;

case WM_LBUTTONUP:
{
m_bDown = FALSE;
}
break;

case WM_MOUSEMOVE:
{
if(m_bDown)
{
int nWidth = m_rcWnd.Width();
int nHeight = m_rcWnd.Height();
int cx = pMsg->pt.x - m_ptStart.x;
int cy = pMsg->pt.y - m_ptStart.y;
m_rcWnd.left += cx;
m_rcWnd.top += cy;
m_rcWnd.right = m_rcWnd.left + nWidth;
m_rcWnd.bottom = m_rcWnd.top + nHeight;
pStatic->MoveWindow(&m_rcWnd);
m_ptStart.x = pMsg->pt.x;
m_ptStart.y = pMsg->pt.y;
}
}
break;

default:
break;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

上面的这个示例代码是在对话框的Client区域中拖动一个Picture 控件
---华软网友回复---
上面有个Bug,就是当拖动超过窗口范围的时候,就收不到UP的消息,这样m_bDown标记的值就不正确了,可以添加处理WM_MOUSEHOVER/WM_MOSUELEAVE消息,当鼠标离开窗口区域的时候,设置m_bDown为FALSE即可
---华软网友回复---
class MyStatic:CStatic
{
bool flag;
list<MyStaitic>* pStaticList;
int MouseUp();
};
从CStatic类继承一个类,当鼠标按下时 这个类在有个成员变量flag记录,当鼠标Up时调用类中的一个函数这个函数是MouseUp判断是否应该换位,如果需换则换。
这样做可能麻烦一些,但如果你控件数目不定或许可以试试      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。