5

そして皆さん、良い一日を。これは私の最初の投稿です。「MFC を使用した Windows のプログラミング - J Prosise (MS Press)」を読んでいました
。第 2 章で、2 つの GDI 関数に出くわし、本当に混乱しました。テキストを引用します。

SetViewportOrg と SetWindowOrg を混同しがちですが、実際には両者の違いは非常に明確です。SetViewportOrg を使用してビューポートの原点を (x,y) に変更すると、論理ポイント (0,0) をデバイス ポイント (x,y) にマップするように Windows に指示されます。SetWindowOrg を使用してウィンドウの原点を (x,y) に変更すると、本質的に逆の処理が行われ、論理ポイント (x,y) をデバイス ポイント (0,0) (表示面の左上隅) にマップするように Windows に指示します。MM_TEXT マッピング モードでは、2 つの関数の唯一の実際の違いは、x と y の符号です。他のマッピング モードでは、SetViewportOrg がデバイス座標を処理し、SetWindowOrg が論理座標を処理するため、それだけではありません。

私はこれと本当に混乱しています。視点の原点を (50,50) に変更してから dc.ellipse (0,0,50,50) を使用すると、デバイス ポイント (50,50) から開始するようなものです。しかし、ウィンドウの原点を (50,50) に変更すると、論理点 (50,50) が (0,0) にマップされることを意味し、その場合、楕円は上界?マッピング モードは MM_LOWENGLISH か何かでしたか? その後、状況はどのように変化しますか?誰かがこの問題に光を当てることができれば、本当に感謝しています

4

1 に答える 1

6

これはかなり複雑な質問です。これは主に、2 つの完全に別個の座標セットを処理する必要があり、(興味深いことに) Windows では、他の世界で使用されている用語とはほぼ逆の用語が使用されているためです。

簡単な答えは、まったく使用SetWindowOrgしないことです。実際のコードでこれをうまく使ったことは一度もないと確信しています。

SetViewportOrg便利で、説明が聞こえるよりも本当に簡単です-あなたはあなたの起源がどこにあるべきかを選んでいるだけです. たとえば、ウィンドウの左下隅から描画を開始したい場合があります。次のようなものでそれを行います:

CRect rect;
GetClientRect(&rect);

pDC->SetViewportOrg(0, rect.Height());

OTOH、負の数と正の数の両方を描画できるようにしたい場合は、ウィンドウの左側に x=0 を配置し、ウィンドウの上部と下部の中間に y=0 を配置することをお勧めします。次のようにします。

// get rect as above.
pDC->SetViewportOrg(0, rect.Height()/2);

ウィンドウの中心を (0,0) にしたい場合は、次のようにします。

// again, get rect like above
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);

これらのいずれかの主な用途は、MM_ISOTROPIC または MM_ANISOTROPIC に設定されたマッピング モードであることに注意してください。これらは、座標を完全に自分で設定する場所です。他のモード [MM_TEXT または MM_(LO|HI)(ENGLISH|METRIC)] では、原点が自動的に設定されます。

于 2011-04-16T07:12:16.597 に答える