Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ListBox
Konnekt | Forum > Developerzy > Tworzenie wtyczek
dulek000
W KTerminarzu, w konfiguracji, użyta jest kontrolka ListBox. Jak się ją wstawia i obsługuje?
Olórin
Śmiem spekulować że jest to ACTT_HWND (czyli okno tworzone via WinAPI).
Aule
Dobrze spekulujesz wink.gif
CODE

//W IPrepare:
UIActionAdd(GCFG_TIMER , IMIA_TIMER_LISTBOX, ACTT_HWND,"ListBox");
//W ActionProc:
case IMIA_TIMER_LISTBOX:
 {
  if (anBase->code == ACTN_CREATEWINDOW)
  {    
   sUIActionNotify_createWindow * an = static_cast<sUIActionNotify_createWindow*>(anBase);
   an->w=150;
   an->h=160;
   an->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX",NULL,WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL,
    an->x,(an->y+5),an->w,an->h,an->hwndParent,(HMENU)an->act.id ,Ctrl->hDll(),NULL);
   edit_proc = (WNDPROC)SetWindowLongPtr(an->hwndParent,GWLP_WNDPROC, (LONG_PTR)EditWndProc);
   an->x += 160;
   SendMessage (an->hwnd  , WM_SETFONT, (WPARAM) an->font, true );  
  } else if (anBase->code == ACTN_DESTROYWINDOW) {
   sUIActionNotify_destroyWindow * an = (anBase->s_size>=sizeof(sUIActionNotify_destroyWindow))?static_cast<sUIActionNotify_destroyWindow*>(anBase):0;
   DestroyWindow(an->hwnd);
  }
  break;
 }


A potem jak ze zwykłym ListBox'em.


dulek000
Kod wygląda tak:
CODE

IPrepare:
UIActionAdd(CONFIG , 0, ACTT_GROUP, "Źródła", 0, 0, 100);
UIActionAdd(CONFIG, CONFIG_ADDRESS, ACTT_HWND|ACTSC_INLINE, "ListBox", 0, 0, 100);
UIActionCfgAdd(CONFIG, IMIB_CFG, ACTT_EDIT, 0, CONFIG_ADDRESS_ADDRESS, 0, 0, 310);
UIActionCfgAdd(CONFIG, IMIB_CFG, ACTT_BUTTON|ACTSC_INLINE, "Dodaj", CONFIG_ADDRESS_ADD, 165, 0);
UIActionCfgAdd(CONFIG, IMIB_CFG, ACTT_BUTTON|ACTSC_INLINE, "Zapisz", CONFIG_ADDRESS_SAVE, 0, 0);
UIActionCfgAdd(CONFIG, IMIB_CFG, ACTT_BUTTON, "Usuń", CONFIG_ADDRESS_DELETE, 0, 0);
UIActionAdd(CONFIG, 0, ACTT_GROUPEND);

ActionProc:
case CONFIG_ADDRESS:
{
if (anBase->code == ACTN_CREATEWINDOW)
{
sUIActionNotify_createWindow* an = static_cast<sUIActionNotify_createWindow*>(anBase);
an->w = 150;
an->h = 100;
an->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "ListBox", 0, WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL, an->x, an->y, an->w, an->h, an->hwndParent, (HMENU)an->act.id, Ctrl->hDll(),0);
an->x += 160;
SendMessage (an->hwnd, WM_SETFONT, (WPARAM)an->font, true);
}
else if (anBase->code == ACTN_DESTROYWINDOW)
{
sUIActionNotify_destroyWindow* an = (anBase->s_size>=sizeof(sUIActionNotify_destroyWindow))?static_cast<sUIActionNotify_destroyWindow*>(anBase):0;
DestroyWindow(an->hwnd);
}
}
break;


Niestety powstaje pewien problem:

user posted image

Co można z tym zrobić?
winthux
ja to załatwiałem w ten sposób, że wstawiałem kolejnego ACTT_HWND obniżonego (parametr y) o tyle ile mi było trzeba.
dulek000
Winthux: Twoje rozwiązanie działa ślicznie.
Aule: Podaj prosze jeszcze kod funkcji EditWndProc.
winthux
EditWndProc jest to typowe WindowProc w winapi, czyli f-cja do obsługi msg przesyłanych przez system.
dulek000
To wiem. Problem polega na tym, że gdy ta funkcja np. tak...:
CODE
LRESULT CALLBACK ListBoxProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch(pnmh->code)
{
case LBN_SELCHANGE:
{
MessageBox(0, 0, 0, 0);
}
}
}
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

...nie są uruchamiane akcje okna konfiguracji.
winthux
Na początku musisz zapamiętać wskaźnik do poprzedniej funkcji, aby następnie ją wywołać:
CODE
WNDPROC OldWndProc;
OldWndProc = (WNDPROC)SetWindowLongPtr( an->hwndParent, GWLP_WNDPROC, (LONG)WindowProc);

Zamiast DefWindowProc wstaw funkcję:
CODE
CallWindowProc( OldWndProc, hWnd, uMsg, wParam, lParam );


Teraz powinno być wszystko OK.
dulek000
Śmiga. smile.gif
Sija
QUOTE(dulek000 @ 28.11.2005 - 12:21)
[...] Niestety powstaje pewien problem:

user posted image

Co można z tym zrobić?
*



wywalic flage ACTSC_INLINE z CONFIG_ADDRESS.
dodatkowa kontrolka jest zbedna, wystarcza oczy ;>
hao
Po utworzeniu kontrolki trzeba oprócz X'a ustawić też Y'ka:
an->y += 100;
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.