質問: y + 2; invalidatergn(hwnd,hrgn,true); sleep(100); }
回答: invalidatergnで無効にした領域だけを再描画するため 右下が欠けたようになるのだと思います createellipticrgnでリュージョンを生成するのを 描画側でやります 描画には fillrgnとframergnで行い 描画位置更新イベント側では getrgnboxでリュージョンの矩形範囲を取得し 進行方向へ膨らませて invalidaterectを実行して見ましょう // 描画側 hrgn = createellipticrgn(x - hankei, y - hankei, x + hankei, y + hankei); hbrush hbrframe = createsolidbrush(rgb(255,0,0)); // hbr: 塗りつぶしようのブラシは生成済みと仮定 fillrgn(hwnd, hrgn, hbr); framergn(hwnd, hrgn, hbrframe, 3, 3); deleteobject(hbrframe); // 消去側 rect r = {0}; if (hrgn) { // 矩形範囲を取得 getrgnbox(hrgn, &r); // 再描画の増分を考慮 r.right += 4; r.bottom += 2; /* 左上に動かすなら left, topを更新 右上なら right,top 左下なら left,bottom */ invalidaterect(hwnd, &r, true); // 使用済みなので リュージョンを破棄 if (deleteobject(hrgn)) { hrgn = null; } } x += 4; y += 2;