1

動的に作成されたCComboBoxでCBN_SELCHANGEを取得する方法??..CComboBoxの配列を使用しました。

MyCComboBox * p_ComboBoxes = new MyCComboBox[numberOcComboBoxes]; //numberOcComboBoxes determined at rumtime

MyCComboBoxのメッセージマップ

BEGIN_MESSAGE_MAP(MyCComboBox , CComboBox)
    ON_CONTROL_REFLECT(CBN_SELCHANGE, &CTestDlg::OnCbnSelchange)
END_MESSAGE_MAP()

void CTestDlg::OnCbnSelchange()
{
this->GetDlgCtrlID(); // Get The ComboBox ID;
CString sText;
p_ComboBoxes[0].GetLBText(p_ComboBoxes[0].GetCurSel() , sText); // I can't access like this 


}

//p_ComboBoxes配列の初期化。

for (int i = 0 ;i < iNumber ; i++)
{


p_ComboBoxes[i].Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN,
        CRect(10 + MY_PIC_ADDITIONAL_WIDTH,iItemDrawHeight,10 + MY_PIC_ADDITIONAL_WIDTH +MY_PIC_PROPERTY_WIDTH
        ,iItemDrawHeight +MY_PIC_HEIGHT), this, pImageControlPropertyID[i]);

iItemDrawHeight += MY_PIC_PROPERTY_ADDITIONAL_HEIGHT;

}

選択したテキストにアクセスできません。「アクセス違反の読み取り場所0x00000020」エラーが表示されます。

4

2 に答える 2

0

すでに述べたように、ON_CONTROL_REFLECTは、親ダイアログクラスではなく、コントロールクラスでメッセージを処理するためのものです。MyCComboBoxクラスにOnCbnSelchange()ハンドラーを実装し、MyCComboBoxメッセージマップにON_CONTROL_REFLECTエントリを追加する必要があります。

親ダイアログでメッセージを本当に処理したい場合は、ON_CONTROLマクロを使用する必要があります。子コンボごとに1つのエントリがあり、それぞれに個別のハンドラーがあり、どちらがメッセージを送信したかがわかります。

于 2013-03-13T03:46:02.097 に答える
0

OnCommand(WPARAM wParam, LPARAM lParam) 親ダイアログ ウィンドウでオーバーライドすることもできます。の場合は、コントロールの IDHIWORD(wParam) == CBN_SELCHANGEと比較 します。LOWORD(wParam)

BOOL CMyDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
    if(HIWORD(wParam) == CBN_SELCHANGE) { //A combo box selection changed
        int ID = LOWORD(wParam); //The ID of the corresponding ComboBox
        //Perform additional handling...
    }
    return CDialog::OnCommand(wParam, lParam);
}
于 2015-10-12T09:06:42.313 に答える