[MFC] ClassWizard en eigenschappen van controls veranderen

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Dit is ben ik bang een nogal newbie-vraag, ik loop echter tegen het probleem op dat ik iets conceptueel verkeerd vat aan dat hele Class Wizard-gebeuren. Alle tutorials die ik bekijk behandelen niet dit specifieke m.i. triviale maar cruciale onderwerp. En ik heb natuurlijk hier en in het MSDN-doolhof gezocht.

Scenario: Ik heb de AppWizard gestart, een dialog getekend met wat controls erop, waaronder de control IDC_editAmount, en die heb ik met de ClassWizard gekoppeld aan de member m_editAmount. Nu wil ik eigenlijk de tekst in de edit-control kunnen veranderen, en ik wil hem ook kunnen disablen (grijs maken).

Nu dacht ik dat er een m_editAmount-object zou komen te ontstaan die een afgeleide is (uiteindelijk) van CWnd. En dan kan ik SetWindowText aanroepen. Dacht ik. Maar nu blijkt dat ik met die m_editAmount alleen de waarde kan veranderen en dan dat met UpdateData() weer kan terugzetten. Hoe maak ik hem nu grijs?

Wie helpt me het kleine stapje verder dat ik nodig heb? Ik wil dus een pointer naar de desbetreffende instantie van de class CEdit hebben. Zo zeg ik het goed toch? :)

Even voor de zekerheid, de ClassWizard heeft ergens een stukje terug het volgende geplaatst:
C++:
1
2
3
4
5
6
7
void CTest2Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTest2Dlg)
    DDX_Text(pDX, IDC_editAmount, m_editAmount);
    //}}AFX_DATA_MAP
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 08:53
MFC leunt heel dicht aan bij de Windows API. Die API is in C geschreven en is dus niet OO, vandaar dat je dus niet zomaar kunt zeggen:
code:
1
m_editAmount.Enabled = true

m_editAmount is gewoon een variable die je aan een control 'gekoppeld' hebt, dus, hetgeen weergegeven wordt in die control, is eigenlijk de inhoud van m_editAmount. Als je de inhoud van de control aanpast, dan moet m_editAmount ook aangepast worden. Dit doe je door de functie
code:
1
UpdateData()
aan te roepen.

Om een control te disablen, moet je een handle naar die control hebben, en dan een functie oproepen die de control disabled. Dit kun je als volgt doen:
code:
1
GetDlgItem (NaamvandeControl)->EnableWindow (FALSE);

https://fgheysels.github.io/


  • Juicy
  • Registratie: December 2000
  • Laatst online: 28-08 06:11
Ik kan hier niks aan toevoegen.

Wil je echt OO kies dan voor .Net. Hier kun je bijvoorbeeld wel m_editAmount.SetWindowText aanroepen.

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 08:53
Juicy schreef op 18 November 2002 @ 12:56:
[...]


Ik kan hier niks aan toevoegen.

Wil je echt OO kies dan voor .Net. Hier kun je bijvoorbeeld wel m_editAmount.SetWindowText aanroepen.


Hmmm.... even nuanceren.... In het voorbeeld van de topicstarter is m_editAmount een integer en geen control. m_editAmount is daar gewoon een variable die 'gekoppeld' is aan een bepaalde control.
In .NET kun je idd gewoon doen:
code:
1
2
TextBox1.Text = "Test";
TextBox1.Enabled = false;

https://fgheysels.github.io/


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Inmiddels uitgevonden dat het inderdaad dat IDC_ gedoe is.
edit:
Bedankt voor de replies, maar even voor de duidelijkheid: wat is nu de naam van de control zoals ik die moet gebruiken bij GetDlgItem? Dat wat de dialog-bouwer er aan toewijst? Dus bijvoorbeeld IDC_EDIT1? Waar stel je anders de naam van de control in?


Met .Net ben ik bekend, C# is inderdaad een stuk eenvoudiger dan dit. Ik moet alleen nu iets hebben op een plek waar ik de .net-runtime niet kan installeren.

Dus even de oude nooit geopende Visual C++ 6.0 maar even uit de kast gehaald.

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Even voortbordurend heb ik nog een vraag die in het verlengde hiervan ligt. Als je de dialog initialiseert dan staat er in alle edit-boxes niets. Gewoon leegte. Op het moment dat je dan een waarde erin stopt (via UpdateData) dan komt inderdaad de goeie waarde erin. Nu wil ik de edit-box weer leeg maken. Nu is het probleem dat de m_editAmount van het type int is, en er dus niet niks in komt, maar een 0. Kan je UpdateData() ook selectief voor bepaalde items doen en niet voor allemaal? Of de UpdateData-mogelijkheid tijdelijk uitzetten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 08:53
rollebol schreef op 18 november 2002 @ 13:06:
Inmiddels uitgevonden dat het inderdaad dat IDC_ gedoe is.[edit]Bedankt voor de replies, maar even voor de duidelijkheid: wat is nu de naam van de control zoals ik die moet gebruiken bij GetDlgItem? Dat wat de dialog-bouwer er aan toewijst? Dus bijvoorbeeld IDC_EDIT1? Waar stel je anders de naam van de control in?
IDC_EDIT1 idd. (Als je rechts op de control klikt, kun je de properties van die control zien, en kun je de naam enzo veranderen).
Met .Net ben ik bekend, C# is inderdaad een stuk eenvoudiger dan dit. Ik moet alleen nu iets hebben op een plek waar ik de .net-runtime niet kan installeren.
Dus even de oude nooit geopende Visual C++ 6.0 maar even uit de kast gehaald.

Anders kun je ook gewoon Delphi, C++ Builder of VB gebruiken. Die zijn ook wat 'makkelijker' in gebruik voor het maken van form-based applicaties.

https://fgheysels.github.io/


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
whoami schreef op 18 november 2002 @ 13:14:
Anders kun je ook gewoon Delphi, C++ Builder of VB gebruiken. Die zijn ook wat 'makkelijker' in gebruik voor het maken van form-based applicaties.
Ja, zit wat in. Helaas heb ik daar niet de beschikking over.

Is er misschien ook een truc om in de MSDN library NIETS OOIT over WinCE te zien te krijgen? Het is bijkans onmogelijk om iets te vinden dat er NIET over gaat. Heel vervelend, ik kijk steeds per ongeluk op de verkeerde pagina omdat het er zo onduidelijk staat. Ik gebruik de DVD van april 2001.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

het is heel simpel, je moet met de class wizard een variabele koppelen aan je edit control. Maar dan niet een integer of string waarde, maar een Edit control. Je kunt dan via deze variabele (wat een CEdit is, een afgeleide van CWnd), gewoon de control manipuleren zonder dat je daarbij met die dataexchange hoeft te werken

Die dataexchange is overigens vooral bedoelt om waarden uit een modal dialog te halen nadat ie is gesloten. Je doet dan iets van dlg.doModal (), en daarna haal je de waarden eruit dmv de members

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.


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Dus voor een normale applicatie die maar uit 1 dialog bestaat hoor je dat data exchange-gedoe eigenlijk niet te gebruiken?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou ik zeg niet dat dat niet hoort (dat moet je tenslotte zelf weten :)), ik zeg alleen dat het opzich omslachtig is omdat je dan niet de controls kunt manipuleren

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.

Pagina: 1