大家好,
我做了一个小对话框程序,Border的属性设置的是Resizing,就是可以最大化,拉伸等等的.
对话框上面有一个picture控件,上面贴了一幅图片.当拉伸对话框的时候,图片闪烁地比较厉害.
贴图相关的代码:
void OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
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
{
CPaintDC dc(this);
CDC* md;
CBitmap* bitmap;
CWnd* pwnd;
CRect rect;
md = new CDC;
bitmap = new CBitmap;
/* IDC_SCREEN 为picture控件的ID */
pwnd = GetDlgItem( IDC_SCREEN );
pwnd->GetWindowRect( &rect );
ScreenToClient( &rect );
md->CreateCompatibleDC(&dc);//将md转换成与dc兼容的DC
/* playerapple.bmp就是picture控件上贴的位图 */
bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"./res/playerapple.bmp",IMAGE_BITMAP,
rect.Width(),rect.Height(),LR_LOADFROMFILE);
md->FillSolidRect( rect.left, rect.top,rect.Width(),rect.Height(),m_DlgColorref );
//md->FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); md->SelectObject(bitmap);
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),md,0,0,SRCCOPY);
//dc.BitBlt(left,top,178,151,md,0,0,SRCCOPY);
if(md)
delete md;
if(bitmap)
delete bitmap;
}
}BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
双缓存也用了, OnEraseBkgnd()里面也返回TRUE了,还要怎么改啊?
请高手帮忙看看,谢谢!
我做了一个小对话框程序,Border的属性设置的是Resizing,就是可以最大化,拉伸等等的.
对话框上面有一个picture控件,上面贴了一幅图片.当拉伸对话框的时候,图片闪烁地比较厉害.
贴图相关的代码:
void OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
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
{
CPaintDC dc(this);
CDC* md;
CBitmap* bitmap;
CWnd* pwnd;
CRect rect;
md = new CDC;
bitmap = new CBitmap;
/* IDC_SCREEN 为picture控件的ID */
pwnd = GetDlgItem( IDC_SCREEN );
pwnd->GetWindowRect( &rect );
ScreenToClient( &rect );
md->CreateCompatibleDC(&dc);//将md转换成与dc兼容的DC
/* playerapple.bmp就是picture控件上贴的位图 */
bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"./res/playerapple.bmp",IMAGE_BITMAP,
rect.Width(),rect.Height(),LR_LOADFROMFILE);
md->FillSolidRect( rect.left, rect.top,rect.Width(),rect.Height(),m_DlgColorref );
//md->FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); md->SelectObject(bitmap);
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),md,0,0,SRCCOPY);
//dc.BitBlt(left,top,178,151,md,0,0,SRCCOPY);
if(md)
delete md;
if(bitmap)
delete bitmap;
}
}BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
双缓存也用了, OnEraseBkgnd()里面也返回TRUE了,还要怎么改啊?
请高手帮忙看看,谢谢!
解决方案 »
- 在vs2008中编译,出现下面的错误,请问什么情况?
- dll模块改成release版本后远程注入失败
- 关于windows api的问题
- 隐藏调用一外部程序,为什么隐藏不了啊?代码见内:
- 100分求一个奇怪的问题 ocx控件在客户端访问时无法加载,但是放到桌面上,建一个静态的HTML页面加载OCX控件就可以
- CMDIFrameWnd的全屏显示~
- 新手上路,请多关照:怎样能使链接后的exe程序在别的电脑上运行?
- 多谢LXFY()来取分
- 求一个法军软件园软件作者注册邀请码!
- APPWIZARD生成的MDI框架里如何重载CWinApp::OnFileOpen()函数?能讲详细步骤吗?
- 在MFC的窗口中怎样添加背景音乐
- FILE_FLAG_DELETE_ON_CLOSE参数不起效
用双缓存
WM_ERASEBKGND直接返回TRUE
看来你对双缓冲的用法不是很了解
建议你看看这篇文章http://hi.csdn.net/link.php?url=http://blog.csdn.net%2FFireway2008
bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"./res/playerapple.bmp",IMAGE_BITMAP,
rect.Width(),rect.Height(),LR_LOADFROMFILE); 每次重绘都要load一边,硬盘读取比较慢啊。
你把这个过程放到初始化里面去行不行?
或者建立bitmap resource,然后直接CBitmap bitmap; bitmap.LoadBitmap(IDB_XXX);
1》其实你只对picture控件进行双缓冲,也就是说,如果单单对picture控件改变大小了,图片并不会闪烁!2》而您改变窗口大小时,是整个主窗体都在进行,控件与主窗体之间背景与图片还是存在反差,所以仍然出现闪烁!如果你还不信的,可以试试,直接在一个窗体上面画面,然后改变大小,看看似乎会闪烁?
我想这就是6楼高手所说的没有使用双缓冲的原因吧!
没有onerase()在哪里设置双缓冲???