📄 upddemo.c
字号:
/*------------------------------------------------
UPDDEMO.C -- Demonstrates Anonymous FTP Access
(c) Charles Petzold, 1998
------------------------------------------------*/
#include <windows.h>
#include <wininet.h>
#include <process.h>
#include "resource.h"
// User-defined messages used in WndProc
#define WM_USER_CHECKFILES (WM_USER + 1)
#define WM_USER_GETFILES (WM_USER + 2)
// Information for FTP download
#define FTPSERVER TEXT ("ftp.cpetzold.com")
#define DIRECTORY TEXT ("cpetzold.com/ProgWin/UpdDemo")
#define TEMPLATE TEXT ("UD??????.TXT")
// Structures used for storing filenames and contents
typedef struct
{
TCHAR * szFilename ;
char * szContents ;
}
FILEINFO ;
typedef struct
{
int iNum ;
FILEINFO info[1] ;
}
FILELIST ;
// Structure used for second thread
typedef struct
{
BOOL bContinue ;
HWND hwnd ;
}
PARAMS ;
// Declarations of all functions in program
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;
VOID FtpThread (PVOID) ;
VOID ButtonSwitch (HWND, HWND, TCHAR *) ;
FILELIST * GetFileList (VOID) ;
int Compare (const FILEINFO *, const FILEINFO *) ;
// A couple globals
HINSTANCE hInst ;
TCHAR szAppName[] = TEXT ("UpdDemo") ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
hInst = hInstance ;
wndclass.style = 0 ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = NULL ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Update Demo with Anonymous FTP"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
// After window is displayed, check if the latest file exists
SendMessage (hwnd, WM_USER_CHECKFILES, 0, 0) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static FILELIST * plist ;
static int cxClient, cyClient, cxChar, cyChar ;
HDC hdc ;
int i ;
PAINTSTRUCT ps ;
SCROLLINFO si ;
SYSTEMTIME st ;
TCHAR szFilename [MAX_PATH] ;
switch (message)
{
case WM_CREATE:
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_RANGE | SIF_PAGE ;
si.nMin = 0 ;
si.nMax = plist ? plist->iNum - 1 : 0 ;
si.nPage = cyClient / cyChar ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
return 0 ;
case WM_VSCROLL:
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
switch (LOWORD (wParam))
{
case SB_LINEDOWN: si.nPos += 1 ; break ;
case SB_LINEUP: si.nPos -= 1 ; break ;
case SB_PAGEDOWN: si.nPos += si.nPage ; break ;
case SB_PAGEUP: si.nPos -= si.nPage ; break ;
case SB_THUMBPOSITION: si.nPos = HIWORD (wParam) ; break ;
default: return 0 ;
}
si.fMask = SIF_POS ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case WM_USER_CHECKFILES:
// Get the system date & form filename from year and month
GetSystemTime (&st) ;
wsprintf (szFilename, TEXT ("UD%04i%02i.TXT"), st.wYear, st.wMonth) ;
// Check if the file exists; if so, read all the files
if (GetFileAttributes (szFilename) != (DWORD) -1)
{
SendMessage (hwnd, WM_USER_GETFILES, 0, 0) ;
return 0 ;
}
// Otherwise, get files from Internet.
// But first check so we don't try to copy files to a CD-ROM!
//测试当前目录所在驱动器是否是CD-ROM类型
if (GetDriveType (NULL) == DRIVE_CDROM)
{
MessageBox (hwnd, TEXT ("Cannot run this program from CD-ROM!"),
szAppName, MB_OK | MB_ICONEXCLAMATION) ;
return 0 ;
}
// Ask user if an Internet connection is desired
if (IDYES == MessageBox (hwnd, TEXT ("Update information from Internet?"),szAppName, MB_YESNO | MB_ICONQUESTION))
// Invoke dialog box
DialogBox (hInst, szAppName, hwnd, DlgProc);
// Update display
SendMessage (hwnd, WM_USER_GETFILES, 0, 0);
return 0 ;
case WM_USER_GETFILES:
SetCursor (LoadCursor (NULL, IDC_WAIT));
ShowCursor (TRUE) ;
// Read in all the disk files
plist = GetFileList () ;
ShowCursor (FALSE) ;
SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
// Simulate a WM_SIZE message to alter scroll bar & repaint
SendMessage (hwnd, WM_SIZE, 0, MAKELONG (cxClient, cyClient)) ;
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
SetTextAlign (hdc, TA_UPDATECP) ;
si.cbSize = sizeof (SCROLLINFO) ;
si.fMask = SIF_POS ;
GetScrollInfo (hwnd, SB_VERT, &si) ;
if (plist)
{
for (i = 0 ; i < plist->iNum ; i++)
{
MoveToEx (hdc, cxChar, (i - si.nPos) * cyChar, NULL) ;
TextOut (hdc, 0, 0, plist->info[i].szFilename,
lstrlen (plist->info[i].szFilename)) ;
TextOut (hdc, 0, 0, TEXT (": "), 2) ;
TextOutA (hdc, 0, 0, plist->info[i].szContents,
strlen (plist->info[i].szContents)) ;
}
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PARAMS params ;
switch (message)
{
case WM_INITDIALOG:
params.bContinue = TRUE ;
params.hwnd = hwnd ;
_beginthread (FtpThread, 0, ¶ms) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -