2

私はWin7デスクトップアプリを書いていて、ウィンドウからウィンドウフルスクリーン(およびその逆)にシームレスに移行したいと考えており、SetWindowLongPtrを呼び出してスタイルを更新し、その後すぐにMoveWindowを呼び出してサイズと位置を更新することでこれを達成しました. 問題は、スタイルが更新されたことを示すためにウィンドウが 1 フレームだけ点滅しますが、新しいサイズと位置が表示されないことです。次のフレームはすべて正しく見えますが、この単一フレームのアーティファクトを回避しようとしています。

API を呼び出す順序を逆にしてみましたが、アーティファクトの外観が変わるだけです。ウィンドウを非表示にし、API を呼び出してからウィンドウを表示することも試みましたが、これによりウィンドウが 1 フレームだけ消えてしまいます。

目的のプロパティを持つ新しいウィンドウを作成し、古いウィンドウを破棄するという選択肢があることは知っていますが、より安価な代替手段を見つけたかったのです。

これらの API を呼び出して、アトミックに視覚的に反映させる方法はありますか? おまけとして、結果として得られる複数の WM_SIZE メッセージを 1 つのイベントに結合することもできますが、それはメッセージ ハンドラーで自分で管理できます。

4

4 に答える 4

1

チェックアウトWM_SETREDRAW; RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN)これを使用して再描画を無効にし、ウィンドウ スタイルを変更してから、それらをアトミックに表示するために呼び出します。

于 2013-09-26T19:51:37.537 に答える
1

MSDNは次のように述べています。

特定のウィンドウ データはキャッシュされるため、 SetWindowLongPtrを使用して行った変更は、 SetWindowPos 関数を呼び出すまで有効になりません。

したがって、これは機能するはずです。おそらく、MoveWindow の代わりに SetWindowPos を使用してみてください。

これらの呼び出しによって発生したイベントを取得したときに、window proc で何か面白いことをしていますか? 特に、サイズなどを「固定」していますか?

于 2013-09-26T19:05:01.337 に答える
0

「windowed-fullscreen」とはどういう意味ですか? 最大化と同じですか?

もしそうなら、?ShowWindow(hwnd, SW_MAXIMIZE)

于 2013-09-26T18:53:55.107 に答える