Win32 API 에서 '출력 좌표' 와 '매핑모드' 에 대해 .. ㅠㅠ 정말 모르겠습니다 ㅠㅠ

naddolki의 이미지

기초적인 부분인 것 같지만 ..
제 나름대로의 노력으로는 .. 어디에서도 답을 얻을 수 없어서 올리는 글인데요 ^^ ;;
두서없이 생각나는 대로 긁적이다 보니 .. 바보스럽고, 긴 글이 되어버렸네요 .. ㅠㅠ
시간 넉넉하신 분께서만 읽으셔야 할 것 같습니다 ... 죄송합니다 ㅠㅠ

책 몇 권과 웹 서핑을 통해 "출력 좌표" 와 "매핑 모드" 를 공부하고 있는데요 ..

책들과 웹 문서들에서는 .. 용어들의 개념에 대한 설명에만 치중해 있어 ..
구체적인 원리에 대한 이해가 어렵네요 ... ;;
그렇다보니 .. 용어들간의 관계가 와닿질 않아요 ;

일단 책과 웹 문서에서 알아낸 바를 아울러 간단히 정리하면 아래와 같던데요 .

논리좌표 :윈도우즈 내부에서 사용되는 좌표 (DC핸들을 인수로 받아들이는 모든 함수가 사용, 장치에 독립적)

물리좌표 : 실제화면에 출력되는 좌표 (필섹단위, 윈도우를 관리하는 함수에서 사용, 장치에 의존적)

윈도우 : 논리좌표가 사용되는 표면

뷰포트 : 물리좌표가 사용되는 영역 (실제로 사용자의 눈에 보이는 좌표 영역)

맵핑모드 : 논리좌표값을 물리좌표값으로 변환할 때 참고

용어들의 의미는 어설프게나마 알 것도 같은데요 ..
출력 과정에 이들이 서로 .. 어떻게 연관지어져 .. 작용하는 것인지는 ..
모르겠습니다 ㅠㅠ

제가 대충 알고 있는 출력 과정은 ..

1. 맵핑모드를 설정한다 .
2. 출력 원점을 지정한다 .
3. 출력 GDI 함수를 호출 한다 .

정도입니다 .

가령, SetPixel() 로 .. 논리좌표값을 지정하면 ..
이 좌표값은 설정된 맵핑모드를 참고해 ..
물리좌표값으로 변환한 후, 원점을 기준으로 윈도우의 특정 위치(좌표값)에 점(dot)을 출력하게 되는 것 같은데요 .

만약 .. 맞다면 .. 과정 중에 아래와 같은 의문이 생기는데요 ..

1 . 원점 지정

원점(x:0, y:0 )을 변경하면 윈도우 내 클라이언트 영역의 좌측 상단 모서리가 아닌 ..
다른 위치가 원점이 되는데요 .

이때, SetWindowOrgEx(); 를 이용하는 것과 SetViewportOrgEx(); 를 이용하는 것은 ..
어떤 차이가 있는 것인가요 .

(물론, 어떤 걸 사용하든 결과는 같게 나타나는데요 .. 어떤 원리에서 같은 결과가 나오는지
모르겠어요 ... 또한, ... 후자는 원점의 좌표값을 바로 지정하면되지만, 전자는 왜 음수로
지정해야 하는 것인지도 .. 이해가 안 갑니다 ㅠㅠ)

2. 뷰포트와 윈도우

지금의 주제(출력 좌표, 매핑모드) 에서 나오는 ..

'윈도우' 는, 모니터에 표시되는 그 윈도우를 의미하는 거랑은 다른 건가요 ?
뷰포트도 실제 화면에 표시되는 영역이고, 이에 대립되는 개념으로 '윈도우' 를 설명하는 것 같던데 ..
둘은 무엇이 다른 건가요 ?
가령, 분류 기준부터가 다른 건가요 ? (뷰포트는 '영역' 이고 윈도우는 '표면')

3. 가변적인 매핑 모드

매핑 모드의 .. 고정적인 매핑모드들은 ..
왜 필요한지 .. 출력 과정에서 어떻게 이용되는지 ..
어느 정도 이해할 수 있을 것 같은데요 ..
(직접 테스트를 통해 확인했 때문에 .. ;;)

근데, "가변 모드" 는 이해가 안 됩니다 .
( MM_ISOTROPIC / MM_ANISOTROPIC )

가변 모드를 사용하는 예제가 있어서 ..
왜 필요한 것인지는 대충 감이 잡히는데요 .
어떤 식으로 사용하는 것인지는 전혀 모르겠습니다 ㅠㅠ

SetMapMode(hdc, MM_ANISOTROPIC); // 매핑모드를 가변으로 설정한다 .
SetWindowExtEx(hdc, 160, 100, NULL); // 윈도우를 160, 100 으로 확장한다 ?????
// (좌표값은 우측하단 모서리에 대한 논리좌표값 ??????)

GetClientRect(hWnd, &rect); // 클라이언트 영역의 크기를 얻는다 (윈도우 우측 하단 모서리의 좌표값)
SetViewportExtEx(hdc, rect.right, rect.bottom, NULL); // 얻어온 현재 클라이언트 영역의 크기로
// 뷰포트를 확장한다 ????

Window 와 ViewPort 의 '무엇인가' 를 일치시켜주는 과정인 것 같기도 하고 .. ^^ ;;;
어렵네요 .
각각의 SetWindowExtEX() 함수와 SetViewportExtEx() 함수의 용도는 ..
winapi.co.kr 에 나온 api 레퍼런스와 .. MSDN 으로 확인했는데 .. 무슨 말인지 모르겠더라고요 ㅠㅠ

바쁜 시간 내어, 긴 글 읽어주셔서 감사합니다 .
답이 없더라도 .. 읽어주신 것만으로도 충분히 감사합니다 .

P.S. 모든 의문이 .. 그본적으로 ..

Windows 의 출력 과정에 대한 이해가 부족한 탓이라고 생각합니다 .
질문도 웬만큼 아는 사람이어야 .. 질문 다운 질문을 할 수 있는 것처럼 ..

아마도 저는 지금 ..

'뷰포트' 와 '윈도우' 의 관계 .. 그리고,
'논리좌표' 와 '물리좌표' 의 관계 .. 를 모르고 있는 것 같은데요 .

혹시, 이들을 .. 실 세계에 견주어 생각할 만한 .. 예가 있으면 좀 알려주셔요 ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.