Just nu i M3-nätverket
Jump to content

Tabordning i fönster


Thomas Tydal

Recommended Posts

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.

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

 

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

 

Link to comment
Share on other sites

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

 

 

Link to comment
Share on other sites

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 :-)

 

 

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...