網上都說用MemDC能解決閃屏問題,但是試了一下還是不想,
有沒有大神能解釋一下是什么原因嗎
void CMy555Dlg::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
{
CDialog::OnPaint();
}
CDC * pDC = GetDC();/////////////黑色背
CDC MemDC; //首先定義一個顯示設備物件
CBitmap MemBitmap;//定義一個位圖物件
//隨后建立與螢屏顯示兼容的記憶體顯示設備
MemDC.CreateCompatibleDC(NULL);
//這時還不能繪圖,因為沒有地方畫 ^_^
//下面建立一個與螢屏顯示兼容的位圖,至于位圖的大小嘛,可以用視窗的大小
MemBitmap.CreateCompatibleBitmap(pDC,400,400);
//將位圖選入到記憶體顯示設備中
//只有選入了位圖的記憶體顯示設備才有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將位圖清除干凈,這里我用的是白色作為背景
//你也可以用自己應該用的顏色
MemDC.FillSolidRect(0,0,400,400,BLACK_BRUSH);
MemDC.SelectStockObject((BLACK_BRUSH));
MemDC.Rectangle(0,0,574,250);
crect.top=0+i;
crect.bottom=30+i;
crect.left=20,
crect.right=50;
MemDC.SelectStockObject(WHITE_BRUSH);
MemDC.Rectangle(crect);
//將記憶體中的圖拷貝到螢屏上進行顯示
pDC->BitBlt(0,0,400,400,&MemDC,0,0,SRCCOPY);
//繪圖完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy555Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy555Dlg::OnTimer(UINT nIDEvent)
{
i=i+1;
Invalidate();
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}
uj5u.com熱心網友回復:
關注一下,
uj5u.com熱心網友回復:
關注下 ,也有同樣問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110045.html
