双缓冲实现透明贴图遇到有关问题

双缓冲实现透明贴图遇到问题
#include <Windows.h>
#include "resource.h"
HDC  hdcMem1,hdcMem2;
HBITMAP  hmapnull;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("BOX") ;
HACCEL       hAccel;
HWND         hwnd ;
MSG          msg ;
HDC          hdc;
HBITMAP      hBitmap;
WNDCLASS     wndclass ;

wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc   = WndProc ;
wndclass.cbClsExtra    = 0 ;
wndclass.cbWndExtra    = 0 ;
wndclass.hInstance     = hInstance ;
wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName  = szAppName ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, TEXT ("俄罗斯方块"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
600,620,
NULL, NULL, hInstance, NULL) ;

hdc = GetDC(hwnd);
hdcMem1 = CreateCompatibleDC(hdc);
hdcMem2 = CreateCompatibleDC(hdc);
hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
SelectObject(hdcMem1,hBitmap);
ReleaseDC(hwnd,hdc);
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

hAccel = LoadAccelerators(hInstance,szAppName);
while (GetMessage (&msg, NULL, 0, 0))
{
if(!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC    hdc;
HBRUSH  hBrush;
PAINTSTRUCT   ps;
static HBITMAP  hbitmap;
BITMAP    bitmap;

static int cxClient,cyClient;
switch(message)
{
case WM_CREATE:
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
hmapnull = CreateCompatibleBitmap(hdc,200,200);
SelectObject(hdcMem2,hmapnull);
BitBlt(hdcMem2,0,0,32,32,hdcMem1,0,32,SRCAND);
BitBlt(hdcMem2,0,0,32,32,hdcMem1,0,0,SRCPAINT);
BitBlt(hdc,200,200,32,32,hdcMem2,0,0,SRCCOPY);

EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
DeleteDC(hdcMem1);
DeleteDC(hdcMem2);
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hwnd,message,wParam,lParam);
}

想用bitblt 实现去除图片背景,用到双缓冲,可是结果不对,求大神解释。
用到位掩码图:
双缓冲实现透明贴图遇到有关问题
------解决思路----------------------
没仔细看你的代码,用bitblt画透明图简单的说就是利用两张图镂空画出一个sprite。

稍微解释下原理,方便记忆
SRCAND:dest = source AND dest 
SRCPAINT:dest = source OR dest
白色可以理解为1,黑色理解为0
先用掩码图(图A,白色部分为要透明掉的部分,其余是黑色,即sprite部分)SRCAND到背景图上,这样就会在背景图上留下掩码图的黑色部分,因为白色部分相当于1,and背景还是等于背景,而黑色部分相当于0,and背景就等于黑色了,然后在相同位置SRCPAINT想要透明的图(图B,B跟A大小相同,并且A的白色部分在图B上是黑色,A的黑色部分在B上就是要被画出来的sprite,因为黑色部分0,or上背景当然仍然是背景,而sprite部分or上一个黑色的背景0,就仍然等于sprite)

伪代码:
缓冲_DC.BITBLT(X,Y,W,H,图A_DC,SRCAND);
缓冲_DC.BITBLT(X,Y,W,H,图B_DC,SRCPAINT);
窗口_DC.BITBLT(X,Y,W,H,缓冲_DC,SRCCOPY);

以你的图片为例,图A就是你发出来的2张图中下面那张,B就是上面那张,画出来的东西应该是个黑色围棋子。