Autor Wątek: [podstawy] Okno Konfiguracji Wtyczki  (Przeczytany 7239 razy)

0 Użytkowników i 1 Gość przegląda ten wątek.

Offline oscyp

  • Młodzież
  • **
[podstawy] Okno Konfiguracji Wtyczki
« dnia: Październik 26, 2010, 22:15:44 pm »
Zaczynam zabawę w pisanie wtyczek, wiadomo początki najtrudniejsze dlatego pytanie nr. 1

Jak poprawnie i zgodnie z wszelką filozofią i finezją dodać wtyczkę do okienka opcji w WTW? :)

Na dobry początek skorzystałem z:

wtwOptionPageDef OpcjeWtyczki;
initStruct(OpcjeWtyczki);

zdefiniowałem odpowiednie pola struktury itd, ale... nijak nie wiem jak sprawić aby to wszystko sie w końcu wyświetliło :)

oświećcie mnie :)

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #1 dnia: Październik 26, 2010, 22:38:03 pm »
za malo kodu, za duzo pytan :P

okno jak stworzone, co ma, jak struktura wypelniona jest... moja szklana kula nie dziala cos ostatnio (a szkoda... -.-)

Offline kwiateusz

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #2 dnia: Październik 27, 2010, 08:30:38 am »
   wtwOptionPageDef settings_page;
initStruct(settings_page);

settings_page.id = PAGE_NAME;
settings_page.caption = L"kwNotify";
settings_page.parentID = WTW_OPTIONS_GROUP_PLUGINS;
settings_page.callback = reinterpret_cast<WTWFUNCTION>(settingsPage);
wtw->fnCall(WTW_OPTION_PAGE_ADD, reinterpret_cast<WTW_PARAM>(hInst), reinterpret_cast<WTW_PARAM>(&settings_page));

hinst to instancja wtyczki z DllMain

Offline crsunik

  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #3 dnia: Grudzień 10, 2011, 14:52:52 pm »
Nie chcąc zakładać nowego wątku, zapytam tutaj. Jak wypełnić zakładkę, który kod opisany powyżej tworzy własnymi polami oczekującymi wartości typu np. string lub enum(combobox) ?

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #4 dnia: Grudzień 10, 2011, 17:33:41 pm »
nie ma czegos takiego, tworzysz sobie sam okno, sam odpowiadasz za przechowywanie wartosci, zapis, odczyt etc. przez api przekazujesz tylko callback w ktorym tworzysz/niszczysz/pokazujesz/ukrywasz/zmieniasz rozmiar okna

Offline crsunik

  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #5 dnia: Grudzień 11, 2011, 10:38:58 am »
A czy mógłbym prosić o jakiś przykładowy kod?

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #6 dnia: Grudzień 11, 2011, 11:13:51 am »
        { 
            wtwOptionPageDef def;
            initStruct(def);
 
            def.callback    = SettingsPage::callback;
            def.id            = L"Sounds/Options";
            def.caption        = L"Dźwięki";
            def.parentID    = WTW_OPTIONS_GROUP_PLUGINS;
            def.iconID        = SOUNDS_ICON_ID;
            wtw->fnCall(WTW_OPTION_PAGE_ADD, reinterpret_cast<WTW_PARAM>(ghInstance), reinterpret_cast<WTW_PARAM>(&def));
        }

WTW_PTR SettingsPage::callback(WTW_PARAM wParam, WTW_PARAM lParam, void*) 
{
    wtwOptionPageShowInfo* info = (wtwOptionPageShowInfo*)wParam;
 
    wcscpy(info->windowCaption, L"Sounds");
    wcscpy(info->windowDescrip, L"Ustawienia dŸwięków");
 
    SettingsPage* pOptions = (SettingsPage*)(WTW_PARAM)info->page->ownerData;
 
    switch(info->action) 
    {
    case WTW_OPTIONS_PAGE_ACTION_SHOW: 
        {
            if(!pOptions)
            {
                pOptions = new SettingsPage;
                info->page->ownerData = (void*)pOptions;
 
                pOptions->Create(info->handle);
 
                CRect rc;
                pOptions->GetClientRect(&rc);
                pOptions->SetScrollSize(rc.Width(), rc.Height());
            }
            pOptions->MoveWindow(info->x, info->y, info->cx, info->cy, TRUE);
            pOptions->ShowWindow(SW_SHOW);
            break;     
        }
    case WTW_OPTIONS_PAGE_ACTION_MOVE:
        {
            if(pOptions)
            {
                pOptions->MoveWindow(info->x, info->y, info->cx, info->cy, TRUE);
            }
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_HIDE: 
        {
            if(pOptions)
            {
                pOptions->ShowWindow(SW_HIDE);
            }
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_APPLY: 
        {
            if(pOptions)
            {
                pOptions->close(true);
            }
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_OK:
    case WTW_OPTIONS_PAGE_ACTION_CANCEL: 
        {
            if(pOptions) 
            {
                pOptions->close(info->action == WTW_OPTIONS_PAGE_ACTION_OK);
                pOptions->DestroyWindow();
                info->page->ownerData = 0;
                delete pOptions;
                pOptions = 0;
            }
            break;
        }
    }
    return 0;
}

Offline crsunik

  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #7 dnia: Grudzień 11, 2011, 11:29:32 am »
Dziękuję.

Offline cubuspl42

  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #8 dnia: Styczeń 02, 2012, 16:04:28 pm »
Sorki, jeśli  uznacie, że to trochę nie na temat, ale czy przykład przytoczony przez Adriana dotyczy tworzenia okien przy pomocy MFC?

Offline mrg

  • Master Developer
  • Młodzież
  • *
  • osobisty mój tekst jest tekstem osobistym ;Dxd
    • Plugins for WTW.im
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #9 dnia: Styczeń 02, 2012, 18:00:38 pm »
bardzo możliwe ;p
// Pisuje wtyczki z których sam potem korzystam (głównie takie), znajdziesz je na forum i TUTAJ
// Wsparcie/Dotacje :: Błędy/Prośby

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #10 dnia: Styczeń 02, 2012, 20:57:04 pm »
nie, adrian nie uzywa MFC tylko ATL/WTL ale bardzo mozliwe jest, iz ten kod zadziala i na MFC ;p

Offline Luki

  • Junior Developer
  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #11 dnia: Kwiecień 09, 2012, 11:18:29 am »
Mała poprawka do kodu adriana dla potomnych:
trzeba jeszcze ustawić odpowiednie style okna, więc używając WTL wygląda to mniej więcej tak:
                settingsPage = new SettingsPage;
                info->page->ownerData = (void*)settingsPage;
                settingsPage->Create(NULL);

                settingsPage->ModifyStyle(0xFFFFFFFFL, WS_CHILD);
                settingsPage->ModifyStyleEx(0xFFFFFFFFL, 0x0);
                settingsPage->SetParent(info->handle);
« Ostatnia zmiana: Kwiecień 10, 2012, 11:18:31 am wysłana przez Luki »

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #12 dnia: Kwiecień 10, 2012, 10:55:34 am »
moj kod zaklada, ze owe okienko siedzi sobie w zasobach (.rc) i tam jest styl WS_CHILD. jezeli piszemy z palca cale okno, to wtedy WS_CHILD mozna po ludzku przekazac w Create.
za to nie wiem po co WS_EX_MDICHILD masz podane, bo okno opcji to nie jest MDI ;p

Offline Luki

  • Junior Developer
  • Narybek
  • *
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #13 dnia: Kwiecień 10, 2012, 11:10:32 am »
Sprawdzałem sobie jakie style ma okno twej wtyczki (Sounds konkretniej) ;)

Hm, w sumie racja, MDICHILD nie jest potrzebne, ale i tak warto sobie wyczyścić zbędne style i ustawić ten jeden, tak dla pewności ;) W przeciwnym wypadku bez zmieniania parametrów okna w zasobach okno ma obramowanie etc.

Poprawiłem post z kodem.

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #14 dnia: Czerwiec 01, 2012, 14:01:24 pm »
Walczę z utworzeniem okna konfiguracji wtyczki, ale coś mi nie idzie...

W pluginLoad mam kod tworzący zakładkę w opcjach:
{
wtwGraphics icon;
initStruct(icon);
icon.graphID = PLUGIN_ICON;
icon.resourceId = MAKEINTRESOURCE(IDB_PNG1);
icon.imageType = 0;
icon.hInst = ghInstance;
wtw->fnCall(WTW_GRAPH_LOAD, (WTW_PARAM)&icon, 0);
}
{
wtwOptionPageDef def;
initStruct(def);
def.callback = reinterpret_cast<WTWFUNCTION>(SettingsPageCallback);
def.id = SETTINGS_SYNC_ARCH; // #define SETTINGS_SYNC_ARCH L"wtwArchSync/options"
def.caption = L"Synchronizacja archiwum";
def.parentID = WTW_OPTIONS_GROUP_PLUGINS;
def.iconID = PLUGIN_ICON;
wtw->fnCall(WTW_OPTION_PAGE_ADD, reinterpret_cast<WTW_PARAM>(ghInstance), reinterpret_cast<WTW_PARAM>(&def));
}

Callback zdefiniowanych (chyba) dobrze:
WTW_PTR SettingsPageCallback(WTW_PARAM wParam, WTW_PARAM lParam, void*)
(co w środku aktualnie nieistotne).

Niestety po uruchomieniu wtyki w opcjach nic się nie pojawia.
Co jest nie tak?
Dodam, że fnCall zwraca 0, przy pomyślnym dodaniu pozycji do menu zwracało wartość niezerową (nie wiem czy ma to jakiś związek).

Offline mrg

  • Master Developer
  • Młodzież
  • *
  • osobisty mój tekst jest tekstem osobistym ;Dxd
    • Plugins for WTW.im
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #15 dnia: Czerwiec 03, 2012, 12:43:09 pm »
wszystko mi tu wygląda dobrze ;p sprawdź callback, najlepiej niech jej ciało będzie puste ;p zobacz tyko czy strona się doda ;p
// Pisuje wtyczki z których sam potem korzystam (głównie takie), znajdziesz je na forum i TUTAJ
// Wsparcie/Dotacje :: Błędy/Prośby

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #16 dnia: Czerwiec 03, 2012, 15:25:42 pm »
No właśnie aktualnie ciało callbacka jest puste, ale to nie ma znaczenia, bo i tak się nie wywołuje. A strona się nie dodaje...
Próbowałem też
def.callback = SettingsPageCallback;
bez żadnych dziwnych rzutowań (C++ mnie przeraża :P ) ale żadnej różnicy. Próbowałem nawet bez ikony (swoją drogą jest wymagana?), z innym parentID  i też echo. Jak to mawiamy w robocie "czary i magia".

Offline mrg

  • Master Developer
  • Młodzież
  • *
  • osobisty mój tekst jest tekstem osobistym ;Dxd
    • Plugins for WTW.im
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #17 dnia: Czerwiec 03, 2012, 19:16:55 pm »
do wtw masz na pewno przypisany wskaźnik do WTWFUNCTIONS otrzymywanego w pluginLoad? ;p nie mam pojęcia co tu jest źle ;p wtyczkę oczywiście włączasz? ;p

wybacz za takie głupie pytania, ale wszystkie możliwości trzeba wyeliminować :D
// Pisuje wtyczki z których sam potem korzystam (głównie takie), znajdziesz je na forum i TUTAJ
// Wsparcie/Dotacje :: Błędy/Prośby

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #18 dnia: Czerwiec 03, 2012, 20:28:33 pm »
jakby nie przypisal wskaznika, to by mu sie to wykrzaczalo za kazdym razem (a jak ma go zerowanego na poczatku to gwarantowane access violation c0000005 :F)

stworz zwyczajnie puste okno i wtedy probuj, poza tym musisz skopiowac tytul i opis strony do struktury ktora dostajesz w callback'u

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #19 dnia: Czerwiec 03, 2012, 21:08:29 pm »
@mrg:
wskaźnik do WTWFUNCTIONS przypisany, gdyby nie był wywaliło by się przy pierwszym wywołaniu fnCall. Zresztą jak pisałem trochę wcześniej mam dodanie pozycji do menu głównego i tam bangla.

@adrian_007:
skopiować nie bardzo mam kiedy, bo callback się nie wywołuje.

Przydałby się jakiś GetLastError dla fnCall.

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #20 dnia: Czerwiec 04, 2012, 08:25:47 am »
cos musiales spieprzyc... kod jest ok, takie cos dziala, a roznic nie widze
        {
            wtwOptionPageDef def;
            initStruct(def);

            def.callback    = SettingsPage::callback;
            def.id            = L"Sounds/Options";
            def.caption        = L"Dźwięki";
            def.parentID    = WTW_OPTIONS_GROUP_PLUGINS;
            def.iconID        = SOUNDS_ICON_ID;
            wtw->fnCall(WTW_OPTION_PAGE_ADD, reinterpret_cast<WTW_PARAM>(ghInstance), reinterpret_cast<WTW_PARAM>(&def));
        }

sprobuj callback zrobic w taki sposob
extern "C"
{
WTW_PTR __cdecl callback(WTW_PARAM, WTW_PARAM, void*)
{
__LOG(wtw, L"LOL", L"ROTFL");
return 0;
}
}

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #21 dnia: Czerwiec 27, 2012, 17:04:37 pm »
Dobra, problem rozwiązany - nie przekazywałem hInstance z DllMain -_-'
Ale teraz pojawił się (chyba) nowy, otóż w callbacku okna opcji WTW_OPTIONS_PAGE_ACTION_MOVE dostaję tylko przy zmianie rozmiaru okna a przy przesuwaniu już nie. Tak ma być? czy znowu coś schrzaniłem?

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #22 dnia: Czerwiec 27, 2012, 21:20:59 pm »
tak ma byc/bez roznicy w sumie jezeli uzywasz MoveWindow

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #23 dnia: Czerwiec 28, 2012, 06:42:04 am »
Ale chwila, bo nie rozumiem... Klasa SettingsPage (do której należy MoveWindow) to jakaś twoja klasa do obsługi okienka tak? Wywołujesz SettingsPage->MoveWindow, żeby przesunąć okno. Ale w takim razie jak reagujesz na przesunięcie całego okna opcji, skoro wtedy w ogóle callback się nie odpala?

Mam w callbacku kod:
switch(info->action)
    {
    case WTW_OPTIONS_PAGE_ACTION_SHOW: 
        {
            myLOG("Show");
            break;     
        }
    case WTW_OPTIONS_PAGE_ACTION_MOVE:
        {
            myLOG("Move");
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_HIDE:
        {
            myLOG("Hide");
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_APPLY: 
        {
            myLOG("Apply");
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_OK:
        {
            myLOG("Ok");
            break;
        }
    case WTW_OPTIONS_PAGE_ACTION_CANCEL: 
        {
            myLOG("Cancel");
            break;
        }
    }
i "Move" w konsoli dostaję tylko przy zmianie rozmiaru okna, przy przesunięciu już nie...

Offline adrian_007

  • Master Developer
  • Starszyzna
  • *
    • WTW PLUGINS
Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #24 dnia: Czerwiec 28, 2012, 07:58:26 am »
MoveWindow

poza tym chyba nie do konca rozumiesz co to 'przesuniecie' okna (bynajmniej nie zlapanie za pasek tytulowy i przeciagniecie myszka)

Offline SubZero

Odp: [podstawy] Okno Konfiguracji Wtyczki
« Odpowiedź #25 dnia: Czerwiec 28, 2012, 12:11:02 pm »
Ok, sprawa rozwiązana, widać Parent w CLR to nie to samo co Parent w ATL/MFC/w_czym_tam_kaw_pisze.

Cytuj
poza tym chyba nie do konca rozumiesz co to 'przesuniecie' okna (bynajmniej nie zlapanie za pasek tytulowy i przeciagniecie myszka)
Fakt, myślałem że to reakcja na przesunięcie całego okna opcji a nie przesunięcie mojego okienka w ramach okna opcji.