A1 Нужно для каждой картинки, входящей в анимацию, делать для окна специальный регион, который включал бы в себя точки, принадлежащие изображению и не включал все остальные. Это можно сделать так (source ниже) : Создать пустой регион, выбрать картинку (bitmap), выбрать прозрачный цвет, проитись по bitmap и для каждого непрозрачного участка в каждой строке bitmap создать регион высотой 1 пиксел и прикомбинировать его к исходному региону. В конце операции установить получившийся регион окну.
void MakeBitmapRegion(HWND hwnd, int int bmp_id) {
COLORREF back_color;
CBitmap bmp;
if (!bmp.LoadBitmap (bmp_id)) return;
BITMAP bmp_o;
bmp.GetObject(sizeof(BITMAP), (LPSTR)&bmp_o);
int w = bmp_o.bmWidth;
int h = bmp_o.bmHeight;
HDC wnd_dc = GetDC(hwnd);
if (hwnd == NULL) return;
if (wnd_dc == NULL) return;
HDC hdc_bmp = CreateCompatibleDC(wnd_dc);
SelectObject(hdc_bmp, HBITMAP(bmp));
back_color = GetPixel(hdc_bmp, 0, 0);
int x, x0, y;
HRGN tmp_rgn, wnd_rgn;
wnd_rgn = CreateRectRgn(0,0,0,0);
x = y = 0;
for (y; y < h; y++) {
while (x < w-1) {
while(GetPixel(hdc_bmp, x, y) == back_color && x < w) x++;
if (x != w) {
x0 = x;
while(GetPixel(hdc_bmp, x, y) != back_color && x < w) x++;
tmp_rgn = CreateRectRgn(x0, y, x, y+1);
CombineRgn(wnd_rgn, wnd_rgn, tmp_rgn, RGN_XOR);
}
}
x = 0;
}
DeleteObject(tmp_rgn);
DeleteDC(hdc_bmp);
SetWindowRgn(hwnd, wnd_rgn, TRUE);
DeleteObject(wnd_rgn);
}