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.

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 | 11880x | Linkuj.cz
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 (0) | Trvalý odkaz | 23857x | Linkuj.cz
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 | 22853x | Linkuj.cz
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 | 22097x | Linkuj.cz
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.

7.12.2008 16:41 | Programování | Komentáře (0) | Trvalý odkaz | 11797x | Linkuj.cz
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 | 11501x | Linkuj.cz
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 | 11301x | Linkuj.cz
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 | 12776x | Linkuj.cz
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.
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 | 11911x | Linkuj.cz
Chvilku jsem si s tímto problémem lámal hlavu, ale docvaklo mi to a tak se můžu podělit. Je to jednoduché. Pro příklad si uděláme Master Page webGui.master, kde bude menu, ve kterém budeme chtít dát vědět, na které stránce jsme.
Otevřeme si soubor webGui.master.cs a přidáme do něj panely s odkazem a ke každému panelu property:
public Panel prvniLink {
get {
return PrvniPanel;
}
set {
PrvniPanel = value;
}
}
V kódu stránky využívající danou Master Page pak těmto property můžeme nastavit CssClass:
((webGui)this.Master).prvniLink.CssClass = "select";
No a už jen stačí pomocí css označit, že je tento odkaz vybraný …
1.4.2008 15:56 | Programování | Komentáře (0) | Trvalý odkaz | 12263x | Linkuj.cz
1 | 2 | 3 | Další příspěvky
"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006