2015-10-22 4 views
0

Я немного смущен тем, как удваивать буфер. Я не уверен, что мне нужно создать еще CreateCompatibleBitmap или CreateCompatibleDC и как связать все это. Это работает как есть, но я не думаю, что его двойное забуференное право.Двойная буферизация AlphaBlend rect с наложением текста

void __OnPaint(HWND hWnd, HDC _hdc = nullptr) 
{ 
    HDC hdc = _hdc; 
    PAINTSTRUCT paint; 
    RECT& rcClient = paint.rcPaint; 

    if (!_hdc) 
     hdc = BeginPaint(hWnd, &paint); 
    else 
     GetClientRect(hWnd, &rcClient); 

    if (hdc) 
    { 
     int width = rcClient.right - rcClient.left; 
     int height = rcClient.bottom - rcClient.top; 

     HDC hDCMem = CreateCompatibleDC(_hdc); 
     HBITMAP hBitmapMem = CreateCompatibleBitmap(hDCMem, width, height); 

     SelectObject(hDCMem, hBitmapMem); 

     Rectangle(hDCMem, 0, 0, width, height); 

     BLENDFUNCTION bfn; 

     bfn.BlendOp = AC_SRC_OVER; 
     bfn.BlendFlags = 0; 
     bfn.AlphaFormat = 0; 
     bfn.SourceConstantAlpha = 0x50; 

     AlphaBlend(hdc, 0, 0, width, height, hDCMem, 0, 0, width, height, bfn); 

     SetTextColor(hdc, RGB(255, 0, 0)); 
     SetBkMode(hdc, TRANSPARENT); 
     DrawText(hdc, "Your text here", -1, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE); 

     //BitBlt(hdc, 0, 0, width, height, hDCMem, 0, 0, SRCCOPY); 

     DeleteDC(hDCMem); 
     DeleteObject(hBitmapMem); 
    } 

    if (!_hdc) 
     EndPaint(hWnd, &paint); 
} 

Также я нашел, что у меня есть еще одна проблема с этим. Я перемещаю свое окно в WM_TIMER, я вызываю свой __onpaint, проблема с импровизацией - это то, что он не перерисовывает его, есть что-то делать с альфа-бландом, он держит то, что когда-либо было под окном во время 1-го розыгрыша, так как он работал до того, как я использовал

+1

Обычно вам нужно «AlphaBlend», когда вы рисуете растровое изображение с полупрозрачностью. Но у вас нет изображений, вы просто пишете на 'hdc'. Вы нацелены только на двойную буферизацию? или это что-то с растровыми изображениями? –

+1

'HDC hDCMem = CreateCompatibleDC (_hdc);' this должно быть hdc not _hdc – milevyo

+0

oh я пропустил это, я попытался нарисовать полупрозрачный прямоугольник над моим полностью прозрачным окном – ramafe

ответ

0

Двойная буферизация - это делать всю вашу печать и рисование временного растрового изображения, которое должно храниться где-то. рисунки на этом растровом изображении могут произойти за пределами события WM_PAINT (например: при добавлении элементов или изменении выбора).

, то на мероприятии WM_PAINT вам нужно только проецировать это растровое изображение в окно с помощью функции BitBlt или аналогичных функций.

Способ использования AlphaBlend неверен. AlphaBlend используется для рисования изображений, которые имеют AlphaChanel поверх существующего изображения в качестве наложения.

+0

Я использую alphaBlend, чтобы сделать свой прозрачный прозрачный, так как я не знаю других способов сделать это, есть ли способ показать мне пример или связать меня с одним? – ramafe

+0

@ramafe Нет ничего плохого в том, как вы используете AlphaBlend; Я не думаю, что это имеет отношение к вашему вопросу о двойной буферизации. –

Смежные вопросы