2013-10-11 11 views
0

:C++는이 같은 확장 메타 파일 만들려고 해요

// Obtain a handle to a reference device context. 

HDC hdcRef = GetDC(hwnd); 

// Determine the picture frame dimensions. 

int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE); 
int iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE); 
int iWidthPels = GetDeviceCaps(hdcRef, HORZRES); 
int iHeightPels = GetDeviceCaps(hdcRef, VERTRES); 

// Retrieve the coordinates of the client 
// rectangle, in pixels. 
RECT rect; 
GetClientRect(hwnd, &rect); 

// Convert client coordinates to .01-mm units. 
// Use iWidthMM, iWidthPels, iHeightMM, and 
// iHeightPels to determine the number of 
// .01-millimeter units per pixel in the x- 
// and y-directions. 

rect.left = (rect.left * iWidthMM * 100)/iWidthPels; 
rect.top = (rect.top * iHeightMM * 100)/iHeightPels; 
rect.right = (rect.right * iWidthMM * 100)/iWidthPels; 
rect.bottom = (rect.bottom * iHeightMM * 100)/iHeightPels; 


// Create the metafile device context. 

CreateEnhMetaFile(hdcRef, (LPTSTR)"temp.emf", &rect, NULL); 

// Release the reference device context. 

ReleaseDC(hwnd, hdcRef); 

내가 결국 가지고 모든 일부 0 바이트 비입니다 코드 here

툭 이상하게 인코딩 된 이름을 가진 확장 파일, 정 灭 攮 sm 같은 smth.

무엇이 문제 일 수 있습니까?

P. 또한, 나는 C#에서 C++/cli 객체를 통해 혼합 모드 응용 프로그램에서 호출하고 있습니다.

EDIT 이상한 인코딩 문제는 해결되었지만 만들어진 파일은 여전히 ​​0 바이트 길이입니다. 어떻게 해결 될 수 있습니까?

답변

1

캐스트가 문제입니다. 실제로 수행해야하는 경우가 아니라면 캐스트를 사용하지 마십시오.

Microsoft 웹 사이트에서이 캐스팅을 얻었습니다. MS 채용 직원의 품질에 대해 궁금해 할 필요가 있습니다. 그러나 그들의 코드에서는 단지 불필요한 것이 아닙니다. 코드로 변환하면 잘못되었습니다.

CreateEnhMetaFile(hdcRef, _T("temp.emf"), &rect, NULL); 

_T 매크로는 유니 코드 문자열 또는 컴파일러 설정에 따라 ANSI 문자열 중 하나로 해석됩니다 문자열 리터럴을 작성하는 공식적인 방법입니다.

+0

@ tube-builder 그래, 나 버그에 대한 꽤 좋은 설명 인 것 같아 놀랍다. – john

+0

지옥, 정말 죄송합니다. 세심한주의를 기울이지 않았습니다. 이제 파일이 생성되었습니다 (여전히 비어 있습니다). 고마워요! –

+0

btw 생성 된 파일이 여전히 0 바이트 크기 일 수있는 이유는 무엇입니까? 나는 그것에 관해 얼간이를 찾으려고 노력했다. 그러나 지금까지 실패했다. C++과 전혀 관련이 없습니다. –