2013-03-12 2 views
1

동적으로 생성 된 CComboBox에서 CBN_SELCHANGE를 얻는 방법 ??. 나는 CComboBoxes 배열을 사용했습니다. 메시지에서동적으로 생성 된 콤보 상자의 CBN_SELCHANGE

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

지도 MyCComboBox의 p_ComboBoxes 배열의

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 


} 

// 초기화 ..

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 "오류 ..

+0

'GetCurSel'은 (는)'CB_ERR'을 반환하지 않습니까? –

+0

CComboBox 배열에 액세스 할 수 없다는 것은 문제가되지 않습니다. –

+0

'p_ComboBoxes '는 언제 초기화합니까? –

답변

0

이미 언급했듯이 ON_CONTROL_REFLECT는 사용 가능합니다. 부모 대화 상자 클래스가 아닌 컨트롤 클래스에있는 메시지가 있습니다. MyCComboBox 클래스에 OnCbnSelchange() 핸들러를 구현하고 MyCComboBox 메시지 맵에 ON_CONTROL_REFLECT 항목을 추가해야합니다.

부모 대화 상자에서 메시지를 실제로 처리하려면 ON_CONTROL 매크로를 사용해야합니다. 각 자식 콤보에 대해 하나의 항목을 별도의 처리기와 함께 사용하면 어느 쪽이 메시지를 보냈는지 알 수 있습니다.

+0

문제는 rumtime 전에 얼마나 많은 콤보 상자가 만들어 지는지 정확하게 말할 수 없다는 것입니다. –

+0

부모 대화 상자 클래스에서 메시지를 처리하는 경우에만 문제가 발생합니다.컨트롤 클래스에서이 클래스를 처리하는 경우 만드는 콤보 인스턴스의 수는 중요하지 않습니다. –

0

부모 대화 상자에서 OnCommand(WPARAM wParam, LPARAM lParam)를 재정의 할 수도 있습니다. HIWORD(wParam) == CBN_SELCHANGE 인 경우 LOWORD(wParam)과 사용자 컨트롤의 ID를 비교하십시오.

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); 
} 
관련 문제