Re: Common Dialogs
- Posted by euman at bellsouth.net Oct 11, 2001
- 378 views
And to think I've been doing it like this for sometime now..... Makes me want to revert back to win32lib ,, ,, ,, ,, naw..hehe global function getDrives() sequence drive,Drives,DrivesReady,info atom bit integer DriveLetter retv=c_func(hGetLogicalDrives,{}) Drives={} DrivesReady={} bit=1 for k=1 to 26 do if and_bits(bit,retv) then DriveLetter=k+64 drive=DriveLetter&":\\" Drives=append(Drives,drive) end if bit=bit*2 end for return Drives end function global sequence drives drives = getDrives() -- check for drives integer Serial, Dtype_str, Dtype sequence Drive_ids Drive_ids = {} -- get volume name and serial # sequence Drive_type Drive_type = {} -- type of drive for i = 1 to length(drives) do Dtype_str = allocate_string2(drives[i]) Dtype = c_func(xGetDriveType, {Dtype_str}) Drive_ids = append(Drive_ids, getVolSerial(drives[i])) Drive_type = append(Drive_type, Dtype) free(Dtype_str) end for atom TreeView1 TreeView1 = 0 global function WndProc(atom hwnd, atom iMsg, atom wParam, atom lParam) if iMsg = WM_CREATE then TreeView1 = MakeTreeView(hwnd, "TreeView1", 175, 190, 175, 150) c_proc(ShowWindow,{TreeView1, 1}) for i = 1 to length(drives) do if length(Drive_ids[i][1]) > 0 then iParent = allocate_string2(Drive_ids[i][1] & " " & drives[i]) else iParent = allocate_string2(drives[i]) end if poke4( tvstruct + TVINSERTSTRUCTITEM_pszText,iParent) poke4( tvstruct + TVINSERTSTRUCTITEM_iImage,Drive_type[i]-2) poke4( tvstruct + TVINSERTSTRUCTITEM_iSelectedImage,Drive_type[i]-2) hParent = c_func(SendMessage,{TreeView1,TVM_INSERTITEM, 0, tvstruct}) free(iParent) end for elsif iMsg = WM_NOTIFY then id = peek4s(lParam + NMHDR_hwndFrom) elsif id = TreeView1 then iMsg = peek4s(lParam + NMHDR_code) if iMsg = TVN_SELCHANGED then --NM_CLICK then -- TreeView count = c_func(SendMessage,{id, TVM_GETCOUNT, 0, 0}) item = c_func(SendMessage,{id,TVM_GETNEXTITEM, 0, TVGN_ROOT}) poke4(tvitem + tvitem_hItem,item) poke4(tvitem + tvitem_mask,TVIF_TEXT) poke4(tvitem + tvitem_stateMask, TVIS_SELECTED) txtbuff = allocate(256) poke4(tvitem + tvitem_pszText,txtbuff) poke4(tvitem + tvitem_cchTextMax,256) junk = c_func(SendMessage,{id, TVM_GETITEM, 0, tvitem}) for i = 1 to count do cmd = peek4s(tvitem + tvitem_state ) if and_bits(cmd, TVIS_SELECTED) then exit end if item = c_func(SendMessage,{id, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, item}) poke4( tvitem + tvitem_hItem, item) junk = c_func(SendMessage,{id, TVM_GETITEM, 0, tvitem}) end for txt = peek_string(txtbuff) str_len = length(txt) junk = c_func(xSelectObject,{memdc, hnewfnt}) junk = c_func(xSetTextAlign, {memdc, TA_CENTER}) junk = c_func(xSetBkColor, {memdc, 9348520}) junk = c_func(xSetTextColor, {memdc, rgb(0, 0, 0)}) c_proc(xTextOut, {memdc, 270, 350, txtbuff, str_len}) junk = c_func(xInvalidateRect, {hwnd, NULL, 0}) free(txtbuff) end if return c_func(DefWindowProc, {hwnd, iMsg, wParam, lParam}) end function And this is only a very small part of the whole process.... Euman euman at bellsouth.net > Try this, append to end of win32lib. > This version doesn't crash on my machine, and cannot select > my computer or network neighborhood. > You can select the selected directory name. > If this is better you can include this to next release of > win32lib. but change the memory routines to win32lib's. > Example use: x = getFolder(Window1, "c:\\windows", > "Select folder") > > ---------------------------- > constant xSHBrowseForFolder = > registerw32Function(shell32,"SHBrowseForFolderA", {C_POINTER}, > C_POINTER) > > constant xSHGetPathFromIDList = > registerw32Function(shell32,"SHGetPathFromIDList",{C_ULONG,C_POINTER},C_ULONG) > > > function callbackselect(atom hWnd, atom uMsg, atom lParam, atom lpData) > object x > if uMsg = 1 then > x = w32Func(xSendMessage, {hWnd, 1126, 1, lpData}) > end if > return 0 > end function > > global function getFolder(atom id, sequence filename, sequence title) > object bi, pbi, ret, folder, pfolder > if length(filename)=2 and filename[2]=':' then > filename &= '\\' > elsif filename[length(filename)] = '\\' then > filename = filename[1..length(filename)-1] > end if > bi = {0,0,0,0, -- hwndOwner = 1 > 0,0,0,0, -- pIDLRoot = 5 > 0,0,0,0, -- pszDisplayName = 9 > 0,0,0,0, -- lpszTitle = 13 > 0,0,0,0, -- ulFlags = 17 > 0,0,0,0, -- lpfnCallback = 21 > 0,0,0,0, -- lParam = 25 > 0,0,0,0} -- iImage = 29 > bi[1..4] = int_to_bytes(getHandle(id)) > bi[13..16] = int_to_bytes(allocate_string(title)) > bi[17..20] = int_to_bytes(1) > bi[21..24] = > int_to_bytes(call_back(routine_id("callbackselect"))) > bi[25..28] = int_to_bytes(allocate_string(filename)) > pbi = allocate(length(bi)) > poke(pbi, bi) > ret = w32Func(xSHBrowseForFolder, {pbi}) > free(bytes_to_int(bi[13..16])) > free(bytes_to_int(bi[21..24])) > free(bytes_to_int(bi[25..28])) > free(pbi) > > pfolder = allocate(256) > if w32Func(xSHGetPathFromIDList,{ret,pfolder}) then > folder = peek_string(pfolder) > else > folder = "" > end if > free(pfolder) > return folder > end function