我有這樣做的擴展畫面的窗口:在擴展幀繪製給人奇怪的顏色
但任何在擴展幀繪製具有非常奇怪的顏色(除了白色,唯一的顏色即保持不變),像這樣(忽略在在市中心凌亂內容和凌亂的工具欄。
粉紅色的矩形(0xFFC9FF
)的應該是0x8000FF
。如果我將DirectX11內容(中心事物)放在擴展幀中,我的FPS計數器的alpha混合會變得混亂。如果我對正確的對話框做同樣的事情,也會發生同樣的情況。
所以,我該怎麼辦這是否正確?我已經試過先畫到內存DC,然後使用BitBlt
。我使用GDI +(加CreateCompatibleDC
,CreateCompatibleBitmap
等功能來處理內存DC)。
PS:因爲你問,這裏是WndProc
:
LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT ReturnValue;
if (DwmDefWindowProc(hWnd, uMsg, wParam, lParam, &ReturnValue)) return ReturnValue;
switch (uMsg)
{
case WM_CREATE:
{
// ...
RECT rcClient;
GetWindowRect(hWnd, &rcClient);
SetWindowPos(hWnd,
NULL,
rcClient.left, rcClient.top,
rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
SWP_FRAMECHANGED);
return 0;
}
case WM_ACTIVATE:
{
MARGINS Margins;
Margins.cxLeftWidth = LEFT_BORDER;
Margins.cxRightWidth = RIGHT_BORDER;
Margins.cyTopHeight = TOP_BORDER;
Margins.cyBottomHeight = BOTTOM_BORDER;
if (DwmExtendFrameIntoClientArea(hWnd, &Margins) != S_OK)
{
MessageBox(hWnd, L"Erro ao configurar janela.", NULL, MB_ICONERROR);
PostQuitMessage(WM_QUIT);
}
if (LOWORD(wParam))
{
fActive = true;
}
else
{
fActive = false;
}
InvalidateRect(hWnd, NULL, false);
return 0;
}
case WM_SIZE:
/* ... */
case WM_NCCALCSIZE:
return 0;
case WM_NCHITTEST:
/* ... */
case WM_GETMINMAXINFO:
((LPMINMAXINFO)lParam)->ptMinTrackSize = { 640, 400 };
return 0;
case WM_PAINT:
{
using namespace Gdiplus;
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
RECT rcWindow;
GetWindowRect(hWnd, &rcWindow);
POINT ptSize = { rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top };
HDC hBuffer = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, ptSize.x, ptSize.y);
SelectObject(hBuffer, hBitmap);
Graphics graphics(hBuffer);
Pen Outline(Color(128, 128, 128));
SolidBrush Selected(Color(128, 0, 255));
Rect Tab1(10, 10, 200, 50);
graphics.FillRectangle(&Selected, Tab1);
graphics.DrawRectangle(&Outline, Tab1);
/* ... */
BitBlt(hDC, 0, 0, ptSize.x, ptSize.y, hBuffer, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
return 0;
}
/* ... */
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
在我看來是毫無意義的詢問程序,但不會顯示你的程序。 –
@DavidHeffernan是的,你是對的。我應該發佈它。 – LHLaurini
總是很高興看到噸的蘇珊娜模型! 'AlphaBlend'是你完成這項任務的朋友。 – enhzflep