ASP.NET HttpHandler,WinClient Form,WebService Base

Guzel bir uygulama ile tekrar karşinizdayim , ama bildiğiniz derste takiliyorum , o ayrı tabi,
Bu yazımıdaki uygulamamiz aşamali olduğundan şimdiden sıkılacak arkadaşlar var ise , haberturk’ün

foto galerilerinde gezmelerini tavsiye edebilirim ,sağlik olsun diyoruz biliyorsunuz ki böyle durumlar için,uygulama temel olarak ASP.NET içerisinde HttpHandler,Windows tarafinda cok yogun kullandığımız WebRequest türünden tipler üzerine inşaa edilecektir,kısaca açiklayacak olursam , bir Windows uygulamasi ,arka planında , arayüzden bizden aldiği değerlere göre , web sayfasina talep yapmakta ve bu talep karşısında,kendisine XML veriler döndürülmektedir.Bu xml verileri DataTable vasitasi ile okuyup , DataGridView kontrolü içerisinde sunuyoruz.Ekran görüntüleri , ve açiklamali kodlarimiz ile sizleri başbaşa bırakıyorum.

Öncelikli olarak bir Veritabanina ihtiyacimiz var , bunun için Sql Script’i sizlerle paylaşiyorum.

create database TriologyDB
use TriologyDB
create table tblUrun
(
UrunID int identity(1,1),
UrunAdi nvarchar(100),
)

create table tblSatis
(
SatisID int identity(1,1),
SatisUrunID int,
SatisTarihi smalldatetime,
SatisAdet int
)

bu DB ve tablolar olusturulduktan sonra, ben yazımızda örnek amacli olarak AdventureWorks veritabaninin Production.Product tablosundan ürün isimlerini tblUrun tablomuza aktardim , tabi hepsini değil..tblSatis tablosunda da , 1000 adet rastgele kayit girişinde bulundum , bu tabloya rastgele urun kimlik bilgisine göre , ve rastgele tarihlere göre kayitlar girdirerek , zaman içerisinde belli adetlerde satış yapıldığına dair simulasyon gerçekleştiriyoruz, gerçek uygulamanizda tabiki böyle bir şeye gerek olmayacaktır,kendi veri tablolarinizda örneğimizdekinden cok cok farklı olacaktir. Veritabani ihtiyacimizi karşıladığımıza göre , sıra geldi adım adım ilerlemeye , bu yürüyüşümüzün ilk adimi olarak HttpHandler tasarimina gireceğiz, HttpHandler’lar ASP.NET içerisinde uzantısına göre işleri devir alan tiplerdir ve HTML çıktı üretmekle yükümlüdürler.Biz Kendi uzantimiz için kendi HttpHandler’imizi yazarken .raporx uzantili olacağı şeklinde bir senaryo düşünmekteyiz.

.raporx ile biten sayfalarimiza talepler ve peşinden gelecek olan QueryString ( sorgu katari ) bilgileri ileXML çıktılar üreteceğiz, tabiki de bunun için yukarıda hazırlanmış olduğunu düşündüğüm ( hazırladığım ) veritabaninin bilgilerinden yararlanacağız.Bu kadar teoriden sonra gelelim bir HttpHandler yazılmasına, bu işlem için bir ClassLibrary Project düşünüyoruz, ki derleme işlemi sonunda bizim için bir Assembly(dll) üretilmiş olsun.HttpHandler ‘larin ortak noktası , System.Web assembly’si içerisinde bulunan IHttpHandler arayüzlerini tiplere uygulanmış olmasıdır.

Açtığımız ClassLibrary’deki class’imiza bu arayüzü uyguluyoruz ve kodlarimiz…

  1. using System;
  2. using System.Data.SqlClient;
  3. using System.Data;
  4.  
  5. namespace HttpRaporXHandler
  6. {
  7. public class RaporHandler : System.Web.IHttpHandler
  8. {
  9. #region IHttpHandler Members
  10.  
  11. public bool IsReusable
  12. {
  13. get { return false; }
  14. }
  15.  
  16. public void ProcessRequest(System.Web.HttpContext context)
  17. {
  18. context.Response.ContentType = "text/xml";
  19. // gelen querystring’ler …
  20. if (context.Request.QueryString.Count > 0)
  21. {
  22. // bu noktada gelen değerleri kontrol ettirebilirsiniz
  23. // try – catch bloklari ile , ama bunu size birakiyorum …
  24. string _productIDCriteria = context.Request.QueryString[0]; // id kriteri sorgu katari
  25. string _beginningTime = context.Request.QueryString[1]; // baslangic zaman bilgisi sorgu katari
  26. string _endingTime = context.Request.QueryString[2]; // bitiş zaman sorgu katari
  27.  
  28. string _connectionString = "data source=localhost;initial catalog=Triology;integrated security=true";
  29. string _commandText = string.Format("select u.UrunAdi,SUM(s.SatisAdet) as ‘SatisAdet’ from tblUrun u inner join tblSatis s on u.UrunID = s.SatisUrunID where s.SatisTarihi >= @beginDateParam and s.SatisTarihi <= @endDateParam and u.UrunID = @idParam group by u.UrunAdi order by 2 DESC");
  30.  
  31. // tarih formati : 25.12.2007 şeklinde gonderilir.
  32. string[] beginParse = _beginningTime.Split(‘.’);
  33. DateTime beginDate = new DateTime(int.Parse(beginParse[2]), int.Parse(beginParse[1]), int.Parse(beginParse[0]));
  34.  
  35. string[] endParse = _endingTime.Split(‘.’);
  36. DateTime endDate = new DateTime(int.Parse(endParse[2]), int.Parse(endParse[1]), int.Parse(endParse[0]));
  37.  
  38. SqlConnection _connection = new SqlConnection(_connectionString);
  39. SqlCommand _command = new SqlCommand(_commandText, _connection);
  40.  
  41. // parameters…
  42. _command.Parameters.Add("@idParam", System.Data.SqlDbType.Int).Value = int.Parse(_productIDCriteria);
  43. _command.Parameters.Add("@beginDateParam", System.Data.SqlDbType.SmallDateTime).Value = beginDate;
  44. _command.Parameters.Add("endDateParam", System.Data.SqlDbType.SmallDateTime).Value = endDate;
  45.  
  46. SqlDataAdapter _adapter = new SqlDataAdapter(_command);
  47. DataTable _dtTable = new DataTable("Results");
  48.  
  49. _adapter.Fill(_dtTable);
  50.  
  51. // DataTable verilerini ekrana yansıtırken , Şemasi ile birlikte
  52. // yazdırıyoruz,çünki başka bir uygulamanin , nesnesi okumak isterken , şema ihtiyaci
  53. // duyar
  54. _dtTable.WriteXml(context.Response.OutputStream,XmlWriteMode.WriteSchema);
  55. }
  56. }
  57.  
  58. #endregion
  59. }
  60. }

Kodlarimizi derlediğimizde bizim için bir DLL oluşmasi gerekir,bu DLL dosyası da Kod dosyasının yanında bulunan Bin/Debug klasörü içerisindedir.

Şimdi bir WebSite açalim , ve peşinden web site projesi üzerine sağ tıklama ile Add Reference diyelim,bu noktadan sonra , DLL dosyamızı bulup Referans ettiğimizi gösterelim

Referans edilen assembly’nin tanitilmasi işlemlerine geçtiğimizde ilk olarak web sitemizin web.config dosyasını açıp httpHandlers düğümünü buluyoruz.Bu düğüm içine kendi handlerimizi ve hangi uzantı için çalışacağını söylemeliyiz.

web.config içerisindeki kodlarimiz…

<httpHandlers>
<remove verb=”*” path=”*.asmx”/>
<add verb=”*” path=”*.asmx” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
<add verb=”*” path=”*_AppService.axd” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
<add verb=”GET,HEAD” path=”ScriptResource.axd” type=”System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″ validate=”false”/>
<!–
BİZİM HANDLERİMİZ
–>
<add verb=”*” path=”*.raporx” type=”HttpRaporXHandler.RaporHandler,HttpRaporXHandler” validate=”false”/>
</httpHandlers>

type kısmında açtiğimiz ClassLibrary’nin Namespace’i ve (.) dan sonrasi ile de yazdığımız HttpHandler tipini söylemekteyiz.

path parametresinde de hangi uzantili dosyalarin ele alinacağı anlatilmaktadir.

Şimdi sıra, bu handler’in IIS tarafindan taninmasi ,bunun için Bilgisayarim > Yonet > IIS Service , Web sitemizi bulalim ve özelliklerine geçelim , Yapılandırma bölümünden ekle dediğimizde

gelecek olacak pencerede GözAt butonunun karşısında olan kısma aspnet_isapi.dll ‘i buluyoruz, yerini gösteriyoruz,path kısmında da .raporx dedikten sonra , pencerenin sol altinda bulunan , dosyalarin fiziksel olarak varliğini kontrol et seçeneğini iptal ediyoruz,işlem bu kadar…

Gelelim Artik , bu Web sitesi üzerinden , bizim belirlediğimiz uzantı ile veri çekme işlemini yapacak form uygulamasina , Form üzerinde 2 tane datetimepicker , bir textbox , button ,ve datagridview bulunmaktadır.

Form1.cs kodları

  1. using System;
  2. using System.Data;
  3. using System.Windows.Forms;
  4. using System.Net;
  5. using System.IO;
  6.  
  7. namespace WindowsClientApp
  8. {
  9. public partial class Form1 : Form
  10. {
  11. public Form1()
  12. {
  13. InitializeComponent();
  14. }
  15.  
  16. private void btnGetData_Click(object sender, EventArgs e)
  17. {
  18. // WebRequest ile bir sayfa talebine hazırlaniliyor…
  19. WebRequest _request = WebRequest.Create(string.Format("http://localhost/WebRaporHandler/Rapor.raporx?P1={0}&amp;P2={1}&amp;P3={2}",txtProductID.Text, dateFirst.Value.ToShortDateString(), dateSecond.Value.ToShortDateString()));
  20.  
  21. // WebResponse ile de , talep den dönen cevabı inceliyoruz..
  22. WebResponse _response = _request.GetResponse();
  23. // cevapın sahip olduğu verileri Stream olarak ele aliyoruz.
  24. Stream st = _response.GetResponseStream();
  25. // Bu Stream’i , bir StreamReader tipinden okuyucuya teslim ediyoruz.
  26. StreamReader reader = new StreamReader(st);
  27. // okuyucunun baştan sona kadar okumasini istiyoruz..
  28. string content = reader.ReadToEnd();
  29.  
  30. // hemen arka planda gelen içerik için bir XML Dosyası oluşturulmasini talep ediyoruz.
  31. FileStream fs = new FileStream("temp.xml", FileMode.Create);
  32. // olusturulduktan sonra filestream kapatilmalidir , ki başka stream’ler erişim
  33. // yaptiginda programda istisnai durum oluşmasin.
  34. fs.Close();
  35.  
  36. // Gelen Icerik içerisinde , \r\n gibi , text dosyalardan veri okumada da göreceğimiz
  37. // kaçış karakterlerini kaldırıyoruz, sebebide bu karakterler bir XML dosya bünyesinde
  38. // yer alamazlar…
  39. content = content.Replace("\r\n", "");
  40. // tüm XML gelen veri içeriğinide dosyamıza yazdırıyoruz…
  41. File.WriteAllLines("temp.xml", new string[] {  content });
  42. DataTable dt = new DataTable();
  43. // DataTable ile verileri XML formatinda olduğundan
  44. // ve DataTable tiplerin XML dosyalari okuma yeteneği olduğundan
  45. // verileri çekelim
  46. dt.ReadXml("temp.xml");
  47. // verileri çekmiş DataTable nesnemizi de Grid kontrolümüze
  48. // veri kaynağı olarak gösteriyoruz.
  49. _grid.DataSource = dt;
  50. }
  51. }
  52. }

Ekran görüntüsü …

WinClient App

WinClient App

Win Form’un arka planda , çektiği verinin web üzerinden çıktısı :

ASPNetOutput

ASPNetOutput

.NET Asenkron Sound Player Ornek

Sound Player Tutorial

Sound Player Tutorial

Basit bir windows uygulaması , System.Media kütüphanesi altindaki SoundPlayer sınıfının dosyalari çalma işlemi için tasarlandi , ve büyük wav dosyalarina karşında asenkron çalışmaktadır.

C# kodlarimiz :

  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4.  
  5. namespace XSoundPlayer
  6. {
  7. public partial class Form1 : Form
  8. {
  9. string secilenDosya;
  10. public Form1()
  11. {
  12. InitializeComponent();
  13. }
  14.  
  15. private void btnGozAt_Click(object sender, EventArgs e)
  16. {
  17. OpenFileDialog dosyaPenceresi = new OpenFileDialog();
  18. dosyaPenceresi.InitialDirectory = "C:\\";
  19. dosyaPenceresi.Filter = "WAV Dosyalari | *.wav";
  20.  
  21. if (dosyaPenceresi.ShowDialog() == DialogResult.OK)
  22. {
  23. secilenDosya = dosyaPenceresi.FileName;
  24. lblDosya.Text = string.Format("Dosya : {0}", secilenDosya);
  25. }
  26. }
  27.  
  28. private void btnPlay_Click(object sender, EventArgs e)
  29. {
  30. if (secilenDosya != string.Empty)
  31. {
  32. // player..
  33. System.Media.SoundPlayer player = new System.Media.SoundPlayer();
  34. // ses dosyasının fiziksel yolu
  35. player.SoundLocation = secilenDosya;
  36. // ses dosyasi yüklenmesi tamamlandiğinda tetiklenecek olay
  37. player.LoadCompleted += new AsyncCompletedEventHandler(player_LoadCompleted);
  38. // ses dosyası değiştiğinde tetiklenecek olay
  39. player.SoundLocationChanged += new EventHandler(player_SoundLocationChanged);
  40. // asenkron yükleme işleminin başlatilmasi ..
  41. player.LoadAsync();
  42. }
  43. }
  44.  
  45. void player_SoundLocationChanged(object sender, EventArgs e)
  46. {
  47. System.Media.SoundPlayer p = (System.Media.SoundPlayer)sender;
  48. p.LoadAsync();
  49. }
  50.  
  51. void player_LoadCompleted(object sender, AsyncCompletedEventArgs e)
  52. {
  53. System.Media.SoundPlayer p = (System.Media.SoundPlayer)sender;
  54. p.Play();
  55. }
  56. }
  57. }

Asenkron ASP.NET

Yaz aylarında yazdığım Ado.NET kitabinda olmasa da , bu teknoloji içerisinde kullanılacak olan asenkron programlama desenlerinin önemini her konuda karşımıza çıktığı ve çıkacağı gerçektir.

Bu programlama desenlerinde Pooling ve CallBack teknikleri en yoğun kullanılanlardır.Console uygulamasi yazılırken bile dikkat edilecek bir noktadır asenkron programlama biçimi , işler windows ortamina ve web ortamine geçtiğinde ise daha da bir hayati öneme kavuşur.

Bu yazıda , çok basit manada bir asp.net sayfasında asenkron programlama kullanımına bakiyor olacağız.Her zaman söylediğimiz gibi önce keyif alalim yoksa , köşedeki butondan sayfayı kapatalim (:

Öncelikli olarak çok az veri attiğim bir Ms-Sql veritabani hazirliyoruz ve Adı => AsenkronASPNETDB.
Uzerinde bir tablo oluşturuyoruz,bu tablonun adı tblData ve şemasi da görüldüğü gibidir.

MSSQL Database

Hemen arkasindan bu tablo için kayitlar girelim sihirbaz üzerinden

Table Records

Page Design

Şimdi sırada bu veritabani ve tablosundaki verileri kullanacağımız ASP.NET sayfasının tasarimina geçiyoruz
Tasarim oldukca basit bir DataGridView ve bir Label kontrolünden oluşmakta, sayfanın kodlarini paylaştim , içerisinde cok az da olsa CSS kullanıldı pek bir önemi olmasa da , bazı öğrenci arkadaşlarimin dediği gibi işe yaramaz bir Label da yerini almiş oldu (:

Sıra Geldi artik kodlama tarafina , Default.aspx sayfasının tasarim kodlarini paylaşalim

<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Creacoder.Com – Asenkron Web</title>
<style type=”text/css”>
.metinStil
{
font-family:Calibri;
font-size : small;
color:Navy;
}
</style>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>

Asenkron Verilerimiz :<br />
<asp:GridView ID=”_grid” runat=”server”>
</asp:GridView>
<br />
<asp:Label ID=”lblBilgi” runat=”server”></asp:Label>

</div>
</form>
</body>
</html>

C# Kodlarini paylaşalim

  1. using System;
  2. using System.Data;
  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Data.SqlClient;
  6.  
  7. public partial class _Default : System.Web.UI.Page
  8. {
  9. // sınıf içinde her noktadan erişim için Field değişkenlerimiz
  10.  
  11. // zaman kriterlerini kontrol için 2 tane başlangic ve bitiş
  12. // değişkenlerimiz
  13. static DateTime _beginTime, _endTime;
  14.  
  15. // Ado.NET işlemleri için kullanılacak değişkenlerimiz
  16. SqlConnection _connection;
  17. SqlCommand _command;
  18. SqlDataReader _dr;
  19.  
  20. protected void Page_Load(object sender, EventArgs e)
  21. {
  22. // başlangıc zamanı aliniyor..
  23. _beginTime = DateTime.Now;
  24.  
  25. // Asenkron işlemler için delege örneği üretiliyor… TimeOut konusunda kullanılan 3.parametre
  26. // EndEventHandler anonim metot almiştir.
  27. PageAsyncTask task = new PageAsyncTask(new BeginEventHandler(BeginTask), new EndEventHandler(EndTask), new EndEventHandler(delegate(IAsyncResult ar)
  28. {
  29. if (_connection != null || _connection.State != ConnectionState.Closed)
  30. {
  31. _connection.Close();
  32. this.Title = "Operasyon Zaman Aşimina Uğradi";
  33. }
  34. }), null);
  35. // Sayfamıza bu asenkron işlemleri kayıt ettiriyoruz.
  36. Page.RegisterAsyncTask(task);
  37. }
  38.  
  39. // Asenkron işlem başlatıldığında tetiklenir.
  40. IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback callBack, object state)
  41. {
  42. // Bağlantilarin hazirlanmasi
  43. // Ado.NET kullananlar cok iyi anlayacaktır ki
  44. // egerki asenkron islem kosturulacaksa bunun bağlantı cümlesinde anlatilmasi gerekir
  45. // son parametre bu özellik içindir
  46. string connectionString = "data source=localhost;initial catalog=AdventureWorks;integrated security=true;Asynchronous Processing=true";
  47. _connection = new SqlConnection(connectionString);
  48. _command = new SqlCommand();
  49. _command.Connection = _connection;
  50. _command.CommandText = "select ContactID,FirstName,LastName from Person.Contact order by newID() DESC";
  51.  
  52. try
  53. {
  54. _connection.Open();
  55. }
  56. catch
  57. {
  58. _connection.Close();
  59. }
  60.  
  61. // asenkron veri çekme işleminin başlatilmasi
  62. return _command.BeginExecuteReader(callBack, state);
  63. }
  64.  
  65. // Asenkron işlem bittiğinde tetiklenir.
  66. void EndTask(IAsyncResult ar)
  67. {
  68. // asenkron işlemin bittiğinde bu işlem değişkeni üzerinden , field değişken
  69. // _dr ‘yı artik doldurabiliriz
  70. _dr = _command.EndExecuteReader(ar);
  71. }
  72.  
  73. // Sayfa arayüze çıkartılırken yapilacak işlemler
  74. // metodumuz , sayfadaki DataGridView kontrolünün
  75. // veri kaynağını belirtiyoruz,asenkron işlemler sırasında
  76. protected override void OnPreRenderComplete(EventArgs e)
  77. {
  78. _grid.DataSource = _dr;
  79. _grid.DataBind();
  80. _connection.Close();
  81. // tüm bu işlemler sonunda bitiş zamanı…
  82. _endTime = DateTime.Now;
  83. lblBilgi.Text = string.Format("Arka Plandaki Islemin Süresi : {0} ms", (_endTime - _beginTime).Milliseconds);
  84. }
  85.  
  86. // Ado.NET kaynaklarinin dispose edilmesi.
  87. public override void Dispose()
  88. {
  89. if (_connection != null) _connection.Close();
  90. base.Dispose();
  91. }
  92. }

buraya kadar geldiğimize göre , yapilmasi gerekenleri paylaşalim,asenkron programlamanın önemi için öncelikle kendi oluşturduğumuz veri kümesinin etkilerini sonrasında ise örnek veritabani olarak seçilen AdventureWorks üzerinde bulunan Person.Contact veri kümesinin etkilerini inceliyor olacağız,bu sebeple ilk test için , connectionString ve CommandText değerlerini görüldüğü gibi görüldüğü kısmı ile değiştirelim

Step 1

Step 1

Şimdi sıra geldi bu değişim sonrasında sayfamızın vereceği tepkiye , çıktımızı aliyoruz.

Async Test 1

Async Test 1

Ve yine değişiklige gidelim connection ve CommandText üzerinde

Step 2

Step 2

ve çıktımızı alalim …

Async Test 2

Async Test 2

Keyifli günler..

Oysa Herkez,Öldürür Sevdiğini

Oysa Herkez öldürür sevdiğini .
kulak verin sözlerime iyice,
herkes öldürebilir sevdiğini
kimi bir bakışıyla yapar bunu,
kimi dalkavukça sözlerle,
korkaklar öpücük ile öldürür,
yürekliler kılıç darbeleriyle!
***
kimi gençken öldürür sevdiğini
kimileri yaşlı iken öldürür;
şehvetli ellerle boğar kimi
kimi altından ellerle … ;
merhametli kişi bıçak kullanır
çünkü bıçakla ölen çabuk soğur.
***
kimi aşk kısadır, kimi uzundur,
kimi satar kimi de satın alır;
kimi gözyaşı döker öldürürken,
kimi kılı kıpırdamadan öldürür;
herkes öldürebilir sevdiğini
ama herkes öldürdü diye ölmez.

oscar wilde

.NET Image Tutorial

Dot Net Image Tutorial

Dot Net Image Tutorial

Cok oldu yazmayali , işler – güçler olayindan , araya birşeyler sıkıştırmak adina güzel bir örnek oldu.Programin ne yaptiğini anlatmaya gerek yok , programcik işte (:

bug felan çıkarsa , dediğimiz gibi bu tamamen sizin sorumluluğunuzdur , keyfinize bakin, mail atarsaniz da sevinirim
Program tek form uygulamasindan oluşmaktadır ve işte kodlarimiz …

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Reflection;
  6. using System.Threading;
  7.  
  8. namespace ImageTutorial
  9. {
  10. public partial class Form1 : Form
  11. {
  12. string resimDosyasi;
  13. // Grafik nesnemiz
  14. Graphics g;
  15.  
  16. Thread thd;
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. resimDosyasi = string.Empty;
  21. thd = new Thread(new ParameterizedThreadStart(ThreadMetot));
  22.  
  23. Form.CheckForIllegalCrossThreadCalls = false;
  24. }
  25. private void btnGozAt_Click(object sender, EventArgs e)
  26. {
  27. // dosya bulmak için
  28. OpenFileDialog dosyaPenceresi = new OpenFileDialog();
  29. // dosya penceresi varsayilan olarak C sürücüsü altini göstersin
  30. dosyaPenceresi.InitialDirectory = "C:\\";
  31.  
  32. // pencerede görüntülebilecek dosyalari filtreleyelim
  33. dosyaPenceresi.Filter = ".JPG | *.jpg";
  34.  
  35. // pencere açilir
  36. // ve kullanıcının Tepkisini elde ederiz
  37. DialogResult kullaniciTepkisi = dosyaPenceresi.ShowDialog();
  38.  
  39. if (kullaniciTepkisi == DialogResult.OK)
  40. {
  41. // demektir ki , bir dosya seçmiş…
  42. string secilenResimDosyasi = dosyaPenceresi.FileName;
  43. // FileName özelliği tüm dosyanın yolunu bildirir
  44. // örn : C: sürücüsü altinda benimResmim.jpg gibi
  45. // C:\\benimResmim.jpg …
  46.  
  47. // araDeğişkene resimin yolunu aldiralim,ilerleyen metotlar preview de bu
  48. // değerden faydalanacağız
  49. resimDosyasi = secilenResimDosyasi;
  50.  
  51. // Resim tipiyle PictureBox içerisinde gösterelim
  52. Image resim = Image.FromFile(secilenResimDosyasi);
  53. // resim kutumuzda gösterelim.
  54. pctResim.BackgroundImage = resim;
  55. }
  56. else
  57. {
  58. MessageBox.Show("Bir Resim Dosyasi Seçiniz");
  59. return;
  60. }
  61. }
  62.  
  63. private void btnOnIzleme_Click(object sender, EventArgs e)
  64. {
  65. if (resimDosyasi == string.Empty || resimDosyasi == null)
  66. {
  67. MessageBox.Show("Bir Resim Dosyası Secilmeliydi");
  68. return;
  69. }
  70. else
  71. {
  72. // Form daki değerleri okumaya başlayalim
  73.  
  74. string resimYazisi,resimYazisiFontu,resimYazisiStili,resimYaziRenk;
  75. resimYazisi = resimYazisiFontu = resimYazisiStili = resimYaziRenk= string.Empty;
  76.  
  77. int resimYaziFontBuyukluyu, _XKordinati, _YKordinati;
  78. resimYaziFontBuyukluyu = _XKordinati = _YKordinati = 0;
  79.  
  80. try
  81. {
  82. resimYazisi = txtYazi.Text;
  83. resimYazisiFontu = cmbFont.SelectedItem.ToString();
  84. resimYazisiStili = cmbFontStili.SelectedItem.ToString();
  85. resimYaziRenk = cmbFontRenk.SelectedItem.ToString();
  86.  
  87. resimYaziFontBuyukluyu = (int)nmrFontBoyutu.Value;
  88. _XKordinati = int.Parse(txtYaziXKordinati.Text);
  89. _YKordinati = int.Parse(txtYaziYKordinati.Text);
  90.  
  91. // grafik nesnesinin üzerinde çalısacağı tuval i söyleyelim
  92. // ki tüm işlemleri neyin üzerinde yapacağını bilsin
  93.  
  94. // resim kutusundaki resmi,sadece görüntüde olmali
  95. // biz görünen resmi bozmamaliyiz
  96. // yeni bir Image üzerinde çalışmak için
  97. // Class seviyesinde tanimlanmiş resimDosyasi değişkenimizden yararlanalim
  98. Image img = Image.FromFile(resimDosyasi);
  99.  
  100. // tuvalimizin arka planda olusturuna img nesnesi olduğunu söyleyelim
  101. g = Graphics.FromImage(img);
  102.  
  103. // img üzerine string yazdırma yaptıralim
  104. g.DrawString(resimYazisi, new Font(resimYazisiFontu, resimYaziFontBuyukluyu, (FontStyle)Enum.Parse(typeof(FontStyle), resimYazisiStili)), new SolidBrush(Color.FromName(resimYaziRenk)), new PointF(_XKordinati, _YKordinati));
  105.  
  106. pctResim.BackgroundImage = img;
  107. }
  108. catch (Exception ex)
  109. {
  110. MessageBox.Show("Hata Olustu !\n" + ex.Message);
  111. }
  112. }
  113. }
  114.  
  115. private void Form1_Load(object sender, EventArgs e)
  116. {
  117. // Bilgisayar daki fontlar ve resimler yüklenmesi
  118. // zaman aldiğinda bu işi bir Thread’e yaptıralim
  119. thd.Start(thd);
  120. }
  121.  
  122. void ThreadMetot(object o)
  123. {
  124. cmbFont.Enabled = false;
  125. cmbFontRenk.Enabled = false;
  126. cmbFontStili.Enabled = false;
  127.  
  128. // Font Stillerini Yükleyelim
  129. cmbFontStili.Items.AddRange(Enum.GetNames(typeof(FontStyle)));
  130. cmbFontStili.Enabled = true;
  131.  
  132. // Renkleri Yükleyelim
  133. PropertyInfo[] ColorTipiRenkleri = typeof(Color).GetProperties();
  134. List&lt;string&gt; renkIsimleri = new List&lt;string&gt;();
  135.  
  136. for (int i = 0; i &lt; ColorTipiRenkleri.Length; i++)
  137. {
  138. string renkAd = ColorTipiRenkleri[i].Name;
  139.  
  140. renkIsimleri.Add(ColorTipiRenkleri[i].Name);
  141. }
  142.  
  143. cmbFontRenk.Items.AddRange(renkIsimleri.ToArray());
  144. cmbFontRenk.Enabled = true;
  145.  
  146. // Fontlari Yükleyelim
  147. FontFamily[] fontAileleri = FontFamily.Families;
  148.  
  149. List&lt;string&gt; fontIsimleri = new List&lt;string&gt;();
  150.  
  151. for (int i = 0; i &lt; fontAileleri.Length; i++)
  152. {
  153. Font f = null;
  154. try
  155. {
  156. f = new Font(fontAileleri[i].Name, 10);
  157. }
  158. catch
  159. {
  160. f = new Font("Arial", 10);
  161. }
  162. fontIsimleri.Add(f.Name);
  163. }
  164.  
  165. cmbFont.Items.AddRange(fontIsimleri.ToArray());
  166. cmbFont.Enabled = true;
  167.  
  168. Thread t = (Thread)o;
  169. t.Abort();
  170. }
  171.  
  172. private void btnKaydet_Click(object sender, EventArgs e)
  173. {
  174. SaveFileDialog kayitPenceresi = new SaveFileDialog();
  175. kayitPenceresi.Filter = ".JPG | *.JPG";
  176. kayitPenceresi.InitialDirectory = "C:\\";
  177.  
  178. if (pctResim.BackgroundImage != null &amp;&amp; kayitPenceresi.ShowDialog() == DialogResult.OK)
  179. {
  180. // hem bir kayit edilebilecek resim var ise , hemde kayitpenceremizden bir dosya kayıt işlemi
  181. // için dosya ismi girilmişse o halde kayit işlemlerini yaptiralim
  182. Image kayitEdilecekResim = pctResim.BackgroundImage;
  183. kayitEdilecekResim.Save(kayitPenceresi.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
  184. }
  185. }
  186. }
  187. }

buraya kadar gelmişseniz, size benden bir şarkı => Yeni Türkü – Kalırsa Bir Soru