2009-05-06 1 views
1

콤보 상자의 선택에 따라 컨트롤의 유형을 동적으로 변경하려는 대화 상자가있는 C++ MFC 앱이 있습니다. 대화 상자 리소스는 평범한 이전 편집 컨트롤로 시작한 다음 SubclassDlgItem을 호출하여 사용자 지정 컨트롤 유형으로 변경합니다.SubclassDlgItem을 사용하여 컨트롤 유형 변경

지금까지 그렇게 좋았습니다. 이제 사용자가 화면의 다른 콤보 상자에서 선택 항목을 변경하면이 컨트롤을 다른 사용자 정의 유형으로 변경하려고합니다. 그래서, 나는 그 컨트롤에 대한 커스텀 클래스에 대한 포인터에 delete를 호출함으로써 기존 컨트롤을 파괴한다. 그런 다음 CreateEx를 호출하여 편집 컨트롤을 다시 만들고 SubclassDlgItem을 호출하여 새 사용자 정의 컨트롤을 만듭니다.

내 문제는이 깜박임이 꽤 많다는 것입니다. 저는 사용자 지정 컨트롤 맨 위에 :: CreateEx를 사용하여 편집 컨트롤을 만들었습니다. 깜박임을 제거하는 방법에 대한 아이디어, 특히 사용자가 제어 콤보 상자의 내용을 빠르게 변경하는 경우?

+0

가 어떻게 그건 그냥 하나 개의 제어 ID와 함께 작동하도록 얻을 수있는 기존의 사용자 지정 컨트롤을 삭제하기 전에 UnsubclassDlgItem를 호출했기 때문에 ::를 CreateEx 편집 컨트롤의 중복이라고 밝혀? ID에 연결된 컨트롤을 전환하려면 Unsubclass 및 Subclass를 다시 호출해야합니까? – Tyler

답변

0

내 동료가 스위치를 수행하기 전에 CWnd :: LockWindowUpdate()를 호출하는 것이 좋습니다. 그래서 다음과 같이 변합니다.

내 사용자 지정 컨트롤 때문에 조금 더 복잡합니다. 결국 m_pParent-> InvalidateRect (r)를 호출하여 컨트롤을 올바르게 그릴 수있게되었습니다.

또한, 내가

+0

아직 이해하지 못했던 다른 개발자 인 'LockWindowUpdate'는 개발자가 생각한 바를 기반으로 제안했습니다 ([LockWindowUpdate는 무엇을합니까?] (https://blogs.msdn.microsoft.com/oldnewthing/). 20070219-00 /? p = 27963)). 그들은 잘못 생각했습니다. 그리고 이것은 당신의 문제에 대한 해결책이 아닙니다. 반면, [CWnd :: ShowWindow] (https://msdn.microsoft.com/en-us/library/72szh9c7.aspx)를 호출하면 원하는 솔루션이됩니다. – IInspectable

3

상위 창의 동일한 영역에 가능한 모든 컨트롤 집합을 만들고 관련 컨트롤 만 표시하고 다른 모든 컨트롤은 숨길 수 있습니다. 사용자가 컨트롤 변경을 발생 시키면 활성 컨트롤을 숨기고 새 컨트롤을 표시합니다. 이것은 더 부드럽게 보일 것입니다.

관련 문제