15,978
社区成员
发帖
与我相关
我的任务
分享
void CtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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
{
CDialogEx::OnPaint();
}
}
void CtestView::OnDraw(CDC* /*pDC*/)
{
Ctest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
}
void CtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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
{
CDialogEx::OnPaint();
}
// CPaintDC dc(this); //使用光栅操作
CClientDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
// bitmap.LoadBitmapW(BMP_TEST2);
bitmap.LoadBitmapW(BMP_TIGER);
BITMAP bm;
bitmap.GetBitmap(&bm);
memDC.SelectObject(&bitmap);
CDC dcmask;
dcmask.CreateCompatibleDC(&dc);
CBitmap bmpmask;
bmpmask.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
dcmask.SelectObject(&bmpmask);
memDC.SetBkColor(RGB(255,255,255));
dcmask.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCINVERT);
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcmask, 0, 0, SRCAND);
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCINVERT);
}
上面这段代码,我初步总结如下:
如果使用 CPaintDC 那么,在我自己的贴图代码之前,(是之前,在最后调用没有影响)调用积基类的 CDialogEx::OnPaint();
导致贴图代码没有影响。
如果使用CClientDC ,没有上面的问题发生。不管 CDialogEx::OnPaint(); 在什么地方调用,没有什么影响。