Wpiąć się w pętlę komunikatów to znaczy tutaj:
void CmxTrackeditorOcxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_TRACKNAME, edTrackName);
......
}
Tak się jeszcze zastanawiam, czy zamiast tworzyć kontrolki za każdym razem dynamicaznie, czy nie było by lepiej ich chować i pokazywać? Ok, zrobiłem już tak, że chowam je i pokazuję, jednak mam błąd makra assert ;/
w klasie CmxTrackeditorOcxDlg mam np CMyEdit ed[5];
i jak rejestruje np tak:
DDX_Control(pDX, 9699, ed[0]);
9699 to losowe id poki co...
HWND CDataExchange::PrepareCtrl(int nIDC)
{
ASSERT(nIDC != 0);
ASSERT(nIDC != -1); // not allowed
HWND hWndCtrl;
COleControlSite* pSite = NULL;
m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
if (hWndCtrl == NULL)
{
// Could be a windowless OCX
pSite = m_pDlgWnd->GetOleControlSite(nIDC);
if (pSite == NULL)
{
TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
ASSERT(FALSE); //dokladnie tutaj ;/
AfxThrowNotSupportedException();
}
}
m_idLastControl = nIDC;
m_bEditLastControl = FALSE; // not an edit item by default
return hWndCtrl;
}
Czy moze byc to spowodowane tym ze nie zostalo dla niej jeszcze wywolana metoda Create? Ale z drugiej strony jak nie mam tablicy kontrolek tylko pojedyncza to wszystko jest ok ;/
Wymyśliłem rozwiązanie tego, tj będę wywoływać metodę Create w DoDataExchange zamiast w OnInitDialog, ale czy to dobry sposób?