开始拖动操作

【勇芳软件工作室】汉化HomePreviousNext

以下功能旨在响应于鼠标按钮消息(例如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;

}