Merhaba,
"Textbox" niteliğinde bir nesne düşünün, örneğin:
class MetinKutusu { ... }
Buna öyle nitelikli üyeler verelim ki ekranda etkin olduğu zaman (üzerine tıklanıp fare imleçi yanıp söndüğünde), klavyenin basılan her tuşunu ''wchar''[] metin;'' dizisinde depolasın. Tabi basılan tuşları yakalama, kodunu varsayılan klavye düzenine göre UTF harfle eşleştirme, imleçin yanıp sönmesi ve harflerin sırayla metin kutusu sınırları içerisinde görünmesi, alt satıra kayması gibi görsel nitelikli işlemlerin halihazırda olduğunu varsayıyoruz...
İşimiz kolay görünüyor...:)
Peki standart, olması gereken üye değişkenleri aşağıdaki gibiyse, sizce başka nelere ihtiyaç var? Örneğin bir kaç kB. geçmişi tutan ve baştaki elemandan eksilerek azalan bir önbellekleme yığınına (buffer stack) duyabiliriz sanki...
size_t kimlik_id;
static kilitlenen_lockId; // etkin olan
uint soldan_x, yukardan_y;
uint en_w, boy_h;
wchar[] metin;
Sanırım bu kadar basit değil!
Çünkü klavyemiz, bilgisayarımızın fare tuşları gibi basılıp bırakılana kadar (herhangi bir süre) tekrar yapmadan beklemez. O yüzden akıllıca çalışan bir zamanlayıcı ve önbellek yığınına ihtiyaç var. Belli bir sürede (type rate and delay) karakter tekrarı olduğu için, yığının başından (FIFO) ve zamanlayıcının denetiminde klavye karakterleri nesneye yazılmalı.
Meğer çatı yazmak ne zormuş! O yüzden hala mütevazi bir aşamadayım (sdlMİNİ) ve belki bir gün eksiksiz GUI çatısı meydana getirebiliriz. Henüz bu konuda bir çözüm bulamadım...:(
Küçük bir deneme yaptım da başlangıç fena değil ama yardıma ihtiyacım var...
Alıntı:
> import sdlmini2, std.stdio;
>
> struct BoşKutu {
> size_t kimlik;
> bool etkin_Mi;
> int x, y, boy;
> static int en = 170;
> clr renk;
>
> this(int solAlttanX, int solAlttanY) {
> this.x = solAlttanX;
> this.y = solAlttanY;
> this.renk = clr.red;
> this.boy = 140;
> }
>
> void durumuEvir() {
> if(etkin_Mi) {
> etkin_Mi = false;
> renk = clr.red;
> } else {
> etkin_Mi = true;
> renk = clr.gray;
> }
> }
>
> bool üstünde_Mi(int mouseX, int mouseY) {
> int en = this.x + this.en;
> int boy = this.y - this.boy;
>
> return (this.x < mouseX && this.y > mouseY &&
> en > mouseX && boy < mouseY);
> }
> }
>
> void main() {
> BoşKutu[3] kutular;
>
> with( new scene(600, 200, "Etkin Kutu Denemesi", clr.white) ) {
>
> // 3 ayrı kutumuz yan yana kurulur...
>
> foreach(int i, ref kutu; kutular) {
> int ötele = (25 + kutu.en) * i;
> kutu = BoşKutu(20 + ötele, h - 20);
> kutu.kimlik = 100 + i;
> }
>
> do {
>
> SDL_Clear();
>
> foreach(i, ref kutu; kutular) {
>
> /* sırayla tüm kutular, fare imleç ile
> * etkileşip etkileşmediği denetlenir:
> */
>
> if(sonBasılanDüğme == SDL_BUTTON_LEFT
> && kutu.üstünde_Mi(xMouse, yMouse)
> && !birNesneyeKilitlendi) {
>
> birNesneyeKilitlendi = true; // sdl2mini.scene üyesi
>
> /* etkin olan kutular ekrana yazılır...
> * DİKKAT: Bu yöntemde birden fazla kutu etkin!
> */
>
> kutu.durumuEvir();
> kutu.kimlik.write(". kutu etkin");
> if(!kutu.etkin_Mi) writeln(" değil!");
> else writeln("...");
> }
>
> /* Henüz kutular ekrana yansıtılmadan evvel
> * GPU belleğine son durumları yazılır...
> */
>
> rectangle(kutu.x, kutu.y,
> kutu.x + kutu.en,
> kutu.y - kutu.boy, kutu.renk);
> }
>
> SDL_Flip(scr);
>
> } while( checkEvents() );
> }
> SDL_Quit();
> } /* sdlmini2.scene'deki yardımcı işlevler:
> void rectangle(int x0, int y0,
> int x1, int y1, clr c=clr.white) {
> line(x0, y0, x1, y0, c);
> line(x1, y0, x1, y1, c);
> line(x1, y1, x0, y1, c);
> line(x0, y1, x0, y0, c);
> }
>
> bool checkEvents() {
> bool continueLoop = true;
> SDL_PollEvent(&event);
>
> if(!keyEventControl() ||
> !mouseEventControl())
> {
> continueLoop = false;
> }
>
> return continueLoop;
> }
> //*/
>
> ```
>
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]