Dela via


Redigera kontrolltextåtgärder

Systemet bearbetar automatiskt alla användarinitierade textåtgärder och meddelar programmet när åtgärderna har slutförts.

I följande avsnitt beskrivs användarinitierade textåtgärder och programmets svar:

Välja en redigeringskontroll

Användaren kan välja en redigeringskontroll genom att klicka på den med musen eller genom att trycka på TABB-tangenten för att flytta till den. Tabbningsmetoden är en del av ett fördefinierat tangentbordsgränssnitt som systemet tillhandahåller. En fullständig beskrivning av det här gränssnittet finns i dialogrutor. När användaren väljer en redigeringskontroll ger systemet kontrollen tangentbordsfokus (se "Tangentbordsfokus och aktivering" i Om tangentbordsinmatning) och markerar texten med omvänd video.

Ange och hämta text

Ett program kan ange texten i en redigeringskontroll med hjälp av funktionen SetWindowText, funktionen SetDlgItemText eller genom att skicka kontrollen ett WM_SETTEXT meddelande.

Om du vill hämta all text från en redigeringskontroll använder du först funktionen GetWindowTextLength eller WM_GETTEXTLENGTH-meddelandet för att fastställa storleken på bufferten som behövs för att innehålla texten. Hämta sedan texten med hjälp av funktionen GetWindowText, funktionen GetDlgItemText eller WM_GETTEXT-meddelandet.

Välja text

När du har valt en redigeringskontroll kan användaren välja text i kontrollen med hjälp av musen eller tangentbordet. Ett program kan hämta start- och slutteckenpositionerna för den aktuella markeringen i en redigeringskontroll genom att skicka kontrollen ett EM_GETSEL meddelande. Returvärdet för slutpositionen är ett större än det sista tecknet i markeringen (det vill: positionen för det första tecknet efter det senast markerade tecknet).

Ett program kan också välja text i en redigeringskontroll genom att skicka kontrollen ett EM_SETSEL meddelande med start- och slutteckenindexen för markeringen. Programmet kan till exempel använda EM_SETSEL med EM_REPLACESEL för att ta bort text från en redigeringskontroll.

Dessa tre meddelanden gäller för både redigeringskontroller med en rad och flera rader.

Ersätta text

Ett program kan ersätta markerad text i en redigeringskontroll genom att skicka kontrollen ett EM_REPLACESEL meddelande med en pekare till ersättningstexten. Om det inte finns någon aktuell markering infogar EM_REPLACESEL ersättningstexten vid insättningspunkten. Programmet kan få en EN_ERRSPACE meddelandekod om ersättningstexten överskrider det tillgängliga minnet. Det här meddelandet gäller både redigeringskontroller med en rad och flera rader.

Ett program kan använda EM_REPLACESEL för att ersätta en del av en redigeringskontrolls text eller funktionen SetDlgItemText för att ersätta allt.

Ändra teckensnittet som används av en redigeringskontroll

Ett program kan ändra teckensnittet som en redigeringskontroll använder genom att skicka meddelandet WM_SETFONT. De flesta program gör detta när WM_INITDIALOG meddelandet bearbetas. Om du ändrar teckensnittet ändras inte storleken på redigeringskontrollen. program som skickar WM_SETFONT meddelandet kan behöva hämta teckensnittsmåtten för texten och beräkna om storleken på redigeringskontrollen. Mer information om teckensnitt och teckensnittsmått finns i Teckensnitt och Text.

Klipp ut kopiera klistra in och rensa åtgärder

Det finns fyra meddelanden för att flytta text mellan en redigeringskontroll och Urklipp. Det WM_COPY meddelandet kopierar den aktuella markeringen (om någon) från en redigeringskontroll till Urklipp utan att ta bort den från redigeringskontrollen. Meddelandet WM_CUT tar bort den aktuella markeringen (om någon) i redigeringskontrollen och kopierar den borttagna texten till Urklipp. Meddelandet WM_CLEAR tar bort den aktuella markeringen (om någon) från en redigeringskontroll, men kopierar den inte till Urklipp (såvida inte användaren tryckte på SKIFT-tangenten). Det WM_PASTE meddelandet kopierar text från Urklipp till en redigeringskontroll vid insättningspunkten. Dessa fyra meddelanden gäller för både redigeringskontroller med en rad och flera rader.

Microsoft Windows NT 4.0 och senare: En redigeringskontroll innehåller en inbyggd snabbmeny som gör det enkelt för användaren att flytta text mellan redigeringskontrollen och Urklipp. Snabbmenyn visas när användaren högerklickar på kontrollen. Kommandona på snabbmenyn innehåller Ångra, Klipp ut, Kopiera, Klistra in, Ta bortoch Välj alla.

Ändra text

Användaren kan välja, ta bort eller flytta text i en redigeringskontroll. Systemet har en intern flagga för varje redigeringskontroll som anger om innehållet i kontrollen har ändrats. Systemet rensar den här flaggan när den skapar kontrollen och anger flaggan när texten i kontrollen ändras. Ett program kan hämta ändringsflaggan genom att skicka kontrollen ett EM_GETMODIFY meddelande. Programmet kan sedan ange eller rensa ändringsflaggan genom att skicka kontrollen ett EM_SETMODIFY meddelande. De här meddelandena gäller för både redigeringskontroller med en rad och flera rader.

Begränsa användarens angivna text

Standardgränsen för hur mycket text en användare kan ange i en redigeringskontroll är 32 KB. Ett program kan ändra standardgränsen genom att skicka kontrollen ett EM_SETLIMITTEXT meddelande. Det här meddelandet anger en hård gräns för antalet byte som användaren kan ange i en redigeringskontroll, men påverkar varken text som redan finns i kontrollen när meddelandet skickades eller text som kopierades till kontrollen av SetDlgItemText funktion eller WM_SETTEXT meddelandet. Anta till exempel att programmet använder funktionen SetDlgItemText för att placera 500 byte i en redigeringskontroll och att användaren även anger 500 byte (totalt 1 000 byte). Om programmet sedan skickar ett EM_SETLIMITTEXT meddelande som begränsar användarangiven text till 300 byte finns de 1 000 byte som redan finns i redigeringskontrollen kvar och användaren kan inte lägga till mer text. Om programmet å andra sidan skickar ett EM_SETLIMITTEXT meddelande som begränsar användarangiven text till 1 300 byte finns de 1 000 bytena kvar, men användaren kan lägga till ytterligare 300 byte.

När användaren når teckengränsen för en redigeringskontroll skickar systemet ett WM_COMMAND meddelande som innehåller en EN_MAXTEXT meddelandekod. Den här meddelandekoden innebär inte att minnet har förbrukats, men att gränsen för användarangiven text har nåtts. användaren kan inte ange mer text. Om du vill ändra den här gränsen måste ett program skicka kontrollen ett nytt EM_SETLIMITTEXT meddelande med en högre gräns.

Som ett exempel på användningen av EM_SETLIMITTEXT och EN_MAXTEXTantar vi att programmet måste begränsa användaren till högst fyra tecken i en redigeringskontroll. Programmet använder EM_SETLIMITTEXT för att ange en gräns på fyra tecken. Om användaren försökte ange ett femte tecken skulle systemet skicka en EN_MAXTEXT meddelandekod till programmet.

Tecken- och linjeåtgärder

Det finns flera meddelanden som returnerar information om tecknen och raderna i en redigeringskontroll. De flesta meddelanden returnerar ett index, vanligtvis ett nollbaserat tal, för att referera till ett tecken eller en rad. I en redigeringskontroll med en rad som innehåller n tecken är linjeindexet till exempel noll och tecknen indexeras från noll till n-1. I en redigeringskontroll med flera rader som innehåller m-rader och n tecken indexeras raderna från noll till m-1 och tecknen indexeras från noll till n-1. Observera att teckenindexering ignorerar radbrytningar.

Ett program kan fastställa antalet tecken i en redigeringskontroll genom att skicka meddelandet WM_GETTEXTLENGTH till redigeringskontrollen. Det här meddelandet returnerar längden, i tecken (inklusive det avslutande null-tecknet), för texten i en redigeringskontroll med en rad eller flera rader. Meddelandet EM_LINELENGTH returnerar längden, i tecken, på en rad som anges av teckenindexet för ett tecken på raden. Den returnerade längden innehåller inga markerade tecken. Ett program kan använda dessa meddelanden i en redigeringskontroll med en rad eller flera rader.

Meddelandet EM_GETFIRSTVISIBLELINE returnerar det nollbaserade indexet för den översta synliga raden i en redigeringskontroll med flera rader, eller det nollbaserade indexet för det första synliga tecknet i en redigeringskontroll med en rad. Ett program kan kopiera en rad från en redigeringskontroll till en buffert genom att skicka meddelandet EM_GETLINE till redigeringskontrollen. Raden anges av dess linjeindex och det första ordet i den mottagande bufferten innehåller det maximala antalet byte som ska kopieras till bufferten. Returvärdet är antalet byte som kopieras. Det här meddelandet kan också användas i en redigeringskontroll med en rad eller flera rader.

Det finns unika meddelanden tillgängliga för att returnera information om en rad i en redigeringskontroll med flera rader. Meddelandet EM_GETLINECOUNT returnerar antalet rader i en redigeringskontroll. Meddelandet EM_LINEFROMCHAR returnerar indexet för raden som innehåller ett angivet teckenindex. Meddelandet EM_LINEINDEX returnerar indexet för det första tecknet på en angiven rad.

Rulla text i en redigeringskontroll

Om du vill implementera rullning i en redigeringskontroll kan du använda de automatiska rullningsformat som beskrivs i Redigera kontrolltyper och format, eller så kan du uttryckligen lägga till rullningslister i redigeringskontrollen. Om du vill lägga till en vågrät rullningslist använder du formatmallen WS_HSCROLL; om du vill lägga till en lodrät rullningslist använder du formatet WS_VSCROLL. En redigeringskontroll med rullningslister bearbetar sina egna rullningslistmeddelanden. Detaljerad information om hur du lägger till rullningslister för att redigera kontroller finns i rullningslister.

Systemet innehåller tre meddelanden som ett program kan skicka till en redigeringskontroll med rullningslister. Det EM_LINESCROLL meddelandet kan rulla en redigeringskontroll med flera rader både lodrätt och vågrätt. Parametern lParam anger antalet rader som ska rullas lodrätt från den aktuella raden och parametern wParam anger hur många tecken som ska rullas vågrätt, med början från det aktuella tecknet. Redigeringskontrollen bekräftar inte vågräta rullningsmeddelanden om den har ES_CENTER eller ES_RIGHT formatmall. Meddelandet EM_LINESCROLL gäller endast för redigeringskontroller med flera rutor.

Det EM_SCROLL meddelandet rullar en redigeringskontroll med flera rader lodrätt. Parametern wParam anger rullningsåtgärden. Meddelandet EM_SCROLL gäller endast för redigeringskontroller med flera rutor. EM_SCROLL har samma effekt som meddelandet WM_VSCROLL.

Det EM_SCROLLCARET meddelandet rullar careten i vyn i en redigeringskontroll.

Ställa in tabbstopp och marginaler

Ett program kan ange tabbstopp i en redigeringskontroll med flera rader med hjälp av meddelandet EM_SETTABSTOPS. (Standardvärdet för ett tabbstopp är åtta tecken.) När ett program lägger till text i redigeringskontrollen genererar tabbtecken i texten automatiskt utrymme upp till nästa tabbstopp. Meddelandet EM_SETTABSTOPS gör inte automatiskt att systemet ritar om texten. För att göra det kan ett program anropa funktionen InvalidateRect. Meddelandet EM_SETTABSTOPS gäller endast för redigeringskontroller med flera rutor.

Ett program kan ange bredden på vänster- och högermarginalerna för en redigeringskontroll med hjälp av meddelandet EM_SETMARGINS. När det här meddelandet har skickats ritar systemet om redigeringskontrollen för att återspegla de nya marginalinställningarna. Ett program kan hämta bredden på vänster- eller högermarginalen genom att skicka meddelandet EM_GETMARGINS. Som standard är marginalerna för redigeringskontroll tillräckligt breda för att rymma det största vågräta överhänget (negativa ABC-bredder) för det aktuella teckensnittet som används i redigeringskontrollen.

Dölj användarindata

Ett program kan använda ett lösenordstecken i en redigeringskontroll för att dölja användarindata. När ett lösenordstecken har angetts visas det i stället för varje tecken som användaren skriver. När ett lösenordstecken tas bort visar kontrollen de tecken som användaren skriver. Om programmet skapar en redigeringskontroll med en rad med formatmallen ES_PASSWORDär standardlösenordstecknet en asterisk (*). Ett program kan använda meddelandet EM_SETPASSWORDCHAR för att ta bort eller definiera ett annat lösenordstecken och EM_GETPASSWORDCHAR meddelande för att hämta det aktuella lösenordstecknet. Dessa meddelanden gäller endast för redigeringskontroller med en rad.

Använda heltal

Det finns två heltalskonverteringsfunktioner för redigeringskontroller som endast är utformade för att innehålla tal. Funktionen SetDlgItemInt skapar strängrepresentationen av ett angivet heltal (signerat eller osignerat) och skickar strängen till en redigeringskontroll. SetDlgItemInt returnerar inget värde. Funktionen GetDlgItemInt skapar ett heltal (signerat eller osignerat) från dess strängrepresentation i en redigeringskontroll. GetDlgItemInt returnerar heltal (eller ett felvärde).

Ångra textåtgärder

Varje redigeringskontroll har en ångra-flagga som anger om ett program kan ångra eller ångra den senaste åtgärden i redigeringskontrollen (t.ex. ångra en textborttagning). Redigeringskontrollen anger ångra-flaggan för att indikera att åtgärden kan ångras och återställer den för att indikera att åtgärden inte kan ångras. Ett program kan fastställa inställningen för ångra-flaggan genom att skicka kontrollen ett EM_CANUNDO meddelande.

Ett program kan ångra den senaste åtgärden genom att skicka kontrollen ett EM_UNDO meddelande. En åtgärd kan ångras förutsatt att ingen annan redigeringskontrollåtgärd utförs först. Användaren kan till exempel ta bort text, ersätta texten (ångra borttagningen) och sedan ta bort texten igen (ångra ersättningen). Meddelandet EM_UNDO gäller för både redigeringskontroller med en rad och flera rader och fungerar alltid för redigeringskontroller med en rad.

Ett program kan återställa en redigeringskontrolls ångra-flagga genom att skicka kontrollen ett EM_EMPTYUNDOBUFFER meddelande. Systemet återställer automatiskt ångra-flaggan när en redigeringskontroll tar emot ett EM_SETHANDLE eller WM_SETTEXT meddelande. Funktionen SetDlgItemText skickar ett WM_SETTEXT meddelande.

Hantera ordliste- och radbrytningar

Ett program kan använda Wordwrap-funktioner med flerradsredigeringskontroller för att hitta ordet eller ordfragmentet som ska omslutas till nästa rad. Med hjälp av den standardfunktion för Wordwrap som tillhandahålls av systemet slutar rader alltid vid blankstegen mellan ord. Ett program kan ange sin egen Wordwrap-funktion genom att ange en EditWordBreakProc- Wordwrap-funktion och skicka redigeringskontrollen ett EM_SETWORDBREAKPROC meddelande. Ett program kan hämta adressen till den aktuella Wordwrap-funktionen genom att skicka kontrollen ett EM_GETWORDBREAKPROC meddelande.

Ett program kan styra en redigeringskontroll med flera rader för att lägga till eller ta bort ett mjukt radbrytningstecken (två vagnreturer och en radmatning) automatiskt i slutet av radslutna textrader. Ett program kan aktivera eller inaktivera den här funktionen genom att skicka redigeringskontrollen ett EM_FMTLINES meddelande. Det här meddelandet gäller endast för redigeringskontroller med flera rader och påverkar inte en rad som slutar med en hård radbrytning (en vagnretur och ett radflöde som användaren har angett). I redigeringskontroller med flera rader kan ett program också ange ES_WANTRETURN formatmall för att begära att systemet infogar en vagnretur när användaren trycker på RETUR-tangenten i redigeringskontrollen.

Hämtar punkter och tecken

Om du vill fastställa tecknet närmast en angiven punkt i klientområdet för en redigeringskontroll skickar du EM_CHARFROMPOS meddelandet till kontrollen. Meddelandet returnerar teckenindexet och linjeindexet för tecknet närmast punkten. På samma sätt kan du hämta klientområdeskoordinaterna för ett angivet tecken genom att skicka EM_POSFROMCHAR meddelandet. Meddelandet returnerar x- och y-koordinaterna i det övre vänstra hörnet av det angivna tecknet.

Automatisk komplettering av strängar

Automatisk komplettering expanderar strängar som delvis har angetts i en redigeringskontroll till fullständiga strängar. När en användare till exempel börjar ange en URL i kontrollen Adressredigering som är inbäddad i verktygsfältet i Windows Internet Explorer expanderar automatisk komplettering strängen till en eller flera fullständiga URL:er som överensstämmer med den befintliga partiella strängen. En partiell URL-sträng som "mic" kan expanderas till "https://www.microsoft.com" eller "https://www.microsoft.com/windows". Automatisk komplettering används vanligtvis med redigeringskontroller eller med kontroller som har en inbäddad redigeringskontroll.

Mer information finns i dokumentationen IAutoComplete och IAutoComplete2 interface.

Komplext skript i redigeringskontroller

Ett komplext skript är ett språk vars tryckta formulär inte är enkelt. Ett komplext skript kan till exempel tillåta dubbelriktad återgivning, kontextbaserad formning av tecken eller kombinera tecken. Standardredigeringskontrollerna har utökats för att stödja flerspråkig text och komplexa skript. Detta omfattar inte bara indata och visning, utan även rätt markörförflyttning över teckenkluster (i till exempel thailändskt och Devanagari-skript).

Ett välskrivet program får det här stödet automatiskt, utan ändringar. Återigen bör du överväga att lägga till stöd för höger-till-vänster-läsordning och högerjustering. I det här fallet växlar du de utökade formatflaggorna i redigeringskontrollfönstret för att styra dessa attribut, som du ser i följande exempel.

// ID_EDITCONTROL is the control ID in the resource file.
HANDLE hWndEdit = GetDlgItem(hDlg, ID_EDITCONTROL);
LONG lAlign = GetWindowLong(hWndEdit, GWL_EXSTYLE) ;

// To toggle alignment
lAlign ^= WS_EX_RIGHT ;

// To toggle reading order
lAlign ^= WS_EX_RTLREADING ;

När du har angett värdet lAlign aktiverar du den nya visningen genom att ange det utökade formatet för redigeringskontrollfönstret på följande sätt.

// This assumes your edit control is in a dialog box. If not, 
// get the edit control handle from another source.

SetWindowLong(hWndEdit, GWL_EXSTYLE, lAlign);
InvalidateRect(hWndEdit, NULL, FALSE);

Uniscribe är en annan uppsättning funktioner som ger bra kontroll för bearbetning av komplexa skript. Mer information finns i Uniscribe.