BlackFullMoon 1
BlackFullMoon
Mt2Hizmet 1
Mt2Hizmet
mavzermete 1
mavzermete
Hikaye Ekle

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 628

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 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 : 2, Üye: 0, Misafir: 2)

Geri
Üst