Никак не могу разобраться с функцией BitBlt()
1)Почему, при использовании CreateCompatibleDC(hdc),CreateCompatibleBitmap() фон получается черным?
2) Не получается создать маску для эллипса создаваемого в контексте hdc.(либо черный прямоугольник, либо эллипс на черном фоне)
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC dc = BeginPaint(hwnd, &ps);
HDC hdc=CreateCompatibleDC(dc);
HDC mask=CreateCompatibleDC(dc);
HBITMAP hbmMem = CreateCompatibleBitmap(dc,574, 375);
HBITMAP hbmMem1 = CreateCompatibleBitmap(dc,574, 375);
// hOld = SelectObject(hdc, hbmMem);
//BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCINVERT)
//SetBkColor(hdc, RGB(0, 0, 0));
SelectObject(hdc,hbmMem);
HPEN pen1 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
LOGBRUSH brushInfo1;
brushInfo1.lbStyle = BS_SOLID;
brushInfo1.lbColor = RGB(255, 255, 0);
brushInfo1.lbHatch = 0;
HBRUSH brush1 = CreateBrushIndirect(&brushInfo1);
HPEN pen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
// .............. ............ ..........
LOGBRUSH brushInfo;
brushInfo.lbStyle = BS_SOLID;
brushInfo.lbColor = RGB(255, 255, 0);
brushInfo.lbHatch = 0;
HBRUSH brush = CreateBrushIndirect(&brushInfo);
HPEN oldPen = SelectPen(dc, pen1);
HBRUSH oldBrush = SelectBrush(dc, brush1);
SelectPen(hdc, pen);
SelectBrush(hdc, brush);
Ellipse(dc,0, 0,100, 100);
Ellipse(hdc,100, 50,250, 150);
HDC test=CreateCompatibleDC(hdc);
HBITMAP testm=CreateCompatibleBitmap(hdc,574,375);
SelectObject(test,testm);
BitBlt(test,0,0,574,375,hdc,0,0,SRCCOPY);
//BitBlt(test,0,0,574,375,hdc,0,0,SRCINVERT);
//BitBlt(test,0,0,574,375,hdc,0,0,SRCAND);
BitBlt(dc,100,200,574,375,test,0,0,SRCCOPY);
//BitBlt(dc,0,0,574,200,hdc,0,0,SRCPAINT);
//BitBlt(dc,0,0,574,200,hdc,0,0,SRCPAINT);
//BitBlt(dc,0,0,574,200,hdc,0,0,SRCINVERT);
SelectPen(hdc, oldPen);
SelectBrush(hdc, oldBrush);
DeletePen(pen);
DeleteBrush(brush);
EndPaint(hwnd, &ps);
}
С маской уже разобрался. Но вот почему он всё же черный фон делает не понимаю.
На единичном кадре всё отлично. Попробовал использовать маски в анимации. Наткнулся на ряд проблем.
1)Хоть черный фон и удаляется, но контур эллипса продолжает отрисовываться(хотя время от времени исчезает).
2)Анимация при использовании масок останавливается быстро, если вывод на черном фоне, то несколько позже снова останавливается.
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC dc = BeginPaint(hwnd, &ps);
int Horres = GetDeviceCaps(dc, HORZRES);
int Vertres = GetDeviceCaps(dc, VERTRES);
hdcMem = CreateCompatibleDC(dc);
hbmMem = CreateCompatibleBitmap(dc,Horres, Vertres);
HDC hdcMem1 = CreateCompatibleDC(dc);
HBITMAP hbmMem1 = CreateCompatibleBitmap(dc,Horres, Vertres);
hOld = SelectObject(hdcMem, hbmMem);
HPEN pen = CreatePen(PS_SOLID, 2, RGB(255-move, 0+move, 0+2*move));//ýòî ñîçäàíèå ïåðà
LOGBRUSH brushInfo;//ñîçäàåòñÿ ýëåìåíò ñòðóêòóðû logbrush
brushInfo.lbStyle = BS_SOLID;
brushInfo.lbColor = RGB(255-move, 255-2*move, 0+2*move);
brushInfo.lbHatch = 0;
HBRUSH brush = CreateBrushIndirect(&brushInfo);//à òóò ñîçäàåòñÿ êèñòü
HPEN oldPen = SelectPen(hdcMem, pen);
HBRUSH oldBrush = SelectBrush(hdcMem, brush);
Ellipse(hdcMem,100,50+move,250, 150+move);
Ellipse(hdcMem,400,100-move,250, 200-move);
Ellipse(hdcMem,400,50+move,550, 150+move);
SelectPen(dc, oldPen);//õèòðîå ìåñòî òóò ìû âûáèðàåì êèñòè ïåðüÿ àíàëîãè÷íûå ïðåäûäóùèì, îíè èñïîëüçóþòñÿ äëÿ õðàíåíèÿ èíôîðìàöèè î ïðåä êèñòÿõ
HDC test=CreateCompatibleDC(hdcMem);
HBITMAP testm=CreateBitmap(Horres,Vertres,1,1,NULL);
//SetBkColor(hdcMem,RGB(0,0,0));
SelectObject(test,testm);
SelectObject(hdcMem1, hbmMem1);
/* BitBlt(test,0,0,Horres,Vertres,hdcMem,0,0,SRCCOPY);
BitBlt(hdcMem1,0, 0,Horres,Vertres,hdcMem,0,0,SRCINVERT);
BitBlt(hdcMem1,0, 0,Horres,Vertres,test,0,0,SRCAND);
BitBlt(hdcMem1,0, 0,Horres,Vertres,hdcMem,0,0,SRCINVERT);*/
BitBlt(dc,0, 0,Horres,Vertres,hdcMem,0,0,SRCCOPY);
SelectBrush(hdcMem, oldBrush);
SelectObject(hdcMem, hOld);
DeleteObject(hbmMem);
DeleteObject(dc);
DeleteDC (hdcMem);
DeletePen(pen);//òàê êàê àêòèâíûå ñòàðûå êèñòè, ìû ìîæåì ïðîñòî óäàëèòü òå, êîòîðûìè ðèñîâàëè.(pen, brush óæå íå èñïîëüçóþòñÿ â êîíòåêñòå óñòðîéòñòâà.)
DeleteBrush(brush);
EndPaint(hwnd, &ps);
}
Обнаружил утечку памяти из-за того, что не удалял используемые контексты. Но анимация всё равно останавливается.