문제

나는 (요즘) 주로 WinForms 앱에서 사용되는 ActiveX 컨트롤을 개발하고 있습니다.

ActiveX 컨트롤에는 '속성 페이지'대화 상자가 있으며 Axhost 클래스의 ShowProperTypages 메소드를 사용하여 프로그래밍 방식으로 표시 할 수 있습니다. 이것은 컨트롤의 속성을 편집하기 위해 Visual Studio에서 제기 할 수있는 사용자 정의 UI입니다.

이 속성 페이지 대화 상자에는 ImageList를 사용하여 항목 옆에 아이콘을 표시하는 ListBox 컨트롤이 포함되어 있습니다. 이 아이콘은 32 비트 알파 블렌딩 비트 맵입니다. 이것들이 제대로 표시 되려면 버전입니다 6.0 또는 comctl32.dll 위에 사용해야합니다.

불행히도 winforms 앱을 실행하면 comctl32.dll 버전을로드하고 사용합니다. 5.xxx. 결과적으로 속성 페이지 대화 상자가 표시되면 아이콘이 나쁘게 보입니다 (반 트랜스 펜트 영역은 단단한 검은 색으로 그려집니다).

내 질문은 프로세스가 사용하는 내용에 관계없이 ActiveX Control의 속성 페이지 UI 내에서 comctl32.dll 버전 6.0+를 사용할 수있는 방법이 있습니까? 아니면 호스트 프로세스가 버전 6.0을 사용하도록 강요 할 수 있습니까? (호스트 프로세스가 ActiveX Control의 코드 중 하나 전에 Comctl32.dll을 메모리에 이미로드했을 수 있다고 생각하기 때문에 생각하지 않습니다.

이 웹 페이지 comctl32 6.0을 사용하기위한 몇 가지 시나리오를 다루지 만 내가있는 상황은 아닙니다.

도움이 되었습니까?

해결책

원래 MSDN 기사는 여러 가지 특정 시나리오에 초점을 맞추기 때문에 혼란 스러웠습니다. 실제로, 그것이 말하는 기본 기술은보다 일반적으로 작동합니다.

에 의해 '매니페스트'XML 파일 추가 ActiveX DLL에 대한 리소스, 나는 해당 dll을 comctl32.dll 6.x를 사용하기를 원한다는 나란히 시스템에 신호를 보낼 수 있습니다. 그런 다음 해당 버전이 자동으로로드됩니다. 꽤 좋은.

이 매니페스트는 자원 유형이어야합니다 rt_manifest, 리소스 ID와 함께 2.

성공의 증거는 다음과 같습니다 (동일한 프로세스에로드 된 동일한 DLL의 두 버전) : :procexp screenshot showing two COMCTL32's loaded in process

(또한 아이콘이 Listbox에 올바르게 표시됩니다. ;))

다른 팁

응용 프로그램이 Application.enableVisualStyles ()를 호출하는 경우 (일반적으로 Application.Run ()을 호출하기 전에 메시지 루프를 시작하기 전) Common Controls 라이브러리의 버전 6+를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top