Программное создание масок
От: Exo_Seeker  
Дата: 08.03.12 14:11
Оценка:
Никак не могу разобраться с функцией 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);
}
bitblt winapi gdi
Re: Программное создание масок
От: Exo_Seeker  
Дата: 08.03.12 14:48
Оценка:
С маской уже разобрался. Но вот почему он всё же черный фон делает не понимаю.
Re: Программное создание масок
От: Exo_Seeker  
Дата: 08.03.12 15:38
Оценка:
На единичном кадре всё отлично. Попробовал использовать маски в анимации. Наткнулся на ряд проблем.
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);
}
Re[2]: Программное создание масок
От: Exo_Seeker  
Дата: 08.03.12 15:51
Оценка:
Обнаружил утечку памяти из-за того, что не удалял используемые контексты. Но анимация всё равно останавливается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.