//------------------------------------------------------- treeselect.h #pragma once #include "Platform.h" typedef struct tagTREESELECT { //in: WCHAR wszTitle[32]; LPSAFEARRAY lpArray; //out: long lSelected; } TREESELECT, *LPTREESELECT; BOOL TreeSelect(LPTREESELECT); //------------------------------------------------------- treeselect.c #include "Platform.h" #include "App.h" #include "TreeSelect.h" INT_PTR CALLBACK TreeSelectDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static LPTREESELECT lpParam; static HWND hTree; switch(uMsg) { case WM_INITDIALOG: { HTREEITEM *lpItems; LONG lColsCount; LONG lRowsCount; TVITEM tvi; TVINSERTSTRUCT tvins; BOOL bNeedInsert = TRUE; LONG i, j; hTree = GetDlgItem(hWnd, IDC_TREE); lpParam = (LPTREESELECT)lParam; SetWindowText(hWnd, lpParam->wszTitle); SafeArrayGetUBound(lpParam->lpArray, 1, &lColsCount); lColsCount ++; SafeArrayGetUBound(lpParam->lpArray, 2, &lRowsCount); lRowsCount ++; lpItems = GlobalAlloc(LPTR, sizeof(HTREEITEM)*lRowsCount); while(bNeedInsert) { bNeedInsert = FALSE; for(i = 0; i < lRowsCount; i++) { if(!lpItems[i]) { tvi.mask = TVIF_TEXT | TVIF_PARAM; tvi.cchTextMax = 256; tvins.item = tvi; tvins.hInsertAfter = TVI_LAST; tvi.pszText = L"TEST";//((VARIANT*)lpParam->lpArray->pvData)[i*lColsCount + 2].bstrVal; tvi.lParam = (LPARAM)i; tvins.hParent = TVI_ROOT; lpItems[i] = TreeView_InsertItem(hTree, &tvins); bNeedInsert = TRUE; } continue; } } GlobalFree(lpItems); return 0; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDOK: { EndDialog(hWnd, IDOK); return 0; } case IDC_CLEAR: { lpParam->lSelected = -1; EndDialog(hWnd, IDOK); return 0; } case IDCANCEL: { EndDialog(hWnd, IDCANCEL); return 0; } } return -1; } } return 0; } BOOL TreeSelect(LPTREESELECT lpParam) { return DialogBoxParam(lpApp->hInstance, MAKEINTRESOURCE(IDD_TREE_SELECT), GetActiveWindow(), (DLGPROC)TreeSelectDlgProc, (LPARAM)lpParam) == IDOK; }