растягивание BitMap на диалог (CBrush)
- From
- Stas Khatsko (2:5080/220)
- To
- All ()
- Date
- 2003-04-11T23:12:10Z
- Area
- SU.WINDOWS.NT.PROG
Привет, All.
Вообще непонятные вещи происходят:
Создаю проект Dialog-Based, растягиваю на нем BitMap вот так:
(сразу скажу: этот диалог прорисовывается как надо, проблема ниже)
В конструкторе:
=== Начало Windows Clipboard ===
VERIFY(m_bkBmap.LoadBitmap(IDB_BKBMAP));
=== Конец Windows Clipboard ===
В OnInitDialog:
=== Начало Windows Clipboard ===
CSystemFaceDlg* pFrm = (CSystemFaceDlg*)AfxGetMainWnd();
CBitmap* dlgBmap;
dlgBmap = &(pFrm->m_bkBmap);
RECT rectClient;
// Load hollow brush;
m_brush.CreateStockObject(NULL_BRUSH);
// Get bitmap information
dlgBmap->GetObject(sizeof(BITMAP), &m_bmInfo);
GetClientRect(&rectClient);
m_size.cx = rectClient.right; // zero based
m_size.cy = rectClient.bottom; // zero based
m_pt.x = rectClient.left;
m_pt.y = rectClient.top;
// Get temporary DC for dialog, will be released in dc destructor
CClientDC dc(this);
// Create compatible memory DC using the dialogs DC
VERIFY(m_dcMem.CreateCompatibleDC(&dc));
m_dcMem.SelectObject(dlgBmap);
=== Конец Windows Clipboard ===
(CSystemFaceDlg - это класс этого диалога)
Далее переопределение WM_CTLCOLOR и WM_ERASEBKGND:
=== Начало Windows Clipboard ===
HBRUSH CSystemFaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
CSystemFaceDlg* pFrm= (CSystemFaceDlg*)AfxGetMainWnd();
if (pFrm->m_transparentText)
pDC->SetBkMode(TRANSPARENT);
// pDC->SetTextColor(RGB(125, 125, 125));
return (HBRUSH)m_brush;
// TODO: Return a different brush if the default is not desired
// return hbr;
}
BOOL CSystemFaceDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
RECT rectClient;
GetClientRect(&rectClient);
m_size.cx = rectClient.right; // zero based
m_size.cy = rectClient.bottom; // zero based
m_pt.x = rectClient.left;
m_pt.y = rectClient.top;
pDC->StretchBlt(m_pt.x, m_pt.y, m_size.cx, m_size.cy,
&m_dcMem, 0, 0, m_bmInfo.bmWidth-1, m_bmInfo.bmHeight-1,
SRCCOPY );
return FALSE;
// return CDialog::OnEraseBkgnd(pDC);
}
=== Конец Windows Clipboard ===
Переменные из хедера:
=== Начало Windows Clipboard ===
protected:
CDC m_dcMem; // Compatible Memory DC for dialog
CBrush m_brush; // Handle of background brush
BITMAP m_bmInfo; // Bitmap Information structure
CPoint m_pt; // Position for upper left corner of bitmap
CSize m_size; // Size (width and height) of bitmap
CBitmap m_bkBmap;
CBitmap m_bmapBrush;
CBitmap m_bmapCentered;
BOOL m_transparentText;
=== Конец Windows Clipboard ===
Проблема в том, что при вызове из этого диалога по нажатию кнопки другого модального диалога (и в этот диалог вся эта закраска вставлена буква-в-букву)
фон второго диалога - прозрачен, т.е. ни bitmap'а, ни дефолтового цвета диалога (оба диалога созданы в ресурсах) - просто на нем та часть экрана которая находилась под этим диалогом.
Вроде такая проблема знакома (давно такое возникало), но непонятность в том, что у обоих диалогов код закраски букву-в-букву.
Из-за чего такое может происходить?
Elvis. mailto:elvis(_at_)beep.ru
---
* Origin: Elvis Station, Ekaterinburg, Russia (2:5080/220)