[winapi] OnClick w Winapi

Odpowiedz Nowy wątek
Początkującyy
2010-04-24 16:36
Początkującyy
0

Witam,
Pisze program w winapi i mam pewien problem, a mianowicie mam problem z popupmenu.

w skrócie program tworzy na pulpicie ikony i chciałbym aby po kliknieciu na nie prawym przyciskiem wyskakiwało menu, wszystko jest dobrze, tylko ze nie wiem jak przypisac procedure do klikniecia w menu
A wygląda to tak:

var
pop: tpopupmenu;
 menuitem: menus.tmenuitem;

//zmienne

//wycinek z WndProc:

function WndProc(hWnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case uMsg of
  WM_RBUTTONUP:
    begin

    menuitem := tmenuitem.Create(menuitem);
    menuitem.Caption := 'aa';

    pop := tpopupmenu.Create(pop);
    pop.Items.Add(menuitem);

    getcursorpos(p);
    pop.Popup(p.x,p.y);
    end;

tutaj wszystko jest dobrze, po kliknieciu wyskakuje popup z jedną pozycją: 'aa';
jednak nie wiem jak zrobić aby po kliknięciu na nią wykonywała się jakaś procedura.
Chciałym aby to wyglądało w ten sposób:

Procedure JakasProcedura;
begin
cos tam cos
end;

function WndProc(hWnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case uMsg of
  WM_RBUTTONUP:
    begin

    menuitem := tmenuitem.Create(menuitem);
    menuitem.Caption := 'aa';

    menuitem.OnClick := JakasProcedura; // <---- o zrobienie tego mi chodzi

    pop := tpopupmenu.Create(pop);
    pop.Items.Add(menuitem);

    getcursorpos(p);
    pop.Popup(p.x,p.y);
    end;

Napisalem troche chaotycznie, ale mam nadzieje ze zrozumiecie o co chodzi :) Kazda pomoc sie przyda.

Pozostało 580 znaków

2010-04-24 17:15
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Szczecin

0

Wiem o co chodzi, ale i tak napisałeś bardzo chaotycznie. Piszesz że chcesz zrobić
aplikację w WinApi, a przeczysz sam sobie bo w kodzie widzę tworzenie klasy, no
to jak WinApi ma być w koncu czy obiektowo? A OnClick Tobie nie zadziała, bo o
ile się nie mylę OnClick musi być zadeklarowane w klasie, a w WinApi nie używa
się przecież klas typu TForm czy TPopUpMenu. Celem pisania w WinApi jest o ile
znowu się nie mylę - tworzenie jak najmniejszego pliku wykonywalnego albo dll,
a nie "spuchniętego" przez użycie klas exeka. A do programowania WinApi - pod
Delphi powinno się używać ze standardowych tylko modułu Windows, no czasem
ewentualnie ActiveX trzeba, ale po co innych. Zobacz sobie na mój kod źródłowy
pod poniższym adresem. Jest to plugin do WinAmpia ktory po naciśnięciu Ctrl+V
skleja ze sobą okno głowne WinAmpa oraz okno Playlisty i Equalizera, o ile te są
widoczne. Zobacz jak tam w dll_main.pas jest dodawana do menu WinAmpa, ta
nowa pozycja "Stick Windows together". Ja nie jestem specem w WinApi - także
wiele Tobie nie pomogę więcej, ale powinieneś tworzyć Menu Inaczej bez użycia
klasy, poniżej masz wycinki kodu dodawania pozycji do istniejącego menu i pod
spodbem przykład na obsługę kliknięcia. Więcej tutaj, może doradzą Tobie inni.
http://www.speedyshare.com/files/22101139/stick_win_plugin.rar
Dodawanie pozycji do Menu:

  case Msg of
    WM_INITMENUPOPUP :
      begin
        if GetMenuItemID(HMENU(wParam), 0) = WINAMP_HELP_ABOUT then
        begin
          MyMenuItemInfo.cbSize := SizeOf(MENUITEMINFO);
          MyMenuItemInfo.fMask := MIIM_ID or MIIM_TYPE or MIIM_DATA;
          MyMenuItemInfo.wID := MENU_ID - 1;
          MyMenuItemInfo.fType := MFT_SEPARATOR;
          InsertMenuItem(HMENU(wParam), 127, False, MyMenuItemInfo);
          MyMenuItemInfo.wID := MENU_ID;
          MyMenuItemInfo.fType := MFT_STRING;
          MyMenuItemInfo.dwTypeData := MenuItemText;
          MyMenuItemInfo.cch := SizeOf(MenuItemText);
          InsertMenuItem(HMENU(wParam), 128, True, MyMenuItemInfo);
        end;
      end;

Obsluga kliknięcia w Menu - Ty w swojej aplikacji zamiast tej procedury masz
pewnie coś w stylu innej funkcji WndProc - gdzie przechwytujesz komunikaty:

function HookWinampWnd(Handle : HWND; Msg : Integer;
  wParam, lParam : Longint) : LRESULT;
// ...
// Obsluga kliknięcia
  case Msg of
    WM_COMMAND : begin
        if LoWord(wParam) = MENU_ID then
        begin
          StickWindows;
        end;
      end;
// Usuwanie pozycji z menu po zniknięciu menu:
    WM_INITMENUPOPUP : begin
        if GetMenuItemID(HMENU(wParam), 0) = WINAMP_HELP_ABOUT then
        begin
          DeleteMenu(HMENU(wParam), MENU_ID - 1, MF_BYCOMMAND);
          DeleteMenu(HMENU(wParam), MENU_ID, MF_BYCOMMAND);
        end;
      end;
  end;
// Dodawanie pozycji menu przy rozwinięciu
  case Msg of
    WM_INITMENUPOPUP :
      begin
        if GetMenuItemID(HMENU(wParam), 0) = WINAMP_HELP_ABOUT then
        begin
          MyMenuItemInfo.cbSize := SizeOf(MENUITEMINFO);
          MyMenuItemInfo.fMask := MIIM_ID or MIIM_TYPE or MIIM_DATA;
          MyMenuItemInfo.wID := MENU_ID - 1;
          MyMenuItemInfo.fType := MFT_SEPARATOR;
          InsertMenuItem(HMENU(wParam), 127, False, MyMenuItemInfo);
          MyMenuItemInfo.wID := MENU_ID;
          MyMenuItemInfo.fType := MFT_STRING;
          MyMenuItemInfo.dwTypeData := MenuItemText;
          MyMenuItemInfo.cch := SizeOf(MenuItemText);
          InsertMenuItem(HMENU(wParam), 128, True, MyMenuItemInfo);
        end;
      end;
  end;
//...

Mam nadzieję, że cześciowo Ciebie to naprowadzi, a więcej dopowie ktoś jeszcze.


Pozostało 580 znaków

Poczatkujacyy
2010-04-25 12:13
Poczatkujacyy
0

Szczerze mówiąc spodziewałem się, że nie da rady.
Jednak nigdzie nie moge znaleść jak zrobić w Winapi wyskakujące menu: np. takie jak po kliknięciu PPM na pulpit ? Ale wielkie dzięki za Twój kod, niestety teraz nie mam czasu sie tym zająć ale wieczorem go rozpracuje :) Być może jakos dojde do rozwiazania:)

Pozostało 580 znaków

2010-04-25 15:41
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Szczecin

0

Proszę bardzo, może Tobie ktoś inny coś doradzi. Takie popup menu jakie w Windowsach mamy
po kliknięciu na ikonkę na pulpicie albo na jakiś plik to umiem stworzyć tylko w VCL a i to tylko
dla pojedyńczej ikony, bo dla większej ilości dzieją się cyrki. A i pomimo że stosowałem się, do
wszystkich porad z forum TotalCommandera, jakie polecał mi jego autor to nie wyszło jak chcę
i póki co sobie to odpuściłem. A w WinApi to pewno sporo kombinacji żeby zrobić takie menu.
Może ktoś inny Tobie coś podpowie. Jest też forum WinApi ale tam piszą w C, ale jakbyś może
zapytał to dostał byś w C jakiś przykład, który udalo by się pewnie przetłumaczyć na Delphi ;/


Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0