Article View: japan.comp.lang.visual-c++
Article #65Re: CComboBoxクラスについて
From: Takeshi Shigihara
Date: Mon, 13 Apr 1998 00:00
Date: Mon, 13 Apr 1998 00:00
92 lines
4314 bytes
4314 bytes
Norio Ishihara wrote:
>
> MFCのCComboBoxクラスについて質問があります。
> どなたかご存知でしたら教えてください。
>
> ・CComboBoxによって作成されたコンボボックス。
>
> ・CComboBox::SetDroppedWidth()により幅を変更した
> リストボックスは左揃えになります。
>
> ●下記のように右揃えにしたいのですが方法が分かりません。
>
> どなたか教えてください。
> --------------------------------------------------
> E-Mail oiron@sic.co.jp
> --------------------------------------------------
(線画によるボックスの状態などは省略させていただきました)
簡単に、 CBN_DROPDOWN をハンドルすれば良いかな? と思いまして
私もちょっとテストプログラムを組んでみました。
1) CBN_DROPDOWN を受けたら、ComboBox の子ウィンドウをリストアップ
2) クラス名が EDIT でないならリストボクスだろう ( 本当は ComboLBox )
3) それを見つけたら、位置を変更すれば良い
ところが! 上記の手法では、リストボクスを見つけられなかったのです。
どうやら、 CBN_DROPDOWN を受けた直後には、まだリストボクスは生成されて
いないらしい。
では、リストボクスが作られた時に、きっと WM_PARENTNOTIFY くらい流れる
だろう、と考える。そこで、 SPI++ を使って、メッセージの流れを調べてみた
ら、おや……そういうメッセージは、一切流れないんですね。困った。
しかし、CBN_DROPDOWN の次くらいには、必ず WM_CTLCOLOR_LISTBOX が流れる
ようです。確実ではないものの、以下のような方法を思い付きました。
1) CBN_DROPDOWN を受けた時に、フラグを立てる
2) WM_CTLCOLOR_LISTBOX を受けたら、フラグが立っているかどうかを
調べる。
3) もし、立っていたのなら、リストボクスの位置を移動する
こんな無茶な方法ですが、なんとかかんとか、うまく表示できているようです。
驚いたのは、リストボクスが、コンボボクスの子ではなかったこと。デスク
トップの直接の子になっています。う~む。
なお、以下のプログラム例は、とりあえず動作した、という程度のもので、
確実な動作の保証はしかねます。
------------------------------------------------------------------
ダイアログ CDialog1 を作成、そこに IDC_COMBO1 なる DropDown 型の
コンボボクスを生成しておく。
また、CDialog1 には BOOL fListDroppedDown を作成しておく。
上記フラグは、先に FALSE で初期化しておくこと。
BEGIN_MESSAGE_MAP(CDialog1, CDialog)
//{{AFX_MSG_MAP(CDialog1)
ON_CBN_DROPDOWN(IDC_COMBO1, OnDropdownCombo1)
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CDialog1::OnDropdownCombo1()
{
fListDroppedDown = TRUE;
}
HBRUSH CDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if ( CTLCOLOR_LISTBOX == nCtlColor) {
CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
if ( TRUE == fListDroppedDown) {
fListDroppedDown = FALSE;
CRect comboRect;
pCombo->GetWindowRect( &comboRect);
CRect listRect;
pWnd->GetWindowRect( &listRect);
pWnd->SetWindowPos( NULL,
listRect.left + (comboRect.Width()-listRect.Width()), listRect.top,
0, 0,
SWP_NOSIZE|SWP_NOZORDER);
}
}
return hbr;
}
----- Takeshi Shigihara
Office cygnus@masternet.or.jp
Home cygnus@po.jah.ne.jp -----
Technical Details
Message-ID:
<3531DD01.B81241FE@masternet.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<01bd6385$37284c70$245e0287@nishihara>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 110a07,35db709ea042dfdf,start X-Google-Attributes: gid110a07,public X-Google-Thread: 10a2c7,fd9cce6aee9fdbef X-Google-Attributes: gid10a2c7,public From: Takeshi Shigihara <cygnus@masternet.or.jp> Subject: Re: CComboBoxクラスについて Date: 1998/04/13 Message-ID: <3531DD01.B81241FE@masternet.or.jp> X-Deja-AN: 343544747 Content-Transfer-Encoding: 7bit References: <01bd6385$37284c70$245e0287@nishihara> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp X-Complaints-To: ap-net@asahi-net.or.jp X-Trace: skytrain.asahi-net.or.jp 892460612 38462 (None) 202.224.45.147 Organization: MasterNet Newsgroups: japan.comp.lang.visual-c++,fj.os.ms-windows.programming