OLD | NEW |
| (Empty) |
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |
2 /* ***** BEGIN LICENSE BLOCK ***** | |
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
4 * | |
5 * The contents of this file are subject to the Mozilla Public License Version | |
6 * 1.1 (the "License"); you may not use this file except in compliance with | |
7 * the License. You may obtain a copy of the License at | |
8 * http://www.mozilla.org/MPL/ | |
9 * | |
10 * Software distributed under the License is distributed on an "AS IS" basis, | |
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
12 * for the specific language governing rights and limitations under the | |
13 * License. | |
14 * | |
15 * The Original Code is mozilla.org code. | |
16 * | |
17 * The Initial Developer of the Original Code is | |
18 * Netscape Communications Corporation. | |
19 * Portions created by the Initial Developer are Copyright (C) 1998 | |
20 * the Initial Developer. All Rights Reserved. | |
21 * | |
22 * Contributor(s): | |
23 * | |
24 * Alternatively, the contents of this file may be used under the terms of | |
25 * either the GNU General Public License Version 2 or later (the "GPL"), or | |
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | |
27 * in which case the provisions of the GPL or the LGPL are applicable instead | |
28 * of those above. If you wish to allow use of your version of this file only | |
29 * under the terms of either the GPL or the LGPL, and not to allow others to | |
30 * use your version of this file under the terms of the MPL, indicate your | |
31 * decision by deleting the provisions above and replace them with the notice | |
32 * and other provisions required by the GPL or the LGPL. If you do not delete | |
33 * the provisions above, a recipient may use your version of this file under | |
34 * the terms of any one of the MPL, the GPL or the LGPL. | |
35 * | |
36 * ***** END LICENSE BLOCK ***** */ | |
37 #define _CRT_SECURE_NO_DEPRECATE | |
38 | |
39 #include <windows.h> | |
40 #include <windowsx.h> | |
41 #include <direct.h> | |
42 #include <stdio.h> | |
43 | |
44 #include "resource.h" | |
45 | |
46 extern HINSTANCE hInst; | |
47 | |
48 #define ITEM_BITMAPWIDTH 16 | |
49 #define ITEM_BITMAPHEIGHT 16 | |
50 #define ITEM_LEFTMARGIN 4 | |
51 #define ITEM_GAP 4 | |
52 | |
53 static HWND hWndDirPicker; | |
54 static HICON hIconDrives[5]; | |
55 static HICON hIconFolders[3]; | |
56 static LPSTR lpszStringToReturn; | |
57 static char szUNCRoot[256] = ""; | |
58 | |
59 UINT DriveType(UINT iType); | |
60 | |
61 static void fillComboBox(HWND hWnd) | |
62 { | |
63 HWND hWndCB = GetDlgItem(hWnd, ID_COMBO_DIR); | |
64 HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); | |
65 if(hWndCB == NULL) | |
66 return; | |
67 ComboBox_ResetContent(hWndCB); | |
68 ListBox_ResetContent(hWndTempLB); | |
69 ListBox_Dir(hWndTempLB, DDL_DRIVES|DDL_EXCLUSIVE, (LPSTR)"*"); | |
70 | |
71 int iDriveCount = ListBox_GetCount(hWndTempLB); | |
72 int iCurDrive=_getdrive() - 1; | |
73 | |
74 char szDrive[16]; | |
75 char szItem[80]; | |
76 | |
77 for (int i = 0; i < iDriveCount; i++) | |
78 { | |
79 ListBox_GetText(hWndTempLB, i, szDrive); | |
80 CharLower(szDrive); | |
81 int iDrive = szDrive[2] - 'a'; | |
82 char szRoot[16]; | |
83 sprintf(szRoot, "%c:\\", szDrive[2]); | |
84 | |
85 int iType = DriveType(iDrive); | |
86 | |
87 if(iType < 2) | |
88 continue; | |
89 | |
90 //Start the item string with the drive letter, colon, and two spaces | |
91 sprintf(szItem, "%c%s", szDrive[2], ": "); | |
92 | |
93 if((iType == DRIVE_FIXED) || (iType == DRIVE_RAMDISK)) | |
94 { // get volume ID | |
95 char szVolumeID[80]; | |
96 DWORD dwMaxLength; | |
97 DWORD dwSysFlags; | |
98 GetVolumeInformation(szRoot, // address of root directory of t
he file system | |
99 szVolumeID, // address of name of the volume | |
100 sizeof(szVolumeID), // length of lpVolumeNameBuffer | |
101 NULL, // address of volume serial numbe
r | |
102 &dwMaxLength, // address of system's maximum fi
lename length | |
103 &dwSysFlags, // address of file system flags | |
104 NULL, // address of name of file system
| |
105 NULL); // length of lpFileSystemNameBuff
er | |
106 | |
107 CharLower(szVolumeID); | |
108 lstrcat(szItem, szVolumeID); | |
109 } | |
110 | |
111 //For network drives, go grab the \\server\share for it. | |
112 if(DRIVE_REMOTE == iType) | |
113 { | |
114 char szNet[64]; | |
115 szNet[0] = '\0'; | |
116 DWORD dwSizeOfszNet = sizeof(szNet); | |
117 | |
118 sprintf(szDrive, "%c:", szDrive[2]); | |
119 CharUpper(szDrive); | |
120 WNetGetConnection(szDrive, szNet, &dwSizeOfszNet); | |
121 CharLower(szNet); | |
122 lstrcat(szItem, szNet); | |
123 } | |
124 | |
125 int index = ComboBox_AddString(hWndCB, szItem); | |
126 ComboBox_SetItemData(hWndCB, index, MAKELONG(iDrive, iType)); | |
127 if(iDrive == iCurDrive) | |
128 ComboBox_SetCurSel(hWndCB, index); | |
129 if(szUNCRoot[0] != '\0') | |
130 ComboBox_SetCurSel(hWndCB, -1); | |
131 } | |
132 } | |
133 | |
134 static void fillTempLBWithDirs(HWND hWndTempLB, LPSTR lpszDir) | |
135 { | |
136 BOOL bDone = FALSE; | |
137 WIN32_FIND_DATA ffdataStruct; | |
138 | |
139 char szPath[_MAX_PATH]; | |
140 char szFileName[_MAX_PATH]; | |
141 lstrcpy(szPath, lpszDir); | |
142 if(szPath[lstrlen(szPath) - 1] == '\\') | |
143 szPath[lstrlen(szPath) - 1] = '\0'; | |
144 lstrcpy(szFileName, szPath); | |
145 lstrcat(szFileName, "\\*"); | |
146 HANDLE handle = FindFirstFile(szFileName, &ffdataStruct); | |
147 if(handle == INVALID_HANDLE_VALUE) | |
148 { | |
149 FindClose(handle); | |
150 return; | |
151 } | |
152 while(!bDone) | |
153 { | |
154 lstrcpy(szFileName, szPath); | |
155 lstrcat(szFileName, "\\"); | |
156 lstrcat(szFileName, ffdataStruct.cFileName); | |
157 if(ffdataStruct. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) | |
158 { | |
159 char szStringToAdd[_MAX_PATH + 2]; | |
160 lstrcpy(szStringToAdd, "["); | |
161 lstrcat(szStringToAdd, ffdataStruct.cFileName); | |
162 lstrcat(szStringToAdd, "]"); | |
163 CharLower(szStringToAdd); | |
164 ListBox_AddString(hWndTempLB, szStringToAdd); | |
165 } | |
166 bDone = !FindNextFile(handle, &ffdataStruct); | |
167 } | |
168 FindClose(handle); | |
169 } | |
170 | |
171 static void fillListBox(HWND hWnd, LPSTR lpszDir) | |
172 { | |
173 HWND hWndLB = GetDlgItem(hWnd, ID_LIST_DIR); | |
174 HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); | |
175 HWND hWndEdit = GetDlgItem(hWnd, ID_EDIT_DIR); | |
176 if((hWndLB == NULL) || (lpszDir == NULL)) | |
177 return; | |
178 | |
179 int iLastChar = lstrlen(lpszDir); | |
180 if(lpszDir[iLastChar - 1] == '\\') | |
181 lpszDir[iLastChar - 1] = '\0'; | |
182 | |
183 SetWindowRedraw(hWndLB, FALSE); | |
184 ListBox_ResetContent(hWndLB); | |
185 ListBox_ResetContent(hWndTempLB); | |
186 | |
187 LPSTR lpszLast; | |
188 lpszLast = CharLower(lpszDir); | |
189 | |
190 SetWindowText(hWndLB, lpszDir); | |
191 | |
192 char szDir[_MAX_DIR]; | |
193 char szFullDir[_MAX_DIR]; | |
194 sprintf(szFullDir, "%s", lpszDir); | |
195 sprintf(szDir, "%s\\*.*", lpszDir); | |
196 | |
197 BOOL bFirst = TRUE; | |
198 char ch; | |
199 int index; | |
200 while (TRUE) | |
201 { | |
202 LPSTR lpsz; | |
203 if((lpszDir[0] == '\\') && (lpszDir[1] == '\\') && bFirst) | |
204 lpsz = strchr(lpszLast + lstrlen(szUNCRoot), '\\'); | |
205 else | |
206 lpsz = strchr(lpszLast, '\\'); | |
207 if(lpsz != NULL) { | |
208 if (bFirst) | |
209 ch = *(++lpsz); | |
210 else | |
211 ch = *lpsz; | |
212 *lpsz = 0; | |
213 } | |
214 else | |
215 { | |
216 //If we're looking at a drive only, then append a backslash | |
217 if (lpszLast == lpszDir && bFirst) | |
218 lstrcat(lpszLast, "\\"); | |
219 } | |
220 //Add the drive string--includes the last one where lpsz == NULL | |
221 index = ListBox_AddString(hWndLB, lpszLast); | |
222 | |
223 UINT i = (NULL != lpsz) ? ID_ICON_FOLDEROPEN : ID_ICON_OPENSELECT; | |
224 ListBox_SetItemData(hWndLB, index, MAKELONG(index, i)); | |
225 | |
226 if(NULL == lpsz) | |
227 break; | |
228 | |
229 //Restore last character. | |
230 *lpsz = ch; | |
231 lpsz += (bFirst) ? 0 : 1; | |
232 | |
233 bFirst=FALSE; | |
234 lpszLast = lpsz; | |
235 } | |
236 int indent = index + 1; | |
237 | |
238 //Get available directories | |
239 fillTempLBWithDirs(hWndTempLB, lpszDir); | |
240 | |
241 int itemCount = ListBox_GetCount(hWndTempLB); | |
242 | |
243 int i=0; | |
244 for (i = 0; i < itemCount; i++) { | |
245 index = ListBox_GetText(hWndTempLB, i, lpszDir); | |
246 //Skip directories beginning with . (skipping . and ..) | |
247 if(lpszDir[1] == '.') | |
248 continue; | |
249 //Remove the ending ']' | |
250 iLastChar = lstrlen(lpszDir); | |
251 lpszDir[iLastChar - 1] = '\0'; | |
252 //Add the string to the real directory list. | |
253 index = ListBox_AddString(hWndLB, lpszDir + 1); | |
254 ListBox_SetItemData(hWndLB, index, MAKELONG(indent, ID_ICON_FOLDERCLOSED)); | |
255 } | |
256 //Force a listbox repaint. | |
257 SetWindowRedraw(hWndLB, TRUE); | |
258 InvalidateRect(hWndLB, NULL, TRUE); | |
259 | |
260 if(szFullDir[lstrlen(szFullDir) - 1] == ':') | |
261 lstrcat(szFullDir, "\\"); | |
262 Edit_SetText(hWndEdit, szFullDir); | |
263 | |
264 GetScrollRange(hWndLB, SB_VERT, (LPINT)&i, (LPINT)&index); | |
265 | |
266 if(!(i == 0 && index == 0)) | |
267 ListBox_SetTopIndex(hWndLB, max((int)(index - 2), 0)); | |
268 | |
269 ListBox_SetCurSel(hWndLB, indent - 1); | |
270 } | |
271 | |
272 static void onDrawItem(LPDRAWITEMSTRUCT lpdis, BOOL bDrive) | |
273 { | |
274 if((int)lpdis->itemID < 0) | |
275 return; | |
276 | |
277 char szItem[_MAX_DIR]; | |
278 DWORD dwItemData; | |
279 | |
280 if(bDrive) | |
281 { | |
282 dwItemData = ComboBox_GetItemData(lpdis->hwndItem, lpdis->itemID); | |
283 ComboBox_GetLBText(lpdis->hwndItem, lpdis->itemID, szItem); | |
284 } | |
285 else | |
286 { | |
287 dwItemData = ListBox_GetItemData(lpdis->hwndItem, lpdis->itemID); | |
288 ListBox_GetText(lpdis->hwndItem, lpdis->itemID, szItem); | |
289 } | |
290 | |
291 if(lpdis->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) | |
292 { | |
293 COLORREF colorText; | |
294 COLORREF colorBack; | |
295 if(lpdis->itemState & ODS_SELECTED) | |
296 { | |
297 colorText = SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); | |
298 colorBack = SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); | |
299 } | |
300 HICON hIcon; | |
301 int indent = 0; | |
302 if(bDrive) | |
303 { | |
304 int iType=(int)HIWORD(dwItemData); | |
305 switch (iType) | |
306 { | |
307 case DRIVE_REMOVABLE: | |
308 hIcon = hIconDrives[0]; | |
309 break; | |
310 case DRIVE_FIXED: | |
311 hIcon = hIconDrives[1]; | |
312 break; | |
313 case DRIVE_REMOTE: | |
314 hIcon = hIconDrives[2]; | |
315 break; | |
316 case DRIVE_CDROM: | |
317 hIcon = hIconDrives[3]; | |
318 break; | |
319 case DRIVE_RAMDISK: | |
320 hIcon = hIconDrives[4]; | |
321 break; | |
322 } | |
323 | |
324 } | |
325 else | |
326 { | |
327 int iconID = (int)HIWORD(lpdis->itemData); | |
328 switch (iconID) | |
329 { | |
330 case ID_ICON_FOLDERCLOSED: | |
331 hIcon = hIconFolders[0]; | |
332 break; | |
333 case ID_ICON_FOLDEROPEN: | |
334 hIcon = hIconFolders[1]; | |
335 break; | |
336 case ID_ICON_OPENSELECT: | |
337 hIcon = hIconFolders[2]; | |
338 break; | |
339 } | |
340 indent = 4 * (1 + LOWORD(lpdis->itemData)); | |
341 } | |
342 | |
343 ExtTextOut(lpdis->hDC, | |
344 lpdis->rcItem.left + ITEM_LEFTMARGIN + ITEM_BITMAPWIDTH + ITEM_GA
P + indent, | |
345 lpdis->rcItem.top, | |
346 ETO_OPAQUE | ETO_CLIPPED, | |
347 &lpdis->rcItem, | |
348 szItem, | |
349 lstrlen(szItem), | |
350 NULL); | |
351 | |
352 BOOL res = DrawIcon(lpdis->hDC, | |
353 lpdis->rcItem.left + ITEM_LEFTMARGIN + indent, | |
354 lpdis->rcItem.top, | |
355 hIcon); | |
356 | |
357 if(lpdis->itemState & ODS_SELECTED) | |
358 { | |
359 SetTextColor(lpdis->hDC, colorText); | |
360 SetBkColor(lpdis->hDC, colorBack); | |
361 } | |
362 } | |
363 if((lpdis->itemAction & ODA_FOCUS) || (lpdis->itemState & ODS_FOCUS)) | |
364 DrawFocusRect(lpdis->hDC, &lpdis->rcItem); | |
365 } | |
366 | |
367 static void fillUNCRootArray(LPSTR lpsz) | |
368 { | |
369 char szCurDir[_MAX_PATH]; | |
370 _getcwd(szCurDir, sizeof(szCurDir)); | |
371 lstrcpy(szUNCRoot, lpsz); | |
372 if(szUNCRoot[lstrlen(szUNCRoot) - 1] == '\\') | |
373 szUNCRoot[lstrlen(szUNCRoot) - 1] = '\0'; | |
374 for(;;) | |
375 { | |
376 LPSTR lptemp = strrchr(szUNCRoot, '\\'); | |
377 if(lptemp == NULL) | |
378 break; | |
379 *lptemp = '\0'; | |
380 if(_chdir(szUNCRoot) == -1) | |
381 { | |
382 *lptemp = '\\'; | |
383 break; | |
384 } | |
385 } | |
386 _chdir(szCurDir); | |
387 } | |
388 | |
389 static void onInitDialog(HWND hWnd, LPSTR lpsz) | |
390 { | |
391 hWndDirPicker = hWnd; | |
392 lpszStringToReturn = lpsz; | |
393 | |
394 hIconDrives[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEFLOPPY)); | |
395 hIconDrives[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEHARD)); | |
396 hIconDrives[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVENETWORK)); | |
397 hIconDrives[3] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVECDROM)); | |
398 hIconDrives[4] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVERAM)); | |
399 | |
400 hIconFolders[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDERCLOSED)); | |
401 hIconFolders[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDEROPEN)); | |
402 hIconFolders[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_OPENSELECT)); | |
403 | |
404 if(lpsz[0] == '\0') | |
405 _getcwd(lpsz, _MAX_PATH); | |
406 else if(lpsz[lstrlen(lpsz) - 1] == ':') | |
407 lstrcat(lpsz, "\\"); | |
408 | |
409 int ret = _chdir(lpsz); | |
410 if(ret == -1) | |
411 { | |
412 char szText[_MAX_PATH + 80]; | |
413 sprintf(szText, "The specified directory %s\ncannot be found", lpsz); | |
414 MessageBox(GetParent(hWnd), szText, "Choose Directory", MB_ICONEXCLAMATION|M
B_OK); | |
415 _getcwd(lpsz, _MAX_PATH); | |
416 } | |
417 if((lpsz[0] == '\\') && (lpsz[1] == '\\')) | |
418 fillUNCRootArray(lpsz); | |
419 fillListBox(hWnd, lpsz); | |
420 fillComboBox(hWnd); | |
421 } | |
422 | |
423 static void shutDialog(HWND hWnd) | |
424 { | |
425 szUNCRoot[0] = '\0'; | |
426 } | |
427 | |
428 static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) | |
429 { | |
430 char szCurDir[_MAX_PATH]; | |
431 switch(id) | |
432 { | |
433 case ID_LIST_DIR: | |
434 if(codeNotify == LBN_DBLCLK) | |
435 { | |
436 int index = ListBox_GetCurSel(hWndCtl); | |
437 DWORD dwItemData = ListBox_GetItemData(hWndCtl, index); | |
438 | |
439 if(HIWORD(dwItemData) == ID_ICON_OPENSELECT) | |
440 { | |
441 shutDialog(hWnd); | |
442 char szString[_MAX_PATH]; | |
443 Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(
szString)); | |
444 lstrcpy(lpszStringToReturn, szString); | |
445 EndDialog(hWnd, IDOK); | |
446 break; | |
447 } | |
448 | |
449 ListBox_GetText(hWndCtl, index, szCurDir); | |
450 | |
451 char szDir[_MAX_DIR]; | |
452 LPSTR lpsz; | |
453 if((HIWORD(dwItemData) == ID_ICON_FOLDEROPEN) && (index != 0)) | |
454 { | |
455 GetWindowText(hWndCtl, szDir, sizeof(szDir)); | |
456 lpsz=_fstrstr(szDir, szCurDir); | |
457 *(lpsz + lstrlen(szCurDir)) = '\0'; | |
458 lstrcpy(szCurDir, szDir); | |
459 } | |
460 if (_chdir(szCurDir) == 0) | |
461 { | |
462 _getcwd(szCurDir, _MAX_PATH); | |
463 fillListBox(hWndDirPicker, szCurDir); | |
464 } | |
465 } | |
466 break; | |
467 case ID_COMBO_DIR: | |
468 if(codeNotify == CBN_SELCHANGE) | |
469 { | |
470 char szDrive[80]; | |
471 int index = ComboBox_GetCurSel(hWndCtl); | |
472 if(index == CB_ERR) | |
473 break; | |
474 ComboBox_GetLBText(hWndCtl, index, szDrive); | |
475 | |
476 int iCurDrive = _getdrive(); | |
477 Retry: | |
478 HCURSOR hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); | |
479 SetCapture(hWndDirPicker); | |
480 if((0 == _chdrive((int)(szDrive[0] - 'a' + 1))) && (NULL != _getcwd(szCu
rDir, _MAX_PATH))) | |
481 { | |
482 fillListBox(hWndDirPicker, szCurDir); | |
483 ListBox_SetTopIndex(GetDlgItem(hWndDirPicker, ID_LIST_DIR), 0); | |
484 SetCursor(hCursorOld); | |
485 ReleaseCapture(); | |
486 break; | |
487 } | |
488 SetCursor(hCursorOld); | |
489 ReleaseCapture(); | |
490 | |
491 char szText[80]; | |
492 sprintf(szText, "Cannot read drive %c:", szDrive[0]); | |
493 if(IDRETRY == MessageBox(hWndDirPicker, szText, "Choose Directory", MB_I
CONEXCLAMATION|MB_RETRYCANCEL)) | |
494 goto Retry; | |
495 | |
496 //Changing drives failed so restore drive and selection | |
497 _chdrive(iCurDrive); | |
498 | |
499 sprintf(szDrive, "%c:", (char)(iCurDrive + 'a' - 1)); | |
500 index = ComboBox_SelectString(hWndCtl, -1, szDrive); | |
501 } | |
502 break; | |
503 case IDOK: | |
504 shutDialog(hWnd); | |
505 char szString[_MAX_PATH]; | |
506 Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(szSt
ring)); | |
507 lstrcpy(lpszStringToReturn, szString); | |
508 EndDialog(hWnd, IDOK); | |
509 break; | |
510 case IDCANCEL: | |
511 shutDialog(hWnd); | |
512 lpszStringToReturn[0] = '\0'; | |
513 EndDialog(hWnd, IDCANCEL); | |
514 break; | |
515 default: | |
516 break; | |
517 } | |
518 } | |
519 | |
520 static BOOL CALLBACK DirPickDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
Param) | |
521 { | |
522 switch(msg) { | |
523 case WM_INITDIALOG: | |
524 onInitDialog(hWnd, (LPSTR)lParam); | |
525 break; | |
526 case WM_COMMAND: | |
527 HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand); | |
528 break; | |
529 case WM_MEASUREITEM: | |
530 { | |
531 static int cyItem = -1; //Height of a listbox item | |
532 LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam; | |
533 if(cyItem == -1) | |
534 { | |
535 HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0L); | |
536 if(hFont == NULL) | |
537 hFont = GetStockFont(SYSTEM_FONT); | |
538 HDC hDC = GetDC(hWnd); | |
539 HFONT hFontOld = SelectFont(hDC, hFont); | |
540 TEXTMETRIC tm; | |
541 GetTextMetrics(hDC, &tm); | |
542 cyItem = max(ITEM_BITMAPHEIGHT, tm.tmHeight); | |
543 SelectFont(hDC, hFontOld); | |
544 ReleaseDC(hWnd, hDC); | |
545 } | |
546 | |
547 lpmis->itemHeight = cyItem; | |
548 } | |
549 break; | |
550 case WM_DRAWITEM: | |
551 onDrawItem((LPDRAWITEMSTRUCT)lParam, ((UINT)wParam == ID_COMBO_DIR)); | |
552 return TRUE; // to prevent default action in listbox (drawing focus) | |
553 default: | |
554 return FALSE; | |
555 } | |
556 return TRUE; | |
557 } | |
558 | |
559 /* | |
560 * DriveType | |
561 * | |
562 * Purpose: | |
563 * Augments the Windows API GetDriveType with a call to the CD-ROM | |
564 * extensions to determine if a drive is a floppy, hard disk, CD-ROM, | |
565 * RAM-drive, or networked drive. | |
566 * | |
567 * Parameters: | |
568 * iDrive UINT containing the zero-based drive index | |
569 * | |
570 * Return Value: | |
571 * UINT One of the following values describing the drive: | |
572 * DRIVE_FLOPPY, DRIVE_HARD, DRIVE_CDROM, DRIVE_RAMDISK, | |
573 * DRIVE_NETWORK. | |
574 * | |
575 * Copyright (c)1992 Kraig Brockschmidt, All Right Reserved | |
576 * Compuserve: 70750,2344 | |
577 * Internet : kraigb@microsoft.com | |
578 * | |
579 */ | |
580 UINT DriveType(UINT iDrive) | |
581 { | |
582 //Validate possible drive indices | |
583 if((0 > iDrive) || (25 < iDrive)) | |
584 return (UINT)-1; | |
585 | |
586 static char path[] = "d:\\"; | |
587 path[0] = 'a' + iDrive; | |
588 int iType = GetDriveType(path); | |
589 | |
590 /* | |
591 * Under Windows NT, GetDriveType returns complete information | |
592 * not provided under Windows 3.x which we now get through other | |
593 * means. | |
594 */ | |
595 | |
596 return iType; | |
597 } | |
598 | |
599 BOOL PickupDirectory(HWND hWndOwner, LPSTR lpszString) | |
600 { | |
601 if(hWndOwner == NULL) | |
602 hWndOwner = GetDesktopWindow(); | |
603 int ret = DialogBoxParam(hInst, MAKEINTRESOURCE(ID_DIALOG_CHOOSEDIR), hWndOwne
r, DirPickDlgProc, (LPARAM)lpszString); | |
604 return (ret == IDOK); | |
605 } | |
OLD | NEW |