Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Subklasowanie editboxa w oknie rozmowy
Konnekt | Forum > Developerzy > Tworzenie wtyczek
KoSiarzPL
Witam jak uzyskać uchwyt do kontrolki wpisywaina wiadomości w oknie rozmowy. Mam plan by subklasować te okno w momęcie otwierania rozmowy, czyli przy otrzymaniu ACTN_CREATE akcji na toolbarze.
1. Czy podczas przechwycenia tej akcji mogę subklasować to okno. Innymi słowy czy to okno w tym moęcie już istnieje.
2. Jak pobrać uchwyt do tego okna.
Olórin
Subclassujesz tą kontrolke w UI K, potem
CODE

    if(anBase->code == ACTN_CREATEWINDOW) // Tworzymy okno rozmowy, druga pod wzgledem ważności funkcja wtyczki
    {
        int ret = IMessageDirect(IM_UIACTION , Tabs::ControlViewPrevOwner, (int)anBase);        //tworzymy kontrolkę rozmowy
            sUIActionNotify_createWindow * an = (anBase->s_size>=sizeof(sUIActionNotify_createWindow))?static_cast<sUIActionNotify_createWindow*>(anBase):0;
// Uchwyt mamy w an->hwnd
return ret;
}


Pamiętaj KONIECZNIE aby przechowywać osobno procedurę okna dla każdej jego instancji (najprościej SetProp/GetProp), inaczej popsujesz działanie kilku wtyczek...
KoSiarzPL
Nie rozumiem Cie. Przecież ja chcę ją tylko subklasować. Chcę zrobić tylko to:
CODE
staraProc = (WNDPROC)SetWindowLongPtr( hwnd_oknaRozmowy, GWLP_WNDPROC, (LONG)MojaProcedura );

Zakłądając, że hwnd_oknaRozmowy jest rodzicem kontrolki wypisywania wiadomość. Bo chcę przechwycić tylko jeden komunikat tej kontrolki.

Więc jeszcze raz, skąd mam pobrać uchwyt do okna rozmowy oraz jak przechwycic moment tworzenia tego okna.

Z tego co piszesz, trozumiem że mam czekać na akcje o kodzie ACTN_CREATEWINDOW bez względu na identyfikator. Tylko skad mam wiedzieć ze ten komunikat się tyczy akurat tego okna.
KoSiarzPL
Więc jak wyjaśnisz mi Olórin raz jescze lub kto inny pomoże?
Olórin
Nie zobaczyłem twojego posta, masz zasubclassować akcję okna rozmowy oczywiście, a potem obsłużyć jak wyżej.

I nie przechowuj danych w jednej zmiennej staraProc - w różnych oknach wtyczki różnie subclassują te okna.
KoSiarzPL
Dlaczego ja ciągle sądze że mówimy o różnych rzeczach.
Jeszcze raz, co ja chcę osiągnąć. Chcę otrzymywać komunikaty od kontrolki w ktorej piszemy wiadomość i ją wysyłąmy. Jaka to jest kontrolka? Edit box? W chwili obecnej robię następująco:
CODE
void Pisak::ActionProc( sUIActionNotify_base * msg )
{
    switch( msg->act.id )
    {
        case IMIG_MSGWND:
            if( msg->code == ACTN_CREATE )
            {
                SubklasujOknoRozmowy( UIActionHandle( msg->act ) );
                IMessage(IMI_INFORM , 0 , 0 , (int)"okno tworzone");
            }
            else if( msg->code == ACTN_DESTROY )
            {
                IMessage(IMI_INFORM , 0 , 0 , (int)"okno niszczone");
            }                
    }    
}

void Pisak::SubklasujOknoRozmowy( void* uchwyt )
{
    staraProc = (WNDPROC)SetWindowLongPtr( (HWND)uchwyt, GWLP_WNDPROC, (LONG)ObslugaOknaRozmowy );
}

Komunikaty o tworzeniu i niszczeniu okna otrzymuję ale żadnych komunikatów z uunkcji ObslugaOknaRozmowy() nie dostaję. Tak jak bym subklasował niewiadomo jakie okno.
hao
Zajrzyj do ui_message_controls.h w SDK. Dostęp do tej kontrolki jest możliwy z poziomu API.
KoSiarzPL
Olórin już mi podpowiedział conieco. Najpierw standardowe subklasowanie akcji:
CODE
int Pisak::Start()
{
    sUIActionInfo  nfo( IMIG_MSGWND, Konnekt::UI::ACT::msg_ctrlsend );
    nfo.mask = UIAIM_ALL;
    nfo.txt = new char [100];
    nfo.txtSize = 99;
    UIActionGet(nfo);

    RodzicOkna = ICMessage( IMI_ACTION_GETOWNER, (int)&nfo.act );
    if( RodzicOkna  == 0 )
        RodzicOkna = ICMessage( IMC_PLUG_ID, 0 );

    ICMessage( IMI_ACTION_REMOVE , (int)&nfo.act );
    ICMessage( IMI_ACTION , (int)&nfo );
    delete[] nfo.txt;

    return 1;
}

int Pisak::ActionProc( sUIActionNotify_base * msg )
{
    switch( msg->act.id )
    {
        case Konnekt::UI::ACT::msg_ctrlsend:
        {
            if( msg->code == ACTN_CREATEWINDOW )
            {
                int ret = IMessageDirect( IM_UIACTION , RodzicOkna, (int)msg );        
                sUIActionNotify_createWindow * an = (msg->s_size>=sizeof(sUIActionNotify_createWindow))?static_cast<sUIActionNotify_createWindow*>(msg):0;
                
                IMessage(IMI_INFORM , 0 , 0 , (int)"subklasujemy");
                SubklasujOknoRozmowy( an->hwndParent );
                return ret;
            }
            else return IMessageDirect( IM_UIACTION , RodzicOkna, (int)msg );
        }
    }
return 0;    
}

Następnie, subklasujemy okno:
CODE
LRESULT CALLBACK ObslugaOknaRozmowy( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    IMessage(IMI_INFORM , 0 , 0 , (int)"procedura");
    switch (uMsg)
    {  
        case WM_COMMAND:
              if( HIWORD( wParam ) == EN_CHANGE )
              {
                     IMessage(IMI_INFORM , 0 , 0 , (int)"zmiana");
              }
            break;  
    }

    return CallWindowProc( staraProc, hwnd, uMsg, wParam, lParam );
}

void Pisak::SubklasujOknoRozmowy( void* uchwyt )
{
    staraProc = (WNDPROC)SetWindowLongPtr( (HWND)uchwyt, GWLP_WNDPROC, (LONG)ObslugaOknaRozmowy );
}


Ok, subklasowanie juz dziala. Dostaje wreszcie komunikat "procedura" ale nie dostaje komunikatu "zmiana" dlaczego, użyliście jakiejś innej kontrolki czy co?
Olórin
Tam jest richedit.
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.