2010-08-17 6 views
3

비 dpi 인식 MFC 응용 프로그램 중 하나에 문제가 있습니다.
시스템 설정을 높은 dpi (예 : 120 또는 144dpi)로 변경하면 작업 표시 줄의 응용 프로그램 아이콘이 엉망으로 보입니다. 안타깝게도 메인 프레임에는 WNDCLASS을 등록해야하고 WNDCLASS.hIcon 회원에게는 아이콘을 설정해야합니다. 이 아이콘은 LoadIcon 기능을 사용하여로드됩니다. 그리고이 함수는 이미지를 표준 크기 (GetSystemMetrics(SM_CXICON)에 의해 반환 됨)로로드하려고합니다. 120dpi는 40x40 픽셀입니다. 우리가 그 크기의 아이콘을 제공하지 않기 때문에 불행한 일입니다. 이상하게도 이상하게도 dpi 가상화는 120dpi에 적용되지 않는 것 같습니다. GetDeviceCaps(..., LOGPIXELSX)은 실제로 120dpi를 반환하고 GetSystemMetrics(SM_CXICON)은 40을 반환합니다. 따라서이를 잡아 내고 다른 크기로 아이콘을로드하면됩니다. 그러나 144 dpi의 경우에는 작동하지 않습니다. 가상화가 적용된 것 같아서 96 dpi와 32 픽셀을 얻었 기 때문에 아이콘이 다시보기 흉하게 보입니다.
WNDCLASS.hIcon 회원을 NULL으로 설정하면 아이콘이 잘 나타납니다. 그러나 나는 그 MSDN에 따라 때문에 괜찮은지 어떤지 궁금 :Windows DPI 설정을 프로그래밍 방식으로 결정합니까?

HICON 클래스 아이콘
핸들. 이 회원은 아이콘 리소스에 대한 핸들이어야합니다. 이 멤버가 NULL이면 시스템에 기본 아이콘이 제공됩니다.

그래서 그 멤버를 NULL로 설정해도 항상 표시되는 아이콘을 믿을 수 있습니까? 다른 방법으로 올바른 크기의 아이콘을로드 할 수도 있지만 시스템을 실제로 144 dpi로 설정해야한다는 것을 알고 있어야합니다. 그리고 거기에 우리는 나의 초기 질문에있다. dpi 가상 응용 프로그램 내에서 시스템의 DPI 설정을 확인할 수 있는지 아는 사람 있습니까? 나는 dpi 인식 응용 프로그램에서 실제 dpi와 같은 것을 말하는 것처럼 더러운 것을 수행하는 것에 대해서도 생각해 봤지만 가능하면 그러한 것들을 피하고 싶습니다.

안부,

humbagumba

업데이트 : 다음 메인 프레임의 아이콘이 기본적으로 대체되기 때문에 NULLWNDCLASS.hIcon 멤버를 설정하는 것은 좋은 생각이 아니다는 것을 발견
아이콘 (작업 표시 줄에서 정상적으로 보였음에도 불구하고 ...) - 첫 번째 테스트에서 알지 못했습니다.

답변

5

프로그램에 매니페스트를 추가하거나 기존 가상 서버를 편집하여 DPI 가상화를 해제해야합니다. 다음과 같이 표시되어야합니다.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

몇 가지 새로운 문제가 발생할 가능성은 거의 없습니다. 이것에 대해 알고 싶은 모든 것은이 MSDN Library article에서 매우 잘 다룹니다.

+0

덕분에 링크 –

+0

고마워요.하지만 이미 거기에 왔습니다. dpi 인식을 활성화하면 144dpi에서 너무 많은 문제가 발생하기 때문에 이것이 내가 원하는 것만은 아닙니다. 120dpi에서 dpi를 인식하는 것처럼 응용 프로그램이 작동하는 이유를 알고 있습니까 (예 : 가상화가 없으므로 xp 스타일 확장). 또한이 문서에서는 시스템의 실제 DPI 설정이 dpi 인식을 사용하지 않고 무엇인지 알 수 있는지 언급하지 않습니다. – humbagumba

+1

DPI가 120을 넘을 때까지 DPI 가상화가 시작되지 않습니다. 실제 DPI를 찾는 경우 가상화를 해제해야합니다. –

관련 문제