2009-05-06 88 views
1

コンボボックスでの選択に基づいてコントロールの種類を動的に変更するダイアログが表示されるC++ MFCアプリケーションがあります。ダイアログリソースは、普通の古いエディットコントロールから始まります。次に、カスタムコントロールタイプに変更するためにSubclassDlgItemを呼び出します。SubclassDlgItemを使用してコントロールの種類を変更する

これまでのところとても良いです。今、ユーザーが画面上の別のコンボボックスで選択を変更すると、このコントロールを別のカスタムタイプに変更します。だから、私はそのコントロールのカスタムクラスへのポインタの削除を呼び出すことによって、既存のコントロールを破壊します。次に、:: CreateExを呼び出して編集コントロールを再作成し、SubclassDlgItemを再度呼び出して新しいカスタムコントロールを作成します。

私の問題は、これがかなりちらつき、私はカスタムコントロールの上に:: CreateExで作成されたエディットコントロールを得ていると思います。どのようにちらつきを取り除くためのアイデア、特にユーザーがコントロールコンボボックスの内容をすばやく変更している場合は?

+0

古いカスタムコントロールを削除する前にUnsubclassDlgItemを呼んでいたので、:: CreateExエディットコントロールの重複があったことをどのように私はそれがちょうど1制御IDで動作するように入手できますか?どのコントロールが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

親ウィンドウの同じ領域にすべての可能なコントロールのセットを作成し、関連するものだけを表示し、他のすべてを非表示にすることができます。ユーザーがコントロールの変更を行うと、アクティブなコントロールが非表示になり、新しいコントロールが表示されます。これはより滑らかに見えるはずです。

関連する問題