A jedeme dál ...
Človíčkův Weblog aneb Michal Horák bloguje

Programování


Získání náhledu webu C# .NET

 | 22.3.2012

Jestliže jste chtěli někde při zadání webové adresy získat její náhled, nebo si uložit nějakou stránku jako obrázek. Pak to lze provést překvapivě jednoduší použitím komponenty WebBrowser. Zde je příklad uložení do formátu TIFF G4:

/// 
        /// Konverze souboru sejmutím obrazovky webového prohlížeče 
        /// 
        /// 
        /// 
        /// 
        Result CaptureWebPage(string input, string output)
        {
            int? width = 1024;
            int? height = null;
            // create a hidden web browser, which will navigate to the page
            using (WebBrowser web = new WebBrowser())
            {
                web.ScrollBarsEnabled = false; // we don't want scrollbars on our image
                web.ScriptErrorsSuppressed = true; // don't let any errors shine through
                web.Navigate(input);
                // wait until the page is fully loaded
                while (web.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
                    System.Windows.Forms.Application.DoEvents();
                //web.Document.Body.InnerHtml = body;

                // set the size of our web browser to be the same size as the page
                if (width == null)
                    width = web.Document.Body.ScrollRectangle.Width;
                if (height == null)
                    height = web.Document.Body.ScrollRectangle.Height;
                web.Width = width.Value;
                web.Height = height.Value;
                // a bitmap that we will draw to
                using (System.Drawing.Bitmap tiff = new System.Drawing.Bitmap(width.Value, height.Value))
                {
                    // draw the web browser to the bitmap
                    web.DrawToBitmap(tiff, new Rectangle(web.Location.X, web.Location.Y, web.Width, web.Height));
                    // draw the web browser to the bitmap
                    using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
                    {
                        EncoderParameter qualityParam = null;
                        EncoderParameters encoderParams = null;
                        try
                        {
                            ImageCodecInfo encoderInfo = null;
                            encoderInfo = GetEncoderInfo("image/tiff");

                            encoderParams = new EncoderParameters(2);
                            EncoderParameter parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
                            encoderParams.Param[0] = parameter;
                            parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                            encoderParams.Param[1] = parameter;

                            tiff.Save(output, encoderInfo, encoderParams);
                            tiff.Dispose();
                            return Result.Succes;

                        }
                        catch {
                            return Result.Exception;
                        }
                        finally
                        {
                            if (encoderParams != null)
                                encoderParams.Dispose();
                            if (qualityParam != null)
                                qualityParam.Dispose();
                        }

                    }
                }
            }
        }

22.3.2012 15:11 | Programování | Komentáře (0) | Trvalý odkaz | 144114x | Linkuj.cz

WPF analogové hodiny

 | 27.11.2009

Když jsem si začal hrát s WPF tak první věc co se mi myslím trošku povedla, byly analogové hodiny jako userControl. Bylo to překvapivě snadné a tak se o řešení podělím. Nevýhodou userControlu je, že hodiny mají pevnou velikost, sice chvilku snaha na nápravu byla, ale už nebyl čas.

Facebook


	
		
			
			
			
		
		
			
			
			
		
		
			
				
					
				
			
			
				
					
				
			
			
				
					
				
				
					
				
			
			
				
					
				
			
			
				
					
				
			
			
			
			
			
				
					
				
			
			
		
	

A samozřejmě kód v c#, který hodiny rozběhá:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Timers;
using System.Windows.Threading;

namespace CashDeskVision
{
	/// 
	/// Interaction logic for Clock.xaml
	/// 
	public partial class Clock : UserControl
	{

        private RotateTransform minuteRotateTransform;
        private RotateTransform hourRotateTransform;
        private RotateTransform secondRotateTransform;

        public delegate void TickTackHandler(Object sender, EventArgs e);
        DispatcherTimer secondTimer = new DispatcherTimer();


        public string Text {
            get {
                return this.text.Text;
            }
            set {
                this.text.Text = value;
            }
        }

		public Clock()
		{
			this.InitializeComponent();
            SetTime(DateTime.Now);

            secondTimer.Tick += new EventHandler(secondTimer_Tick);
            secondTimer.Interval = new TimeSpan(0, 0, 1);
            secondTimer.Start();
		}

        void secondTimer_Tick(object sender, EventArgs e)
        {
            SetTime(DateTime.Now);
        }

        private void SetTime(DateTime time)
        {


            minuteRotateTransform = new RotateTransform(time.Minute * 6, 0, 0);
            this.minute.RenderTransform = minuteRotateTransform;
           
            hourRotateTransform = new RotateTransform(time.Hour * 30, 0, 0);
            this.hour.RenderTransform = hourRotateTransform;

            secondRotateTransform = new RotateTransform(time.Second * 6, 0, 0);
            this.second.RenderTransform = secondRotateTransform;
        }


	}
}

27.11.2009 09:45 | Programování | Komentáře (0) | Trvalý odkaz | 180678x | Linkuj.cz

Google translator API pro C#

 | 26.3.2009

Kdo chcete využívat google translator i programově a ještě k tomu na platformě .NET tak je k nalezení knihovna, pomocí které můžete nechat přeložit jakýkoliv retězec. Tuto knihovnu najdete na adrese http://code.google.com/p/gtapi/.

26.3.2009 18:10 | Programování | Komentáře (2) | Trvalý odkaz | 192588x | Linkuj.cz

Spuštění výchozího emailového klienta s přednastavenou zprávou pomocí MAPI

 | 11.3.2009

Dnes jsem hledal, jak z programu spustit výchozího emailového klienta tak, aby se rovnou zobrazilo okno pro psaní zprávy a tu zprávu jsem již měl částěčně předvyplněnou. Prostě něco, jako když ve webovém prohlížeči kliknete na odkaz mailto. Hledání bylo úspěšné a našel jsem pár tříd napsaných v jazyku C#, které vše zvládnou. Takže díky autorovi, Andrew Bakerovi, jsem měl hned o práci méně. Třídu najdete na adrese: http://www.metageek.net/svn/Inssider/trunk/MapiMailMessage.cs

11.3.2009 16:45 | Programování | Komentáře (0) | Trvalý odkaz | 101642x | Linkuj.cz

Rozklad stromu reprezetovaného řetězcem na všechny podstromy (C#)

 | 7.3.2009

V diplomce jsem řešil takový problém, mám program reprezentovaný stromem, který mám kvůli rychlosti v řetězci. Strom může vypadat například takto:

div((add((div((X1), (X0))), (X1))), (add((add((X0), (X2))), (X1))))

Což kdyby se převedlo na matematický výraz, tak bude vypadat následovně:

((X1/X0)*X1)/((X0*X2)*X1), kde X0, X1, X2 jsou proměnné

No a z toho stromu jsem potřeboval získat všechny podstromy, včetně těch, které mají pouze kořen. No a povedlo se tímto kódem:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;

namespace Pokusy
{
    class Program
    {
        static void Main(string[] args)
        {
            List list = new List();
            string s = "div((add((div((X1), (X0))), (X1))), (add((add((X0), (X2))), (X1))))";
            foreach (Match m in Regex.Matches(s, @"(\w+)"))
            {
                if (Regex.IsMatch(m.ToString(), @"^X[\d+]$"))
                {
                    Console.WriteLine(m.ToString());
                }
                else
                {
                    Console.Write(m.ToString());

                    GetLists(s.Substring(m.Index));
                }
            }

            Console.ReadLine();
        }

        private static string GetLists(string s)
        {
            if (s.Contains("("))
            {
                char[] array = s.ToCharArray();
                int startIndex = 0;
                int endIndex = 0;
                int braces = 0;
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i].ToString() == "(" && startIndex == 0)
                    {
                        startIndex = i;
                    }
                    else if (array[i].ToString() == "(" && startIndex > 0)
                    {
                        braces++;
                    }
                    else if (array[i].ToString() == ")" && startIndex > 0)
                    {
                        if (braces == 0)
                        {
                            endIndex = i + 1;
                            i = array.Length;
                        }
                        braces--;
                    }
                }
                string left = "";
                left = s.Substring(startIndex, endIndex - startIndex);

                Console.WriteLine(left);
                return left;
            }
            return "";
        }
    }
}

7.3.2009 18:10 | Programování | Komentáře (0) | Trvalý odkaz | 96491x | Linkuj.cz

ASP.NET MVC

 | 7.12.2008

Naposledy jsem tu začal psát o ASP.NET MVC a zamýšlel jsem to jako seriál, ale změnil jsem názor. Když jsem o tom psal do školy, tak jsem sepsal dokument, který nyní dávám k dispozici.

ASP.NET MVC

ASP.NET MVC

7.12.2008 16:41 | Programování | Komentáře (0) | Trvalý odkaz | 27670x | Linkuj.cz

ASP.NET MVC 1.díl

 | 5.11.2008

Tak jsem zase po dlouhé době začal zkoumat něco nového v dotnetu. A ejhle ono se mi to zalíbilo :-) Jde o ASP.NET MVC, což je vlastně alternativa k WebForms, s tím že má řadu výhod, ale i nějakou tu nevýhodu.

Hlavními výhodami je striktnější oddělení logiky od prezentace, výsledný výstup je přesně takový jaký chcete a není ničím ovlivněn, lépe se testuje a dělá nám hezké url adresy v adresním řádku.

Nevýhodou oproti webforms je, že si musíme více věcí dělat sami, tedy je to méně pohodlné, ale za to můžeme dostat lepí výsledek.

Základem ASP.NET MVC je návrhový vzor model view controller, který už je známý zhruba tři desítky let, ale v poslední době se znovu ocitá na výsluní díky Ruby on Rails. No a Microsoft nemůže být nikdy pozadu, tak se pustil do ASP.NET MVC. Jak je již z názvu patrné Model View Controller se skládá ze tří částí:

Když si ve Visual Studiu vytvoříme ASP.NET MVC projekt, tak se nám vytvoří adresáře odpovídající jednotlivým částem. Například je možné do adresáře models, vložit LINQ to SQL Classes a můžeme mít hotovo, do adresáře Controllers se vkládají třídy zděděné z System.Web.Mvc.Controller (Zde se budou definovat akce) a nakonec v adresáři View máme aspx soubory, ovšem ještě uložené v adresářích odpovídajícím controllerům.

Pro pochopení základního principu si ukážeme jednoduchý příklad. Půjde o editaci a zobrazení článků. Nejdříve si vytvoříme HomeController.cs a stránku Index.aspx v adresáři Views/Home:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MVCweb.Models;

namespace MVCweb.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

V controlleru máme funkci Index, která je typu ActionResult a vrací nám pohled na stránku Index.aspx. Tuto funkci, nebo lépe řečeno akci, zavoláme, pokud zadáme do adresního řádku http://www.example.com/Home/Index. Když přidáme další akci, například Create, potom ji zavoláme z url http://www.example.com/Home/Create. Zde je vidět, jak se nám krásně mapují url na akce.

Pro první díl, by to mohlo stačit, příště si ukážeme jaké jsou další možnosti pro akce a také si ukážeme jak zobrazit data z modelu na stránce.

5.11.2008 21:32 | Programování | Komentáře (0) | Trvalý odkaz | 27511x | Linkuj.cz

Problém s bindováním dat v aspx stránce

 | 18.5.2008

Opět jsem řešil drobný problém, který ale umí potrápit. Potřeboval jsem do repeateru vložit HyperLink, kde se dynamicky generovala vlastnost NavigateUrl. Nejprve jsem zkoušel toto:

    
        
            
            Odstranit z Blacklistu
        
    

Což se projevilo tak, že se vše vyhodnotilo jako text a teď co s tím? No řešení je opravdu jednoduché stačí malá změna :-)

    
        
            
            Odstranit z Blacklistu
        
    

18.5.2008 11:36 | Programování | Komentáře (0) | Trvalý odkaz | 26828x | Linkuj.cz

Převedení řetězce na datum v C#

 | 15.4.2008

Opět tu mám jednu drobnost, která mě dokázala chvíly potrápit. Šlo o převedení řetězce ve tvaru dd-MM-yyyy na DateTime. Řešení je následující:

DateTimeFormatInfo formatInfo = new DateTimeFormatInfo();
formatInfo.ShortDatePattern = "dd-MM-yyyy";
formatInfo.DateSeparator = ".";

DateTime date = Convert.ToDateTime("15.04.2008", formatInfo);

DateTimeFormatInfo je k nalezení v Namespace System.Globalization, tak na to nezapomeňte :-)

15.4.2008 09:23 | Programování | Komentáře (2) | Trvalý odkaz | 29013x | Linkuj.cz

Simple Captcha v ASP.NET

 | 12.4.2008

Pro školní projekt jsem dnes dělal nějakou jednoduchou verzi Antispamové kontroly Captcha. Udělal jsem to tak, že jsem si vygeneroval kód a alespoň trošku přeházeně a s různými fonty jej vložil do obrázku, kde ještě matu s barevnými obdelníkčky. Kód jsem uložil do Sessions, abych se k tomu následně dostal a mohl vše zkontrolovat.

Zdrojový kód: Captcha.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace GUI
{
    public partial class Captcha : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.ContentType = "image/gif";
            int sirka = 180;
            int vyska = 80;
            string code = GenerateCode();
            Session["code"] = code;
            string[] fonts = new string[4];
            fonts[0] = "Verdana";
            fonts[1] = "Arial";
            fonts[2] = "Arial Black";
            fonts[3] = "Arial Black";

            Random rand = new Random();
            Bitmap image = new Bitmap(sirka, vyska);
            Graphics g = Graphics.FromImage(image);
            Pen pero = new Pen(Color.BurlyWood, 1);

            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillRectangle(Brushes.Black, 0, 0, sirka, vyska);
            for (int i = 0; i < 30; i++)
            {
                g.FillRectangle(Brushes.DarkRed, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.DarkGreen, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.Red, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.Green, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
            }

            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            for (int i = 0; i < 6; i++)
            {
                g.DrawString(code.Substring(i, 1), new Font(fonts[rand.Next(0, 3)], rand.Next(18, 26)), Brushes.White, new Point(i*30, rand.Next(5, 30)));
            }
            image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            g.Dispose();
            image.Dispose();
        }

        private string GenerateCode() {
            string znaky = "abcdefghijklmnopqrstuvwxyz0123456789";
            string code = string.Empty;

            Random rand = new Random();
            for (int i = 0; i < 6; i++)
            {
                code += znaky.Substring(rand.Next(0, znaky.Length - 1), 1);
            }
            return code;
        }
    }
}

A ověření je již jednoduché stačí dát:

if (kontrolaTextBox.Text == Session["code"].ToString()){}           

12.4.2008 13:19 | Programování | Komentáře (1) | Trvalý odkaz | 27692x | Linkuj.cz

1 | 2 | 3 | Další příspěvky

Tipy na přečtení

Kategorie

Vyhledávání

Odkazy

Nejčtenější příspěvky za poslední týden

Poslední příspěvky

"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006