2

私のプログラムは、とりわけ、コンソール ウィンドウの外観 (主にウィンドウ サイズと境界線) を変更します。
現在、私のコンピューターではすべてが完全に機能していますが、VirtualBoxまたは別のコンピューターでアプリケーションを実行すると、次のようになります。

何が起こっている

画像の左上隅にあるウィンドウは、実際にはウィンドウではありません。クリックできないウィンドウの画像です。(マウス クリックはそれを通過します)
デスクトップ上の選択長方形をその上に伸ばすか、(たとえば) その下にあるボタンを強調表示すると、それを取り除くことができます。また、ウィンドウをその上に移動すると、ウィンドウが完全に消えます。

画像の右下隅にある黒い四角形は私のコンソール ウィンドウで、正しく表示されています。

私の質問は、C++ で「ゴースト」ウィンドウを取り除く方法ですか?
少しグーグルを試してみましたが、見つけたのはChangeDisplaySettings(0, 0);で、これは私のコンピューターでは何もしません (おそらく私のコンピューターではこの問題が発生していないためです)。ウィンドウをフルスクリーンにしてから、元の状態に戻します。(アプリケーションを初めて実行したときに画面がちらつきます)
ゴースト ウィンドウは削除されますが、画面がそのようにちらつきたくないので、これは私が探しているものではありません。

編集:
この問題に関連するコードが何であるかを実際に把握できないため、プログラム内のウィンドウ自体の変更に関係するほとんどすべてのコードをダンプします。

CSBIEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
GetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
CSBIEx.dwSize.X = 49;
CSBIEx.dwSize.Y = 21;
SetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
srWnd.Bottom = 20;
srWnd.Left = 0;
srWnd.Right = 48;
srWnd.Top = 0;
SetConsoleWindowInfo(hCon, TRUE, &srWnd);
GetClientRect(hWnd, &rClnt);
rClnt.top += 1;
rClnt.bottom -= 2;
rClnt.right -= 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) - rClnt.right / 2) - 1, (rScr.bottom / 2) - rClnt.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE);
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1);
ShowWindow(hWnd, SW_SHOWNORMAL);
//ChangeDisplaySettings(0, 0);

2番目の編集:
それが役立つかどうかはわかりませんが、ChangeDisplaySettings(NULL, 0);代わりに使用ChangeDisplaySettings(0, 0);しても何も起こらないことに気付きました. NULLそれが#definedであることを考えると、それはかなり奇妙0です..
誰も何も理解できない場合、私はおそらくChangeDisplaySettings(0, 0);.

4

2 に答える 2

2
InvalidateRect(NULL, NULL, TRUE);

私が探していたものでした。

于 2012-11-29T13:48:28.750 に答える
0

コンピューターで「Aero」テーマを実行していますか?その場合は、クラシックテーマに切り替えます。Betchaは、問題が明らかになるのを見るでしょう。アプリがWM_PAINTメッセージを適切に処理していないと思います。Aeroテーマは、送信するWM_PAINTメッセージがはるかに少なくなります。OSは、保存したビットマップを使用してペイントを実行します。

編集:新しい次元でこれらを呼び出してみてください:

BOOL WINAPI SetConsoleDisplayMode(
    _In_       HANDLE hConsoleOutput,
    _In_       DWORD dwFlags,
    _Out_opt_  PCOORD lpNewScreenBufferDimensions
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033%28v=vs.85%29.aspx

BOOL WINAPI SetConsoleWindowInfo(
  _In_  HANDLE hConsoleOutput,
  _In_  BOOL bAbsolute,
  _In_  const SMALL_RECT *lpConsoleWindow
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686125%28v=vs.85%29.aspx

DispatchMessageを使用してWM_PAINTメッセージを自分に送信してみることもできます。

于 2012-11-28T13:23:09.800 に答える