2014-04-09 5 views
2

나는 Windows API 함수 PathCompactPath을 사용하는 방법을 알아 내려고하고있다. 장치 컨텍스트에는 길이 계산에 사용되는 글꼴 크기, 글꼴 크기 등에 대한 정보가 들어있는 경로 문자열이 축소되는 픽셀 길이 외에도 장치 컨텍스트 (hDC)에 대한 핸들이 필요합니다.PathCompactPath에 대한 Wnd 핸들에서 DC 핸들을 얻는 방법?

레이블에 창 핸들 (hWnd)이있는 경우이 레이블이 작성된 글꼴 정보가 들어있는 장치 컨텍스트를 어떻게 올바르게 얻을 수 있습니까? GetDC은 일반 창 핸들에 대해이 정보를 삭제 한 것으로 보입니다.

VB6에서 사용할 C++ DLL을 작성 중이므로 hWnd는 VB6 컨트롤에서 가져옵니다. 그러나, 제 질문은 일반적인 경우 (C++ 형식의 레이블)에도 적용된다고 생각합니다.

+1

장치에 적절한 글꼴을 선택해야합니다. –

+0

일부 테스트 후 적어도 Windows 7에서 GetDC는 실제로 hwnd의 글꼴 정보를 반환합니다. –

답변

3

"라벨"이 텍스트가 포함 된 정적 컨트롤이라고 가정합니다. 이 경우 제어 스타일을 SS_PATHELLIPSIS으로 간단하게 추가하고 컨트롤을 통해 작업을 수행 할 수 있습니다. 질문으로 질문에 대답 할 수 있지만

는 :

당신은 DC가 그것으로 선택 올바른 글꼴이되지 않습니다, 대부분,의 GetDC와 컨트롤의 DC를 얻을 수 있지만. 그렇다면 운이 좋았지 만 운에 의존하고 싶지는 않습니다. 대부분의 컨트롤을 사용하면 WM_GETFONT 메시지를 보내어 사용할 글꼴 핸들을 요청할 수 있습니다. 이를 사용하여 DC를 설정하고 PathCompactPath를 호출 한 다음 정리할 수 있습니다.

auto hdc = ::GetDC(hwnd); 
auto hfont = reinterpret_cast<HFONT>(::SendMessage(hwnd, WM_GETFONT, 0, 0)); 
auto hfontOld = ::SelectObject(hdc, hfont); 
blah blah PathCompactPath blah blah 
::SelectObject(hdc, hfontOld); 
::ReleaseDC(hwnd, hdc); 

당신은 특히 WM_GETFONT 메시지의 반환을 확인하기 위해, 일부 오류 검사를 수행 할 수 있습니다 - 당신이 그 메시지를 지원하지 않는 조회하고 제어 가능합니다.

+0

은 글꼴, DC 및 GUI가있는 경우에만 작동합니다. 콘솔 응용 프로그램에서 charcount 만 기반으로 경로를 압축하려고 할 때 무엇을합니까? –

+0

@ v.oddou : 두 가지 옵션 : (1) 직접 작성하십시오. 문자 수만 고려하고 크기를 지정하지 않으므로 매우 간단해야합니다. (2) 메모리 DC를 만들고 고정 피치 글꼴을 만들어 DC로 선택한 다음 그림과 같이 PathCompactPath를 호출합니다. (예, 콘솔 응용 프로그램은 ''을 포함하고 gdi32 및 어쩌면 user32에 연결하면 DC 및 글꼴을 만들 수 있습니다.) –

+0

어제이 주석을 작성한 직후 해결책을 찾았습니다. [PathCompactPatchEx] (https://msdn.microsoft. com/ko-us/library/windows/desktop/bb773578 (v = vs.85) .aspx), Shlwapi의 기능 :) :) –