Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ukrywanie przycisku, podmiana ikony
Konnekt | Forum > Developerzy > Tworzenie wtyczek
Mucha
1. Jak ukryc przycisk w oknie rozmowy? Oto moj przycisk (otwiera menu):
CODE
UIGroupInsert(IMIG_MSGTB , MSG_GRUP, 0, 0, 'Poczta', IDI_TOOLBAR);
UIActionAdd(MSG_GRUP, TOOL_MSG_BAR, 0, 'Temat', IDI_TEMAT);
UIActionAdd(MSG_GRUP, ZALACZNIK, 0, 'Zalącznik', IDI_ZALACZNIK);
UIActionAdd(MSG_GRUP, IMIA_EXAMPLE_BUTTON, 0, 'Sprawdź pocztę', IDI_ODBIERZ);
Robie tak:
CODE
if anBase.code = ACTN_CREATE then
        begin
           ai:= sUIActionInfoB(IMIG_MSGTB, MSG_GRUP);
           ai.act := anBase.act;
           ai.mask := UIAIM_ALL;
           if GETCNTI(anBase.act.cnt,CNT_NET)=NET_EMAIL then begin
           ai.status := ACTS_HIDDEN;
           ai.statusMask := ACTS_HIDDEN;
           ICMessage(IMI_ACTION_SET , Integer(@ai));
           end;
        end;
NIe dziala, gdzie mam to wpakowac? Jak to prawidlowo powinno wygladac?

2. Jak podmienic ikonke w menu (po kliknieciu), robie tak:
CODE
        ON_OFF: if GETINT(CFG_ON_OFF) = 0 then begin
           Ctrl.DTsetInt(DTCFG, 0, CFG_ON_OFF, 1);
           ai:= sUIActionInfoB(IMIG_PLUGINS, ON_OFF);
           ai.act := an.act;
           ai.mask := UIAIM_ICO;
           ai.p1 := $1D;
           ICMessage(IMI_ACTION_SET , Integer(@ai));
        end else begin
          Ctrl.DTsetInt(DTCFG, 0, CFG_ON_OFF, 0);
          ai:= sUIActionInfoB(IMIG_PLUGINS, ON_OFF);
          ai.act := an.act;
          ai.mask := UIAIM_ICO;
          ai.p1 := 0;
          ICMessage(IMI_ACTION_SET , Integer(@ai));
        end;
Ale to nic nie daje, jak powinno byc prawwidlowo?

Odpowiedzi moga byc w C++, tylko najlepiej z uzyciem ICMessage bo wolalbym nic nie przepisywac na delphi
ursus6
Ad 1. W 3 parametrze wsadź ACTR_INIT to bedziesz otrzymywał komunikaty akcji.
Mucha
Nie dziala, dalem tak:
CODE
UIGroupInsert(IMIG_MSGTB , MSG_GRUP, 0, ACTR_INIT, 'Poczta', IDI_TOOLBAR);
// oraz na wszelki wypadek
UIActionAdd(MSG_GRUP, TOOL_MSG_BAR, ACTR_INIT, 'Temat', IDI_TEMAT);
UIActionAdd(MSG_GRUP, ZALACZNIK, ACTR_INIT, 'Zalącznik', IDI_ZALACZNIK);
UIActionAdd(MSG_GRUP, IMIA_EXAMPLE_BUTTON, ACTR_INIT, 'Sprawdź pocztę', IDI_ODBIERZ);
A cala podmianka:
CODE
function ActionProc(const anBase: sUIActionNotify_basePtr): Integer;
var...
begin
  if ((anBase.act.id and IMIB_) = IMIB_CFG) then
    Result := ActionCfgProc(anBase)
  else
    begin
            case (anBase.act.id) of
        IMIG_MSGWND:
        if anBase.code = ACTN_CREATE then
        begin
...
ursus6
Robisz tak?
CODE

  if ((anBase.act.id and IMIB_) = IMIB_CFG) then
    Result := ActionCfgProc(anBase)
  else
    begin
      case (anBase.act.id) of
        MSG_GRUP:
        begin
        if (anBase.code = ACTN_CREATE) then
          begin
          tu reszte dajesz


Mucha
Dzieki, dziala teraz tylko trzeba bylo zmienic UIAIM_ALL na UIAIM_STATUS bo krytyk wystepowal
Pytanie 2 tez juz wiem: trzeba dodac ACTR_INIT do ON_OFF
Ale zrodzilo sie pytanie nr 3 wink.gif
Chce w ActionProc obsluzyc IMIG_MSGWND (okno rozmowy - jakakolwiek zwiazana z nim akcje). Probowalem wykorzystac moja akcje w oknie rozmowy ale wtedy zwraca mi tylko ACTN_CREATE
ursus6
Jak chcesz otrzymywać komunikaty od okna rozmowy musisz je subclassowac.
CODE

function IStart():Integer;
var
nfo :sUIActionInfo;
begin
   nfo.s_size := SizeOf(nfo);
   nfo.mask := UIAIM_ALL;
   nfo.act.cnt := AC_CURRENT;
   GetMem(nfo.txt, 100);
   nfo.txtSize := 99;
   nfo.act.parent := IMIG_MSGWND;
   nfo.act.id := Konnekt_UI_ACT_msg_ctrlsend;
   UIActionGet(nfo);

   cnt_info_prevOwner := ICMessage( IMI_ACTION_GETOWNER, Integer(@nfo.act));
    if( cnt_info_prevOwner  = 0 ) then
        cnt_info_prevOwner := ICMessage( IMC_PLUG_ID, 0 );
    ICMessage( IMI_ACTION_REMOVE , Integer(@nfo.act));
    ICMessage( IMI_ACTION , Integer(@nfo) );
    FreeMem(nfo.txt);    


Teraz w ActionProc przykładowa akcja utworzenia kontrolki do wysyłania tekstu. W ui_message_controls masz więcej stałych.

CODE

Konnekt_UI_ACT_msg_ctrlsend:
          begin
          if (anBase.code = ACTN_CREATEWINDOW)  then
            begin
            Result := IMessageDirect( IM_UIACTION , cnt_info_prevOwner, Integer(anBase));
            an := sUIActionNotify_createWindowPtr(anBase);
            jakasprocka(an.hwnd, an.hwndparent);
            end
          else
            Result := IMessageDirect( IM_UIACTION , cnt_info_prevOwner, Integer(anBase));
          end;
Mucha
Tez tak probowalem ale zwraca mi tylko ACTN_CREATE, ACTN_SETCNT i ACTN_DESTROY. A mi zalezy na tym zeby wykrywac takze ukrycie, pokazanie i zminimalizowanie okna
ursus6
Przy ACTN_CREATEWINDOW subclassuj okno rozmowy i odbieraj windowsowe komunikaty.
Mucha
Dzieki wielkie za pomoc, z tym subclassowaniem musze jeszcze zrobic
Mucha
Eh, nadal mam z tym problemy, subclassuje ten element w oknie rozmowy (ta kontrolke 251). Potem robie tak:
CODE
        251:
          begin
          if (anBase.code = ACTN_CREATEWINDOW)  then
            begin
            Result := IMessageDirect( IM_UIACTION , cnt_info_prevOwner, Integer(anBase));
            wnd := sUIActionNotify_CreateWindowPtr(anBase); //anBase jest wskazniekiem na sUIActionNotify_CreateWindow?
            SetProp(wnd.hwndparent,'Subclass',SetWindowLong(wnd.hwndparent,GWL_WNDPROC,integer(@WndProc)));
            end
          else
            begin
            Result := IMessageDirect( IM_UIACTION , cnt_info_prevOwner, Integer(anBase));
            end;
          end;

Dodalem do plug.pas:
CODE
type
  sUIActionNotify_createWindowPtr = ^sUIActionNotify_createWindow;
  sUIActionNotify_createWindow = packed record
   s_size: Word;
   act: sUIAction;
   code: Cardinal;
   reserved: Integer;   //!! dotąd odzedziczone z sUIActionNotify_base
   hwnd: HWND;  ///< Tutaj MUSIMY ustawić uchwyt do naszego okna.
   hwndParent: HWND; ///< Uchwyt okna, do którego mamy się podłączyć.
   x,         ///< Pozycja X na której trzeba wstawić okno. TRZEBA tą wartość zwiększyć o szerokość utworzonego okna!
   y: Integer;///< Pozycja Y na której trzeba wstawić okno. TRZEBA tą wartość zwiększyć o wysokość utworzonego okna!
   status: Byte; ///< Kopia wartości \a status akcji
   txt: pchar; ///< Kopia wartości \a txt akcji
   flags: Byte; ///< Flagi - Na razie 0.
   font: HFONT;     ///< Domyślna czcionka używana przez konnekta.
   fontBold: HFONT; ///< Ta sama czcionka, tyle że pogrubiona.
   w,           ///< Sugerowana szerokość okna
   h: Integer;  ///< Sugerowana wysokość okna
end;

A potem jut tylko WndProc:
CODE
function WndProc(hWnd: HWND;
  message: UINT;
  wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
var
PrevProc: Pointer;
begin
case message of
WM_ACTIVATE: IMLOG('ACTIV',[]);
WM_MOVE: IMLOG('MOVE',[]);
end;
PrevProc := Pointer(GetProp(hWnd, 'Subclass'));
result := CallWindowProc(PrevProc,hwnd,message,wParam,lParam);
end;
Niestety logi pozostaja puste, sprawdzalem te wartosci wnd.hwnd oraz wnd.hwndparent (napisalem sobie prosty programik w API ukrywajacy i pokazujacy kontrolke o jakims id) i one sa bledne.
Co tu jeest zle bo nie moge do tego dojsc??
ursus6
CODE

sUIActionNotify_createWindow = record
    sm: sUIActionNotify_base;
    hWnd: Cardinal;
    hwndParent: Cardinal;
    x: Integer;   ///< Pozycja X na której trzeba wstawić okno. TRZEBA tą wartość zwiększyć o szerokość utworzonego okna!
    y: Integer;///< Pozycja Y na której trzeba wstawić okno. TRZEBA tą wartość zwiększyć o wysokość utworzonego okna!
    Status: Cardinal; ///< Kopia wartości \a status akcji
    txt: Pchar;
    flags :Cardinal;
    font :Cardinal;
    fontBold :Cardinal;
    w :Cardinal;
    h :Cardinal;
  end;


Nie zawsze sie używa packed record
Mucha
Dzieki, dziala
A teraz mam z kolei pytanie do Olorina: jakie windowsowe komunikaty zwraca tabletka przy zamknieciu okna grupowego oraz zamknieciu okna pojedynczego kontaktu (probowalem juz na paru (28,132,24,6), ale przy wiekszej liczbie okien nastepowala zwiecha konnekta lub komunbikat byl "za wczesnie" i stanokna rozmowy byl nieaktualny)
EDIT
Juz nie wazne, poszedlem inna droga
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.