출처 : http://blog.naver.com/gml81/40037809685

MapWindowPoints : CWnd의 좌표계로부터 다른 윈도우의 좌표계로 지정된 점들을 매핑시 킨다.
ClientToSreen : 클라이언트 좌표계를 화면 좌표계로 변환한다.
ScreenToClient : 화면 좌표계를 클라이언트 좌표계로 변환한다. 
-----------------------------------------------------------------------------

OnPrepareDC()에서

    dc.SetMapMode(MM_ISOTROPIC);

    dc.SetWindowExt(1000,1000);

    dc.SetViewportExt(2000,2000);

      CClientDC dc (this);
     OnPrepareDC (&dc);
     dc.DPtoLP (&point);
point가 마우스 좌표라면 논리 좌표로 변환해 주는 코드입니다.

 ----------------------------------------------------------------------------------

jpg 이미지가 255*255 픽셀 크기인데요...
출력을하면은 255*255 크기가 아니고 적게 출력이 되는데.
무슨 이유입니까??

좌표계가 MM_TEXT로 설정되어 있어서 그럴겁니다

 MM_TEXT 좌표계는 하나의 픽셀이 기준이 됩니다
질문하셨다 시피 jpg 이미지가 255*255 크기라면   
좀 픽셀이 큰 모니터에서는 이미지가 더 크게 나오겠죠?

출력을 할때도 마찬가지로
프린터 장치의 dpi라고 하죠 1인치 사각형안에 얼마나 많은 점들을 찍을수 있느냐 하는 건데
(보통 300dpi 뭐 이런 얘기 많이 들어보셨을 겁니다)
이 프린터의 dpi에 따라 이미지 사진이 더 크게나올수도 있고 작게나올수도 있는겁니다

왜냐하면 기준이 픽셀이기 때문이죠 

그럼 화면과 출력물의 크기가 같아지기 위해서는 어떻게 해야하느냐 하면
MM_LOMETRIC같은 좌표계를 쓰시는 겁니다

MM_LOMETRIC은 자표계 기준이 0.1미리 입니다
따라서 MM_LOMETRIC좌표계 기준으로 1000*1000의 그림은
화면에서나 출력에서나 10cm * 10cm로 동일하게 출력되는 것이죠

쉽게 말씀드리면

 SetMapMode() 함수를 이용해서 좌표계를 바꿔주라는 이야기 입니다 ^^
SetMapMode(hPrinterDC, MM_LOMETRIC); // 이런식으로요

물론 출력하실때 좌표계가 바뀌었으니 출력될 좌표는 신경쓰셔야 겠죠 ^^
참고로 MM_LOMETRIC은 MM_TEXT와는 달리

y축이 아래로 가면 - 값 입니다

덧붙이자면

BOOL DPtoLP() // 디바이스 좌표를 로직좌표계로 바꿔주는 함수와 그 반대 함수들이 존재하니 참고 하시구요

 -----------------------------------------------------------------------

 DPtoLP는 함수 이름 대로 디바이스 좌표를 논리적 좌표로 변경해주는 함수입니다...
 디바이스 좌표는 화면의 한 Pixel, 프린터의 한 Dot를 뜻합니다.
논리적 좌표는 논리적으로 단위를 정한 좌표입니다.(예로 10cm단위로 1, 2, 3...)
 일반적으로 GetDC()를 하게 되면 리턴되는 DC는 MM_TEXT 모드가 됩니다.
MM_TEXT는 디바이스 좌표와 논리 좌표가 1:1 대응(화면의 한 점이 1이 됩니다.)됩니다.
결국 DPtoLP를 해도 값의 변화가 없겠죠...

하지만 map mode를 MM_HIMETRIC으로 변경했다고 가정하면 논리적 좌표 1은
0.01mm를 나타내기 때문에 화면의 한 pixel은 화면 DPI에 따라 1이 아닌 다른 논리적 값이 됩니다...

[출처] [MFC] 좌표계|작성자 영희

출처 : http://tong.nate.com/gayanim/27925620

GetWindowRect
윈도우의 현재 위치와 크기를 구해준다. (left, top)은 윈도우의 현재 좌상단 위치를 나타내는데 이 좌표는 전체 화면을 기준으로 한 좌표이다. (right, bottom)은 윈도우의 우하단 위치를 나타내며 역시 전체 화면을 기준으로 한 좌표이다. 윈도우의 현재 크기(폭과 높이)를 구하고 싶으면 right-left, bottom-top을 계산하면 된다.

GetClientRect
윈도우의 작업영역 크기를 계산해 준다. 크기만 계산해 주기 때문에 좌상단(left, top)값은 항상 0,0이며 우하단 좌표(right, bottom)가 곧 윈도우의 크기를 나타낸다. 작업영역이란 윈도우의 타이틀바, 스크롤 바, 경계선, 메뉴 등을 제외한 영역이며 윈도우가 그리기를 하는 대상 영역이다

 

ScreenToClient
화면의 원점을 기준으로 하는 좌표 lpPoint를 hWnd의 작업 영역을 기준으로 하는 좌표로 변환한다. hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x - cx, lpPoint - cy로 변환된다. GetCursorPos, MoveWindow, GetWindowRect 등과 같이 화면 좌표를 리턴하는 함수로부터 작업 영역의 좌표로 변환하고자 할 때 이 함수를 사용한다.


위와 같은 메시지가 뜰때
윈도우 -> 실행 창에

regsvr32 /u c:\windows\system32\comdlg32.ocx

와 같은 명령어를 치면 실행이 됩니다. orz

출처 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=HDBIpLK2dKJq8ky5IX8Ecll+WHWB6BAr&qb=x9S89iC4xbCzuq+89r+hIMfUvPY=&pid=f41gKwoi5UKsstAfjAKsss--511308&sid=rkRgAsFUhEgAAHOWCcQAAAA4
에서 맨 밑의답변


int TestFn()
{
   return 1;
}

void TestFn2(void* pFunction)
{
   typedef int (*FunctionTest)();
   FunctionTest TestFnTemp = (FunctionTest)pFunction;
   std::cout << TestFnTemp() << std::endl;
}

void TestMain()
{
   TestFn2(&TestFn);
}

이렇게 하는이유야... 소스를 좀더 간결화 하기 위해서라고 봅니다.
꽤 편하구요.

노트북이 식상해서... (일단... 앞면에 도ㅁ바 라고 써있는것도 뭐하고 해서) 아래와 같이 시트를 붙였습니다.
든돈은... 배송비 합해서 한 3~5천원 들었습니다. (쿠폰가로 사면 좀더 싸지더군요)

사용자 삽입 이미지


대략.. 아래와 같은 방법으로 작업을 진행하였습니다.

1. 옥션이든 어디든 시트지를 검색해서 가장 맘에 드는 시트 하나를 삽니다.
   살때, 상판 면적이 되는지 확인하고, 적당한 매수로 삽니다. (대부분 1매이면 됩니다. )
사용자 삽입 이미지

2. 곧 튜닝(...?)할 노트북.. 아직 산지 1주 정도 됬습니다.
사용자 삽입 이미지

3.  배송해온 시트지의 자를 부분을 선택합니다.
저의 경우 나비 문양인데, 나비 문양이 한쪽으로 쏠려 있더군요 ;_;..
사용자 삽입 이미지

4. 만약 노트북 덥개 기스 방지 비닐이 있다면 이것을 기준으로 자릅니다.
 없다면... 자로 정확히 치수를 재서 잘라야 합니다.
사용자 삽입 이미지

5. 전.. 비닐을 사용하여 잘랐습니다.
사용자 삽입 이미지

6. 시트지를 씌울때 마치 액정 보호 필름을 씌우듯 기포를 없애가면서 붙입니다.
 접착력이 액정 보호 필름보단 강하기 때문에 조심조심 신중히 붙입니다.
30cm 자로 기포 없애가면서 붙이는걸 추천합니다.
사용자 삽입 이미지

7. 완성된 모습...
사용자 삽입 이미지

때가 탈꺼 같아 검은색으로 했는데... 유광이라 그런지 지문이 좀 묻어나네요.
허나 맨 회색의 X시바 로고 보단 났다고 봅니다.

+ Recent posts