###前提・実現したいこと
C言語とWIN32APIを使用したシステム開発を行っています。
現在はマウスカーソルの速度に応じてマウスカーソルの色を変化させるプログラムを実装しようとしています。
カーソルの速度が大きく変化した場合にのみWM_PAINTを呼び出し、カーソル(ウィンドウ)の再描画を行う方針です。
###発生している問題・エラーメッセージ
問題なのですが、InvalidateRect()の後にUpdateWindow()すると画面がちらつき、プログラムが凍ってしまいます。
調べたところ、ちらつく原因としては
InvalidateRect()で背景を塗りつぶす→UpdateWindow()による再描画の繰り返しによるものであると考えられたため、InvalidateRect()の第三引数をNULLにしたりと試みましたがうまくいきませんでした。
###該当のソースコード
/*カーソルの速度変化の判定部分*/ //20161225追加 if(test_gazeposition_flag){ //20160103追加(視線カーソルの速度評価) //最初の一回目はbefore_gazepositionを持っていないのでスルーする方向で行く if(Before_GazePosition_Count) { cal_speed = check_speed(GazePosition_X,GazePosition_Y,Before_GazePosition_X,Before_GazePosition_Y); file2 = fopen("./experiment/cal_speed.txt", "a+"); fprintf(file2, "%d,%d,%d,%d,%d\n",cal_speed,GazePosition_X,GazePosition_Y,Before_GazePosition_X,Before_GazePosition_Y); fclose(file2); //cal_speedによって速度のクラスを決定する if(cal_speed >= 40) { //高速 class_speed = 1; } else if(cal_speed >=20) { //中速 class_speed = 2; } else if(cal_speed >=5) { //低速①(パスート運動) class_speed = 3; } else if(cal_speed >=2) { //低速②(注視) class_speed = 4; } //以前のclass_speedと差異があるかの判定 if(check_class(class_speed)) { //以前と同じ場合、ここでは何もしない else { //違う場合は色を変えるためのフラグをオンに //一回目はここに入るはず… change_speed++; change_color = TRUE; } //1つ前のクラスを保存 before_class = class_speed; } else { //インクリメントすることで以後上の分岐に入る Before_GazePosition_Count++; } //20170103追加(ひとつ前のカーソル位置の保存) Before_GazePosition_X = GazePosition_X; Before_GazePosition_Y = GazePosition_Y; if(change_color) { InvalidateRect(hwndGazeCursor_Ctl,NULL,FALSE); ←カーソルの色を変える必要のある場合は一旦InvalidateRect()しています UpdateWindow(hwndGazeCursor_Ctl); } else { //視線カーソルウィンドウの更新 UpdateWindow(hwndGazeCursor_Ctl); ←カーソルの色を変える必要のない場合はそのままUpdateWindow()しています } /////////////////// WM_PAINTによる描画部分////////////////////////////////////// case WM_PAINT: if(!test_gazeposition_flag){ // BeginPaintでマーカーの表示を始める hdc = BeginPaint(hwnd, &ps); hBrush = CreateSolidBrush(RGB(0,0,0)); // ブラシの決定 RGB(0,0,0) SelectObject(hdc, hBrush); Rectangle(hdc, 0, 0, 17, 30); //直方形の描画 hOldB = SelectObject(hdc, hBrush); DeleteObject(hBrush); EndPaint(hwnd,&ps); } else { /*カーソルのスピードによって使用するブラシが変わりますが、上記とほぼ同様の描画処理*/ } break;
###試したこと
InvalidateRect()の第二引数を再描画の対象部分に指定 ← 解決に至らず(ちらつきがおさまらない)
InvalidateRect()の第三引数をNULLへと変更 ← 解決に至らず(同上)
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
以下、参考にしたサイトです。
(1)「InvalidateRect関数」
<URL>https://msdn.microsoft.com/ja-jp/library/cc410421.aspx/
(2)「ちらつきをおさえる」
<URL>http://www.eonet.ne.jp/~maeda/winc/direct.htm/
(3)「描画の一括処理」
<URL>http://eternalwindows.jp/graphics/repaint/repaint04.html/

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/09 07:33
2017/01/09 10:12