C++ İLE MOUSE HAREKETİ
C++ ile forma resim eklemek ve fareyi kendi kendine resimlerin üzerine hareket ettirmek. Fareyi kendi kendine metin kutusuna götürmek ve metin kutusuna yazı yazdırmak.
Evet, başlıkta ve alt başlıkta okuduklarınız C++ diline hakim olmayanlara fantastik gelebilir. Bu tür yazıları ülkemizde C++ ile ilgili yeterli doküman olmadığını gördüğümde yazmaya karar verdim. Daha önce, form oluşturma, forma resim, textbox ve combobox ekleme, resmi hareket ettirme ile ilgili yazılar yazmıştım. Şimdiki uygulama biraz daha fantastik. Bu arada uygulamayı DEV C++ ile yazdığımı da belirteyim.
Bu uygulamada 4 tane resim, 1 tane textbox (metin kutusu = EditText), 1 tane timer ve 5 tane button olacak.
1. buttona tıkladığımızda fare 1. Resmin üzerine gidecek ve üzerinde duracak.
2. buttona tıkladığımıza fare 2. Resmin üzerine gidecek ve üzerinde duracak.
3. buttona tıkladığımızda fare 3. Resmin üzerine gidecek ve üzerinde duracak.
4. buttona tıkladığımızda fare 4. Resmin üzerine gidecek ve üzerinde duracak.
5. buttona tıkladığımızda fare metin kutusunun üzerine gidecek ve metin kutusuna gidince kutuya focuslanacak, daha sonra metin kutusunda bir yazı belirecek hemen ardından bu yazı okunarak bir mesaj penceresi ile gösterilecek.

Uygulamada 12 fonksiyon 1 timer çalışacak. Bu uygulamada aynı zamanda fonksiyonlar arasında bir haberleşme sistemi olacak. Örneğin, 1. Button, NesneKod adlı değişkeni 1 yapacak ve timeri çalıştıracak, Timer, İşlem() fonksiyonuna bağlı olduğundan bu fonksiyonu çağıracak, İşlem fonksiyonu NesneKod adlı değişkenin değerini kontrol edecek ve bu değere göre hangi buttonun tıklanmış olduğunu anlayacak. Ardından fareyi ilgili nesnenin üzerine hareket ettirmeye başlayacak. Fare hedef koordinatlara ulaşınca timeri durduracak.
Oldukça sistematik yazılan bu programı anlamaya çalışıp kendiniz denemeler yaparsanız, algoritmanızı çok çok geliştirebilirsiniz.
Farenin resimlere konumlanma biçimi ise ayrı bir algoritma kurgusu. Özetle yapılmaya çalışılan şey fareyi ekranın üstünden, altından, sağından ve solundan belli mesafelerde tutmak Bu mesafeler, resmin alanı içindeki koordinatlardır.
C++ ya fazla aşina olmayanlara tavsiyemiz, önce masaüstünde veya bir sürücüde bir klasör oluşturun. Daha sonra bu klasöre iki adet bitmap resmi koyun, boyutları 60x60 olsun. Bitmap resimlerinden birinin adı top1, diğerinin adı top2 olsun. Bundan sonra DEV C++ ile bu klasörde boş bir proje oluşturun. Project optionsta uygulama tipini Win32 GUI seçin (consol penceresi çıkmaması için).
Daha sonra buraya yazdığımız kodları kaynak sayfanıza kopyalayın ve çalıştırın. Daha sonra kodlar üzerinde oynamalar ve değişiklikler yaparak uygulamaya hakim olmaya çalışın.
Kolay gelsin.
#include <windows.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <sstream>
#include<Math.h>
#define BUTTON_SW 3
#define BUTTON_SW2 4
#define BUTTON_SW3 5
#define BUTTON_SW4 6
#define BUTTON_SW5 7
#define PCTRBOX1 401
#define PCTRBOX2 402
#define PCTRBOX3 403
#define PCTRBOX4 404
#define TXTBX1 501
static HINSTANCE g_hInst = NULL;
//Timer ID'si ve bekleme süresi
const UINT Timex1 = 1;
UINT waitms = 5;
//Form Elemanları ve veri taşıyıcılar
BITMAP bmp1;
HWND PictureBox1;
HWND PictureBox2;
HWND PictureBox3;
HWND PictureBox4;
HWND TextBox1;
HBITMAP bitmap1;
HBITMAP bitmap2;
HWND Button1;
HWND Button2;
HWND Button3;
HWND Button4;
HWND Button5;
HWND datahw;
RECT rex;
//Çalıştırılacak Fonksiyonlar
void Button1_Click();
void Button2_Click();
void Button3_Click();
void Button4_Click();
void Button5_Click();
void Islem();
void HareketFnc();
void HareketFnc2();
void HareketFnc3();
void HareketFnc4();
void HareketFnc5();
void DynamicWriter();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
using namespace std;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX winc;
HWND hwnd;
MSG msg;
memset(&winc,0,sizeof(winc));
winc.cbSize = sizeof(WNDCLASSEX);
winc.lpfnWndProc = WndProc;
winc.hInstance = hInstance;
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)(COLOR_3DHILIGHT+9);
winc.lpszClassName = "WindowClass";
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&winc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","SANATSAL ANIMASYON",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WS_MAXIMIZE,
WS_MAXIMIZE,
NULL,NULL,hInstance,NULL);
//Resim, label, button oluşturma alanı
bitmap1 = (HBITMAP)LoadImage(GetModuleHandle(NULL), "top1.bmp", IMAGE_BITMAP, 60, 60, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
bitmap2 = (HBITMAP)LoadImage(GetModuleHandle(NULL), "top2.bmp", IMAGE_BITMAP, 60, 60, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
int H = GetSystemMetrics(SM_CYSCREEN);
int W = GetSystemMetrics(SM_CXSCREEN);
GetClientRect(datahw, &rex);
PictureBox1 = CreateWindow("static", "picturebox", WS_CHILD | WS_VISIBLE | SS_BITMAP, 10, 10, 60, 60, hwnd, HMENU(PCTRBOX1), hInstance, NULL);
PictureBox2 = CreateWindow("static", "picturebox", WS_CHILD | WS_VISIBLE | SS_BITMAP, W-75, 10, 60, 60, hwnd, HMENU(PCTRBOX2), hInstance, NULL);
PictureBox3 = CreateWindow("static", "picturebox", WS_CHILD | WS_VISIBLE | SS_BITMAP, 10, H-175, 60, 60, hwnd, HMENU(PCTRBOX3), hInstance, NULL);
PictureBox4 = CreateWindow("static", "picturebox", WS_CHILD | WS_VISIBLE | SS_BITMAP, W-75, H-175, 60, 60, hwnd, HMENU(PCTRBOX4), hInstance, NULL);
TextBox1 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, W/4, 10, 220,
25, hwnd, HMENU(TXTBX1), NULL, NULL);
SendMessage(PictureBox1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap1);
SendMessage(PictureBox2, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap2);
SendMessage(PictureBox3, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap1);
SendMessage(PictureBox4, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap2);
Button1 = CreateWindow("button", "RESIM1", WS_VISIBLE | WS_CHILD, 60, 250, 100, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);
Button2 = CreateWindow("button", "RESIM2", WS_VISIBLE | WS_CHILD, 60, 310, 100, 25, hwnd, HMENU(BUTTON_SW2), NULL, NULL);
Button3 = CreateWindow("button", "RESIM3", WS_VISIBLE | WS_CHILD, 60, 360, 100, 25, hwnd, HMENU(BUTTON_SW3), NULL, NULL);
Button4 = CreateWindow("button", "RESIM4", WS_VISIBLE | WS_CHILD, 60, 410, 100, 25, hwnd, HMENU(BUTTON_SW4), NULL, NULL);
Button5 = CreateWindow("button", "METIN", WS_VISIBLE | WS_CHILD, 60, 460, 100, 25, hwnd, HMENU(BUTTON_SW5), NULL, NULL);
datahw=hwnd;
if(hwnd == NULL)
{
MessageBox(0, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_COMMAND:
switch(wParam)
{
case BUTTON_SW:
Button1_Click();
break;
case BUTTON_SW2:
Button2_Click();
break;
case BUTTON_SW3:
Button3_Click();
break;
case BUTTON_SW4:
Button4_Click();
break;
case BUTTON_SW5:
Button5_Click();
break;
}
case WM_TIMER:
//Timer bu fonksiyonu çağıracak
Islem();
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
KillTimer(hwnd, Timex1);
DeleteObject(bitmap1);
DeleteObject(bitmap2);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
POINT cp;
double Mx1=0;
double My1=0;
int NesneKod=0;
int NesneKod2=0;
LONG clientX=0;
LONG clientY=0;
void Button1_Click()
{
NesneKod=1;
SetTimer(datahw, Timex1, waitms, NULL);
}
void Button2_Click()
{
NesneKod=2;
SetTimer(datahw, Timex1, waitms, NULL);
}
void Button3_Click()
{
NesneKod=3;
SetTimer(datahw, Timex1, waitms, NULL);
}
void Button4_Click()
{
NesneKod=4;
SetTimer(datahw, Timex1, waitms, NULL);
}
void Button5_Click()
{
NesneKod=5;
NesneKod2=0;
SetTimer(datahw, Timex1, waitms, NULL);
}
void Islem()
{
if(NesneKod==1)
{
HareketFnc();
}
if(NesneKod==2)
{
HareketFnc2();
}
if(NesneKod==3)
{
HareketFnc3();
}
if(NesneKod==4)
{
HareketFnc4();
}
if(NesneKod==5)
{
HareketFnc5();
}
}
void HareketFnc()
{
GetClientRect(datahw, &rex);
clientX=rex.left;
clientY=rex.top;
GetCursorPos(&cp);
Mx1=cp.x;
My1=cp.y;
if(Mx1>clientX+50)
{
Mx1--;
}
if(Mx1<clientX+50)
{
Mx1++;
}
if(My1<clientY+50)
{
My1++;
}
if(My1>clientY+50)
{
My1--;
}
SetCursorPos(Mx1, My1);
if((Mx1>20&&Mx1<60)&&(My1>49&&My1<70))
{
KillTimer(datahw, Timex1);
SetFocus(PictureBox1);
}
}
int T1=0;
int T2 =0;
int T3=0;
int T4=0;
void HareketFnc2()
{
GetClientRect(datahw, &rex);
clientX=rex.right;
clientY=rex.bottom;
GetCursorPos(&cp);
Mx1=cp.x;
My1=cp.y;
if(Mx1>clientX-30)
{
Mx1--;
}
if(Mx1<clientX-30)
{
Mx1++;
}
if(My1<55)
{
My1++;
}
if(My1>55)
{
My1--;
}
SetCursorPos(Mx1, My1);
T1=rex.right-30;
T2 = rex.right-40;
if((Mx1>T2&&Mx1<T1)&&(My1>49&&My1<60))
{
KillTimer(datahw, Timex1);
SetFocus(PictureBox2);
}
}
void HareketFnc3()
{
GetClientRect(datahw, &rex);
clientX=rex.left;
clientY=rex.bottom;
GetCursorPos(&cp);
Mx1=cp.x;
My1=cp.y;
if(Mx1>clientX+50)
{
Mx1--;
}
if(Mx1<clientX+50)
{
Mx1++;
}
if(My1<clientY-110)
{
My1++;
}
if(My1>clientY-110)
{
My1--;
}
SetCursorPos(Mx1, My1);
T2=rex.bottom-150;
T1=rex.bottom-105;
if((Mx1<51&&Mx1>30)&&(My1>T2&&My1<T1))
{
KillTimer(datahw, Timex1);
SetFocus(PictureBox3);
}
}
void HareketFnc4()
{
GetClientRect(datahw, &rex);
clientX=rex.right;
clientY=rex.bottom;
GetCursorPos(&cp);
Mx1=cp.x;
My1=cp.y;
if(Mx1>clientX-20)
{
Mx1--;
}
if(Mx1<clientX-20)
{
Mx1++;
}
if(My1<clientY-110)
{
My1++;
}
if(My1>clientY-110)
{
My1--;
}
SetCursorPos(Mx1, My1);
T1=rex.right-40;
T2=rex.bottom-150;
if((Mx1>T1&&Mx1<T1+21)&&(My1>T2&&My1<T2+45))
{
KillTimer(datahw, Timex1);
SetFocus(PictureBox4);
}
}
void HareketFnc5()
{
GetClientRect(datahw, &rex);
clientX=rex.right;
clientY=rex.top;
GetCursorPos(&cp);
Mx1=cp.x;
My1=cp.y;
if(Mx1>(clientX/4)+30)
{
Mx1--;
}
if(Mx1<(clientX/4)+30)
{
Mx1++;
}
if(My1<clientY+50)
{
My1++;
}
if(My1>clientY+50)
{
My1--;
}
SetCursorPos(Mx1, My1);
T1=(rex.right/4) + 21;
T2=(rex.right/4)+60;
T3=rex.top+49;
T4=rex.top+51;
if((Mx1>T1)&&(Mx1<T2)&&(My1>T3&&My1<T4))
{
KillTimer(datahw, Timex1);
SetFocus(TextBox1);
DynamicWriter();
}
}
void DynamicWriter()
{
if(NesneKod2!=1)
{
NesneKod2=1;
string tekst="SANATSAL BİLGİ";
const char *Txt1="SANATSAL BİLGİ";
SetWindowText(TextBox1,Txt1);
char data[64];
int txtlength;
txtlength=GetWindowTextLength(TextBox1) + 1;
GetWindowText(TextBox1,data,txtlength);
MessageBox(0, data,"I'm AN AI",MB_ICONINFORMATION);
}
}
C++ İle Nesneleri Hareket Ettirmek
SANATSAL BİLGİ
27/04/2019