关于windows编程 图片移动地问题!

wgua520 2009-12-23 06:36:33
图片跟谁鼠标移动,移动地过程中出现了很多的图片残留!有什么办法可以把图片在移动地时候只有原图在跟随
而不是鼠标移动一下就出现一大把杂乱地图片呢!
有人说用强制更新函数,但我把那个代码放置在鼠标移动判断的那个语句里不起作用啊!
这个是为什么!哪位大大能帮忙给一个小小地示例!
没时间帮忙说一下怎么样能够实现也是可以的哈!
...全文
203 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgua520 2010-01-09
  • 打赏
  • 举报
回复
感谢各位地回答!长点儿见识了@!
lambochan 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wgua520 的回复:]
现在主要问题是图片跟随鼠标移动会产生闪图地状态
[/Quote]

试试吧,不过不保证work的,因为偶几乎不写win32代码的~~
另:如有错自己改了,因为偶只是用notepad随手改的, Good Luck~~


HBITMAP hBitmap = NULL; // 全局变量load pic
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
//消息分类处理
switch (iMsg) {
//客户区的绘制消息
case WM_PAINT:
{
hDC hMemDC1, hMemDC2; // 两个
HBITMAP hBG; // 客户区背景
BITMAP bm;
PAINTSTRUCT ps;

HDC hDC = BeginPaint( hWnd, &ps );
RECT rect;
GetClientRect( hWnd, &rect );
int w = rect.right - rect.left; // 客户区宽
int h = rect.bottom - rect.top; // ......高
// Create bg dc & bitmap
hMemDC1 = CreateCompatibleDC( hDC );
hBG = CreateCompatibleBitmap( hDC, w, h );
HBITMAP hOld1 = ( HBITMAP )SelectObject( hMemDC1, hBG );
FillRect( hMemDC1, &rect, GetStockObject( WHITE_BRUSH ) );
// load pic
if( !hBitmap )
hBitmap = ( HBITMAP )LoadImage(NULL,"pic.bmp",IMAGE_BITMAP, 0 ,0,LR_LOADFROMFILE);
GetObject( hBitmap, sizeof( BITMAP ), &bm );
hMemDC2 = CreateCompatibleDC( hDC );
HBITMAP hOld2 = ( HBITMAP )SelectObject( hMemDC2, hBitmap );

POINT pt;
GetCursorPos(&pt);
// 计算位置
ScreenToClient( hWnd, &pt );
pt.x = pt.x - bm.bmWidth / 2;
pt.y = pt.y - bm.bmHeight / 2;
// pic to bg
BitBlt( hMemDC1, pt.x, pt.y, bm.bmWidth, bm.bmHeight, hMemDC2, 0, 0, SRCCOPY );
SetBkMode( hMemDC1, TRANSPARENT );
SetTextColor( hMemDC1, RGB( 255, 0, 0 ) );
DrawText( hMemDC1, TEXT( "Hello, Win32!" ), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
// bg to client
BitBlt( hDC, 0, 0, w, h, hMemDC1, 0, 0, SRCCOPY );

// all finish, release
SelectObject( hMemDC1, hOld1 );
SelectObject( hMemDC2, hOld2 );
DeleteDC( hMemDC1 );
DeleteDC( hMemDC2 );
DeleteObject( hBG );

EndPaint( hWnd, &ps );
return 0;
}

case WM_MOUSEMOVE:
{
InvalidateRect(hWnd, NULL, FALSE);
//invalidate( FALSE );
UpdateWindow(hWnd);
break;
}

case WM_DESTROY:
{
//发送WM_QUIT消息,通知线程消息检索循环,主程序可以退出
//release
if( hBitmap )
DeleteObject( hBitmap );
PostQuitMessage(0);
return 0;
}
case WM_ERASEBKGND:
{
return 1; // return true
}
}
//程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理
return DefWindowProc(hWnd, iMsg, wParam,lParam);
}
wgua520 2009-12-25
  • 打赏
  • 举报
回复
呜呜呜!!晕哦!不是的啊!我只不过想借用这个例子去实现别的功能而已!
并不是纯粹地为了让图片跟随鼠标这个白痴想法,1如果真的单单为了这个!
我也不费这鸟劲了!
liguangqang 2009-12-25
  • 打赏
  • 举报
回复
把你的图片做成光标,不就跟着动了吗。
lambochan 2009-12-24
  • 打赏
  • 举报
回复
last说说,不知道你这垃圾代码是在哪里搬回来的,最主要的是:
hbm=(HBITMAP)LoadImage(NULL,"pic.bmp",IMAGE_BITMAP, 0 ,0,LR_LOADFROMFILE);
这句居然放在WM_PAINT里..

这样的东西应该一次load进,永久使用.
而不是在WM_PAINT里去load磁盘文件..然后又把它Del掉,下次又再load,永无休止,不慢有鬼了.
可以把hMemDC和hBitmap保存为全局变量,一次搞定,真的不需要时才del.
ckfan 2009-12-24
  • 打赏
  • 举报
回复
在ontime里更新,这个方法土了点。。。效果不好
lambochan 2009-12-24
  • 打赏
  • 举报
回复
帖图前先把客户区刷干净..否则残留着移动前上一把的帖图.
FillRect( hDC, &rect, GetStockObject( WHITE_BRUSH ) );

xxxxxxx();

BitBlt();//..
wgua520 2009-12-24
  • 打赏
  • 举报
回复
晕InvalidateRect(hWnd,NULL,TRUE);
这个更新地太吓人了!搞的图片和幻灯片差不多了!
有什么办法可以让他刷新慢一点儿的呀?

wgua520 2009-12-24
  • 打赏
  • 举报
回复
晕哦!我这个是自学的!走的弯路实在是太多了!
所以我想多提问这样 会好一点!
昨天上午为了能够显示多张图片忙和了一上午!
如果有 老师教的话肯定会快很多哈!
我这也是把你们当做老师了!
至于问题很多!因为目前我还是初学者没办法啊!!好奇心正处于最重的阶段
不喜欢动脑子我感觉我是动过了头了!
才搞的遍地错误
wgua520 2009-12-24
  • 打赏
  • 举报
回复
晕哦!!
我把你说的那个声明成全局的也还是一样的哈!
InvalidateRect(hWnd,NULL,true);加上这句之后
现在主要问题是图片跟随鼠标移动会产生闪图地状态
这个有人说是双缓冲可以 解决!
哪位不知道有时间帮忙贴一下简单的双缓冲地代码哈!
chenweiye120 2009-12-23
  • 打赏
  • 举报
回复
帮顶了,俺这方面也是初学者。
muarom 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 muarom 的回复:]
InvalidateRect()里面需要传当前图片的矩形进去,然后在PAINT消息那里刷背景。
[/Quote]
**********
不好意思,表达错了
muarom 2009-12-23
  • 打赏
  • 举报
回复
你的结贴率太低了,而且问题很多而且不喜欢动脑子。我只想提示你InvalidateRect()你需要传当前图片的举行进去,然后在PAINT消息那里做刷背景的工作
wgua520 2009-12-23
  • 打赏
  • 举报
回复
能麻烦把代码稍微搞出来吗?
invalidate( FALSE );这个函数我添加进去
报invalidate未声明
不能用
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 
{
//消息分类处理
switch (iMsg)
{
//客户区的绘制消息
case WM_PAINT:
{
HDC hdc;
HBITMAP hbm;
BITMAP bmp;
PAINTSTRUCT ps; //绘制属性结构描述

HDC hDC = BeginPaint(hWnd, &ps); //获取显示设备对象及绘制描述属性
RECT rect;
GetClientRect(hWnd, &rect);//获取当前窗口对象客户区矩形
SetBkMode(hDC,TRANSPARENT);//设置背景方式
SetTextColor(hDC, RGB(255, 0, 0));//设置文本颜色
//绘制文本
hbm=(HBITMAP)LoadImage(NULL,"pic.bmp",IMAGE_BITMAP, 0 ,0,LR_LOADFROMFILE);

hdc = CreateCompatibleDC(ps.hdc);
SelectObject(hdc,hbm);
GetObject(hbm,sizeof(BITMAP),&bmp);

POINT pt;
GetCursorPos(&pt);
// 计算位置
ScreenToClient(hWnd, &pt);
pt.x = pt.x - bmp.bmWidth / 2;
pt.y = pt.y - bmp.bmHeight / 2;

BitBlt(ps.hdc,pt.x,pt.y,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);

DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps); //客户区绘制结束,归还显示设备对象
DeleteObject(hbm);
DeleteDC(hdc);
EndPaint(hWnd,&ps);

return 0;
}
case WM_MOUSEMOVE:
{
InvalidateRect(hWnd, NULL, FALSE);
//invalidate( FALSE );
UpdateWindow(hWnd);
break;
}
case WM_DESTROY:
{
//发送WM_QUIT消息,通知线程消息检索循环,主程序可以退出
PostQuitMessage(0);
return 0;
}
}
//程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理
return DefWindowProc(hWnd, iMsg, wParam,lParam);
}

谢谢麻烦在这个里面改一下下!
lingxichun3zhu 2009-12-23
  • 打赏
  • 举报
回复
再鼠标移动响应函数里面,加上invalidate( FALSE );
wgua520 2009-12-23
  • 打赏
  • 举报
回复
晕死了,还不如不顶呢
syxhpx 2009-12-23
  • 打赏
  • 举报
回复
up

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧