- ベストアンサー
親ウィンドウの領域外でも表示されるエディットボックス
- VisualStudio2005でMFCアプリを作っています。親ウィンドウに指定したコントロールの領域外でも表示されるようなエディットボックスを作りたいのですが、方法はありますか?
- ダイアログ上にボタンがあって、そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、ダイアログの下の端でエディットボックスが途切れてしまいます。ダイアログの下より大きくなっても全体が表示されるようにしたいんです。
- エディットの生成は次のような感じで行っています。DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1);
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2ですが、もうちょっと凝ったやりかたをするなら、 ダイアログの矩形とエディットボックスの矩形からリージョンを作成し、 そのリージョンをダイアログに対してSetWindowRgnしてやる方法でしょうか。 おそらく見た目的には、お望みの動作になると思います。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
基本的には無理です。 エディットボックスの大きさにあわせて、ダイアログの大きさを広げるのが多分一番楽だと思います。
WS_CHILD を外せば良いのではないでしょうか?コントロールもウィンドウの一つですし。 ただ親から離れるとイベントやら位置関係やら背後関係やらがややこしくなりますかねぇ。 根性で実装できるかどうかですね。 またはエディット専用のダミー用子ダイアログを作ってその上にエディットを配置する。C#ならかなり簡単に実装できますが・・・。でもこっちの方がコーディングは少なくてすむ? がんばってください!
お礼
ダミー用の子ダイアログを使うという方法を採用しました。 ありがとうございます。
補足
ありがとうございます。 すみません、質問を見返したらこれまでに試した方法を書いていませんでした。 実はWS_CHILDは外してやってみたことはあるのですが、これでもうまくいきませんで、 WS_CHILDをつけている状態と何も違いはありませんでした。 また、WS_POPUPをつけて、次のようにしたこともあります。 m_edit.CreateEx(0, "EDIT", "test", dwStyle, rect, this/*ダイアログ*/, 0); この場合、エディットが表示はされるものの、表示位置がずれていたり、 Enterキーなどを受け付けない、という問題があり、ダメでした。 >またはエディット専用のダミー用子ダイアログを作ってその上にエディットを配置する。 >C#ならかなり簡単に実装できますが・・・。でもこっちの方がコーディングは少なくてすむ? ありがとうございます。この方法も試してみようという検討事項には一応入っています。 より簡単にできれば、と思い、今回質問させていただきました。
お礼
別ダイアログを出してそれらしく動かす際に、 リージョンを使うことでエディット以外の部分を見えなくすることができました。 リージョンについては知らなかったのですが、この回答のおかげで使うことができました。 ありがとうございます。
補足
ご回答ありがとうございます。 リージョン周りは初めてですが、 こんなことをすればいいんでしょうか?(エディットの更新のとき) HRGN parentRgn, rgn, newRgn; parentRgn = CreateRectRegion( 親のRect ) rgn = CreateRectRegion( 自分のRect ) CombineRgn(newRgn, parentRgn, rgn, RGN_OR); GetParent()->SetWindowRgn(newRgn, redraw);