请问我如何拖动图像列表, 就象资源管理器那样拖动图标(200分)

  • 主题发起人 主题发起人 zmzmzm
  • 开始时间 开始时间
拖动位图:
==============================================================================================
所需变量:
RECT rect;
int i;
static struct IMAGE
{
POINT pt;
//显示的位置
} im [ImageNum];

static POINT ptt;
POINT pt;
static int iPos;
拖动时为1,否则为0
static HIMAGELIST himg;
static int num;
记录进行拖动时的图象索引
int Dx(void){return GetSystemMetrics(SM_CXFIXEDFRAME)+1;}
int Dy(void){
return GetSystemMetrics(SM_CYFIXEDFRAME)+GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYMENU)+1;
}
由于一个是客户区坐标,一个是窗口坐标,有一些误差
case WM_CREATE:
加载图象列表.himg
初始化 im[ImageNum],使之有显示的位置
break;

case WM_LBUTTONDOWN:
for(i=0;i<ImageNum;i++)
{
SetRect( 将第i个位图RECT装置在 rect中
&amp;rect,
im.pt.x,
im.pt.y,
im.pt.x+32,
im.pt.y+32
);

if(PtInRect(&amp;rect,pt)&amp;&amp;himg) 测试鼠标按下时是否在图象上
{
iPos=1;

SetCapture(hwnd);
将鼠标所有捕获设置到这个窗口
ShowCursor(FALSE);
隐含鼠标,也可以不用
ptt.x=LOWORD(lParam)-im.pt.x-2;
热点坐标,当前光标与图象左上角坐标之差
ptt.y=HIWORD(lParam)-im.pt.y-2;
-2好象更好一些
num=i;
记录进行拖动时的图象索引,以便在WM_LBUTTONUP里
让程序识别哪个图象该变化
ImageList_begin
Drag(himg,i,ptt.x,ptt.y);
//创建一个临时的图象列表用于拖动,这里用的是原来的图象,i为图象的索引,
ptt.x,ptt.y为热点坐标,自此开始拖动
ImageList_DragEnter(hwnd,pt.x+Dx(),pt.y+Dy());

break;
}
}
break;
case WM_MOUSEMOVE:
if(iPos)
{
ImageList_DragMove(LOWORD(lParam)+Dx(),HIWORD(lParam)+Dy());
//移动开始
}
break;

case WM_LBUTTONUP:
if(iPos) iPos=1时才拖动
{
ImageList_EndDrag();
ImageList_DragLeave(hwnd);
//此二函数表明拖动结束
ReleaseCapture();
与SetCapture(hwnd)相对应,结束对鼠标的捕捉
ShowCursor(TRUE);
GetClientRect(hwnd,&amp;rect);
得到客户区的RECT
pt.x=im[num].pt.x;

pt.y=im[num].pt.y;
将图象上个坐标储存起来
im[num].pt.x=LOWORD(lParam)-ptt.x;
im[num].pt.y=HIWORD(lParam)-ptt.y;
确定UP后的坐标
if(!PtInRect(&amp;rect,im[num].pt)) 如果不在客户区内,则恢复原值
im[num].pt=pt;
InvalidateRect(hwnd,NULL,TRUE);
iPos=0;
}
break;
case WM_PAINT:
hdc = begin
Paint(hwnd, &amp;ps);
for(i=0;i<ImageNum;i++)
ImageList_Draw(himg,i,hdc,im.pt.x,im.pt.y,ILD_NORMAL|ILD_TRANSPARENT);
EndPaint(hwnd, &amp;ps);
break;
 
好详细啊谢谢
 
后退
顶部