(for Internet Explorer)
任意の形(4種類固定)の図形や、画像です。
Handle
Surface
Line
近い
遠い
Canvas
マイナス
ゼロ
diff値
最も diff 値が小さいものにヒットします。
を押してから、図形のハンドルをドラッグすると、図形が回転します。
CMainFrame::m_mode == CMainFrame_Rotate
Rect_Ex::m_RotateDegree
CadPrim::MoveByHandle( bool bRotate = true )
回転モード
図形の角度
ハンドルを動かす
回転の正方向(Y軸が下向きなので)
アンチエイリアスには対応していないので、回転するとギザギザした感じに
表示されてしまっています。
回転した楕円は、多角形に近似して(ごまかして)表示しています。
参考
図形の回転角度は、(マウス位置の角度) - (ハンドルの角度) で求まります。
dx, dy から、角度は atan2 で求まります。
図形の角度
→ 逆正接 atan, atan2
参考
Rect_Ex::GetHitHandleNum
  TwoD_XY_init( &xy, x, y );
  TwoD_XY_init( &center, m_Rect.x + m_Rect.w / 2, m_Rect.y + m_Rect.h / 2 );
  TwoD_XY_rot( &xy, &center, - m_RotateDegree * (2 * 3.141592) / 360 );
角度=-30°
● は回転の中心
マウス位置を
-m_RotateDegree 回転
このように回転していない
状況に戻してヒット判定します。
回転した図形のヒット判定は、回転していない状況に戻してから行います。
の最初の方:
  TwoD_XY_init( &xy, *dx, *dy );
  TwoD_XY_init( &center, 0, 0 );
  TwoD_XY_rot( &xy, &center, m_RotateDegree * (2 * 3.141592) / 360 );
の最後の方:
Rect_Ex::GetHitHandleNum
回転した図形における、マウスの位置を原点としたハンドルの座標 (*dx,*dy)
(Rect_Ex::GetHitHandleNum の出力の1つ)は、回転した状況に戻す必要があります。
前提として、図形を回転させるときは、図形の中心を回転の中心に回転するとします。
参考
Rect_Ex::MoveByHandle に渡される座標は、m_Rect.x, m_Rect.y ではなく、そこから
回転した位置です。 (上の図の◆)
図形の新しい位置(m_Rect.x, m_Rect.y)は、新しい●を中心に◆を逆回転した位置
になります。
つまり、古い変数の値による ( m_Rect.x + m_Rect.w / 2,  m_Rect.y + m_Rect.h / 2 )
を中心に逆回転させるのではありません。
逆回転させる中心は、左上が ◆ の 0°の図形の中心座標を、◆を中心に正回転した
位置になります。
図形の新しい位置(m_Rect.x, m_Rect.y)は、下記の (1)と(2) を行った後の ■ です。
(1) ◆を中心に正回転
(2) 上の●を
中心に逆回転
新しい m_Rect.x, m_Rect.y の位置
(MoveByHandle に渡す値)
前提として、図形を回転させるときは、図形の中心を回転の中心に回転するとします。
この問題を対処するには、不動点がずれた分だけ、図形の基準点を移動するようにします。
この性質を踏まえて、たとえば、下のハンドルを下へドラッグしたとき、図形の高さを増やすだけでは
うまくリサイズしません。 下の図のように、中心点が横に移動しないため、不動点の1つである
左上の頂点がずれます。
期待する動作
高さを増やしただけの動き
中点がずれる量を計算することもできますが、誤差が心配なので採用していません。
回転した図形を、変換します。
・印刷、VML出力、VBA(Word, Excel, PPT)出力 、EMF 出力
図形を回転する。
回転した図形を移動する。
回転した図形の大きさを変える。
テキストならエディタを起動する。
パス条件
120度以上回転している図形の周りをクリック&範囲選択しても選択状態にならないこと。

図形を移動するとき、ドラッグ開始直後に、図形が飛ぶことがないこと。
このとき、ドラッグ開始点は左端に近いところ、右端に近いところの、2点で試すこと。

図形の大きさを変えるとき、ドラッグ終了時のマウスの位置がハンドルのある位置にあること。

テキストエディタが起動中は、回転させないで、エディタを終了したら、元の回転に戻ること。

回転モードで、ハンドルの上にカーソルを持っていったら、カーソルが変わること
not_pass
サブテストケース1を、下記図形やテキストについて行います。
各形状の図形、
複数行のテキストの基準点が、左、中央、右。
サブテストケース2を、ズーム&スクロールした状態で行います。
テストケース
テスト手順
サブテストケース1
サブテストケース2
サブテストケース3
サブテストケース4
サブテストケース1
サブテストケース2、4
とくになし
すべての図形やテストについて、サブテストケース1を行い、パス条件を満たしているか
確認します。
スクロール&ズームした状態で、同様にパス条件を満たしているか確認します。
サブテストケース4を行います。
not_pass
not_pass
not_pass
サブテストケース3
ゆっくりスクロールさせても、図形が欠けないこと
→ テストフォルダ
で開いて
に移動します
r.bat を実行します。 (rotate_test.svg が開きます)
画像ファイルを
ドロップしたら
CSVGCatApp::Load_imp
/* 埋め込み画像ファイルを復活する */
CSVGCatApp::GetImgWorkFilePath
Rect_Ex::Draw
%08X=hWnd, %d=static変数 id ++
拡張子は、Rect_Ex::Draw 時に決定 …
SVGファイルをロードしたら
描画するときは
m_ImgWorkPath
m_ImgPath
(プロパティ)
リンク画像のとき、
更新されたらコピー
DDB(Device Depend Bitmap)
高速描画用に変換。矩形の縦横サイズを画像に合わせる。
Susies_drawStretch, WinX_DDBmp_openForWrite
CMainFrame::DropFile
/* 画像を追加する */
WinX_DDBmp_readDirect による高速ダイレクト描画
SVGに埋め込んだ画像ファイル
ウィンドウや紙
テスト項目
・画像ファイルをドロップして、すぐに表示されること。
・画像を移動するときは、DDB を作り直さないこと。
・ドロップしたファイルを消したり、別の内容に変えても、変わらないこと。
・縮小して、埋め込みでなくしてから(リンク画像にしてから)、別の内容に(更新日時も)変えたら、
 内容が変わり縦横サイズが縮小したままであること。
・消すとグレー表示になること。
img_%08X_%d
CChildView::PasteAdjust
/* 画像の ImgWorkFilePath
ファイル名を決定 …
Rect_Ex::copyImageToWork
FileX_repairExt
画像図形を
ペーストや
ドロップしたら
ImgWorkFilePath (名前)は新しくして、
ファイルはコピーする。
DDBは作り直す。
画像関係のデバッグをするときは、
Rect_ImgDebug を 1 にしてください。
基本テスト用データ
→ simple.svg
色の数を変えても、画像が正しく表示できること(キャッシュをリセットしていることのチェック)
ズームアップしたとき、zoom をかけても、ちょうど画像サイズにならないことが多いので、
Rect_Ex::m_bZoomUpTarget を設定し、このフラグが立っていたら誤差を無くす。
縦横サイズの正確さより、画像のきれいさを優先する。
m_bZoomUpTarget
縮小する、100% に戻す
キャンバスより大きな画像をキャプチャすることが多く、そのとき、縮小するためのハンドルをつかまえる
のに、スクロールさせなければならない。 この手間を無くすため、画像の縮小をメニューから選べるよう
にする。
100%に戻す(画像のオリジナルサイズにする)こともよくあるだろう。
ズームアップ
画像のカタログ的な SVG ファイルを作成したとき、画像のオリジナルサイズで見たくなることがよくある。
ズームアップ機能で、その画像がオリジナルのサイズで見えるようにズームする。
スクロール位置
画像
画像の中心がウィンドウの中央になるようにする。

img.cy * zoom / 100 - client.h / 2