Ich habe zwei Fenster, Elternfenster, wo ich von D3D11 und zweiten Kindfenster rendern, was ich über Elternfenster verschieben möchte.GDI und DirectX-Rendering
hier ist der Code, wie ich bin Erstellen von Fenstern:
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)0;
wcex.lpszMenuName = 0;
wcex.lpszClassName = L"Parent";
wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
if(!RegisterClassEx(&wcex)){
return E_FAIL;
}
if(!(hWnd = CreateWindowEx(WS_EX_COMPOSITED,L"Parent",L"WINDOW",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN |
WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
WIDTH,HEIGHT,
NULL,NULL,
hInstance,NULL))){
return E_FAIL;
}
und Kind Fenster
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = 0;
wcex2.lpfnWndProc = WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)0;
wcex2.lpszMenuName = 0;
wcex2.lpszClassName = L"Child";
wcex2.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
if(!RegisterClassEx(&wcex2)){
return E_FAIL;
}
if(!(chilWnd = CreateWindowEx(0, wcex2.lpszClassName, NULL,
WS_CHILD|WS_CLIPSIBLINGS,
0,0,
200, 100,
hWnd,NULL,
hInstance,0)))
{
return FALSE;
}
das ist WndProc Kinder Fenster
case WM_LBUTTONDOWN:
dragWindow = true;
SetCapture(hWnd);
break;
case WM_LBUTTONUP:
ReleaseCapture();
dragWindow = false;
break;
case WM_MOUSEMOVE:
if (dragWindow == true)
{
RECT mainWindowRect;
POINT pos;
int windowWidth, windowHeight;
pos.x = (int)(short) LOWORD(lp);
pos.y = (int)(short) HIWORD(lp);
GetWindowRect(hWnd,&mainWindowRect);
windowHeight = mainWindowRect.bottom - mainWindowRect.top;
windowWidth = mainWindowRect.right - mainWindowRect.left;
ClientToScreen(hWnd, &pos);
HDWP hdwp = BeginDeferWindowPos(1);
DeferWindowPos(hdwp,
hWnd,
HWND_TOP,
pos.x,
pos.y,
windowWidth,
windowHeight,
SWP_NOZORDER);
EndDeferWindowPos(hdwp);
LockWindowUpdate(hWnd);
RedrawWindow(hWnd, 0, 0, RDW_UPDATENOW);
LockWindowUpdate(NULL);
....
case WM_PAINT:
hdc = BeginPaint(hWnd, &Ps);
FillRect(hdc, &r, (HBRUSH)GetStockObject(GRAY_BRUSH));
EndPaint(hWnd, &Ps);
ohne LockWindowUpdate() Funktion Ich habe Kind Fenster Spuren, wenn ich es bewege. Endergebnis ist, dass Kindfenster schwarz ist, während ich es bewege. Was kann ich mehr tun? Ich versuchte GDI doppelte Pufferung, d. H. In Offscreen-Puffer auf WM_MOUSEMOVE Ereignis zeichnen und auf Fenster WM_PAINT Ereignis, aber das gleiche Ergebnis.
In Kind proc können Sie hinzufügen 'Fall WM_NCHITTEST: return HTCAPTION;' das wird das Fenster bewegen (Entfernen Sie 'WM_MOUSEMOVE/LBUTTONUP/DOWN') Versuchen Sie auch' WS_EX_COMPOSITED' auf Null zu setzen –
Ich habe 'case WM_NCHITTEST: HTCAPTION zurückgeben;' und 'WM_MOUSEMOVE/LBUTTONUP/DOWN' entfernt, aber ich habe Spuren des untergeordneten Fensters, wenn ich es verschiebe wie alte Positionen. – Alatriste
Es sollte keine Zeilen folgen. Aktualisieren Sie Ihre Frage, um zu zeigen, was Sie gerade tun. –