• 締切済み

EDIT 作成時のちらつき防止について

Enterキーを押下された時に画面にEDITBOXを表示し、 再度Enterキーを押下されたらEDITBOXを消す。 という処理を行っているのですが、表示する時も消す時も画面のちらつきが発生します。 このちらつきを防ぐにはどうしたらいいでしょうか? Enterキーが押されたときに、毎回、CreateWindowし、SetWindowLongでWNDPROCを設定しています。 mainWndProc関数の一部 mHwEnter = CreateWindow("EDIT", "ここに入力", WS_CHILD | WS_VISIBLE | WS_BORDER, 173, 380, 12 * 16, 16, mHwMain, NULL, hInst, NULL); mainWndProc = (WNDPROC)GetWindowLong(mHwEnter, GWL_WNDPROC); SetWindowLong(mHwEnter, GWL_WNDPROC, (LONG)WndProcEnter); 再度Enterキーが押されたとき ウインドウを破棄しています。 WndProcEnter関数の一部 SetWindowLong (mHwEnter, GWL_WNDPROC, (LONG)mainWndProc); DestroyWindow (mHwEnter); mHwEnter = NULL; EDITの表示、消去の仕方はWebで調べたのですが、間違っていたらご指摘お願いします。 また、メイン(親)画面は20FPSくらいで描画し続けています。MFCやDirectXは使用していません。 ちらつき防止のわかる方がいたら回答お願いします。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>EDITの表示、消去の仕方はWebで調べたのですが、間違っていたらご指摘お願いします。 普通はコントロールの表示・非表示のためだけに毎回作成・破棄は行いません。遅いですし。 ShowWindow()でSW_SHOW、SW_HIDEを呼ぶだけです。 >InvalidateRect (mHwMain, NULL, FALSE); > >という処理をいれましたがちらつきは改善されません。 これじゃクライアント領域全体を無効化しちゃってますが。考え方が間違ってます。 ちらつく=全体が無効領域にされている なんですから、EDIT破棄後にValidateRectで全体を有効化してEDITがあった矩形のみ無効化しないと。

  • muenos
  • ベストアンサー率16% (1/6)
回答No.2

EN_UPDAETなどが無限ルーブして、直後に自動で無限ループが解除させるまでの様子がちらつきだと思います。 WndProcEnterでEN_UPDAETなどの処理をしたらmainWndProcでEN_UPDAETされないようにしないといけないと思います。 別件で、*etWindowLongは*etWindowLongPtrにした方がいいです。

回答No.1

何度も画面表示の更新が入る場合にはそのようなちらつきが発生します。 そのような場合には 1) ValidateRect(...)で表示更新領域を削除する。 2) 描画処理。(というかCreateWindowするから自動的にそうなってしまう) 3) ValidateRect()している領域は表示更新されません。 4) そのままではそこには何も表示されない(元のまま)のでCreateWindow(), DestroyWindow() が終わった後に InvalidateRect(...), ShowWindow() してやります。 何か描画アクションが起こるたびに画面を書き直す(Windowsが)からちらつきが発生します。ValidateRect()で「ここの部分は描かなくていいよ」というのをWindowsにまず教えてやります。雑多な処理が終わったときに InvalidateRect() で「やっぱり、ココ描き直して!」とWindowsに指示するわけです。

lilillii
質問者

補足

回答ありがとうございます。 CreateWindow前に recEnter.top = 173; recEnter.left = 380; recEnter.right = 380+12*16; recEnter.bottom = 173+16; ValidateRect(mHwMain, &recEnter); という処理をいれ DestroyWindow後に InvalidateRect (mHwMain, NULL, FALSE); という処理をいれましたがちらつきは改善されません。 これは、EDIT表示時と、消去時のちらつきが解消されるのでしょうか?それともEDITを表示している最中のちらつき防止ほうでしょうか? 説明不足だったかもしれないので、補足しますと、 ちらつきが発生するのは表示した瞬間と、消去した瞬間と、全角文字を入力しEnterキーを押した瞬間の3つの タイミングで、EDIT表示中はちらつきは発生しません。