"Unit1.cpp" Dosyası

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Büyüteç programı ekranın tamamını kullanarak yapılan kopyalama tekniklerini
göstermesi açısından iyi bir örnektir. Programınızın dışında bulunan masaüstü
alanına nasıl müdahale edileceğini, bu alanın bir kısmının veya tamamının
hafızada bir değişkene nasıl kopyalanacağını ve yine bu değişkenin içindeki
görüntünün tekrar form'a veya ekranın başka bir noktasına ne şekilde
kopyalanacağını açık ve anlaşılır bir şekilde göstermektedir.
Kopyalama işlemlerinin tamamı API fonksiyonları kullanılarak yapılmıştır.
Program kodları tarafımdan yazılmış olup, Herhangi bir yerden alıntı değildir.
Ayrıca hemen her satırda kodların açıklamaları anlaşılır bir lisanla yapılmıştır.
Değişkenlerde bile anlaşılır isimler kullanmaya çalıştım...
-----------------------------------------------------------------------------------------
Kullanılan Api Fonksiyonları Aşağıda Gösterilmiştir.
-----------------------------------------------------------------------------------------
GetDC;
CreateCompatibleDC;
CreateCompatibleBitmap;
SelectObject;
StretchBlt;
BitBlt;
GetCursorPos;
ReleaseDC;
-----------------------------------------------------------------------------------------
Program : Taner Kocaova Mak. Müh.
e-mail : tanerkocaova@tekniktesisat.org
Tarih : 26 Mayıs 2003
-----------------------------------------------------------------------------------------

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
Form1->ScaleBy(Screen->Width, Screen->Height);

//Resmi kopyalayabilmek için TCanvas cinsinden
//başlık dosyasında tanımlanmış değişken oluşturuluyor.
MasaUstuCanvas = new TCanvas();

//Masa üstünün fotoğrafı dosyaya kaydedilmek istenirse
//aşağıdaki kodlar gerekli olacaktır.
KayitEdilecekResim = new TImage(this);
KayitEdilecekResim->Picture->Bitmap->Width = Screen->Width;
KayitEdilecekResim->Picture->Bitmap->Height = Screen->Height;

//Masa üstü ile işlem yapabilmek için GetDC fonksiyonu
//ile masa üstünün handle numarası çizim yapmak için
//hafızada oluşturduğumuz değişkene atanıyor.
MasaUstuCanvas->Handle = ::GetDC(0);
//veya aşağıdaki şekilde de kullanabilirsiniz.
//MasaUstuCanvas->Handle = ::GetDC(GetDesktopWindow());

//HDC tipinde tanımlanmış değişkenden "CreateCompatibleDC"
//fonksiyonu kullanılarak masa üstü ile uyumlu çizim
//yapılabilecek bir memory device context (DC) yaratılıyor.
MemoryDC = ::CreateCompatibleDC(MasaUstuCanvas->Handle);

//Masa üstü ile uyumlu bir Bitmap yaratmak için
//"HBITMAP" tipinde tanımlanan değişkenden, "CreateCompatibleBitmap"
//fonksiyonu kullanılarak yürürlükteki DC ile uyumlu bir bitmap yaratılıyor.
ResimBmp = ::CreateCompatibleBitmap(MasaUstuCanvas->Handle,
Screen->Width, Screen->Height);

//Bitmap yeni oluşturulan DC'ye seçiliyor.
//Böylece masaüstü görüntüleri "MemoryDC" değişkeninin
//içine hafızada kopyalanabilecektir.
::SelectObject(MemoryDC, ResimBmp);

//Ve API fonksiyonları kullanılarak masa üstünün bir bölümü
//hafızada "MemoryDC" değişkenine çizdiriliyor.
//Burada önemli olan çizimin tamamen hafızada
//gerçekleştiriliyor olmasıdır. Daha sonra ekrana basılacak
//bitmaplerin nasıl hızlı bir şekilde kopyalanacağı ve ekran
//titremelerinin önüne nasıl önleneceği anlatırken bu konuya tekrar döneceğim.
::StretchBlt(MemoryDC,
0, 0, Screen->Width, Screen->Height,
MasaUstuCanvas->Handle,
0, 0, Screen->Width, Screen->Height, SRCCOPY);

//"MemoryDC" değişkeni içinde saklanan masaüstü görüntüsünü
//bir dosyaya da kaydedebiliriz. Bu iki ayrı işlevi birlikte
//yapmak ile olanaklıdır. Önce görüntüyü "TImage" tipinde
//tanımlanmış bir değişkene hafızada kopyalayıp sonra dosyaya kaydetmek...
//Resmin boyutunda değişiklik yapılmayacak ise "BitBlt"
//Api fonksiyonu kullanılabilir.
::BitBlt(KayitEdilecekResim->Picture->Bitmap->Canvas->Handle,
0, 0, Screen->Width, Screen->Height,MemoryDC, 0, 0, SRCCOPY);

//Çalışılan dizinde dosya oluşturuluyor.
KayitEdilecekResim->Picture->SaveToFile("Foto.bmp");

}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//"FormCreate" olayında yaratılan dongüden çıkmak
//için değişkene "1" değeri atanıyor.
Form1->Tag = 1;

//değişkenler hafızadan atılıyor.
delete MasaUstuCanvas;
delete KayitEdilecekResim;
delete ResimBmp;
::ReleaseDC(GetDesktopWindow(), MemoryDC);

}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{

//Değişkene başlangıçta "0" değeri atanıyor.
//Böylece aşağıdaki döngü başlayacaktır.
//Formu başlangıçta göstermezseniz "FormCreate" olayı
//tamamlanmadan form ekranda görünmeyeceğinden
//program çalışmaz. Aşağıdaki döngü söz konusu
//olayın tamamlanmasını önlemektedir.

Form1->Tag = 0;
Form1->Show();

//Aşağıdaki dongü değişken "1" değerini alana
//kadar devam edecektir.
while(Form1->Tag == 0)
{
Application->ProcessMessages();

//Değişken "1" değerini aldı ise döngüden çık.
if (Form1->Tag == 1)
break;

//Farenin ektandaki koordinatları alınıyor.
::GetCursorPos(&Koordinatlar);
//Alınan koordinatlar fere ile formu taşıyabilmek
//için formun sol üst köşesi ile ilişkilendiriliyor.
//Artık form farenin ucuna bağlanmış durumdadır ve
//onu ekranda istediğiniz noktaya götürebilirsiniz.
Form1->Left = Koordinatlar.x - (Form1->Width - 5);
Form1->Top = Koordinatlar.y - (Form1->Height - 5);

//Masa üstünün saklandığı değişken tekrar API fonksiyonları
//kullanılarak Formumuza kopyalanıyor. Artık kopyalama işlemi
//hafızada değil ekrana yani Forma yapılmaktadır.
//İstenirse aşağıda yapıldığı görüntü büyütülüp küçültülebilir.
//Burada resim kopyalanırken %100 oranında büyütülmüştür.
::StretchBlt(Form1->Canvas->Handle,-20, -50,
(Form1->ClientWidth*2), (Form1->ClientHeight*2),
MemoryDC, Form1->Left, Form1->Top, Form1->ClientWidth,
Form1->ClientHeight, KopyalamaModu1);

Form1->Canvas->Refresh();
}

//"break" ile dongü dışına çıkıldı ise değişken
//"1" değerini almıştır. Uygulama kapatılıyor.
if (Form1->Tag == 1)
Application->Terminate();

}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{

//"Escape" tuşuna basarsanız program sona erer.
//Çünkü "FormCreate" olayında başlangıç değerini
//"0" verip başlattığımız döngü artık devam etmez.
if (Key == VK_ESCAPE)
Form1->Tag = 1;

}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::FormDeactivate(TObject *Sender)
{

Form1->Tag = 1;

}
//---------------------------------------------------------------------------

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

"Unit1.h" Dosyası

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
#include

#define KopyalamaModu1 cmMergeCopy
#define KopyalamaModu2 cmWhiteness
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TPanel *Panel2;
TPanel *Panel3;
TPanel *Panel4;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormKeyPress(TObject *Sender, char &Key);
void __fastcall FormDeactivate(TObject *Sender);
__fastcall TForm1(TComponent* Owner);

private: // User declarations
HDC MemoryDC;
HBITMAP ResimBmp;
TCanvas *MasaUstuCanvas;
TPoint Ekran;
TPoint Koor;
TImage *KayitEdilecekResim;
POINT Koordinatlar;

public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

PROGRAMIN EKRAN GÖRÜNTÜSÜ

<<< Geri Dön