Toon posts:

[C|W32] Op Enter reageren in combobox

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in een programma een combo-box waar de gebruiker een bestandsnaam in kan typen. Als er op enter gedrukt wordt moet er dan het een en ander gebeuren? Hoe doe ik dat?

Volgens mij wordt er geen message afgegeven als er op enter gedrukt wordt. Ik heb geprobeerd een standaard button er bij te zetten, maar blijkbaar werkt dat alleen in een dialogbox. Wat nu?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

WM_KEYDOWN/WM_KEYUP gebeurt bij iedere keypress dus ook bij Enter. Kan overigens zijn dat je even WM_GETDLGCODE ook moet afvangen en DLGC_WANTALLKEYS retourneren.

[ Voor 43% gewijzigd door curry684 op 28-01-2005 16:12 ]

Professionele website nodig?


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Als het goed is wordt er een OnKeyPress / OnKeyDown (of iets dergelijks) event getriggerd. Daarin controleer je dan of er op de enter werd gedrukt of niet.

Welke omgeving gebruik je precies?

My personal website


  • Kappie
  • Registratie: Oktober 2000
  • Laatst online: 03-05 13:14

Kappie

Tell me your secrets...

Bij de meeste programmeertalen kun je een knop de eigenschap Standard meegeven. Dan reageert deze knop op de Enter toets.

He does fit the profile perfectly. He's intelligent, but an under-achiever; alienated from his parents; has few friends. Classic case for recruitment by the Soviets.


Verwijderd

Topicstarter
Kappie schreef op vrijdag 28 januari 2005 @ 16:22:
Bij de meeste programmeertalen kun je een knop de eigenschap Standard meegeven. Dan reageert deze knop op de Enter toets.
Volgens mij werkt dat alleen in dialog boxes, en die gebruikt mijn programma niet.

Volgens mij raken er ergens messages kwijt, want als ik een print-statement in mijn message functie (MainWndProc) zet print deze niks als ik enter in druk.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Als je VC++ hebt: neus eens met Spy++ erdoorheen, die detecteert alle messages en waar ze heen gaan.

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op vrijdag 28 januari 2005 @ 16:28:
Als je VC++ hebt: neus eens met Spy++ erdoorheen, die detecteert alle messages en waar ze heen gaan.
Handig programma. De edit box in de combo box krijgt wel WM_KEYDOWN, de combo box alleen als hij open geklapt is, niet als hij dicht geklapt is.Verder worden alle messages gewoon doorgegeven naar boven.

De Combobox snoept dus de WM_KEYDOWN op.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Dan kun je daar neem ik aan de code plaatsen die je nodig hebt? Tenzij je een apart soort actie wilt maken onder de enter waarbij de combobox opengeklapt blijft. Dit is echter niet Windows-eigen: wanneer je een combobox open hebt en je drukt op enter, dan selecteer je een waarde.

My personal website


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

De DefWindowProc van de combobox eet dus inderdaad de WM_KEYDOWN op omdat hij er default behaviour voor introduceert. Je kunt dit echter ondervangen door de ComboBox te subclassen als je het echt nodig hebt: dat houdt in dat je zelf een eigen WndProc aan de ComboBox knoopt die alle messages 'ziet' die de combobox krijgt, en na een eventuele eigen afhandeling alsnog de DefWindowProc kan aanroepen voor het reguliere gedrag van de ComboBox. Mocht je hieraan willen beginnen: zoek eens in MSDN naar window subclassing :)

Professionele website nodig?


Verwijderd

Topicstarter
OZ-Gump schreef op vrijdag 28 januari 2005 @ 16:42:
Dan kun je daar neem ik aan de code plaatsen die je nodig hebt?
Wat bedoel je hiermee? Het is een Windows Control, daar kan ik niet zomaar code in plaatsen.

Ik heb het nu min of meer opgelost door met GetWindow de hWnd van de editbox in de combobox op te vragen. Hier vraag ik dan met GetWindowLong de WndProc van op en ik stel mijn eigen WndProc in.
C:
1
2
3
4
    hWndEdit=GetWindow(hWndCombo, GW_CHILD);

    DefComboWndProc=GetWindowLong(hWndEdit, GWL_WNDPROC);
    SetWindowLong(hWndEdit, GWL_WNDPROC, OwnComboWndProc);


In OwnComboWndProc stuur ik alles (behalve een WM_CHAR met enter erin) door naar DefComboWndProc.
Pagina: 1