4

とりわけ、コンソール ウィンドウのサイズを変更し、ウィンドウの境界線を削除するプログラムを作成しました (ほとんどの場合、ウィンドウ スタイルを WS_POPUP に設定します)。
コンピューターでは、アプリケーションは問題なく実行されますが、別のコンピューター (または VirtualBox) でコードを実行すると、ファンキーな不具合が発生します。

これは、私が話しているこれらの不具合を示す画像です。 素晴らしい被写界深度によるグリッチ

これらの不具合は、ユーザーがウィンドウをコンソール ウィンドウの上に移動または開いてから、コンソール ウィンドウを再び一番上に移動した場合に発生します。
当然のことながら、この問題を解決する最も簡単な方法は、コンソール ウィンドウを常に最前面に表示することだと思いましたが、それは役に立ちませんでした。なぜなら、グリッチは、新しいウィンドウの前にあったものから「背景」を取得するだけだからです。ウィンドウがコンソール ウィンドウの上(または下)に移動/開かれました。
グリッチ領域がどこかにキャッシュ/保存されているようで、ウィンドウのサイズが変更されたことに気付きません。

GetClientRect(hWnd, &rClnt);
rClnt.top += 1;
rClnt.bottom -= 2;
rClnt.right -= 1;
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1);
SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP);
exStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
exStyle &= ~WS_EX_CLIENTEDGE;
SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle);
BringWindowToTop(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rWnd.right / 2) - 1, (rScr.bottom / 2) - rWnd.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE);// After this I just use ShowWindow().
4

1 に答える 1

0

不具合の修正に成功しました。

私がしたことは、関数を (コード スニペットの最後にある) のSetWindowRgn()すぐ上に移動したことだけです。 これにより、不具合のある領域が削除され、ウィンドウが正しく表示されるようになりました。ShowWindow()


その後ウィンドウが中央にならないバグがありましたが、変更して修正しました

if(!SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rWnd.right / 2) - 1, (rScr.bottom / 2) - rWnd.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE))

if(!SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rClnt.right / 2) - 1, (rScr.bottom / 2) - rClnt.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE))
于 2012-11-27T13:03:28.713 に答える