位图淡入没问题,因为透明度从浅到深覆盖,
但是位图淡出的话就不行了,我用重绘的话窗口闪烁得厉害。
这个小问题对于高手来说应该不是什么问题,
以下是简单不完善的测试代码,
希望高手帮忙改进以下让其实现淡出效果。
(希望自己先测试后看问题再回复)#include <wingdi.h>
#pragma comment(lib, "MSIMG32.LIB");
void CMyDlg::OnButton1() 
{

// TODO: Add your control notification handler code here

CRect rect;
GetClientRect(&rect); CDC * pDC = this->GetDC();
pDC->SetStretchBltMode(HALFTONE); CBitmap bitmap, *oldmemBitmap;
//bitmap.LoadBitmap(IDB_BITMAP1);
HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, "123.bmp" , IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE);
bitmap.Attach(hBmp);

BITMAP bmp;
bitmap.GetBitmap(&bmp); CDC memdc;
memdc.CreateCompatibleDC(pDC);
oldmemBitmap = memdc.SelectObject(&bitmap); BLENDFUNCTION blend;
memset( &blend, 0, sizeof( blend) );
blend.BlendOp = AC_SRC_OVER; static int i = 0;
for (i = 255; i > 0 ; i--) { //如果i是递增则(淡入)没有问题
blend.SourceConstantAlpha = i; 
//RedrawWindow( CRect(0, 0, rect.Width() - 100, rect.Height()) );
AlphaBlend(pDC->m_hDC, 0, 0, rect.Width() - 100, rect.Height(), memdc.m_hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, blend);
Invalidate(FALSE);
Sleep(10);
}
memdc.SelectObject(oldmemBitmap);
bitmap.DeleteObject();
memdc.DeleteDC();
pDC->DeleteDC();

}

解决方案 »

  1.   

    healer_kx , 你会改的话直接把改好的板上来看看~ 虽然说是小问题,我已经请教了不少让人但是还没人能给解决
      

  2.   

    不要在Sleep,使用timer刷新或者在Sleep(10)前面加上如下代码:
        MSG msg;
        while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            DispatchMessage(&msg);
            TranslateMessage(&msg);
        } 
      

  3.   

    如果闪烁,看看你是不是画背景了?去掉EraseBackground相关的东东。另外,尽量用内存DC画。然后再画到控件DC上。
    一张图的淡入淡出不会引起“闪烁”,一定是多画了什么东西,比如背景。
      

  4.   


    没有用的,即使把Sleep注释掉,问题不是在这里。。
      

  5.   

    自己解决了,淡出gdi的api有问题,淡出等效于背景淡入,用等效的方法来实现。。