[win32/MFC] vullen van combobox vanuit andere klasse

Pagina: 1
Acties:

  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
ik heb dus een combobox in een toolbar, die ik gedeclareerd heb in CMainFrame, nu moet de combobox dus vanuit de View klasse gevuld worden, maar wat ik ook die ik krijg telkens een unhandled exception (access violation 0xC0000005) vraag me dus af wat de manier is om dit te doen, ben er niet in geslaagd om de oplossing in een boek of met google te vinden, en na een uurtje of 6 wil ik het toch graag aan de praat krijgen...

zie onderstaande code voor wat m'n laatste poging was...

stukje van de View klasse dat van belang is...
C++:
1
2
3
4
5
6
7
8
9
10
int CComboToolBarView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    CMainFrame *mainFrame;
    mainFrame = (CMainFrame *) (AfxGetApp()->m_pMainWnd);
    mainFrame->SetString("Test05");
    return 0;
}


stukje van CMainFrame dat van belang is...
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    m_ToolBar.Create(this);
    m_ToolBar.LoadToolBar(IDR_TOOLBAR1);
    m_ToolBar.SetButtonInfo(1, ID_BUTTON_GRAY, TBBS_SEPARATOR, 150);
    RECT rect;
    m_ToolBar.GetItemRect(1, &rect);
    rect.bottom = rect.top + 150;
    m_Combo.Create(WS_CHILD | CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL |
        CBS_HASSTRINGS, rect, &m_ToolBar, ID_BUTTON_GRAY);
    m_Combo.ShowWindow(SW_SHOW);

    SetString("Test");
    
    return 0;
}

void CMainFrame::SetString(CString p_String)
{
    m_Combo.AddString(p_String);
}


Het gaat dus mis als de SetString functie wordt uitgevoerd, maar hoe krijg ik dan een string in m'n combobox vanuit de view class...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

En waar krijg je die unhandled exception dan wel?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
die krijg ik als m_Combo.AddString(p_String); wordt uitgevoerd. heeft zo te zien iets te maken met hWnd die geen waarde heeft...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

wijst AfxGetApp()->m_pMainWnd wel naar de juiste window?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
AfxGetApp()->m_pMainWnd geeft een pointer naar de main window van de applicatie...CMainFrame dacht ik zo en in CMainFrame.h staan:
C++:
1
2
CToolBar m_ToolBar;
CComboBox m_Combo; 

de rest staat in de code bovenaan...dacht dat het zo wel goed was, maar dus niet...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

AfxGetApp()->m_pMainWnd geeft een pointer naar de main window van de applicatie...
ja, dat lees ik ook in de MSDN, maar wijst ie IN JOUW APPLICATIE wel naar de juiste window, oftewel eentje van het type CMainFrame, voordat je mainFrame->SetString aanroept?

En is m_Combo.Create () wel gelukt? Want ik zei dat je nergens controleert op errors

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
controle op errors heb ik er even uitgeknipt om de code zo klein mogelijk te houden, het is slechts een "test" applicatie om het werkend te krijgen, de combo.create() lukt aangezien er in CMainFrame.Create() ook de functie SetString() wordt aangeroepen die een "test05" toevoegd aan de combobox, maar als ik
C++:
1
TRACE("Executable filename = %s\n", AfxGetApp()->m_pszExeName);


krijg ik dus te zien: "Executable filename = ComboToolBar"
maar
C++:
1
mainFrame = (CMainFrame *) (AfxGetApp()->m_pMainWnd);


laat dus in m'n debug scherm 0x00000000 {CMainFrame hWnd=????} zien
dat gaat dus niet goed, maar hoe moet ik het dan doen?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

In de MSDN docs over m_pMainWnd las ik dit:
Typically, you set this member variable when you override InitInstance. In a worker thread, the value of this data member is inherited from its parent thread.
Je moet 'm dus zelf zetten vermoed ik. Doe je dat ook?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
nee, dat doe ik dus niet, maar was daar zo juist even mee bezig, maar nog geen idee hoe dat te doen, heb ook geen InitInstance...heb je niet met standaard MFC App

  • chrisO
  • Registratie: Mei 2003
  • Laatst online: 21-08 10:06
Denk dat ik het probleem gevonden heb CComboToolBarView::OnCreate() wordt dus aangeroepen voordat CMainFrame::OnCreate()...en ik dacht dus dat het eerst CMainFrame en dan pas de view klasse was...lijkt mij ook het meest logische...niet dus...

PROBLEEM OPGELOST!

i.p.v. ik heb de code vanuit CComboToolBarView::OnCreate(); naar
CComboToolBarView::OnInitialUpdate(); verplaatst en
C++:
1
this->m_hWnd = GetSafeHwnd();


in m'n CMainFrame::OnCreate() en nu werkt alles naar wens :)

[ Voor 42% gewijzigd door chrisO op 18-09-2003 20:19 ]

Pagina: 1