Jag vill kunna göra en bmp eller jpeg av min treeView. I stort sätt göre en skärmdump av kontrollern fast då utan scrollbars) Jag kan inte svara exakt på hur du skall göra, men kanske kan du ha någon nytta av mitt program i programarkivet : Programarkivet:Skärmdumpar i C# (screenshots) Testade dina klasser och det stämmer ja att det "bara" tar med vad som är synligt på skärmen så det går inte att fuska med att rita ut trädet utanför skärmen och ta en dump på den där :( Nu kanske det är just vad ni har pratat om, men skulle man inte kunna göra en "extra" treeview som är enorm, göra den osynlig, men ändå trigga ett paint-event på något sätt? Om treeviewen inte använder sin egna scroll utan använder .nets scroll (dvs. t.ex. att den ligger i en container, containern har autoscroll påslaget. Treeviewen är så stor som den behöver) så kan man enkelt skicka ett paint-event till treeviewen för att få rubbet. Problemet är dock att sådan som inte syns kommer inte att synas... OK. Hur skickar jag ett "wm_paint" meddelande till en treewiev. (Visa gärna med C# kod :) ) Nope, tanken är att du ska skicka ett window message med win32 api:t SendMessage. Jag har ingen aning om hur mycket du har använt externa dll:er (unmanaged) så jag utgår ifrån det; dumt att överarbeta ;) Skall prova när jag får tid. Men att köra "unmanaged" är ju lite tråkigt. Lär ju aldrig funka om man försöker köra programmet i mono sen :(. Tja, ska du köra managed tror jag att du måste köra .net 2.0 ;) Detta verkar definitivt vara något du skall titta på : Verkar vara en bra bit på vägen :) Saxat från koden:Bild (bmp, jpeg) av kontroll (treeView)
Någon som har en bra idee hur man skapar en bild utifrån en kontroll?Sv: Bild (bmp, jpeg) av kontroll (treeView)
Om du skickar in windowshandlen för treeviewen borde du få en screenshot av endast den, men det är klart att om inte alla noder är synliga så kommer det ju inte att bli bra. Det har jag ingen lösning på...
Fast när jag tänker efter har jag gjort en utskrift av en trädstruktur i ActiveReports en gång, men då fick jag så att säga rita alla linjer och ikoner själv, och det var inte helt lätt. Tyvärr tillhör den koden en kund och inte mig, så jag kan inte dela med mig av den...Sv:Bild (bmp, jpeg) av kontroll (treeView)
Sv: Bild (bmp, jpeg) av kontroll (treeView)
Sv:Bild (bmp, jpeg) av kontroll (treeView)
Den variant som låter mest lovande är nog Niklas variant; skapa som sagt en ny, enorm sak. Lägg den på t.ex. ett eget fönster, visa dock inte fönstret (men se till att den har en handle) och loopa in rubbet i den. Expandera sedan rubbet och skicka wm_paint-meddelandet till treeviewenSv: Bild (bmp, jpeg) av kontroll (treeView)
Och var din tanke sedan att jag skulle kunna använda "Per Hultqvist" klass där jag tar och köra ".GetScreenShot(treeView1.Handle)"?Sv:Bild (bmp, jpeg) av kontroll (treeView)
Kollade lite snabbt på WM_PAINT-meddelandet, en liten rättelse behövs: Du ska skicka ett WM_PRINT-meddelande
Det första du behöver är följande program: http://www.mentalis.org/agnet/apiviewer.shtml för att få tag på alla konstanter samt SendMessage-funktionen.
På följande sida ser du det du behöver veta om WM_PRINT-meddelandet: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_3qwk.asp
Som du ser ska WPARAM vara ett HDC. Din HDC får du genom:
IntPtr hdc = ditt_graphics_objekt.GetHdc();
//SendMessage någonting, här kommer kontrollen att rita på ditt graphics-objekt
ditt_graphics_objekt.ReleaseHdc(hdc);
Som du ser är det första parameter till SendMessage ett hWnd, dvs. en handle till ett fönster. Den handle motsvarar:
IntPtr hWnd = vilken_kontroll_som_helst.Handle;
Innan du anropar SendMessage måste du se till att ditt graphics-objekt är stort nog (eller snarare din bild bakom)Sv: Bild (bmp, jpeg) av kontroll (treeView)
Finns det fler förslg på lösningar så tar jag görna emot! Sv:Bild (bmp, jpeg) av kontroll (treeView)
Sv:Bild (bmp, jpeg) av kontroll (treeView)
http://www.codeproject.com/csharp/PrintTreeView.aspSv: Bild (bmp, jpeg) av kontroll (treeView)
Nu skall jag bara se hur man kn få det till att bli en bild istället ;)Sv:Bild (bmp, jpeg) av kontroll (treeView)
<code>
// Returns an image of the specified width and height, of a control represented by handle.
private Image GetImage(IntPtr handle, int width, int height) {
IntPtr screenDC = GetDC(IntPtr.Zero);
IntPtr hbm = CreateCompatibleBitmap(screenDC, width, height);
Image image = Bitmap.FromHbitmap(hbm);
Graphics g = Graphics.FromImage(image);
IntPtr hdc = g.GetHdc();
SendMessage(handle, 0x0318 /*WM_PRINTCLIENT*/, hdc, (long)(0x00000010 | 0x00000004 | 0x00000002));
g.ReleaseHdc(hdc);
ReleaseDC(IntPtr.Zero, screenDC);
return image;
}
</code>
Det är unmanaged, och det är ett litet trevligt window message; WM_PRINTCLIENT (kan inte skillnaden mellan den och bara WM_PRINT, men, men)