WS_CHILD.C
上传用户:dansui
上传日期:2007-01-04
资源大小:71k
文件大小:29k
源码类别:

Ftp客户端

开发平台:

WINDOWS

  1. /***************************************************************************
  2.   Windows Sockets FTP Client Application Support Module
  3.   Written by:
  4.      Santanu Lahiri              Internet: slahiri@magnus.acs.ohio-state.edu
  5. Converted the Create Buttons calls to simulated buttons.  Added necessary
  6. WM_PAINT code to handle displaying the buttons in the appropriate mode
  7. Added the ComboBox "History" feature.
  8. Cleaned up WM_PAINT code that was eating resources - Deselected created
  9. brushes and pens before the hdc was released.
  10. *****************************************************************************/
  11. /*
  12.   MODULE: WS_CHILD.C  (child window functions)
  13. */
  14. #include "ws_glob.h"
  15. #include "winftp.H"
  16. #include <dos.h>
  17. #include <ctype.h>
  18. #define WS_CHILDSTYLE  WS_CHILD|WS_VISIBLE
  19. #define LBS_STYLE      LBS_STANDARD|WS_VSCROLL|WS_CHILDSTYLE|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT
  20. #define WS_TXTSTYLE    WS_CHILDSTYLE|SS_LEFTNOWORDWRAP
  21. #define WS_RADIOSTYLE  WS_CHILDSTYLE|BS_RADIOBUTTON
  22. #define CBS_STYLE      WS_CHILDSTYLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_HASSTRINGS|CBS_SORT
  23. #define SBV_STYLE      WS_CHILDSTYLE|SBS_VERT|WS_VISIBLE
  24. #define EDT_STYLE      WS_CHILDSTYLE|WS_BORDER|ES_AUTOHSCROLL
  25. #define XSIZ(x) (x*nWndx)/4
  26. #define YSIZ(x) (x*nWndy)/8
  27. #ifdef WIN32
  28.    #define MAXLINES 150
  29. #else
  30.    #define MAXLINES 100
  31. #endif
  32. #define STATLEN  151
  33. char *lpStatusLines=NULL;
  34. int nStatusPtr=0;
  35. int nStatusScroll=1;
  36. RECT rcMsg;
  37. BOOL bCanMKD,bCanRMD,bCanREN,bCanDELE,bIsQVT,bIsNCSA,bIs5000,bIsDual;
  38. BOOL bHELP=FALSE;
  39. LPSTR lpListBox = "listbox";
  40. LPSTR lpButton  = "button";
  41. LPSTR lpStatic  = "static";
  42. LPSTR lpEdit    = "edit";
  43. LPSTR lpComboBox= "combobox";
  44. LPSTR lpScroll  = "scrollbar";
  45. LPSTR lpChgDir  = "ChgDir";
  46. LPSTR lpMkDir   = "MkDir";
  47. LPSTR lpRmDir   = "RmDir";
  48. LPSTR lpRefresh = "Refresh";
  49. LPSTR lpDisplay = "Display";
  50. LPSTR lpRename  = "Rename";
  51. LPSTR lpDelete  = "Delete";
  52. LPSTR lpConnect = "Connect";
  53. LPSTR lpClose   = "Close";
  54. LPSTR lpLongDir = "LongDir";
  55. LPSTR lpAbort   = "Abort";
  56. LPSTR lpOptions = "Options";
  57. LPSTR lpAbout   = "About";
  58. LPSTR lpExit    = "Exit";
  59. LPSTR lpToRemote= "-->";
  60. LPSTR lpToLocal = "<--";
  61. typedef struct
  62. {
  63.   LPSTR *lpBtnTxt;
  64.   RECT rcBtn;
  65.   int nBtnID, nStat;
  66.   int nTxtx, nTxty;
  67.   int nSendMsg;
  68.   RECT rcExt;
  69. } BTNPOS;
  70. static RECT rcLEdt, rcREdt, rcLLst, rcRLst, rcLDir, rcLFile, rcRDir, rcRFile;
  71. #define  BUTTONS   23
  72. BOOL bEnabled[BUTTONS];
  73. BTNPOS bpButton[BUTTONS] = 
  74. {  
  75.   &lpChgDir,  {  84,  32, 26, 13}, BTN_LCHANGE,         0, 0, 0, 0, {0, 0, 0, 0},
  76.   &lpMkDir,   {  84,  46, 26, 13}, BTN_LMKDIR,          0, 0, 0, 0, {0, 0, 0, 0},
  77.   &lpRmDir,   {  84,  60, 26, 13}, BTN_LRMDIR,          0, 0, 0, 0, {0, 0, 0, 0},
  78.   &lpRefresh, {  84,  84, 26, 13}, BTN_LREFRESH,        0, 0, 0, 0, {0, 0, 0, 0},
  79.   &lpDisplay, {  84, 107, 26, 13}, BTN_LDISPLAY,        0, 0, 0, 0, {0, 0, 0, 0},
  80.   &lpRename,  {  84, 121, 26, 13}, BTN_LRENAME,         0, 0, 0, 0, {0, 0, 0, 0},
  81.   &lpDelete,  {  84, 135, 26, 13}, BTN_LDELETE,         0, 0, 0, 0, {0, 0, 0, 0},
  82.   &lpChgDir,  { 213,  32, 26, 13}, BTN_RCHANGE,         0, 0, 0, 0, {0, 0, 0, 0},
  83.   &lpMkDir,   { 213,  46, 26, 13}, BTN_RMKDIR,          0, 0, 0, 0, {0, 0, 0, 0},
  84.   &lpRmDir,   { 213,  60, 26, 13}, BTN_RRMDIR,          0, 0, 0, 0, {0, 0, 0, 0},
  85.   &lpRefresh, { 213,  84, 26, 13}, BTN_RREFRESH,        0, 0, 0, 0, {0, 0, 0, 0},
  86.   &lpDisplay, { 213, 107, 26, 13}, BTN_RDISPLAY,        0, 0, 0, 0, {0, 0, 0, 0},
  87.   &lpRename,  { 213, 121, 26, 13}, BTN_RRENAME,         0, 0, 0, 0, {0, 0, 0, 0},
  88.   &lpDelete,  { 213, 135, 26, 13}, BTN_RDELETE,         0, 0, 0, 0, {0, 0, 0, 0},
  89.   &lpToLocal, { 116, 101, 14, 13}, BTN_REMOTE_TO_LOCAL, 0, 0, 0, 0, {0, 0, 0, 0},
  90.   &lpToRemote,{ 116, 118, 14, 13}, BTN_LOCAL_TO_REMOTE, 0, 0, 0, 0, {0, 0, 0, 0},
  91.   &lpConnect, {   4, 185, 32,  9}, BTN_CONNECT,         0, 0, 0, 0, {0, 0, 0, 0},
  92.   &lpClose,   {  38, 185, 32,  9}, BTN_CLOSE,           0, 0, 0, 0, {0, 0, 0, 0},
  93.   &lpLongDir, {  72, 185, 32,  9}, BTN_LONG,            0, 0, 0, 0, {0, 0, 0, 0},
  94.   &lpAbort,   { 106, 185, 34,  9}, BTN_ABORT,           0, 0, 0, 1, {0, 0, 0, 0},
  95.   &lpOptions, { 142, 185, 32,  9}, BTN_OPTION,          0, 0, 0, 0, {0, 0, 0, 0},
  96.   &lpAbout,   { 176, 185, 32,  9}, BTN_ABOUT,           0, 0, 0, 0, {0, 0, 0, 0},
  97.   &lpExit,    { 210, 185, 32,  9}, BTN_EXIT,            0, 0, 0, 0, {0, 0, 0, 0} 
  98. };
  99. //*********************************************************************
  100. //  Create the Button positions array.  Compute the actual screen sizes
  101. //  and the screen text positions based on the initial button position
  102. //  and size.  Use the actual screen size of text to locate it in a button.
  103. //*********************************************************************
  104. void CreateButtonPos (HWND hWnd)
  105. {
  106.   HDC hdc;
  107.   DWORD dwExt;
  108.   RECT rc;
  109.   int nI, cExt, cHt;
  110. #ifdef WIN32
  111.   SIZE sizeStr;
  112. #endif
  113.   
  114.   hdc = GetDC (hWnd);
  115.   SelectObject (hdc, GetStockObject (ANSI_VAR_FONT));   //  This allows actual size calc.
  116.   for (nI=0; nI<sizeof (bpButton)/sizeof (BTNPOS); nI++)
  117.   {
  118.     bEnabled[nI] = TRUE;
  119. #ifdef WIN32
  120.     dwExt = GetTextExtentPoint (hdc, *bpButton[nI].lpBtnTxt, lstrlen (*bpButton[nI].lpBtnTxt), &sizeStr);
  121.     cExt = sizeStr.cx;                 //  Length of screen text
  122.     cHt  = sizeStr.cy;                 //  Height of screen text
  123. #else
  124.     dwExt = GetTextExtent (hdc, *bpButton[nI].lpBtnTxt, lstrlen (*bpButton[nI].lpBtnTxt));
  125.     cExt = LOWORD (dwExt);                 //  Length of screen text
  126.     cHt  = HIWORD (dwExt);                 //  Height of screen text
  127. #endif
  128.     
  129.     rc = bpButton[nI].rcExt = bpButton[nI].rcBtn;  //  Copy button size for later use
  130.     rc.right += rc.left;                   //  Compute screen right bound
  131.     rc.bottom+= rc.top;                    //  Compute screen lower bound
  132.     rc.left   = (rc.left   * nWndx) / 4;   //  Convert to MM_TEXT pixel count
  133.     rc.top    = (rc.top    * nWndy) / 8;
  134.     rc.right  = (rc.right  * nWndx) / 4;
  135.     rc.bottom = (rc.bottom * nWndy) / 8;
  136.     bpButton[nI].rcBtn = rc;               //  Save the computed sizes.
  137.     bpButton[nI].nTxtx = (rc.left+rc.right-cExt)/2;  //  Compute the text position
  138.     bpButton[nI].nTxty = (rc.top+rc.bottom-cHt)/2;   //  horizontal and vertical both.
  139.   }
  140.   
  141.   rcMsg.top    = YSIZ (164);
  142.   rcMsg.bottom = YSIZ (179);
  143.   rcMsg.left   = XSIZ (8);
  144.   rcMsg.right  = XSIZ (228);
  145.   
  146.   ReleaseDC (hWnd, hdc);    //  Done here, release resources.
  147. }
  148. //*********************************************************************
  149. //*********************************************************************
  150. void CreateListRectPos (LPRECT rcLDir, int nX, int nY, int nExt, int nH)
  151. {
  152.   rcLDir->left  = nX;
  153.   rcLDir->top   = nY;
  154.   rcLDir->right = nX+nExt-1;
  155.   rcLDir->bottom= nY+nH-1;
  156. }
  157. //*********************************************************************
  158. //*********************************************************************
  159. int GetChildWindowID (LPARAM lParam)
  160. {
  161.   POINT pt;
  162.   BOOL bFlag = (pt.y > rcLLst.bottom);
  163.   pt.y = HIWORD (lParam);
  164.   pt.x = LOWORD (lParam);
  165.   if (PtInRect (&rcLFile, pt)) return LST_LFILES;
  166.   if (PtInRect (&rcRFile, pt)) return LST_RFILES;
  167.   if (PtInRect (&rcLDir, pt)) return LST_LDIRS;
  168.   if (PtInRect (&rcRDir, pt)) return LST_RDIRS;
  169.   if (PtInRect (&rcLLst, pt)) return LST_LDIRLST;
  170.   if (PtInRect (&rcRLst, pt)) return LST_RDIRLST;
  171.   if (PtInRect (&rcLEdt, pt)) return EDT_LFILETYPE;
  172.   if (PtInRect (&rcREdt, pt)) return EDT_RFILETYPE;
  173.   
  174.   return 0;
  175. }
  176. //*********************************************************************
  177. //*********************************************************************
  178. int CreateSubWindows(HWND hParent,HWND hInst)
  179. {
  180.   HFONT hFont = GetStockObject (ANSI_VAR_FONT);
  181.   int nX1, nX2, nY1, nY2, nH1, nH2, nExt;
  182.   CreateButtonPos (hParent);  //  Create the button screen positions.
  183.   
  184.   nExt= XSIZ ( 28);           //  Editbox Extent
  185.   nX1 = XSIZ ( 81);           //  Local File Type position
  186.   nX2 = XSIZ (210);           //  Remote File Type position
  187.   nY1 = YSIZ (  6);           //  EditBox Y position
  188.   nH1 = YSIZ ( 10);           //  EditBox height
  189.   CreateWindow (lpEdit, NULL, EDT_STYLE,
  190.     nX1, nY1, nExt, nH1, hParent, (HMENU) EDT_LFILETYPE, hInst,  NULL);
  191.   
  192.   CreateWindow (lpEdit, NULL, EDT_STYLE,
  193.     nX2, nY1, nExt, nH1, hParent, (HMENU) EDT_RFILETYPE, hInst,  NULL);
  194.   CreateListRectPos (&rcLEdt,  nX1, nY1, nExt, nH1);
  195.   CreateListRectPos (&rcREdt,  nX2, nY1, nExt, nH1);
  196.   nExt= XSIZ (74);            //  Combo box Extent
  197.   nX1 = XSIZ ( 7);            //  Local Dir List position
  198.   nX2 = XSIZ (136);           //  Remote Dir List position
  199.   nY1 = YSIZ (32);            //  Combo Box Y position
  200.   nH1 = YSIZ (82);            //  Combo Box height when opened
  201.   hLbxLDirLst = CreateWindow (lpComboBox, NULL, CBS_STYLE,
  202.     nX1, nY1, nExt, nH1, hParent, (HMENU) LST_LDIRLST, hInst,  NULL);
  203.   
  204.   hLbxRDirLst = CreateWindow (lpComboBox, NULL, CBS_STYLE,
  205.     nX2, nY1, nExt, nH1, hParent, (HMENU) LST_RDIRLST, hInst,  NULL);
  206.     
  207.   CreateListRectPos (&rcLLst,  nX1, nY1, nExt, nH1);
  208.   CreateListRectPos (&rcRLst,  nX2, nY1, nExt, nH1);
  209.   nY1 = YSIZ (44);            //  Directory List Y position
  210.   nH1 = YSIZ (38);            //  Directory List Box height
  211.   nY2 = YSIZ (84);            //  Files List Y position
  212.   nH2 = YSIZ (65);            //  Files List Box height
  213.   
  214.   hLbxLDir = CreateWindow (lpListBox, NULL, LBS_STYLE,          // Local Dir list
  215.     nX1, nY1, nExt, nH1, hParent, (HMENU) LST_LDIRS, hInst,  NULL);
  216.   hLbxLFiles = CreateWindow (lpListBox, NULL, LBS_STYLE| LBS_EXTENDEDSEL,
  217.     nX1, nY2, nExt, nH2, hParent, (HMENU) LST_LFILES, hInst,  NULL);    // Local Files List
  218.   hLbxRDir = CreateWindow(lpListBox, NULL, LBS_STYLE,           // Remote Dir List
  219.     nX2, nY1, nExt, nH1, hParent, (HMENU) LST_RDIRS, hInst,  NULL);
  220.   hLbxRFiles = CreateWindow(lpListBox, NULL, LBS_STYLE| LBS_EXTENDEDSEL,
  221.     nX2, nY2, nExt, nH2, hParent, (HMENU) LST_RFILES, hInst,  NULL);    //  Remote Files List
  222.   CreateListRectPos (&rcLDir,  nX1, nY1, nExt, nH1);
  223.   CreateListRectPos (&rcRDir,  nX2, nY1, nExt, nH1);
  224.   CreateListRectPos (&rcLFile, nX1, nY2, nExt, nH2);
  225.   CreateListRectPos (&rcRFile, nX2, nY2, nExt, nH2);
  226.   CreateWindow (lpListBox, NULL, LBS_STANDARD|WS_CHILD,         // Temporary Files list
  227.     0, 0, nExt, nH1, hParent, (HMENU) LST_DELFILES, hInst,  NULL);
  228.   SendDlgItemMessage (hParent, EDT_LFILETYPE, WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  229.   SendDlgItemMessage (hParent, EDT_RFILETYPE, WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  230.   SendDlgItemMessage (hParent, LST_LDIRLST,   WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  231.   SendDlgItemMessage (hParent, LST_RDIRLST,   WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  232.   SendDlgItemMessage (hParent, LST_LDIRS,     WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  233.   SendDlgItemMessage (hParent, LST_RDIRS,     WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  234.   SendDlgItemMessage (hParent, LST_LFILES,    WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  235.   SendDlgItemMessage (hParent, LST_RFILES,    WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  236.   SendDlgItemMessage (hParent, LST_DELFILES,  WM_SETFONT, (WPARAM) hFont, (LPARAM) MAKELONG (TRUE, 0));
  237.   SendDlgItemMessage (hParent, EDT_LFILETYPE, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) szLFileType);
  238.   SendDlgItemMessage (hParent, EDT_RFILETYPE, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) szRFileType);
  239.   hTxtLDir   = CreateWindow (lpStatic, NULL, WS_TXTSTYLE, XSIZ (  9), YSIZ (21), XSIZ (100), YSIZ (8), hParent, (HMENU) TXT_LDIRECTORY, hInst,  NULL);
  240.   hTxtRDir   = CreateWindow (lpStatic, NULL, WS_TXTSTYLE, XSIZ (138), YSIZ (21), XSIZ (100), YSIZ (8), hParent, (HMENU) TXT_RDIRECTORY, hInst,  NULL);
  241.   hScroll    = CreateWindow (lpScroll, NULL, SBV_STYLE, XSIZ(230), YSIZ(164), XSIZ(8), YSIZ(15), hParent, (HMENU) SCRLWND, hInst, NULL);
  242.   
  243. #define WC_TEXT(style,x)   CreateWindow (lpStatic, NULL, WS_CHILDSTYLE | style, x, YSIZ(155), XSIZ(40), YSIZ(8), hParent, (HMENU) TXT_STATUS, hInst, NULL)
  244.   hTxtLBytes = WC_TEXT (SS_RIGHT, (XSIZ(10)));
  245.   hTxtRBytes = WC_TEXT (SS_RIGHT, (XSIZ(198)));
  246. #define WC_RADIO(Txt,x,ID) CreateWindow (lpButton, Txt, WS_RADIOSTYLE, x, YSIZ(154), XSIZ(39), YSIZ(9), hParent, (HMENU) ID, hInst, NULL)
  247.   hRBascii = WC_RADIO ("ASCII",  (XSIZ ( 60)), RB_ASCII);
  248.   hRBbinary= WC_RADIO ("Binary", (XSIZ (115)), RB_BINARY);
  249.   hRBl8    = WC_RADIO ("L 8",    (XSIZ (160)), RB_L8);
  250.   return(TRUE);
  251. }
  252. HPEN hPenDark;
  253. HPEN hPenLight;
  254. //*********************************************************************
  255. //  Draw a box to give the chiseled metal appearance
  256. //*********************************************************************
  257. void BoxIt (HDC hDC, int left, int top, int width, int height, BOOL flag)
  258. {
  259.   POINT Pt;
  260.   HPEN hPenOld;
  261.   
  262.   hPenOld = SelectObject (hDC, flag? hPenDark : hPenLight);
  263.   MoveToEx (hDC, (left*nWndx)/4, ((top+height)*nWndy)/8, &Pt);
  264.   LineTo (hDC, (left*nWndx)/4, (top*nWndy)/8);
  265.   LineTo (hDC, ((left+width)*nWndx)/4, (top*nWndy)/8);
  266.   if (flag) SelectObject (hDC,hPenLight); 
  267.   else SelectObject (hDC,hPenDark);
  268.   LineTo (hDC, ((left+width)*nWndx)/4, ((top+height)*nWndy)/8);
  269.   LineTo (hDC, (left*nWndx)/4, ((top+height)*nWndy)/8);
  270.   SelectObject (hDC, hPenOld);
  271. }
  272. //*********************************************************************
  273. //*********************************************************************
  274. void BoxButton (HDC hDC, int left, int top, int width, int height, BOOL bFlag, BOOL bEnable)
  275. {
  276.   if (!bEnable)
  277.   {
  278.     HBRUSH hBr = GetStockObject (DKGRAY_BRUSH);
  279.     RECT rc;
  280.     
  281.     rc.top = YSIZ (top); rc.bottom = YSIZ (top+height);
  282.     rc.left = XSIZ (left); rc.right = XSIZ (left+width);
  283.     FillRect (hDC, &rc, hBr);
  284.   }
  285.   BoxIt (hDC, left, top, width, height, bFlag);
  286. }
  287. //*********************************************************************
  288. //  Return the Button ID, given its index position
  289. //  Used for sending the WM_COMMAND message
  290. //*********************************************************************
  291. int GetButtonID (int nBtn)
  292. {
  293.   return bpButton[nBtn].nBtnID;
  294. }
  295. //*********************************************************************
  296. //  Return the Button ID, given its index position
  297. //  Used for sending the WM_COMMAND message
  298. //*********************************************************************
  299. int GetButtonIndex (int nBtnID)
  300. {
  301.   int nI;
  302.   
  303.   for (nI=0; nI<sizeof (bpButton)/sizeof (BTNPOS); nI++)
  304.   {
  305.     if (bpButton[nI].nBtnID==nBtnID) return nI;
  306.   }
  307.   return -1;
  308. }
  309. //*********************************************************************
  310. //  Return the Button SendMsg type - 0=>Post Message, 1=> SendMessage
  311. //*********************************************************************
  312. int GetButtonMsgStatus (int nBtn)
  313. {
  314.   return bpButton[nBtn].nSendMsg;
  315. }
  316. //*********************************************************************
  317. //  Return the Button Status - 0=>Button is up, 1=> depressed
  318. //*********************************************************************
  319. int GetButtonStatus (int nBtn)
  320. {
  321.   return bpButton[nBtn].nStat;
  322. }
  323. //*********************************************************************
  324. //  Set new button status, return the old one.
  325. //*********************************************************************
  326. int SetButtonStatus (int nBtn, int nStat)
  327. {
  328.   int nOld = bpButton[nBtn].nStat;
  329.   
  330.   bpButton[nBtn].nStat=nStat;  
  331.   return nOld;
  332. }
  333. //*********************************************************************
  334. //  Return the Button Status - 0=>Button is up, 1=> depressed
  335. //*********************************************************************
  336. BOOL GetButtonEnabledStatus (int nBtn)
  337. {
  338.   return bEnabled[nBtn];
  339. }
  340. //*********************************************************************
  341. //  Set Btn Enabled Status, Return Prev Status - True => Was Enabled
  342. //*********************************************************************
  343. BOOL SetButtonEnabledStatus (int nBtnID, BOOL bFlag)
  344. {
  345.   BOOL bFlagOld;
  346.   
  347.   nBtnID = GetButtonIndex (nBtnID);
  348.   if (nBtnID==-1) return FALSE;
  349.   bFlagOld = bEnabled[nBtnID];
  350.   bEnabled[nBtnID] = bFlag;
  351.   if (bFlag!=bFlagOld) InvalidateRect (hWndMain, &bpButton[nBtnID].rcBtn, TRUE);
  352.   return bFlagOld;
  353. }
  354. //*********************************************************************
  355. //  Given x & y coords of a point, find which button it belongs to.
  356. //  Return index if found, else return -1
  357. //*********************************************************************
  358. int FindButtonClicked (int nXpos, int nYpos)
  359. {
  360.   int nI;
  361.   POINT pt;
  362.   pt.x = nXpos;
  363.   pt.y = nYpos;
  364.   for (nI=0; nI<sizeof (bpButton)/sizeof (BTNPOS); nI++)
  365.   {
  366.     if (PtInRect (&bpButton[nI].rcBtn, pt)) return nI;
  367.   }
  368.   return -1;
  369. }
  370. //*********************************************************************
  371. //  Enable all buttons
  372. //*********************************************************************
  373. void SetButtonsEnabled()
  374. {
  375.   int nI;
  376.   for (nI=0; nI<BUTTONS; nI++) if (bEnabled[nI]!=TRUE) InvalidateRect (hWndMain, &bpButton[nI].rcBtn, TRUE);
  377.   for (nI=0; nI<BUTTONS; nI++) bEnabled[nI] = TRUE;
  378. }
  379. //*********************************************************************
  380. //  Reduce the RECT size by n Pixels along all dimensions
  381. //*********************************************************************
  382. RECT ReduceRect (RECT rc, int nPix)
  383. {
  384.   nPix >>= 1;
  385.   rc.left   += nPix;
  386.   rc.right  -= nPix;
  387.   rc.top    += nPix;
  388.   rc.bottom -= nPix;
  389.   return rc;
  390. }
  391. //*********************************************************************
  392. //*********************************************************************
  393. void CreateButtonPens()
  394. {
  395.   hPenDark  = CreatePen (PS_SOLID, 1, RGB (128,128,128));
  396.   hPenLight = CreatePen (PS_SOLID, 1, RGB (224,224,224));
  397. }
  398. //*********************************************************************
  399. //*********************************************************************
  400. void DeleteButtonPens()
  401. {
  402.   DeleteObject (hPenDark);
  403.   DeleteObject (hPenLight);
  404. }
  405. //*********************************************************************
  406. //  Paint a single button, with the status supplied - up/down.  Button
  407. //  specified by its index number.
  408. //*********************************************************************
  409. int DoPaintButton (HWND hWnd, int nBtn, int nStat)
  410. {
  411.   RECT  rc   = bpButton[nBtn].rcExt;
  412.   LPSTR lpsz = *bpButton[nBtn].lpBtnTxt;
  413.   int   nX   = bpButton[nBtn].nTxtx + nStat;
  414.   int   nY   = bpButton[nBtn].nTxty + nStat;
  415.   
  416.   HBRUSH hBrushOld;
  417.   HBRUSH hBrush=CreateSolidBrush (RGB(192,192,192));
  418.   HDC hDC = GetDC (hWnd);
  419.   //*************************************************
  420.   // Create two temporary pens to do the 3-D effect
  421.   //*************************************************
  422.   CreateButtonPens();
  423.   //*************************************************
  424.   //  Prepare the hdc for drawing the button
  425.   //*************************************************
  426.   hBrushOld = SelectObject (hDC, hBrush);
  427.   SelectObject (hDC, GetStockObject (ANSI_VAR_FONT));
  428.   SetBkColor (hDC, RGB (192, 192, 192));
  429.   //*************************************************
  430.   //  Draw the bounding box as 3-D, then fill inside
  431.   //  with Gray brush, lastly draw the text
  432.   //*************************************************
  433.   BoxIt (hDC, rc.left, rc.top, rc.right, rc.bottom, nStat?TRUE:FALSE);
  434.   rc = ReduceRect (bpButton[nBtn].rcBtn, 6);
  435.   FillRect (hDC, &rc, bEnabled[nBtn]? hBrush : GetStockObject (DKGRAY_BRUSH));
  436.   if (bEnabled[nBtn]) TextOut (hDC, nX, nY, (LPSTR) lpsz, lstrlen (lpsz));
  437.   
  438.   //*************************************************
  439.   // Release the pens and brushes created this run.
  440.   //*************************************************
  441.   SelectObject (hDC, GetStockObject (BLACK_PEN));
  442.   DeleteObject (SelectObject (hDC, hBrushOld));
  443.   DeleteButtonPens();
  444.   
  445.   //*************************************************
  446.   //  Final cleanup
  447.   //*************************************************
  448.   ReleaseDC (hWnd, hDC);
  449.   return 0;
  450. }
  451. //*********************************************************************
  452. //*********************************************************************
  453. DoMainPaint(HWND hWnd)
  454. {
  455.   HDC         hDC;   // handle for the display device
  456.   PAINTSTRUCT ps;    // holds PAINT information
  457.   HBRUSH      hBrush, hBrushOld, hDkBrush;
  458.   int         nI;
  459.   memset (&ps, 0x00, sizeof(PAINTSTRUCT));
  460.   hDC = BeginPaint (hWnd, &ps);
  461.   hBrush = CreateSolidBrush (RGB(192,192,192));
  462.   hPenDark = CreatePen (PS_SOLID,1,RGB(128,128,128));
  463.   hPenLight = CreatePen (PS_SOLID,1,RGB(224,224,224));
  464.   hBrushOld = SelectObject (hDC, hBrush);            // Save original handle
  465.   SelectObject (hDC, GetStockObject (ANSI_VAR_FONT));   // Prepare Device Context
  466.   SetBkColor (hDC, RGB (192,192,192));
  467.   BoxIt (hDC,   4,2,109,149,TRUE);            //  Locals 3-D box
  468.   BoxIt (hDC, 133,2,109,149,TRUE);            //  Remotes 3-D box
  469.   BoxIt (hDC,   7,5,103,12,TRUE);             //  "Local" window 
  470.   BoxIt (hDC, 136,5,103,12,TRUE);             //  "Remote" window
  471.   BoxIt (hDC,  4,153,238,29,TRUE);            //  Outer 3-D Grouping Box
  472.   BoxIt (hDC,  7,163,232,17,FALSE);           //  Inner 3-D FTP Message box
  473.   
  474.   BoxIt (hDC,  7,19,103,10,FALSE);            //  Local 3-D Current Dir box
  475.   BoxIt (hDC,136,19,103,10,FALSE);            //  Remote 3-D Current Dir box
  476.   TextOut (hDC, XSIZ (  9), YSIZ (8),"Local PC info",13);
  477.   TextOut (hDC, XSIZ (138), YSIZ (8),"Remote host info",16);
  478.   //*************************************************
  479.   //  Now draw the 3-D effects for all the buttons
  480.   //  and print the text for each button.
  481.   //*************************************************
  482.   
  483.   FillRect (hDC, &rcMsg, hBrush);
  484.   if (lpStatusLines!=NULL)
  485.   {
  486.     char *lp;
  487.     HRGN hRgn;
  488.     
  489.     hRgn = CreateRectRgn (rcMsg.left, rcMsg.top, rcMsg.right, rcMsg.bottom);
  490.     SelectClipRgn (hDC, hRgn);
  491.     lp = lpStatusLines+(nStatusScroll*STATLEN);
  492.     TextOut (hDC, XSIZ(9), YSIZ(172), lp, lstrlen (lp));
  493.     if (nStatusScroll>0)
  494.     {
  495.       lp = lpStatusLines+((nStatusScroll-1)*STATLEN);
  496.       TextOut (hDC, XSIZ(9), YSIZ(165), lp, lstrlen (lp));
  497.     }
  498.     SelectClipRgn (hDC, (HRGN) NULL);
  499.     DeleteObject (hRgn);
  500.   }
  501.   hDkBrush = GetStockObject (DKGRAY_BRUSH);
  502.   SetBkMode (hDC, TRANSPARENT);
  503.   for (nI=0; nI<sizeof (bpButton)/sizeof (BTNPOS); nI++)
  504.   {
  505.     LPSTR lpsz = *bpButton[nI].lpBtnTxt;
  506.     RECT  rc   =  bpButton[nI].rcExt;
  507.     int   nX   =  bpButton[nI].nTxtx + bpButton[nI].nStat;
  508.     int   nY   =  bpButton[nI].nTxty + bpButton[nI].nStat;
  509.     BoxIt (hDC, rc.left, rc.top, rc.right, rc.bottom, bpButton[nI].nStat?TRUE:FALSE);
  510.     rc = ReduceRect (bpButton[nI].rcBtn, 6);
  511.     FillRect (hDC, &rc, bEnabled[nI]? hBrush : hDkBrush);
  512.     if (bEnabled[nI]) TextOut (hDC, nX, nY, (LPSTR) lpsz, lstrlen (lpsz));
  513.   }
  514.   SelectObject (hDC, hBrushOld);         //  Deselect any created resources
  515.   SelectObject (hDC, GetStockObject (BLACK_PEN));
  516.   
  517. // Inform Windows painting is complete
  518.   EndPaint (hWnd, &ps);
  519.   DeleteObject (hBrush);              //  Release all resources created
  520.   DeleteObject (hPenLight);
  521.   DeleteObject (hPenDark);  
  522.   return 0;
  523. }
  524. //*********************************************************************
  525. //*********************************************************************
  526. #ifdef WIN32
  527. int GetLocalDirForWnd(HWND hWnd)
  528. {
  529.   WIN32_FIND_DATA ffblk;
  530.   HANDLE hFile;
  531.   // get the local directory name
  532.   // DLG_LDIRECTORY (directory name)
  533.   getcwd (szString,180);
  534.   SendMessage (hTxtLDir,WM_SETTEXT,0,(LPARAM)(LPCSTR) szString);
  535.   SendDlgItemMessage (hWnd, LST_LDIRLST, CB_SELECTSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szString);
  536.   // DLG_LDIRS      (directory list box)
  537.   SendMessage (hLbxLDir,LB_RESETCONTENT,0,0);
  538.   if ((hFile = FindFirstFile ("*.*", &ffblk))!=INVALID_HANDLE_VALUE)
  539.   {
  540.     do 
  541.     {
  542.       if ((ffblk.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
  543.           (lstrcmp (ffblk.cFileName, ".")!=0))
  544.              SendMessage (hLbxLDir,LB_ADDSTRING,0,(LPARAM)(LPCSTR) ffblk.cFileName);
  545.     }
  546.     while (FindNextFile (hFile, &ffblk));
  547.     FindClose (hFile);
  548.   }
  549.   // add drives to the list box
  550.   SendMessage(hLbxLDir, LB_DIR, 0x4000 | 0x8000, (LPARAM) ((LPSTR) "*"));
  551.   // DLG_LFILES     (file list box)
  552.   SendMessage (hLbxLFiles, LB_RESETCONTENT, 0, 0);
  553.   SendDlgItemMessage (hWndMain, EDT_LFILETYPE, WM_GETTEXT, (WPARAM) sizeof (szLFileType), (LPARAM)(LPCSTR) szLFileType);
  554.   if (lstrlen (szLFileType)==0) 
  555.   {
  556.     lstrcpy (szLFileType, "*.*");
  557.     SendDlgItemMessage (hWndMain, EDT_LFILETYPE, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) szLFileType);
  558.   }
  559.   
  560.   if ((hFile = FindFirstFile (szLFileType, &ffblk))!=INVALID_HANDLE_VALUE)
  561.   {
  562.     do 
  563.     {
  564.       if (!(ffblk.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  565.              SendMessage (hLbxLFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) ffblk.cFileName);
  566.     }
  567.     while (FindNextFile (hFile, &ffblk));
  568.     FindClose (hFile);
  569.   }
  570.   
  571.   return 0;
  572. }
  573. #else
  574. int GetLocalDirForWnd(HWND hWnd)
  575. {
  576. #ifdef _BORLANDC_
  577.   struct ffblk ffblk;
  578. #else
  579.   #define ff_attrib attrib
  580.   #define ff_name name
  581.   #define findnext(a) _dos_findnext(a)
  582.   struct _find_t ffblk;
  583. #endif  
  584.   
  585.   int nDone;
  586.   // get the local directory name
  587.   // DLG_LDIRECTORY (directory name)
  588.   getcwd (szString,180);
  589.   SendMessage (hTxtLDir,WM_SETTEXT,0,(LPARAM)(LPCSTR) szString);
  590.   SendDlgItemMessage (hWnd, LST_LDIRLST, CB_SELECTSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szString);
  591.   // DLG_LDIRS      (directory list box)
  592.   SendMessage (hLbxLDir,LB_RESETCONTENT,0,0);
  593. #ifdef _BORLANDC_
  594.   nDone = findfirst("*.*",&ffblk,FA_DIREC);
  595. #else
  596.   nDone=_dos_findfirst("*.*",_A_SUBDIR,&ffblk);
  597. #endif  
  598.   while (!nDone)
  599.   {
  600.     if (ffblk.ff_attrib & 0x10 && lstrcmp(ffblk.ff_name,".")!=0)
  601.       SendMessage (hLbxLDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) ffblk.ff_name);
  602.     nDone = findnext (&ffblk);
  603.   }
  604.   // add drives to the list box
  605.   SendMessage (hLbxLDir, LB_DIR, 0x4000 | 0x8000, (LPARAM) ((LPSTR) "*"));
  606.   // DLG_LFILES     (file list box)
  607.   SendMessage (hLbxLFiles, LB_RESETCONTENT, 0, 0);
  608.   SendDlgItemMessage (hWndMain, EDT_LFILETYPE, WM_GETTEXT, (WPARAM) sizeof (szLFileType), (LPARAM)(LPCSTR) szLFileType);
  609.   if (lstrlen (szLFileType)==0) 
  610.   {
  611.     lstrcpy (szLFileType, "*.*");
  612.     SendDlgItemMessage (hWndMain, EDT_LFILETYPE, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) szLFileType);
  613.   }
  614.   
  615. #ifdef _BORLANDC_
  616.   nDone = findfirst (szLFileType, &ffblk, 0);
  617. #else
  618.   nDone=_dos_findfirst (szLFileType, _A_NORMAL, &ffblk);
  619. #endif
  620.   
  621.   while (!nDone)  
  622.   {
  623.     if (!(ffblk.ff_attrib & 0x10)) 
  624.     {
  625.       lstrcpy (szString,ffblk.ff_name);
  626.       strlwr (szString);
  627.       SendMessage (hLbxLFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) szString);
  628.     }
  629.     nDone = findnext (&ffblk);
  630.   }
  631.   return 0;
  632. }
  633. #endif
  634. //*********************************************************************
  635. // Return a Status Line Pointer
  636. //*********************************************************************
  637. LPSTR GetStatusLine (int nLine)
  638. {
  639.   if (lpStatusLines==NULL) return NULL;
  640.   return (LPSTR) (lpStatusLines + nLine*STATLEN);
  641. }
  642. //*********************************************************************
  643. //*********************************************************************
  644. int GetMaxStatusLines()
  645. {
  646.   return __min (nStatusPtr, MAXLINES);
  647. }
  648. //*********************************************************************
  649. //  Display the Scroll Message
  650. //*********************************************************************
  651. ScrollStatus (HWND hWnd, int value) 
  652. {
  653.   int nNew=nStatusScroll+value;
  654.   
  655.   nNew = __min (__max (nNew, 1), nStatusPtr);
  656.   if (nNew!=nStatusScroll)
  657.   {
  658.     nStatusScroll = nNew;
  659.     InvalidateRect (hWnd, &rcMsg, FALSE);
  660.   }
  661.   return 0;
  662. }
  663. //*********************************************************************
  664. //*********************************************************************
  665. SetStatus (HWND hWnd, LPSTR lpString) 
  666. {
  667.   if (lpStatusLines==NULL)
  668.   {
  669.     (char *) lpStatusLines = (char *) GlobalAllocPtr (GHND, (MAXLINES+1) * STATLEN);
  670.     nStatusPtr = 0;
  671.     if (lpStatusLines==NULL) return 0;
  672.   }
  673.   
  674.   if (nStatusPtr>(MAXLINES-1))
  675.     memmove (lpStatusLines, lpStatusLines+STATLEN, (MAXLINES*STATLEN));
  676.   if (lstrlen (lpString) > (STATLEN-1)) lpString[STATLEN-1] = '';
  677.   lstrcpy (lpStatusLines+nStatusPtr*STATLEN, lpString);
  678.   nStatusScroll = nStatusPtr;
  679.   if (nStatusPtr<MAXLINES) nStatusPtr++;
  680.   InvalidateRect (hWnd, &rcMsg, FALSE);
  681.   return 0;
  682. }
  683. //*********************************************************************
  684. //*********************************************************************
  685. UnsetStatusLines()
  686. {
  687.   if (lpStatusLines!=NULL) GlobalFreePtr (lpStatusLines), lpStatusLines=NULL;  
  688.   return 0;
  689. }