guclusat

Tanınmış Üye
Süper Moderatör
8SG06.webp

Biliyorsunuz ki her objenin contextmenu veya right click eventi yok. Dolayısıyla bu objelere popup menü (sağ tık menü) yapamıyorduk. Memory plugini bu noktada bize yardımcı oluyor. Kodlarımızı inceleyelim.

Öncelikle Global Functions kısmına kodlarımızı yazıyoruz ;
Kod:
WM_LBUTTONDOWN = 513
WM_LBUTTONUP = 514
WM_RBUTTONDOWN = 516

function SelectItem(hWnd,  wParam, lParam)
LeftButtonDown(hWnd,  wParam, lParam)
LeftButtonUp(hWnd,  wParam, lParam)
end

function LeftButtonUp(hWnd,  wParam, lParam)
va_args = string.format("%d,%d,%d,%d",hWnd, WM_LBUTTONUP, wParam, lParam)
DLL.CallFunction("User32.dll", "SendMessageA", va_args, DLL_RETURN_TYPE_INTEGER, DLL_CALL_STDCALL);
end
function LeftButtonDown(hWnd,  wParam, lParam)
va_args = string.format("%d,%d,%d,%d",hWnd, WM_LBUTTONDOWN, wParam, lParam)
DLL.CallFunction("User32.dll", "SendMessageA", va_args, DLL_RETURN_TYPE_INTEGER, DLL_CALL_STDCALL);
end

function LOWORD(value)
  return Memory.BitAND(value, 65535)
end

function HIWORD(value)
  return Memory.BitAND(Memory.ShiftRight(value, 16), 65535)
end

---------- Menü kodlarımız ------------
function ShowPopUpMenu()
  tblMenu = {};
  tblMenu[1] ={};
  tblMenu[1].Text = "ExtremitySoft";
  tblMenu[1].ID = 100;
  tblMenu[1].IconID = 0;
  tblMenu[1].Checked = false;
  tblMenu[1].Enabled = true;
  tblMenu[2] ={};
  tblMenu[2].Text = "Divane ©";
  tblMenu[2].ID = 200;
  tblMenu[2].IconID = 0;
  tblMenu[2].Checked = false;
  tblMenu[2].Enabled = true;
 
  Mouse = System.GetMousePosition(true, nil);
  nRes = Application.ShowPopupMenu(Mouse.X, Mouse.Y, tblMenu, TPM_LEFTALIGN, TPM_TOPALIGN, true, true);
end
Globale kodlarımızı yazdık, aynı zamanda menümüzü de oluşturduk. Şimdi sıra obje ile ilişkilendirmede. Kodları inceleyelim ;

On show eventine kodlarımızı yazıyoruz.

Kod:
function CallBack(hWnd, uMsg, wParam, lParam)

        if uMsg == WM_RBUTTONDOWN then

        SelectItem(hWnd,wParam, lParam)
        ShowPopUpMenu()
      
        end
      
end

LBHandle = ListBox.GetProperties("ListBox1").WindowHandle;
Memory.CreateWindowSubClass(LBHandle, 0, "CallBack");
İşlem tamamdır. Listbox objemize sağ tık menüsü oluşturmuş olduk. Bu kodlarla tüm objelere menü ekleyebilirsiniz.

Kod:
LBHandle = ListBox.GetProperties("ListBox1").WindowHandle;
Sayfamızın on show evresine yazdığımız yukarıdaki kod Listbox'un handle değerini alıyordu. Bu satırda istediğiniz objenin handle değerini alarak popup menü göstermiş olacaksınız. Kolay gelsin.
 
Son düzenleme:

AMS 9: Her Objeye Sağ Tık (Popup) Menüsü Ekleme Rehberi​

AutoPlay Media Studio'da standart olarak sağ tık menüsü desteği olmayan nesnelere (ListBox, Image vb.) kendi özel menünüzü eklemek ister misiniz? Memory Plugini kullanarak projenize profesyonel bir hava katabilirsiniz.

Neden Bu Yöntemi Kullanmalıyız?​

Bazı nesnelerin "Right Click" özelliği kısıtlıdır. Bu yöntemle, nesnenin üzerine sağ tıklandığını sistem düzeyinde yakalayıp istediğiniz menüyü açtırabilirsiniz.

Adım 1: Global Fonksiyonları Hazırlama​

Öncelikle menü yapısını ve fare hareketlerini tanıyan kodları Global Functions bölümüne ekliyoruz. Bu kodlar menünün nerede ve nasıl açılacağını belirler.
Kod:
-- Global Functions Bölümüne:
WM_RBUTTONDOWN = 516

function ShowPopUpMenu()
  tblMenu = {};
  tblMenu[1] = {Text = "Web Sitemiz", ID = 100, Checked = false, Enabled = true};
  tblMenu[2] = {Text = "Dosyayı Aç", ID = 200, Checked = false, Enabled = true};
 
  Mouse = System.GetMousePosition(true, nil);
  nRes = Application.ShowPopupMenu(Mouse.X, Mouse.Y, tblMenu, TPM_LEFTALIGN, TPM_TOPALIGN, true, true);
 
  -- Menüden seçilen işleme göre görev atayalım
  if nRes == 100 then
     File.OpenURL("https://www.uydudoktoru.com");
  elseif nRes == 200 then
     -- Dosya açma kodu buraya
  end
end

Adım 2: Obje İle İlişkilendirme (On Show)​

Menünün hangi objede çalışacağını belirlemek için sayfanın On Show eventine şu kodları ekliyoruz:
Kod:
function CallBack(hWnd, uMsg, wParam, lParam)
    if uMsg == WM_RBUTTONDOWN then
        ShowPopUpMenu()
    end
end

-- Örnek: ListBox1 nesnesine sağ tık özelliği verelim
Handle = ListBox.GetProperties("ListBox1").WindowHandle;
Memory.CreateWindowSubClass(Handle, 0, "CallBack");

Püf Noktası: Farklı Objeler​

Eğer menüyü bir resme veya butona eklemek isterseniz, tek yapmanız gereken ListBox.GetProperties yerine o nesnenin kendi özelliğini (Örn: Image.GetProperties) kullanarak WindowHandle değerini almaktır.
 
Geri
Yukarı