位图的刷新问题?

hfkingbox 2010-04-03 12:51:36
各位大侠,小弟才学MFC有这样一个难题:在Dialog 程序中显示一个位图,并且在鼠标左键按下时位图移动一点位置,松开时复原。我的程序在鼠标按下时图片能移动,但原位置图片还在,用了几种方法都无法刷新掉。这是小弟的代码(vc6.0),请大侠更正。
void CRrrDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{


SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//画图
CBitmap map;
map.LoadBitmap(IDB_BMain);
BITMAP bm;
map.GetBitmap(&bm);
CDC temDC;
temDC.CreateCompatibleDC(&dc);
temDC.SelectObject(&map);
dc.BitBlt(200,100,bm.bmWidth,bm.bmHeight,&temDC,0,0,SRCCOPY);
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CRrrDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CRrrDlg::OnLButtonDown(UINT nFlags, CPoint point)
{

CClientDC dc(this);
//Invalidate(TRUE);
CBitmap map;
map.LoadBitmap(IDB_BMain);
BITMAP bm;
map.GetBitmap(&bm);
CDC temDC;
temDC.CreateCompatibleDC(&dc);
temDC.SelectObject(&map);
dc.BitBlt(204,104,bm.bmWidth,bm.bmHeight,&temDC,0,0,SRCCOPY);
//UpdateWindow();

CDialog::OnLButtonDown(nFlags, point);

}

void CRrrDlg::OnLButtonUp(UINT nFlags, CPoint point)
{

CClientDC dc(this);
Invalidate(TRUE);
CBitmap map;
map.LoadBitmap(IDB_BMain);
BITMAP bm;
map.GetBitmap(&bm);
CDC temDC;
temDC.CreateCompatibleDC(&dc);
temDC.SelectObject(&map);
dc.BitBlt(200,100,bm.bmWidth,bm.bmHeight,&temDC,0,0,SRCCOPY);

CDialog::OnLButtonUp(nFlags, point);
}

...全文
122 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
inkb_xy 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hfkingbox 的回复:]

谢谢各位的帮助,我在给位帮助下终于弄好了。再次感谢大家!!!
[/Quote]

问下,这个是怎么实现的?
hfkingbox 2010-04-03
  • 打赏
  • 举报
回复
谢谢各位的帮助,我在给位帮助下终于弄好了。再次感谢大家!!!
Swkjd 2010-04-03
  • 打赏
  • 举报
回复
因为你只是在鼠标响应函数里移动了位图,当窗口重绘时,调用的OnPaint函数里位图并没有移动,所以没效果。


OnPaint()

//...
BitBlt(x,y,...)
//...


OnLButtonDown()
{
//...
x=x_origin+dx;
y=y_origin+dy;
Invalidate();//这里不需要BitBlt,Invalidate会使窗口重绘
//...
}

OnLButtonUp()
{
//...
x=x_origin;
y=y_origin;
Invalidate();
//...
}


楼主是这意思吧?
向立天 2010-04-03
  • 打赏
  • 举报
回复
也不知道你是不是这个意思
下面这段代码是在你的基础上改的
应该可以实现鼠标拖动
希望对你有帮助


void CRrrDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if(IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}else
{
//画图
CBitmap map;
map.LoadBitmap(IDB_BMain);
BITMAP bm;
map.GetBitmap(&bm);
CDC temDC;
temDC.CreateCompatibleDC(&dc);
temDC.SelectObject(&map);
dc.BitBlt(m_nPosX, m_nPosY,bm.bmWidth,bm.bmHeight,&temDC,0,0,SRCCOPY);//m_nPosX, m_nPosY是CRrrDlg的成员变量
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CRrrDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CRrrDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bIsLButtonDown = true;
SetCapture();
CDialog::OnLButtonDown(nFlags, point);
}

void CRrrDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bIsLButtonDown = false;
ReleaseCapture();
CDialog::OnLButtonUp(nFlags, point);
}

void CRrrDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bIsLButtonDown)
{
m_nPosX = point.x;
m_nPosY = point.y;
Invalidate();
}
}
hfkingbox 2010-04-03
  • 打赏
  • 举报
回复
大概是情况我没说清楚,这个程序是动态按钮的雏形,我想让鼠标点下的时候,图片移动,松开的时候图片复原。但是现在按下鼠标不放时候,图片是移动了,但原来位置图片还在,产生了重叠。
我用过InvalidateRect(),Invalidate()都无法把原位置的位图消除。这个程序鼠标松开时没有问题。
也许2楼方法可以,但是现在基础很薄弱。不知道具体怎么实现,像鼠标按下的消息里怎样处理画图数据,才能让原位置的位图消失?
向立天 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hfkingbox 的回复:]
请各位大侠能给些代码参考吗?
[/Quote]

你自己不是写出来了么
按着我们说的改改就是了
其实核心还是你写的这些东西
hfkingbox 2010-04-03
  • 打赏
  • 举报
回复
请各位大侠能给些代码参考吗?
xsc2001 2010-04-03
  • 打赏
  • 举报
回复
这个也好办,在你按下鼠标在新的位置绘制图片的同时,调用InvalidateRect()将先前的图片所在区域更新一下就可以,不过要在新位置上绘制之前调用。
向立天 2010-04-03
  • 打赏
  • 举报
回复
把画图的函数都放到OnPaint中
鼠标消息里只处理相应数据
另外
在OnPaint中画图之前先用一种颜色把背景盖一下
kier2 2010-04-03
  • 打赏
  • 举报
回复
你这样,当鼠标左键弹起来后,你激活其他窗口,然后再激活这个程序的窗口,如果图片回到原来位置了,那可以是你的重绘消息没有得到及时的响应。试试updateview

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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