Fethi Polat 1
Fethi Polat
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
shrpnl 1
shrpnl
YusufŞimşek14 1
YusufŞimşek14
berzahx 2
berzahx
xranzei 1
xranzei
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cevaplanmadı SetInsideRender client src ekleme

  • Konuyu başlatan Konuyu başlatan odinogluthorr
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 5
  • Görüntüleme Görüntüleme 618

odinogluthorr

Level 4
TM Üye
Üye
Katılım
27 Şub 2024
Konular
108
Mesajlar
324
Çözüm
16
Online süresi
4mo 9d
Reaksiyon Skoru
53
Altın Konu
0
TM Yaşı
2 Yıl 3 Ay 16 Gün
Başarım Puanı
101
MmoLira
7,913
DevLira
12
Ticaret - 0%
0   0   0

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

İyi günler herkese auto sell sistemi için SetInsideRenden client src taraflı eklemem gerkiyor nasıl eklerim


Kod:
        renderWindow = CreateWindow(ui.Window(), resultBg, (2, 2), "", "", (resultBg.GetWidth() - 19, resultBg.GetHeight()-4))
        #renderWindow.SetInsideRender(True)
        renderWindow.AddFlag("not_pick")
        self.__children["renderWindow"] = renderWindow
 
Merhaba dostum, iyi günler. Sorduğun soru çok yerinde ve client ile uğraşan herkesin er ya da geç ihtiyaç duyduğu bir işlemi içeriyor: Python arayüzü için C++ tarafında yeni bir fonksiyon yaratmak.

Kodunda #renderWindow.#renderWindow.SetInsideRender(Trueum satırı olarak bırakman, bu fonksiyonun C++ tarafında tanımlı olmadığını ve eklemen gerektiğini doğru anladığını gösteriyor. Hadi birlikte ekleyelim.

Bu işlemi üç ana durakta tamamlayacağız:
* Fonksiyonumuzu C++'ın "kimlik kartı" olan header (.h) dosyasına tanıtacağız.
* Fonksiyonumuzun ne iş yapacağını C++ uygulama (.cpp) dosyasına yazacağız.
* Bu yeni fonksiyonu Python'a "tercüme eden" modüle kaydedeceğiz.


Birinci Durak: Header Dosyası (UserInterface/PythonWindow.h)


İlk olarak CWindow sınıfına yeni fonksiyonumuzu ve bu fonksiyonun durumunu tutacak bir değişkeni bildirmemiz gerekiyor. PythonWindow.h dosyasını aç ve CWindow sınıfının içine şu satırları ekle:

[CODE title="C++"]// class CWindow'un public bölümüne ekle:
public:
void SetInsideRender(bool bEnable);

// class CWindow'un protected veya private bölümüne ekle:
protected:
bool m_bInsideRender;[/CODE]

Şimdi de bu değişkenin bir başlangıç değeri olması için sınıfın kurucu fonksiyonuna (constructor) gidelim. PythonWindow.cpp dosyasında CWindow::CWindow() fonksiyonunu bul ve içine m_bInsideRender = false; satırını ekle.

İkinci Durak: CPP Dosyası (UserInterface/PythonWindow.cpp)


Şimdi fonksiyonumuzun ne iş yapacağını kodlayalım. SetInsideRender ismi, bu pencerenin içindeki nesnelerin, pencere dışına taşmadan render edilmesi (çizilmesi) gerektiğini ima ediyor. Bunu "Clipping" (Kırpma) ile yaparız.

Aşağıdaki kod bloğunu PythonWindow.cpp dosyasının en sonuna ekleyebilirsin:

[CODE title="C++"]void CWindow::SetInsideRender(bool bEnable)
{
m_bInsideRender = bEnable;
}[/CODE]

Bu fonksiyon sadece değişkeni ayarlıyor. Asıl işi, pencerenin çizildiği OnRender() fonksiyonunda yapacağız. CWindow::OnRender() fonksiyonunu bul ve içeriğini aşağıdaki gibi düzenle. Mantık şu: Eğer m_bInsideRender aktif ise, çizime başlamadan önce bir "kırpma dörtgeni" ayarla, çizim bitince de bu dörtgeni sıfırla ki diğer arayüz elemanları etkilenmesin.

[CODE title="C++"]void CWindow::OnRender()
{
// ... (Fonksiyonun başındaki diğer kodlar) ...

if (m_bInsideRender)
{
// Pencerenin global koordinatlarını alıyoruz
RECT& r = GetRect();
CPythonGraphic::Instance().SetClipRect(r.left, r.top, r.right, r.bottom);
}

// ... (Burada pencerenin alt nesnelerini çizen döngü veya kodlar olmalı) ...
// OnRenderChildren(); gibi bir fonksiyon olabilir, onun öncesine ve sonrasına eklenmeli.

for (auto* pWin : m_pChildList)
{
pWin->Render();
}
// ...

if (m_bInsideRender)
{
// Kırpmayı sıfırlıyoruz ki diğer pencereler normal çizilsin
CPythonGraphic::Instance().ResetClipRect();
}
}[/CODE]

Üçüncü ve Son Durak: Python'a Tanıtma (UserInterface/PythonApplicationModule.cpp)



Artık C++ tarafında çalışan bir fonksiyonumuz var. Son adım, Python'a "Bak, SetInsideRender diye yeni bir komut var, bunu kullanabilirsin" demek.

PythonApplicationModule.cpp (veya benzeri bir isimdeki) dosyayı aç. İçinde static PyMethodDef s_WindowMethods[] gibi bir dizi göreceksin. Bu dizi, Python'da ui.Window() nesnesiyle kullanılabilecek tüm fonksiyonları listeler. Oraya bizimkini de ekleyeceğiz:

* Önce s_WindowMethods dizisine yeni fonksiyonumuzu ekleyelim:

[CODE title="C++"]// ... mevcut fonksiyonlar ...
{ "SetInsideRender", windowSetInsideRender, METH_VARARGS },
// ...[/CODE]

Şimdi de Python'dan çağrıldığında çalışacak olan C++ köprü fonksiyonunu yazalım. Bu fonksiyonu dosyanın üst kısımlarındaki diğer window... fonksiyonlarının yanına ekleyebilirsin:

[CODE title="C++"]PyObject* windowSetInsideRender(PyObject* poSelf, PyObject* poArgs)
{
UI::CWindow* pWindow;
if (!PyTuple_GetWindowPointer(poArgs, 0, &pWindow))
return Py_BuildException();

bool bEnable;
if (!PyTuple_GetBoolean(poArgs, 1, &bEnable))
return Py_BuildException();

pWindow->SetInsideRender(bEnable);
return Py_BuildNone();
}[/CODE]

Not: PyTuple_GetWindowPointer fonksiyonunun adı senin kaynak kodunda farklı olabilir. PyTuple_Get ile başlayan diğer fonksiyonlara bakarak doğru ismi bulabilirsin.
Bu üç adımı tamamlayıp client'ını yeniden derlediğinde (compile), Python kodundaki #renderWindow.SetInsideRender(True) satırının başındaki # işaretini kaldırabilirsin ve sihir gerçekleşir!

Umarım yardımcı olmuştur. Kolay gelsin!
#renderWindow.SetInsideRender(True
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst