Dialog的背景图,窗口中有图标,当窗口最小化后,恢复窗口,图标等被背景图覆盖? 本人接触VC++时间短,诚请高手帮忙!显示背景图在:
BOOL CW05Dlg::OnEraseBkgnd(CDC* pDC)
{
CDialog::OnEraseBkgnd(pDC); m_pic2.SubclassWindow( m_hWnd );
m_pic2.m_nMessageHandler = CPictureWindow::BackGroundPaint;
m_pic1.Load("dlg_bk.bmp"); return CDialog::OnEraseBkgnd(pDC);
}另一方案:用dialog中picture控件也覆盖图标等.
请讲明原理最好有代码我每次验证后都给分了,从不背信!谢谢!
BOOL CW05Dlg::OnEraseBkgnd(CDC* pDC)
{
CDialog::OnEraseBkgnd(pDC); m_pic2.SubclassWindow( m_hWnd );
m_pic2.m_nMessageHandler = CPictureWindow::BackGroundPaint;
m_pic1.Load("dlg_bk.bmp"); return CDialog::OnEraseBkgnd(pDC);
}另一方案:用dialog中picture控件也覆盖图标等.
请讲明原理最好有代码我每次验证后都给分了,从不背信!谢谢!
{
if (IsIconic())
{
CPaintDC dc(this);
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
{
m_pic1.SubclassWindow( m_hWnd );
m_pic1.m_nMessageHandler = CPictureWindow::BackGroundPaint;
m_pic1.Load("dlg_bk.bmp");
CDialog::OnPaint();
}
}
BOOL CW05Dlg::OnEraseBkgnd(CDC* pDC)
{
CDialog::OnEraseBkgnd(pDC); m_pic2.SubclassWindow( m_hWnd );
m_pic2.m_nMessageHandler = CPictureWindow::BackGroundPaint;
m_pic1.Load("dlg_bk.bmp");既然自己画背景了,还要系统的OnEraseBkgnd干吗?直接return OK;就可以了。保证背景不会被擦掉
return CDialog::OnEraseBkgnd(pDC);
}
{
HBITMAP hBmp = (HBITMAP)LoadBitmap(::AfxGetInstanceHandle()
,MAKEINTRESOURCE(IDB_BITMAP1));
CStatic *pPic = (CStatic*)GetDlgItem(IDC_PIC1);
pPic->SetBitmap(hBmp);
pPic->Invalidate(FALSE);
return TRUE;
}
和一个CBrush m_brBk;
响应WM_CTLCOLOR消息,
然后在BOOL CW05Dlg::OnInitDialog()
{
bmp.LoadBitmap(IDB_BITMAP);
m_brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject(); //OnInitDialog里加入这几行
}然后在在HBRUSH CDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd==this)
{
return m_brBk;
}
}
就没问题了,,
谢谢awnucel,学到新知识啦