Dela via


Åtgärder för Urklipp

Ett fönster bör använda Urklipp när du klipper, kopierar eller klistrar in data. Ett fönster placerar data i Urklipp för klipp ut och kopiera åtgärder och hämtar data från Urklipp för inklistringsåtgärder. I följande avsnitt beskrivs dessa åtgärder och relaterade problem.

Om du vill placera data på eller hämta data från Urklipp måste ett fönster först öppna Urklipp med hjälp av funktionen OpenClipboard. Endast ett fönster kan ha Urklipp öppet i taget. Om du vill ta reda på vilket fönster som har Urklipp öppet anropar du funktionen GetOpenClipboardWindow. När det är klart måste fönstret stänga Urklipp genom att anropa funktionen CloseClipboard.

Följande avsnitt beskrivs i det här avsnittet.

Klipp ut och kopiera åtgärder

Om du vill placera information på Urklipp rensar ett fönster först allt tidigare Urklippsinnehåll med hjälp av funktionen EmptyClipboard. Den här funktionen skickar meddelandet WM_DESTROYCLIPBOARD till den tidigare ägaren av Urklipp, frigör resurser som är associerade med data i Urklipp och tilldelar Urklippsägarskap till fönstret där Urklipp är öppet. Om du vill ta reda på vilket fönster som äger Urklipp anropar du funktionen GetClipboardOwner.

När urklipp har tömts placerar fönstret data i Urklipp i så många Urklippsformat som möjligt, ordnade från det mest beskrivande Urklippsformatet till det minst beskrivande. För varje format anropar fönstret funktionen SetClipboardData och anger formatidentifieraren och ett globalt minneshandtag. Minneshandtaget kan vara NULL, vilket anger att fönstret återger data på begäran. Mer information finns i fördröjd rendering.

Klistra in åtgärder

Om du vill hämta klistra in information från Urklipp avgör ett fönster först formatet för Urklipp som ska hämtas. Normalt räknar ett fönster upp tillgängliga Urklippsformat med hjälp av funktionen EnumClipboardFormats och använder det första format som det känner igen. Den här metoden väljer det bästa tillgängliga formatet enligt prioritetsuppsättningen när data placerades i Urklipp.

Ett fönster kan också använda funktionen GetPriorityClipboardFormat. Den här funktionen identifierar det bästa tillgängliga Urklippsformatet enligt en angiven prioritet. Ett fönster som bara känner igen ett Urklippsformat kan helt enkelt avgöra om formatet är tillgängligt med hjälp av funktionen IsClipboardFormatAvailable.

När du har fastställt vilket Format för Urklipp som ska användas anropar ett fönster funktionen GetClipboardData. Den här funktionen returnerar handtaget till ett globalt minnesobjekt som innehåller data i det angivna formatet. Ett fönster kan kort låsa minnesobjektet för att undersöka eller kopiera data. Ett fönster bör dock inte frigöra objektet eller lämna det låst under en längre tid.

Ägarskap för Urklipp

Den urklippsägaren är fönstret som är associerat med informationen i Urklipp. Ett fönster blir Ägare till Urklipp när det placerar data i Urklipp, särskilt när det anropar funktionen EmptyClipboard. Fönstret förblir Urklipps ägare tills det är stängt eller ett annat fönster tömmer Urklipp.

När Urklipp töms får Urklippsägaren ett WM_DESTROYCLIPBOARD meddelande. Följande är några orsaker till varför ett fönster kan bearbeta det här meddelandet:

  • Fönstret fördröjde återgivningen av ett eller flera Urklippsformat. Som svar på meddelandet WM_DESTROYCLIPBOARD kan fönstret frigöra resurser som det hade allokerat för att återge data på begäran. Mer information om återgivning av data finns i Fördröjd återgivning.
  • Fönstret placerade data på Urklipp i ett privat Urklippsformat. Data för privata Urklippsformat frigörs inte av systemet när Urklipp töms. Därför bör Urklippsägaren frigöra data när WM_DESTROYCLIPBOARD-meddelandet tas emot. Mer information om privata Urklippsformat finns i Urklippsformat.
  • Fönstret placerade data i Urklipp med hjälp av CF_OWNERDISPLAY Urklippsformat. Som svar på det WM_DESTROYCLIPBOARD meddelandet kan fönstret frigöra resurser som det hade använt för att visa information i Visningsfönstret i Urklipp. Mer information om det här alternativa formatet finns i Visningsformat för ägare.

Fördröjd återgivning

När du placerar ett Urklippsformat i Urklipp kan ett fönster fördröja återgivningen av data i det formatet tills data behövs. För att göra det kan ett program ange NULL- för parametern hData för funktionen SetClipboardData. Detta är användbart om programmet stöder flera Format för Urklipp, varav vissa eller alla är tidskrävande att återge. Genom att skicka ett NULL- handtag återger ett fönster endast komplexa Urklippsformat när och om de behövs.

Om ett fönster fördröjer återgivningen av ett Urklippsformat måste det vara berett att återge formatet på begäran så länge det är Urklipps ägare. Systemet skickar ett WM_RENDERFORMAT meddelande till Urklipps ägare när en begäran tas emot för ett visst format som inte har renderats. När du tar emot det här meddelandet bör fönstret anropa funktionen SetClipboardData för att placera ett globalt minneshandtag på Urklipp i det begärda formatet.

Ett program får inte öppna Urklipp innan det anropar SetClipboardData som svar på WM_RENDERFORMAT-meddelandet. Det är inte nödvändigt att öppna Urklipp och alla försök att göra det misslyckas eftersom Urklipp för närvarande hålls öppet av programmet som begärde att formatet skulle återges.

Om Urklippsägaren håller på att förstöras och har fördröjt återgivningen av vissa eller alla Urklippsformat tar den emot WM_RENDERALLFORMATS meddelande. När du får det här meddelandet bör fönstret öppna Urklipp, kontrollera att det fortfarande är Urklippsägare med funktionen GetClipboardOwner och sedan placera giltiga minneshandtag på Urklipp för alla Format för Urklipp som det tillhandahåller. Detta säkerställer att dessa format förblir tillgängliga när Urklipps ägare har förstörts.

Till skillnad från med WM_RENDERFORMATbör ett program som svarar på WM_RENDERALLFORMATS öppna Urklipp innan det anropar SetClipboardData för att placera globala minneshandtag på Urklipp.

Alla Urklippsformat som inte återges som svar på det WM_RENDERALLFORMATS meddelandet upphör att vara tillgängliga för andra program och räknas inte längre upp av Urklippsfunktionerna.

Vägledning för fördröjd återgivning

Fördröjd rendering är en prestandafunktion som gör det möjligt för ett program att undvika arbete med att återge Urklippsdata i ett format som kanske aldrig begärs. Att använda fördröjd återgivning innebär dock följande kompromisser som bör beaktas:

  • Om du använder fördröjd rendering blir programmet mer komplext, vilket kräver att det hanterar två återgivningsfönstermeddelanden enligt beskrivningen ovan.
  • Att använda fördröjd återgivning innebär att programmet förlorar alternativet att hålla användargränssnittet responsivt om det tar tillräckligt med tid för att återge data att det är märkbart för användaren. Med fördröjd återgivning måste fönstret återge data vid bearbetning av ett återgivningsfönstermeddelande, enligt beskrivningen ovan, om data behövs så småningom. Om data är mycket tidskrävande att rendera kan programmet därför bli synligt svarar inte (låst) medan återgivningen sker, eftersom inga andra fönstermeddelanden kan bearbetas medan återgivningsfönstret bearbetas. Ett program som inte använder fördröjd återgivning kan i stället välja att återge data i en bakgrundstråd för att behålla användargränssnittssvaret medan renderingen sker, vilket kanske ger förlopps- eller annulleringsalternativ som inte är tillgängliga när fördröjd återgivning används.
  • Om du använder fördröjd rendering lägger du till en liten mängd omkostnader om data slutligen behövs. När du använder fördröjningsåtergivning anropar ett fönster först funktionen SetClipboardData med en NULL--handtag, och om data senare behövs måste fönstret svara på ett fönstermeddelande och anropa SetClipboardData fungera en andra gång med en referens till renderade data, enligt beskrivningen ovan. Om data så småningom behövs lägger fördröjd återgivning till kostnaden för att bearbeta ett fönstermeddelande och anropar funktionen SetClipboardData en andra gång. Den här kostnaden är liten men inte noll. Om ett program bara stöder ett enda Urklippsformat, och om data alltid begärs så småningom, lägger fördröjd återgivning bara till den här lilla mängden omkostnader (kostnaden varierar beroende på maskinvara. En uppskattning är mellan 10 och 100 mikrosekunder). Men om data är små kan kostnaden för att använda fördröjd rendering överskrida kostnaden för att återge data, vilket kan motverka syftet med att använda fördröjd återgivning för att förbättra prestandan. (Vid testning, för data som redan är i sin slutliga form, överskred kostnaderna för att använda fördröjd återgivning konsekvent kostnaden för att kopiera data till Urklipp om data var 100 KiB eller mindre. Den här testningen inkluderar inte kostnaden för att återge data, bara för att kopiera dem när de återges.)
  • Fördröjd rendering är en nettoprestandafördel om den sparar mer tid än vad den lägger till i omkostnader. För att fastställa omkostnaderna för fördröjd rendering är mätning bäst, men 10 till 100 mikrosekunder är en uppskattning. Om du vill beräkna besparingarna med att använda fördröjd återgivning för varje Urklippsformat mäter du kostnaden för att återge data i det formatet och avgör hur ofta formatet så småningom begärs (baserat på de fönstermeddelanden som beskrivs ovan). Multiplicera kostnaden för att återge data med den procentandel av tiden som data inte begärs (innan Urklipp töms eller dess innehåll ändras) för att fastställa besparingarna för fördröjd återgivning för varje Urklippsformat. Fördröjd rendering är en nettoprestandafördel om besparingarna överstiger kostnaden.
  • Som en konkret riktlinje kan du överväga att placera data direkt på Urklipp om datastorleken är 4 KiB eller mindre för program som endast stöder ett enda Urklippsformat, till exempel text, där data inte är avsevärt dyra att återge.

Minne och Urklipp

Ett minnesobjekt som ska placeras i Urklipp ska allokeras med hjälp av funktionen GlobalAlloc med flaggan GMEM_MOVEABLE.

När ett minnesobjekt har placerats i Urklipp överförs ägarskapet för minneshandtaget till systemet. När Urklipp töms och minnesobjektet har något av följande Urklippsformat frigör systemet minnesobjektet genom att anropa den angivna funktionen:

Funktion för att frigöra objekt Urklippsformat
DeleteMetaFile
CF_DSPENHMETAFILE
CF_DSPMETAFILEPICT
CF_ENHMETAFILE
CF_METAFILEPICT
DeleteObject
CF_BITMAP
CF_DSPBITMAP
CF_PALETTE
GlobalFree
CF_DIB
CF_DIBV5
CF_DSPTEXT
CF_OEMTEXT
CF_TEXT
CF_UNICODETEXT
ingen
CF_OWNERDISPLAY
När Urklipp töms på ett CF_OWNERDISPLAY objekt måste själva programmet frigöra minnesobjektet.