Thomas Tydal Postad 1 september, 2002 Share Postad 1 september, 2002 Det här är nog första gången jag frågar något här. Har faktiskt inte lyckats hitta svaret någon annanstans, så jag hoppas att någon här vet. Jag håller på och skriver ett Windowsprogram i C. Överst i ett fönster (alltså inte en dialog) har jag en liten hemmasnickrad toolbar. Den består av en knapp och några edit-fönster. Mitt problem är att jag vill att man ska kunna förflytta sig mellan dem genom att trycka tab. Finns det nån färdig funktion för det? Jag har skrivit en egen funktion själv, men stött på problemet att jag inte vet hur man ska göra för att få reda på när tab trycks när man står i ett edit-fönster. WM_KEYUP skickas ju till edit-fönstret och inte till huvudfönstrets message loop. Länk till kommentar Dela på andra webbplatser More sharing options...
Anp Postad 1 september, 2002 Share Postad 1 september, 2002 Kan du inte ta emot WM_KEYUP i edit-fönstret och "vidarebefordra" till huvudfönstret? \\Anp - noll koll.. Länk till kommentar Dela på andra webbplatser More sharing options...
Thomas Tydal Postad 1 september, 2002 Trådskapare Share Postad 1 september, 2002 Det är just det jag undrar hur man gör... Länk till kommentar Dela på andra webbplatser More sharing options...
Thomas Tydal Postad 1 september, 2002 Trådskapare Share Postad 1 september, 2002 När man skapar ett nytt fönster i Windows så gör man det efter en mall som kallas för fönsterklass. Om man har konstruerat fönsterklassen själv så bestämmer man vilken funktion som ska anropas när något händer i fönstret (muspekaren flyttas, musknapp trycks, nån knapp trycks). Denna funktion skriver man då själv och får därmed information om allt som händer i fönstret. Ett editfönster (edit control) däremot bygger på en mall som finns färdig i Windows och man bestämmer därför inte vilken funktion som ska anropas, utan istället sköter Windows det internt. Man kan dock skicka frågor till Windows funktion och få svar om exempelvis vilken text editfönstret innehåller. Man kan även skriva text i editfönstret genom att skicka ett speciellt meddelande om det till Windows funktion där man ber om det. Men det jag vill veta är hur man gör för att få Windows funktion att tala om när användaren trycker tab. Länk till kommentar Dela på andra webbplatser More sharing options...
Anders N Postad 1 september, 2002 Share Postad 1 september, 2002 Vad händer om man kör standard windowproc? (DefWindowProc) Kör den en "generell", eller kör den den som hör ihop med klassen? Är det klassens, så borde du kunna göra den owner-drawn, ta emot de wm du vill, och sedan köra DefWindowProc. Annars skulle du väl kunna köra RegisterHotKey och på så sätt ta emot t.ex. TAB. Problemet är att den är system-wide, så om du använder den får du registrera/avregistrera när du får WM_ACTIVATE. Ciao, Anders Länk till kommentar Dela på andra webbplatser More sharing options...
Anp Postad 1 september, 2002 Share Postad 1 september, 2002 Man kan dock skicka frågor till Windows funktion och få svar om exempelvis vilken text editfönstret innehåller. ...läsa av om texten innehåller en <tab> också? \\Anp Länk till kommentar Dela på andra webbplatser More sharing options...
Thomas Tydal Postad 1 september, 2002 Trådskapare Share Postad 1 september, 2002 Hmm... Hur gör man en edit control owner-drawn? I annat fall borde det väl alltid gå att göra en hook för bara den egna applikationen, men det känns ju lite overkill, för jag tycker ju att föräldern borde få se vad barnet håller på med :-) Länk till kommentar Dela på andra webbplatser More sharing options...
Thomas Tydal Postad 1 september, 2002 Trådskapare Share Postad 1 september, 2002 Editfönstret lagrar inte tab:en. Det händer inget mer när man trycker tab än att ett meddelande skickas till editfönstret som talar om att användaren tryckt på tab. Men jag vill ju att meddelandet ska skickas till fönstret som editfönstret ligger i. Argh. Länk till kommentar Dela på andra webbplatser More sharing options...
Anders N Postad 1 september, 2002 Share Postad 1 september, 2002 för jag tycker ju att föräldern borde få se vad barnet håller på med Mmmm.. lite "overkill" kanske det är, men.. det är lätt och det fungerar. Knappar exempelvis har en BS_OWNERDRAWN som du kan sätta med SetWindowLong, jag tror inte en editbox har det, men då borde du kunna sätta en ny wndproc med SetWindowLong istället. Ciao, Anders Länk till kommentar Dela på andra webbplatser More sharing options...
fhe Postad 1 september, 2002 Share Postad 1 september, 2002 Enklast är att subklassa edit-fönstret, i ren C så gör du så här: 1. Gör din egen WNDPROC där du lyssnar på WM_KEYUP (mm) och skickar vidare dem till din parent (eller för all del, behandla dem på plats om det är enklare). 2. Peka om den till din egna windowproc med SetWindowLong(hEdit, GWL_WNDPROC, DinWndProc). Returvärdet är Edit-kontrollens windowproc. För att inte edit-kontrollen ska tappa sina "medfödda" egenskaper så ropar du på CallWindowProc längst ner där du normalt skulle ha ropat på t.ex DefWindowProc:en. CallWindowProc tar (här skriver jag friskt ur minnet, jag tror jag har rätt men slå upp det för säkerhets skull) 5 argument, först och främst den funktionspekare du fick tillbaka från SetWindowLong() i punkt 2, därefter hWnd:n, meddelandet och wparam/lparam precis som vanligt. Det är lätt att tro att det går att få ut WNDPROC:en genom att läsa vad som står i Edit-kontrollens fönsterklass-definition men det är viktigt att du plockar det du får tillbaka från SetWindowLong() eftersom du annars kortsluter andra eventuella "subklassningar" som kan vara gjorda av t.ex hjälpmedel för synskadade, "fjärrstyrningar" (a'la VNC) osv. Lycka till, jag har för mig att det finns en länk till hela grejjen om du slår på CallWindowProc i web-msdn, om inte rekomenderar jag ett inköp av Petzolds aktuella upplaga. Länk till kommentar Dela på andra webbplatser More sharing options...
Thomas Tydal Postad 1 september, 2002 Trådskapare Share Postad 1 september, 2002 Perfekt! Precis vad jag söker. Stort tack! Länk till kommentar Dela på andra webbplatser More sharing options...
Rekommendera Poster
Arkiverat
Det här ämnet är nu arkiverat och är stängt för ytterligare svar.