请教高人:如何清除PICTURE控件上的图像

shihui2009 2010-06-18 04:09:34
CImage img;

if (!img.IsNull())
{
img.Destroy();
}


img.Load(path);


CDC* hdc = m_DISP1.GetDC();
::SetStretchBltMode(hdc->m_hDC,HALFTONE);


img.Draw(hdc->m_hDC,CRect(DispX_Origin,DispY_Origin,DispX_Origin + pWidth,DispY_Origin + pHeight),CRect(0,0,img.GetWidth(),img.GetHeight()));

img.Destroy();

m_DISP1.Invalidate(TRUE);
m_DISP1.ReleaseDC(hdc);
m_DISP1.UpdateWindow();


其中 m_DISP1 为图像控件的相关变量。

请教一下如何动态刷新PICTURE上的图像。

我现在每次都直接覆盖上去。

谢谢各位达人。。。

...全文
536 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fandh 2010-06-21
m_DISP1.Invalidate(TRUE);
直接把画的覆盖了!
你应该把画的内容,放倒ondraw或者onpaint里面,然后,外面直接调用Invalidate
回复
向立天 2010-06-21
你Picture控件用的有问题吧
从你的代码看不出任何和这个控件实质性的联系啊
回复
shihui2009 2010-06-21
m_DISP1.Invalidate();

我使用这个函数之后,直接都显示不出图像来了。
继续请教大家,谢谢。
回复
shihui2009 2010-06-21
就是我采集完图像之后会传一个路径过来,然后调用DrawPicture
回复
fandh 2010-06-21
我将鼠标放在软件客户区的时候,图片不显示。
我将鼠标移到软件客户区外的时候图片就刷新。

看看鼠标方面的。。。
回复
fandh 2010-06-21
DrawPicture在那儿调用的?
回复
shihui2009 2010-06-21
[Quote=引用 4 楼 fandh 的回复:]
m_DISP1.Invalidate(TRUE);
直接把画的覆盖了!
你应该把画的内容,放倒ondraw或者onpaint里面,然后,外面直接调用Invalidate
[/Quote]

我在这个函数里面载入图像,并直接调用invalidate.
void CSystemDlg::DrawPicture(CString path)
{

if (!img.IsNull())
{
img.Destroy();
}


m_DISP1.ModifyStyle( SS_BLACKFRAME,SS_BLACKRECT|SS_CENTERIMAGE);
m_DISP1.SetBitmap(NULL);

img.Load(path);


m_DISP1.Invalidate();

}

下面是我写的WM_PAINT函数。
void CSystemDlg::OnPaint()
{
//CPaintDC dc(GetDlgItem(IDC_DISP)); // 用于绘制的设备上下文
if (IsIconic())
{

CPaintDC dc(this);// 用于绘制的设备上下文
if (IsIconic())

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
DrawDialog();
}
else
{
CDialog::OnPaint();

double Image_XSize; //图片X大小
double Image_YSize; //图片Y大小
int DispX_Origin; //图像显示X起始原点
int DispY_Origin; //图像显示Y起始原点
int pHeight,pWidth;

if (img.IsNull())
return;
Image_XSize = img.GetWidth();
Image_YSize = img.GetHeight();

double factor = Image_XSize / Image_YSize;

pWidth = ConDispRect.Width();
pHeight = ConDispRect.Height();

//比例因子小于1,说明X比Y小,则Y为定值
if(factor <= 1.0)
{
pWidth = factor * pHeight; //得到在窗口上显示的宽度
}
else
{
pHeight = pWidth / factor; //得到在窗口上显示的高度
if(pHeight >= ConDispRect.Height())
{
pHeight = ConDispRect.Width();
pWidth = factor * pHeight;
}
}

if(pHeight == 0 || pWidth == 0)
{
MessageBox(_T("窗口上显示的宽度或高度不能为0"));
}
//计算显示原点
DispX_Origin = (ConDispRect.Width() - pWidth)/2;
DispY_Origin = (ConDispRect.Height() - pHeight)/2;

CDC* hdc = m_DISP1.GetWindowDC();
hdc->SetStretchBltMode(HALFTONE);
img.Draw(hdc->m_hDC,CRect(DispX_Origin,DispY_Origin,DispX_Origin + pWidth,DispY_Origin + pHeight),CRect(0,0,img.GetWidth(),img.GetHeight()));
ReleaseDC(hdc);



可是我现在出现一个问题,我将鼠标放在软件客户区的时候,图片不显示。
我将鼠标移到软件客户区外的时候图片就刷新。
请教高人,这是为什么呀?
我写错了什么东西?
谢谢各位啦!
回复
xiuxianshen 2010-06-18
Invalidate 强制重绘
回复
相关推荐
发帖
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
帖子事件
创建了帖子
2010-06-18 04:09
社区公告
暂无公告