以下功能旨在响应于鼠标按钮消息(例如WM_LBUTTONDOWN)来调用。该函数确定用户是否在图像的边界矩形内单击。如果用户点击,该函数将捕获鼠标输入,从客户端区域擦除图像,并计算图像中热点的位置。该函数将热点设置为与鼠标光标的热点一致。然后该函数通过调用ImageList_BeginDrag开始拖动操作。
// StartDragging - 开始拖动位图。
//如果成功返回TRUE,否则返回FALSE。
// hwnd - 拖动位图的窗口的句柄
// ptCur - 光标的坐标
// himl - 图片列表的句柄
//
//全局变量
// g_rcImage - 要拖动的图像的边界矩形
// g_nImage - 图像索引
// g_ptHotSpot - 图像热点的位置
// g_cxBorder和g_cyBorder - 边框的宽度和高度
// g_cyCaption和g_cyMenu - 标题栏和菜单栏的高度
extern RECT g_rcImage;
extern int g_nImage;
extern POINT g_ptHotSpot;
BOOL StartDragging(HWND hwnd, POINT ptCur, HIMAGELIST himl)
{
//如果光标不在边界的矩形中,则返回
// 图片。
if(!PtInRect(& g_rcImage,ptCur))
return FALSE;
//捕获鼠标输入。
SetCapture(hwnd);
//从客户区擦除图像。
InvalidateRect(hwnd, &g_rcImage, TRUE);
UpdateWindow(hwnd);
//计算热点的位置,并保存。
g_ptHotSpot.x = ptCur.x - g_rcImage.left;
g_ptHotSpot.y = ptCur.y - g_rcImage.top;
//开始拖动操作。
if(!ImageList_BeginDrag(himl,g_nImage,
g_ptHotSpot.x,g_ptHotSpot.y))
return FALSE;
//设置图像的初始位置,使其可见。
//因为ImageList_DragEnter函数需要坐标
//相对于给定窗口的左上角,
//需要边框宽度,标题栏和菜单栏
//考虑到
ImageList_DragEnter(hwnd,ptCur.x + g_cxBorder,
ptCur.y + g_cyBorder + g_cyCaption + g_cyMenu);
g_fDragging = TRUE;
return TRUE;
}