我正在尝试使用Windows API在具有透明背景的窗口上绘制动画.问题是我无法从窗口中删除以前的图形.
我设置了以下参数:
InvalidateRect(m_hWnd, &sClientRect, TRUE); // we set the bErase parameter as TRUE
paintParams.dwFlags = BPPF_ERASE; // erase window content while copying backbuffer
paintParams.pBlendFunction = &m_sBlendfunc; // copy source image to backbuffer
Run Code Online (Sandbox Code Playgroud)
但它仍然无效.您可以在附加图像中看到结果.我想要的动画是在屏幕上移动圆圈.我得到的(如附图所示)是他们运动的人工制品,因为在每次抽奖之前窗口没有被清除.
请参阅下面的完整代码:
#include "DrawTest.h"
DrawTest* m_sDrawTest;
DrawTest::DrawTest()
{
m_pAnimation = NULL;
m_sDrawTest = NULL;
m_nFrameindex = 0;
}
DrawTest::~DrawTest(void)
{
if(m_pAnimation)
delete m_pAnimation;
m_pAnimation = NULL;
if(m_sDrawTest)
delete m_sDrawTest;
m_sDrawTest = NULL;
}
int DrawTest::Init(AnimationManager* pAnimationManager,HINSTANCE hInstance,int nCmdShow)
{
//listener
m_sDrawTest = this;
//get anemation (sequence of …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 alpha 拉伸 HBITMAP 并将其绘制到花药 hdc。
我使用的是 StretchDIBits,然后是 AlphaBlend,如下面的代码所示。
问题是 AlphaBlend 失败并返回 false。
1. 有谁知道可能是什么原因?2. 有没有更好的为什么要拉伸和绘制透明图像?
void AnimationManager::Draw(HDC hBBDC, Instance sInstance,RECT sClientRect)
{
// sClientRect is the hwnd rect
int nID = GetId(sInstance.nAnemationId);
int nFrameindex = sInstance.nFrameIndexs;
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
///******************* create PBITMAPINFO *********************///
GetObject(m_pAnimations[nID]->m_pFramesArray[nFrameindex]->hBmp, sizeof(bmp), &bmp);
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if(cClrBits == 1)
cClrBits = 1;
else if(cClrBits <= 4)
cClrBits = 4;
else if(cClrBits <= 8) …Run Code Online (Sandbox Code Playgroud)