用MouseMove让图片移动,怎样可以根据鼠标移动速度的快慢来控制? 我自己画了一个滚动条,用MouseMove让图片移动,现在可以移动了,但不知道怎样可以根据鼠标移动速度的快慢来控制?谢谢大家帮忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用postmessage不停的发消息,带上鼠标点的位置!响应消息的时候,取得最新的消息与点,然后刷新!这样就可以了! 你说的计时器 是SetTiemr吧?当一直MouseMove,不抬起鼠标时怎样得到其中的距离和时间? 我想这样应该不对吧,鼠标没有抬起之前Move的速度就会有变化的,所以不应该等到鼠标抬起时在计算速度吧? 把Timer的时间刻度设置小一点。每一毫秒循环一次。 直接在mousemove事件里面根据当前鼠标坐标处理就好了 现在我的滚动块可以跟着Mousemove中的坐标点移动了,但是发现时只移动几次就不动了,我的程序里没有数据处理,所以不项内存泄露, 重绘消息里我是这样写的:void MainWnd::OnPaint(HWND hWnd){ DEBUGMSG(TRUE, (TEXT("MainWnd::OnPaint\n"))); PAINTSTRUCT ps = {0}; HDC hdc = BeginPaint(hWnd, &ps); // 在此添加任意绘图代码 RECT m_rc = {0}; GetClientRect(hWnd, &m_rc); //创建双缓冲 HDC g = CreateCompatibleDC(hdc); HBITMAP buffer=CreateCompatibleBitmap(hdc,m_rc.right-m_rc.left,m_rc.bottom-m_rc.top); HBITMAP m_hOldbmp = (HBITMAP)SelectObject(g, buffer); HDC imgdc=CreateCompatibleDC(hdc); //临时dc HBITMAP m_hOldbmp1 = (HBITMAP)SelectObject(imgdc, m_hScrollBar); BitBlt(g, 225, 50 , 11, 195 , imgdc, 0, 0, SRCCOPY); SelectObject(imgdc, m_hScrollUp); BitBlt(g, 225, 50 , 11, 11 , imgdc, 0, 0, SRCCOPY); SelectObject(imgdc, m_hScrollDown); BitBlt(g, 225, (243 - 11) , 11, 11 , imgdc, 0, 0, SRCCOPY); //滚动块Y坐标在随时变化 for(int i=0; i<10; ++i) { SelectObject(imgdc, m_hScrollBox); BitBlt(g, 225, (m_nScrolltop + i), 11, 10 , imgdc, 0, 0, SRCCOPY); } SelectObject(imgdc, m_hOldbmp1); DeleteDC(imgdc); imgdc = NULL; //最后显示到hdc BitBlt(hdc, m_rc.left, m_rc.top, m_rc.right-m_rc.left,m_rc.bottom-m_rc.top, g, 0, 0, SRCCOPY); SelectObject(g, m_hOldbmp); DeleteDC(g); g = NULL; EndPaint(hWnd, &ps);}//左键按下消息void MainWnd::OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) { DWORD point; POINT cpDown={0}; point=GetMessagePos(); cpDown.x=LOWORD(point); cpDown.y=HIWORD(point); m_nDownX = cpDown.x; //记录按下位置 m_nDownY = cpDown.y;} //WM_Mousemove消息void MainWnd::OnMousemove(HWND hwnd, int x, int y, UINT keyFlags){ //移动滚动块 //判断点击滚动条范围 if(m_nDownX > 225 && m_nDownY > (50 + 11) && m_nDownY < (243 - 11)) { m_nScrolltop = y; } InvalidateRect(hwnd, NULL, TRUE); ::UpdateWindow(hwnd);}哪里不对呢? 谢谢大家帮忙 不要调用UpdateWindow,否则,如果系统繁忙可能让系统停止响应,另外,m_nScrolltop 似乎处理不全面 不好意思 现在才看到你帮我回信息。 你上次说“不要调用UpdateWindow,否则,如果系统繁忙可能让系统停止响应”。如果我不写UpdateWindow, 发现也总是响应多次MouseMove后 就自动停止了 这是为什么呢? 自己写的控件供IE调用,如何让控件窗口覆盖IE滚动条 初学VC的技术社区 MFC初学者提问! 什么时候要DECLARE_DYNCREATE......... 请教 怎么响应鼠标事件? 谁有H.264的官方参考测试软件JM(Joint model)?今晚要着急用,谢谢大家了。。。 有谁可以用例子解释下这两个函数 程序运行中内存引用错误。可能是什么问题? 有谁编写过并口双互连的程序? 请推荐MFC的书,内详 写的通信类软件的问题!
响应消息的时候,取得最新的消息与点,然后刷新!这样就可以了!
void MainWnd::OnPaint(HWND hWnd)
{
DEBUGMSG(TRUE, (TEXT("MainWnd::OnPaint\n")));
PAINTSTRUCT ps = {0};
HDC hdc = BeginPaint(hWnd, &ps);
// 在此添加任意绘图代码 RECT m_rc = {0};
GetClientRect(hWnd, &m_rc);
//创建双缓冲
HDC g = CreateCompatibleDC(hdc);
HBITMAP buffer=CreateCompatibleBitmap(hdc,m_rc.right-m_rc.left,m_rc.bottom-m_rc.top);
HBITMAP m_hOldbmp = (HBITMAP)SelectObject(g, buffer);
HDC imgdc=CreateCompatibleDC(hdc); //临时dc
HBITMAP m_hOldbmp1 = (HBITMAP)SelectObject(imgdc, m_hScrollBar);
BitBlt(g, 225, 50 , 11, 195 , imgdc, 0, 0, SRCCOPY);
SelectObject(imgdc, m_hScrollUp);
BitBlt(g, 225, 50 , 11, 11 , imgdc, 0, 0, SRCCOPY);
SelectObject(imgdc, m_hScrollDown);
BitBlt(g, 225, (243 - 11) , 11, 11 , imgdc, 0, 0, SRCCOPY); //滚动块Y坐标在随时变化
for(int i=0; i<10; ++i)
{
SelectObject(imgdc, m_hScrollBox);
BitBlt(g, 225, (m_nScrolltop + i), 11, 10 , imgdc, 0, 0, SRCCOPY);
}
SelectObject(imgdc, m_hOldbmp1);
DeleteDC(imgdc);
imgdc = NULL;
//最后显示到hdc
BitBlt(hdc, m_rc.left, m_rc.top, m_rc.right-m_rc.left,m_rc.bottom-m_rc.top, g, 0, 0, SRCCOPY);
SelectObject(g, m_hOldbmp);
DeleteDC(g);
g = NULL;
EndPaint(hWnd, &ps);
}//左键按下消息
void MainWnd::OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
DWORD point;
POINT cpDown={0};
point=GetMessagePos();
cpDown.x=LOWORD(point);
cpDown.y=HIWORD(point); m_nDownX = cpDown.x; //记录按下位置
m_nDownY = cpDown.y;
}
//WM_Mousemove消息
void MainWnd::OnMousemove(HWND hwnd, int x, int y, UINT keyFlags)
{
//移动滚动块
//判断点击滚动条范围
if(m_nDownX > 225 && m_nDownY > (50 + 11) && m_nDownY < (243 - 11))
{
m_nScrolltop = y;
}
InvalidateRect(hwnd, NULL, TRUE);
::UpdateWindow(hwnd);
}哪里不对呢? 谢谢大家帮忙