🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: japan.comp.lang.visual-c++
Article #65

Re: CComboBoxクラスについて

#65
From: Takeshi Shigihara
Date: Mon, 13 Apr 1998 00:00
92 lines
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-mail
References: <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