非模态对话框调用movewindow()后,不重绘背景

devilgavin 2014-07-22 04:10:00
重载OnEraseBkgnd()函数,重绘背景。
BOOL CProgressDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CRect rect;
this->GetClientRect(&rect);

if (!memDC_.IsOK())
{ // 背景还没有绘制到内存DC中
// 获取背景图片的完整路径名
CDirectory dirOper;
CString szPicPath = dirOper.GetCurrentDirectory() + PATH_SEPARATOR
+ DEFAULT_PICTURE_FOLDER + PATH_SEPARATOR;

if (m_backjpg.IsEmpty())
szPicPath += PICTURE_DIALOG_BACKGROUND;
else
szPicPath += m_backjpg;

// 将背景绘制到内存DC中
SIZE size = { rect.Width(), rect.Height() };
memDC_.Create(pDC->GetSafeHdc(), &size);


Graphics graphics(memDC_.GetDC());
Bitmap bmpBG(szPicPath);
graphics.DrawImage(&bmpBG, 0, 0, rect.Width(), rect.Height());
}

::BitBlt(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), memDC_.GetDC(), 0, 0, SRCCOPY);


return TRUE;

//return CDialogEx::OnEraseBkgnd(pDC);
}
使用非模态对话框
HWND CProgressHandle::ShowWindow(CWnd *pWnd)
{
try
{
m_pProgressDlg = new CProgressDlg(pWnd);
m_pProgressDlg->Create(IDD_DLG_PROGRESS,pWnd);

if(NULL != m_pProgressDlg)
{
CRect rcWorkArea,rcPopArea;
pWnd->GetClientRect(&rcWorkArea);
pWnd->ClientToScreen(&rcWorkArea);

rcPopArea.left = (rcWorkArea.right-rcWorkArea.left)/4;
rcPopArea.top = (rcWorkArea.bottom-rcWorkArea.top)/4;
rcPopArea.right = rcPopArea.left + (rcWorkArea.right-rcWorkArea.left)/2;
rcPopArea.bottom = rcPopArea.top + (rcWorkArea.bottom-rcWorkArea.top)/2;
::MoveWindow(m_pProgressDlg->GetSafeHwnd(),rcPopArea.left, rcPopArea.top, rcPopArea.Width(), rcPopArea.Height(),TRUE);
::SetWindowPos(m_pProgressDlg->GetSafeHwnd(), HWND_TOPMOST, rcPopArea.left, rcPopArea.top, rcPopArea.Width(), rcPopArea.Height(), SWP_SHOWWINDOW);
return m_pProgressDlg->GetSafeHwnd();
}
return 0;
}
catch(...)
{
return 0;
}
}

窗口显示后,只和重绘了对话框初始大小的面积,其它部分没有重绘。

请大侠给指导一下。。
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
devilgavin 2014-07-23
  • 打赏
  • 举报
回复
解决了,将MoveWindow()放到了对话框中的OnInitDialog()函数中.
devilgavin 2014-07-22
  • 打赏
  • 举报
回复
引用 2 楼 boylafong 的回复:
//return CDialogEx::OnEraseBkgnd(pDC); 为什么屏蔽掉?
不屏蔽掉,无法擦除背景。
devilgavin 2014-07-22
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
BitBlt改为StretchBlt
不行啊,感觉是BOOL CProgressDlg::OnEraseBkgnd函数中的CRect rect 为MoveWindow()函数前的大小 。
boylafong 2014-07-22
  • 打赏
  • 举报
回复
//return CDialogEx::OnEraseBkgnd(pDC); 为什么屏蔽掉?
fishion 2014-07-22
  • 打赏
  • 举报
回复
BitBlt改为StretchBlt

15,979

社区成员

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

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