Путаница в двух функциях MFC GDI - PullRequest
5 голосов
/ 16 апреля 2011

и хорошего дня всем вам.Это мой первый пост здесь. Я читал «Программирование Windows с помощью MFC - J Prosise (MS Press)»
Во второй главе я наткнулся на 2 функции GDI, которые меня действительно смутили, я цитирую текст:

Легко запутать SetViewportOrg и SetWindowOrg, но на самом деле различие между ними совершенно очевидно.Изменение начала координат области просмотра (x, y) с помощью SetViewportOrg указывает Windows сопоставить логическую точку (0,0) с точкой устройства (x, y).Изменение начала координат окна на (x, y) с помощью SetWindowOrg делает по существу обратное, сообщая Windows, чтобы сопоставить логическую точку (x, y) с точкой устройства (0,0) - верхним левым углом поверхности дисплея.В режиме отображения MM_TEXT единственное реальное различие между двумя функциями - это знаки x и y.В других режимах отображения есть нечто большее, чем это, потому что SetViewportOrg работает с координатами устройства, а SetWindowOrg работает с логическими координатами

Я действительно запутался с этим, это как если мы изменим начало точки обзора, чтобы сказать (50,50) и затем использовать dc.ellipse (0,0,50,50), он будет начинаться с точки устройства (50,50) в качестве источника, но если мы изменим начало окна на (50,50), это будет означать сейчаслогическая точка (50,50) будет отображаться в (0,0), если это так, не будет ли эллипс вне области клиента в верхней области?А что за режим отображения был MM_LOWENGLISH или что-то еще?Как изменится тогда ситуация?Пожалуйста, если кто-нибудь мог бы пролить свет на этот вопрос, я был бы очень благодарен

1 Ответ

6 голосов
/ 16 апреля 2011

Это довольно сложный вопрос, в основном потому, что у вас есть два совершенно разных набора координат, с которыми нужно иметь дело, и (просто для простоты) 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)] он автоматически устанавливает источник для вас.

...