14. september 2001 - 15:49Der er
13 kommentarer og 1 løsning
aflæsning af ENTER knap under MFC
jeg har en CDialog med nogle knapper en CListBox og en editbox i MFC. Denne dialog er oprette på en CPropertyPage hvor der også er nogle knapper Jeg skal udføre nogle kommandoer når man trykker på ENTER. hvordan kan jeg nemmest fange dette tastetryk.
Lige nu når jeg trykker på ENTER vælger programmet at aktivere den knap på propertypagen som har focus istedet.
nej det kan jeg ikke den knap som programmet aktiver er jo til en helt anden funktion. Den henter en anden CDialog ind på CPropertySheeten.
Det er når jeg har tatstet noget ind i min edit box og trykker enter for at gemme resultatet. Så gemmer den ikke resultatet da enter knappen istedet aktivere den knap som henter en ny dialog ind istedet for den jeg arbejder i.
Okay men kan du så ikke gøre sådan at når du har trykket på knap 1 så bliver den invisible men så bliver Knap2 visible hvor du kan skrive din anden gemme kode......
Det er fordi. det fungere som at navigere sig rundt i et menu system. lad os sige der er 2 knapper på mit property shet når man trykker på en af dem, åbner der en CDialog oven på. hvis jeg trykker på den anden knap destroyer denne dialog og åbner en ny. I den ene dialog har jeg en edit box jeg gerne vil fylde noget i. Når jeg gør dette og trykker på enter tror den jeg skifter til en anden dialog ved at trykke, på en ny menu knap ???
Du kan normalt ikke \"fange\" ENTER på en form med knapper, simpelthen fordi knapperne (den aktive kontrol, dvs. den knap der har fokus) har \"førsteprioritet\" til tastetrykkene. Du skal sætte property\'en \'KeyPreview\' på parent komponenten og nappe ENTER via OnKeyPress på parent componenten på den måde.
Alle tastetryk bliver under Windows fanget af Windows selv, og sendt videre til det aktive program som en \"event\" eller en MESSAGE. Den enkelte application i sin tur, er opbygget med et central \"message\" loop der fanger alle disse events fra selve Windows, og dernæst sender dem videre til f.eks. den komponent der har fokus. Alt efter opbygningen af det centrale \"message\" loop og komponentens ditto, vil du kunne fange f.eks. ENTER i komponenten eller i det centrale loop. Hvis du VIL fange enten i komponenten, må du altså fortælle det centrale loop at det IKKE skal behandle ENTER der.
Under C++ Builder (og MVC) har man på hver form (svarende til et Windows handle til et canvas) direkte en property der hedder \'KeyPreview\' som betyder at det centrale loop skal lade komponenten (her altså formen) kigge på evt. tastetryk FØR det bliver behandlet i det centrale loop. Jeg kender ikke MFC særlig godt, men som jpk skriver ville du formentlig skulle aktivere en handler til at reagere på tastetrykket. (Om den så hedder WM_GETDLGCODE eller hvad, aner jeg ikke - men jeg ville forvente at WM_GETDLGCODE giver dig dialogens \"modal result\", altså hvilken af dine knapper der blev trykket på, hvilket ikke nødvendigvis har noget med tasten ENTER at gøre. WM_GETKEYPRESS var et mere sandsynligt navn.)
WM_GETDLGCODE er ikke en MFC message! (Platform SDK) Den har absolut heller intet med en dialogs modal result at gøre...
Fra platform SDK dokumentationen: The WM_GETDLGCODE message is sent to the window procedure associated with a control. By default, the system handles all keyboard input to the control; the system interprets certain types of keyboard input as dialog box navigation keys. To override this default behavior, the control can respond to the WM_GETDLGCODE message to indicate the types of input it wants to process itself.
Tjaa dette er ved at være et gammelt spørgsmål, og jeg er kommet videre unden at bruge noget af ovenstående hjælp. Min løsning var at jeg begyndte at bruge et grid komponent fra OGrid fra firmaet stingray. Denne løste dette enter problem. Men ellers tak for hjælpen til jer alle
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.