位图淡入没问题,因为透明度从浅到深覆盖,
但是位图淡出的话就不行了,我用重绘的话窗口闪烁得厉害。
这个小问题对于高手来说应该不是什么问题,
以下是简单不完善的测试代码,
希望高手帮忙改进以下让其实现淡出效果。
(希望自己先测试后看问题再回复)#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();
}
但是位图淡出的话就不行了,我用重绘的话窗口闪烁得厉害。
这个小问题对于高手来说应该不是什么问题,
以下是简单不完善的测试代码,
希望高手帮忙改进以下让其实现淡出效果。
(希望自己先测试后看问题再回复)#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();
}
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
DispatchMessage(&msg);
TranslateMessage(&msg);
}
一张图的淡入淡出不会引起“闪烁”,一定是多画了什么东西,比如背景。
没有用的,即使把Sleep注释掉,问题不是在这里。。