環境は、VC++6.0sp6 WindowsXPです。
長方形の右下座標を描画する必要があり、詳細グラフィックスモードにする
ようにしたのですが、(SetGraphicsModeを使用)
以下のように弧を描画した場合に、ヘルプでは、SetGraphicsMode
の所で、GM_ADVANCEDを指定した場合は弧は常に反時計回りで描画される
とあるのですが、実行してみると、どうも時計回りで描画されているようなのです。
何か、考え方が違うのでしょうか?
すいませんが、誰か教えてください。お願いします。
void CTESTView::OnDraw(CDC* pDC)
{
CTESTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect rect;
GetClientRect(&rect);
pDC->SetViewportOrg(rect.CenterPoint());
pDC->SetMapMode(MM_HIMETRIC);
::SetGraphicsMode(pDC->GetSafeHdc(), GM_ADVANCED);
CRect rect1(0, 1000, 1000, 0);
pDC->Arc(rect1, CPoint(500, 0), CPoint(1000, 500));
}
// x の正の値は右方向、y の正の値は上方向を指します。
pDC->SetMapMode(MM_HIMETRIC);
なので時計回りになるのでないでしょうか?
GM_ADVANCEDを指定した場合は弧は常に反時計回りで描画されると
あるので、マッピングモードに依存しないと思ってたのですが、
MM_HIMETRICの場合は、時計回りとなるのでしょうか?
もしかしたら・・
GDI+ と GDI のことでしょうか
たとえばSDK(Win32プロジェクト)で描画原点を中央に移動します。
図形などは中央より右下に描画されます。
当然ですよね。
その状態でGDI+を使うと設定した描画原点ではなく
画面の左上隅を原点に描画してしまいます。
見当ちがいでしょうか?
GDI+は使ってなく、GDIでやってるのですが、
上記のコードで、SetGrahpicsMode関数をコール
しない場合は、反時計回りで円弧が描画されるのですが、
(円弧の長さで言えば、短いものになる。)
SetGraphicsMode関数でGM_ADVANCEDを指定してコール
すると、時計回りで円弧が描画されてしまう。
(円弧の長さで言えば、長いものになる。)
ヘルプでは、常に反時計となっているので、どうしてかな
と思い、ここに記載した訳です。
もし、詳しい方がおられたら、教えて頂きたいです。
わかりにくい表現ですみません。
GDIではどうやら、X軸の正方向からY軸の正方向に向って回る方向を
時計回りとしているような気がします。
MM_TEXTで描画してみれば納得がいく結果になると思います。
MM_HIMETRICの場合はデバイス座標系に対してY軸が反転しているので、
見た目に反する結果になるのだと思います。
MFCは内部でGDI+ 使ってますかね?
> MFCは内部でGDI+ 使ってますかね?
使ってないと思いますよ。
少なくともVC++6に関しては。
必要ならSetArcDirectionで調整されてはいかがでしょうか?
かもねぎさん、ありがとうございました。
SetArcDirectionで調整することにしました。
皆さん、ありがとうございました。