0

実行時にコンボボックスコントロールをowner-drawに変更したいと思います。リソーススクリプトでは、コントロールは標準コントロールとしてレイアウトされています。

スタイルビットをCBS_OWNERDRAWに設定して実験しました| CBS_HASSTRINGSですが、どういうわけかこれは役に立ちません。

サブクラスを実行する前に、ウィンドウスタイルを設定します。

    // turn to ownerdraw
DWORD dwStyle = ::GetWindowLong(hwnd, GWL_STYLE);
dwStyle |= CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS;
SetWindowLong(hwnd, GWL_STYLE, dwStyle);

誰かがそのトリックを知っていますか?

4

1 に答える 1

3

ウィンドウの作成後、実行時にすべてのスタイルを正常に変更できるわけではありません。たとえば、スタイルを介して制御されている場合でも、実行時に折り返し複数行編集を折り返し複数行編集に変更することはできません。まったく新しい編集コントロールを作成する必要があります。これは、メモ帳が行うことです。ownerdrawも同様のスタイルであり、CreateWindow時に設定する必要があり、後で変更できない可能性があります。

最善の策は、気になるプロパティ(コントロールID、サイズ、場所)と、ダイアログでその前にあったHWNDを保存することです。古いコントロールを破棄し、新しい同一の置換を作成しますが、必要なスタイルを使用します。最終的には新しいHWNDになるため、それ以降、コードで古いHWNDの代わりにそれを使用するようにする必要があります。また、削除したときに古いコントロールにキーボードフォーカスがあった場合は、フォーカスが「消える」だけではないように、新しいコントロールキーボードフォーカスも指定する必要があります。最後に、SetWindowPos(hwndPrev ...)を使用して、新しいHWNDをZオーダーの適切な場所に移動し、タブとラベル(Zオーダーに基づく)が新しいウィンドウで、年。

于 2012-09-17T04:16:16.217 に答える