/**************/ /* listbox.c */ /**************************************************************************** PROGRAM: listbox.c PURPOSE: Aliohjelmia list-boxin käyttämiseksi AUTHOR: Vesa Lappalainen 2.8.1994 USAGE: Projektiin lisättävä ALI\listbox.c ALI\mjonot.c (liita_jono) Yleisiä parametreja: hWnd - ikkunan kahva, jossa Listbox sijaitsee id - listboxin tunnus (jos = 0, niin hWnd on Listboxin kahva) all - 0 = vain valitut, 1=kaikki (SELECTED, ALL enum) Käytössä on seuraavat aliohjelmat: int get_items(HWND hWnd,int id, int all,int **items) - varaa tilaa taulukolle, jossa on indexit valittuihin list-boxin riveihin. Palauttaa 0 tai <0 jos ei onnistu. Tällöin mitään ei ole varattuna (*items = NULL). Muuten paulattaa varatun taulukon koon. char *listbox_to_text(HWND hWnd,int id,int all,char *buf,int n) - laittaa listboxin valitut rivit tekstiksi (väliin cr lf) merkkijonoon buf, jonka max-koko on n. Koko voidaan tarvittaessa laskea funktiolla delete_from_listbox int count_listbox_selsize(HWND hWnd,int id,int all) - laskee listboxin valittujen rivien viemän tilan merkkijonoksi muutettuna (rivien välissä cr lf) int delete_from_listbox(HWND hWnd,int id,int all) - poistaa valitut rivit listboxista int select_all_from_listbox(HWND hWnd,int id) - valitsee kaikki listboxin rivit, palauttaa rivien lkm windowsx.h:sta löytyy seuraavat makrot, joita tulisi käyttää sen sijaan että käyttää kutsuja SendDialogItemMessage(...): ListBox_Enable(hwndCtl, fEnable) ListBox_GetCount(hwndCtl) ListBox_ResetContent(hwndCtl) ListBox_AddString(hwndCtl, lpsz) ListBox_InsertString(hwndCtl, index, lpsz) ListBox_AddItemData(hwndCtl, data) ListBox_InsertItemData(hwndCtl, index, data) ListBox_DeleteString(hwndCtl, index) ListBox_GetTextLen(hwndCtl, index) ListBox_GetText(hwndCtl, index, lpszBuffer) ListBox_GetItemData(hwndCtl, index) ListBox_SetItemData(hwndCtl, index, data) ListBox_FindString(hwndCtl, indexStart, lpszFind) ListBox_FindItemData(hwndCtl, indexStart, data) ListBox_SetSel(hwndCtl, fSelect, index) ListBox_SelItemRange(hwndCtl, fSelect, first, last) ListBox_GetCurSel(hwndCtl) ListBox_SetCurSel(hwndCtl, index) ListBox_SelectString(hwndCtl, indexStart, lpszFind) ListBox_SelectItemData(hwndCtl, indexStart, data) ListBox_GetSel(hwndCtl, index) ListBox_GetSelCount(hwndCtl) ListBox_GetTopIndex(hwndCtl) ListBox_GetSelItems(hwndCtl, cItems, lpItems) ListBox_SetTopIndex(hwndCtl, indexTop) ListBox_SetColumnWidth(hwndCtl, cxColumn) ListBox_GetHorizontalExtent(hwndCtl) ListBox_SetHorizontalExtent(hwndCtl, cxExtent) ListBox_SetTabStops(hwndCtl, cTabs, lpTabs) ListBox_GetItemRect(hwndCtl, index, lprc) ListBox_SetCaretIndex(hwndCtl, index) ListBox_GetCaretIndex(hwndCtl) ListBox_SetAnchorIndex(hwndCtl, index) ListBox_GetAnchorIndex(hwndCtl) ListBox_FindStringExact(hwndCtl, indexStart, lpszFind) ListBox_SetItemHeight(hwndCtl, index, cy) ListBox_GetItemHeight(hwndCtl, index) ListBox_Dir(hwndCtl, attrs, lpszFileSpec) ListBox_AddFile(hwndCtl, lpszFilename) /***************************************************************************/ #include #include #include #include "listbox.h" #include "mjonot.h" #define H(hWnd,id) ( id ? GetDlgItem(hWnd,id) : hWnd ) /***************************************************************************/ int get_items(HWND hWnd,int id, int all,int **items) { int i,lkm; HWND lhWnd = H(hWnd,id); *items = NULL; if ( all == ALL ) lkm = ListBox_GetCount(lhWnd); else /* SELECTED */ lkm = ListBox_GetSelCount(H(hWnd,id)); if ( lkm == LB_ERR || lkm == 0 ) return lkm; *items = malloc(sizeof(int)*lkm); if ( *items == NULL ) return -2; if ( all == ALL ) { for (i=0; i= sizeof(text)-1 ) continue; (void)ListBox_GetText(lhWnd,index,text); liita_jono(buf,n,text); liita_jono(buf,n,"\r\n"); } if ( items ) free(items); return buf; } /***************************************************************************/ int count_listbox_selsize(HWND hWnd,int id,int all) { int len,i,lkm; int *items=NULL; int size=0; HWND lhWnd = H(hWnd,id); if ( ( lkm = get_items(hWnd,id,all,&items) ) <= 0 ) return 0; for (i=0; i= 0 ) size+=len+2; /* Myös cr lf */ } if ( items ) free(items); return size+1; /* Myös NUL-merkin tila */ } /***************************************************************************/ int delete_from_listbox(HWND hWnd,int id,int all) { int i,lkm; int *items; HWND lhWnd = H(hWnd,id); if ( ( lkm = get_items(hWnd,id,all,&items) ) <= 0 ) return lkm; for (i=lkm-1; i>=0; i--) (void)ListBox_DeleteString(lhWnd,items[i]); if ( items ) free(items); return lkm; } /***************************************************************************/ int select_all_from_listbox(HWND hWnd,int id) { HWND lhWnd = H(hWnd,id); int lkm = ListBox_GetCount(lhWnd); if ( lkm <= 0 ) return lkm; (void)ListBox_SelItemRange(lhWnd,TRUE,0,lkm); return 0; }