2012-03-15 3 views
3

OnPaint을 재정의하는 CComboBox 하위 클래스가 포함 된 큰 MFC 응용 프로그램을 상속 받았습니다. 현재는 모든 도면을 손으로 (선과 직사각형으로) 처리하고 Windows 98 스타일로 보이는 콤보 상자를 렌더링합니다. 그러나, 그렇지 않으면 위대한 작품과 우리가 의존하는 많은 유용한 사용자 지정 기능을 제공하고, 전체 컨트롤을 다시 작성 아마 옵션이 아닙니다.MFC : 소유자 그리기를 위해 Aero 스타일 콤보 상자를 렌더링하는 방법?

OnPaint은 가능한 경우 에어로 스타일로 그려지도록 현대화하고 싶습니다. (현대적인 테마를 사용할 수없는 경우 이전 코드로 되돌아갑니다). 단추와 같은 다른 사용자 지정 컨트롤을 사용하여이 작업을 수행했습니다. 마우스가 움직일 때의 부드러운 강조와 같이 제대로되지 않는 작은 행동이 있다는 것을 알고 있지만,이 앱에는 큰 문제가 아닙니다.

은 내가 CVisualStylesXP ckass에 액세스 할 수 있으므로 (LoadLibrary 그래서 우리는 A 최소 시스템으로 Vista를 강요하지 않는다 통해) 이미 아주 쉽게 OpenThemeData, GetThemeColor 또는 DrawThemeBackground 같은 통화를 할 수있는 인프라를 가지고있다. 불행히도, 테마에 맞는 테두리와 드롭 다운 버튼으로 멋진 모양의 콤보 상자를 얻으려는 호출 순서를 알지 못합니다.

누구든지 여기서 무엇을 해야할지 알고 계십니까?

답변

0

솔직히, 나는 왜 그들이 원래 OnPaint를 오버라이드하려했는지 모르겠다. 좋은 이유가 있니? ComboBox의 항목 그리기를 재정의하려는 경우 적어도 99 %의 시간이 필요하다고 생각합니다. 이를 위해 파생 된 콤보 상자에서 DrawItem, MeasureItem 및 CompareItem을 재정 의하여 원하는 기능을 얻을 수 있습니다. 이 경우 OS는 각 OS에 고유 한 비 사용자 컨텐츠를 올바르게 그립니다.

+0

정직하게 말하자면, 중간에 표시되는 텍스트 이외의 기본 콤보 상자처럼 보입니다. 그러나 나는 정말로 그것을 재구성하고 싶지 않습니다. – StilesCrisis

+0

실제로 두 번째 생각에서 Droplist는 Dropdown과 비슷하게 보입니다. 기본적으로 사용자가 텍스트의 하위 집합을 입력 한 다음 목록에 필터링 된 결과가 표시됩니다. 드로 프로스트처럼 드로잉하는 것은 잘못된 것입니다. – StilesCrisis

0

난 당신이 XP 테마와 다양한 시스템 메트릭의 깊이 잠수하지 않고 최선이 프로젝트를 한 번 봐 걸릴 생각 : http://www.codeproject.com/Articles/2584/AdvComboBox-Version-2-1

확인 CAdvComboBox 클래스의 OnPaint를를 - 컨트롤의 전체 구현이 XP 테마 관련 문제를 포함하여 다시 칠하기.

+1

불행히도, 나는 이미 그 중 하나를 시도하고, 그것은 에어로 콤보 상자처럼 보이지 않습니다. 그들이 해킹 한 것처럼 보이고 시각적 인 모습이 XP에서했던 것과 일치 할 때까지 교양있는 추측을했지만 Aero에서는 완전히 잘못되었습니다. 예를 들어 오른쪽 가장자리의 화살표 버튼은 Luna의 경우에는 정사각형 버튼으로 둘러싸여 있지만 Aero의 경우에는 잘못된 버튼입니다. – StilesCrisis

+0

오, 내 잘못이야. 좋아, 관련 코드를 스크랩하기 위해 좀 더 복잡해 지지만 에어로 스타일로 잘 작동하는 또 다른 것이있다. http://www.codeproject.com/Articles/130682/VCOMBOBX-in-MFC-A-Virtual-Combo-Box-Control 관련 코드는 VComboBox.cpp 파일에 있습니다. – sigman

0

동일한 상황인지는 확실하지 않지만 -이 경우 (서브 클래스 CButtons의 경우)이 문제에 직면했을 때 컨트롤 선언을 포인터로 변경하고 컨트롤을 동적으로 만들어야합니다.

하위 클래스 컨트롤이 CComboBoxExt라고 가정 해 봅시다.
당신이

CComboBoxExt m_cComboBoxExt; 

했다 이제

CComboBoxExt* m_pcComboBoxExt; 

그리고 컨트롤이 배치되는 창의를 OnInitDialog에있을 것이다,이 때문에

m_pcComboBoxExt = new CComboBoxExt(); 
m_pcComboBoxExt->Create(...) 

를 사용하여 작성 이제 포인터가되었으므로 DestroyWindow()에 전화하고 종료시 포인터를 삭제하는 것을 잊지 마십시오.

이렇게하면 내 특별한 문제가 해결됩니다. 컨트롤이 같은 방식으로 선언 된 경우 시도해보십시오.

+0

이것은 수동으로 그리는 'OnPaint'를 수정하지 않습니다. 라인을 채우고 상자를 채 웁니다. – StilesCrisis