C++ İLE NESNELERİ HAREKET ETTİRME

C++ Programlama dili ile Windows form uygulamaları. DEV C++ ile yazılmış nesneleri hareket ettirme. Windows form üzerindeki iki topu hareket ettiren program. Konu anlatımı ve tam kodlar.


Bu derste C++ ile bir Windows form uygulaması oluşturacağız ve bu uygulamada forma iki resim yerleştirip bu resimleri Timer ile hareket ettireceğiz.


Resimleri ekrana bitmap nesnesini kullanarak yerleştirmeyeceğiz. Bir label etiketini resim kutusu haline getirip bu labeli hareket ettireceğiz. İsterseniz sadece bitmap resmini ekrana basarak bu resmi hareket ettirebilirsiniz. 

Uygulamada iki resim, iki button bulunuyor. Buttonların biri resimleri hareket ettirirken, diğeri durduruyor.

Uygulamayı yapmak için önce bir klasör oluşturun. DEV C++ ile bir Windows form projesi oluşturarak bu klasöre kaydedin, ardından kaynak kodları yazacağınız sayfayı da bu klasöre kaydedin. Daha sonra 60x60 piksel boyutlarında iki bitmap resmini bu klasöre kopyalayın. Buradaki kodları kaynak dosyanıza yazın. Programı derlemeden önce "Project" menüsünden "Project Options" seçeneğini tıklayarak General sekmesinde alt kısımdaki "Types" seçeneğini "Win32 GUI" olarak değiştirin.


Cplus_motion1

Programı derleyip çalıştırabilirsiniz. Program kodları hakkında aşağıda biraz bilgi verdik. Button, picturebox gibi nesnelerin nasıl oluşturulacağı hakkında daha önce ayrıntılı bilgi verdiğimizden burada onlara değinmeyeceğiz.


Timer Kullanımı

Kullacağımız timere bir id vermemiz gerek. Ayrıca Timerin ne kadar bekleyeceğini de belirtmeliyiz. Bu değerler aşağıdaki şekilde tanımlanıyor.

const UINT Timex1 = 1;

UINT waitms = 1;

Buttona tıkladığımızda Timere Start komutunu aşağıdaki şekilde veriyoruz.

SetTimer(datahw, Timex1, waitms, NULL);

Bu komuttaki “datahw” global değişken olarak tanımladığımız “HWND” nesnesi. Timex1, timerin ID’si, waitms, timerin bekleme süresi.

Timeri durdurmak için aşağıdaki kodları kullanıyoruz.

KillTimer(hwnd, Timex1);

Pictureboxların koordinatlarını değiştirmek için aşağıdaki kodları kullanıyoruz. 

SetWindowPos(PictureBox1, NULL, left1, top1, 60, 60, 0);

Yukarıdaki komutta Picturebox1 konumu ayarlanacak olan form elemanı, left1 Picturebox’un sol koordinatını, top1 üst koordinatı, 60, 60 değerleri kutunun büyüklüğünü belirtir. Yani istersek pictureboxların büyüklüğünü de değiştirebiliriz.

Programda temel mantık kullanıcı “BAŞLAT” buttonuna bastığında program önce ekran çözünürlüğünü alacak. Ekran çözünürlüğünün aşağıdaki kodlar alıyor.

GetClientRect(datahw, &rex);

Burada datahw, HWND nesnesidir. Rex, bir global değişkendir. Ekran koordinatlarını kendisinde tutmaktadır. Ekranın sağ ve alt uçları çözünürlük değerlerini verir. Aşağıdaki kod genişliği vermektedir.

LONG p2=rex.right;

Ekran yüksekliğini almak isterseniz,

LONG p2=rex.bottom;

Kullanmalısınız.

Movie1 değişkeni resim ekranın sağ veya sol kenarına vardığında değişir, böylece fonksiyonun değişmesini sağlar. Fonksiyonların biri ileri diğeri geri hareket ettirmektedir. Tabii her resmi zıt yönde.

void HareketFnc()

{

 SetWindowPos(PictureBox1, NULL, left1, top1, 60, 60, 0);

 SetWindowPos(PictureBox2, NULL, left2, top2, 60, 60, 0);

 if(movie1==1)

 {

  HareketFnc2();

 }

 if(movie1==0)

 {

  HareketFnc3();

 }

}


Left3 değişkeni siz Timeri durdurup yeniden başlattığınızda Picturebox2 nin koordinatını kendisinde tutmaktadır. Speed değişkenini 1 yaparsanız 1 birim, 2 yaparsanız 2 birim, 5 yaparsanız 5 birim öteler. Yani hızı ayarlar.

Diğerlerini anlarsınız herhalde kolay gelsin.


Tüm kodlar.

#include <windows.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <sstream>

#define BUTTON_SW 3
#define BUTTON_SW2 4
#define PCTRBOX1 401
#define PCTRBOX2 402

static HINSTANCE g_hInst = NULL;
const UINT Timex1 = 1;
UINT waitms = 1;

BITMAP bmp1;
HWND PictureBox1;
HWND PictureBox2;
HBITMAP bitmap1;
HBITMAP bitmap2;
HWND Button1;
HWND Button2;
HWND datahw;
RECT rex;

using namespace std;
void Islem();
void HareketFnc();
void HareketFnc2();
void HareketFnc3();
void Durdur();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

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);
 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, 10, 80, 60, 60, hwnd, HMENU(PCTRBOX2), hInstance, NULL);
 SendMessage(PictureBox1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap1);
 SendMessage(PictureBox2, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap2);

 Button1 = CreateWindow("button", "BAŞLAT", WS_VISIBLE | WS_CHILD, 60, 250, 100, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);
 Button2 = CreateWindow("button", "DURDUR", WS_VISIBLE | WS_CHILD, 180, 250, 100, 25, hwnd, HMENU(BUTTON_SW2), NULL, NULL);

 //Bizim global kullanacağımız HWND nesnesini tanımlıyoruz.
 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:
   Islem();
   break;
   case BUTTON_SW2:
   Durdur();
   break;
   
  }
      case WM_TIMER:
       //Timer bu fonksiyonu çağıracak
       HareketFnc();
  
      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;
}
int left1=10;
int top1=10;
int left2=0;
int left3=0;
int top2=80;
LONG crdnt=0;
int movie1=1;
int movie2=0;
int speed=2;
void Islem()
{
 //Ekran koordinatlarını al
  GetClientRect(datahw, &rex);
  LONG p2=rex.right;
  crdnt=rex.right;
  p2=p2-80;
  if(left3==0)
  {
   left2=p2;
  }
  else
  {
   left2=left3;
  }
  //Resimlerin koordinatlarını başlangıç noktalarına getir
 SetWindowPos(PictureBox1, NULL, 10, 10, 60, 60, 0);
 SetWindowPos(PictureBox2, NULL, left2, 80, 60, 60, 0);
 //Timeri başlat
 SetTimer(datahw, Timex1, waitms, NULL);
}
void HareketFnc()
{
 //Resimlerin koordinatlarını değiştir
 SetWindowPos(PictureBox1, NULL, left1, top1, 60, 60, 0);
 SetWindowPos(PictureBox2, NULL, left2, top2, 60, 60, 0);
 if(movie1==1)
 {
  //movie 1 değişkeni sadece resimler ekran kenarlarına ulaşınca değişir
  HareketFnc2();
 }
 if(movie1==0)
 {
  HareketFnc3();
 }
}
void HareketFnc2()
{
 //Picturebox1 in ileri, picturebox2 nin geri gitmesi için
 left1=left1+speed;
 left2=left2-speed;
 left3=left2;
 if(left1>crdnt-60)
 {
  //Resimler ekran kenarlarına ulaşıncaya kadar bu fonksiyon çalışmalı
  movie1=0;
 }
}
void HareketFnc3()
{
 //Picturebox1 in geri, picturebox2 nin ileri gitmesi için
 left1=left1-speed;
 left2=left2+speed;
 left3=left2;
 if(left1<1)
 {
  //Resimler ekran kenarına ulaşıncaya kadar bu fonksiyon çalışmalı
  movie1=1;
 }
}
void Durdur()
{
   KillTimer(datahw, Timex1);
         
}


C++ Çoklu Button, TextBox ve Label Oluşturma

C++ İle Tablo Yapımı


SANATSAL BİLGİ

30/03/2019

  • YORUM YAZ
  • ADI SOYADI(veya nick)
  • YORUM


COPYRIGHT© HER HAKKI SAKLIDIR
Sitede Yer Alan Bilgi Belge Ve Materyallerin İzinsiz olarak Kopyalanması ve Alıntılanması Yasaktır

SANATSAL BILGI