📄 progress.c
字号:
/*__________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: Progress.c,v 1.4 2002/10/08 23:05:52 pbj Exp $
__________________________________________________________________________*/
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <stdlib.h>
#include <stdio.h>
#include "pgpErrors.h"
#include "resource.h"
#define NOPRGDLG 0
#ifndef IDC_PRGAVI
#define IDC_PRGAVI 100 // dummy if no resource is spec'ed
#endif
extern HINSTANCE g_hinst;
#define UPDATETIMERID 100
#define UPDATETIME 75 // milliseconds between updates
typedef UINT (*USERFUNCTION)(HWND,void *);
typedef struct _PRGDLG
{
HWND hwnd;
HWND hwndParent;
USERFUNCTION UserFunction;
void *pUserValue;
DWORD dwBar;
char *szTitle;
char *szFile;
char *szInfo;
DWORD dwAVIClip;
DWORD dwNewValue;
DWORD dwOldValue;
HANDLE hSemaphore;
DWORD dwThreadID;
UINT err;
BOOL bCancel;
BOOL bAVIPlaying;
HKL hKL;
} PRGDLG, *HPRGDLG;
DWORD WINAPI
PrgDlgThreadRoutine (LPVOID lpvoid)
{
HPRGDLG hPrgDlg;
HKL hKLLoaded;
hPrgDlg=(HPRGDLG)lpvoid;
// we have to "inherit" the keyboard layout of our parent
// thread manually. for some reason this is not done
// automatically and can cause the new passphrase dialog
// to not respect the current keyboard setting.
hKLLoaded=ActivateKeyboardLayout(hPrgDlg->hKL,0);
hPrgDlg->err=(hPrgDlg->UserFunction)(hPrgDlg->hwnd,hPrgDlg->pUserValue);
#if (!NOPRGDLG)
SendMessage(hPrgDlg->hwnd,WM_DESTROY,0,0);
ReleaseSemaphore(hPrgDlg->hSemaphore, 1, NULL);
#endif
return 0;
}
BOOL CALLBACK PrgDlgProc (HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
HPRGDLG hPrgDlg;
switch (uMsg)
{
case WM_INITDIALOG:
{
RECT rc;
SetWindowLong (hDlg, GWL_USERDATA, lParam);
hPrgDlg=(HPRGDLG)lParam;
hPrgDlg->hwnd=hDlg;
// Initialize GUI elements
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETRANGE,
0, MAKELPARAM(0, 100));
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
(WPARAM)hPrgDlg->dwBar, 0);
if(hPrgDlg->szTitle)
SetWindowText(hDlg,hPrgDlg->szTitle);
if(hPrgDlg->szFile)
SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGFILE),hPrgDlg->szFile);
if(hPrgDlg->szInfo)
SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGINFO),hPrgDlg->szInfo);
if(hPrgDlg->dwAVIClip!=0)
{
hPrgDlg->bAVIPlaying=TRUE;
Animate_Open(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI),
MAKEINTRESOURCE(hPrgDlg->dwAVIClip));
}
// Center window and set to foreground
GetWindowRect (hDlg, &rc);
SetWindowPos (hDlg, NULL,
(GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2,
(GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 2,
0, 0, SWP_NOSIZE | SWP_NOZORDER);
SetForegroundWindow(hDlg);
// Create update timer
SetTimer(hDlg,UPDATETIMERID,UPDATETIME,NULL);
return TRUE;
}
case WM_CTLCOLOR:
{
if(wParam!=0)
{
DWORD color;
color=GetSysColor(COLOR_BTNFACE);
SetBkColor ((HDC)wParam, color);
SetTextColor ((HDC)wParam, GetSysColor (COLOR_WINDOWTEXT));
return (BOOL)CreateSolidBrush (color);
}
break;
}
case WM_TIMER:
{
BOOL bWindowEnabled;
hPrgDlg = (HPRGDLG) GetWindowLong(hDlg, GWL_USERDATA);
if(hPrgDlg->dwThreadID==0)
{
// Spawn work thread
CreateThread (NULL, 0, PrgDlgThreadRoutine,
(LPVOID)hPrgDlg, 0, &(hPrgDlg->dwThreadID));
}
if(hPrgDlg->dwAVIClip!=0)
{
bWindowEnabled=IsWindowEnabled(hPrgDlg->hwnd);
if((!bWindowEnabled)&&(hPrgDlg->bAVIPlaying))
{
hPrgDlg->bAVIPlaying=FALSE;
Animate_Stop(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI));
}
if((bWindowEnabled)&&(!hPrgDlg->bAVIPlaying))
{
hPrgDlg->bAVIPlaying=TRUE;
Animate_Play(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI), 0, -1, -1);
}
}
// If there has been a change, process it
if(hPrgDlg->dwNewValue!=hPrgDlg->dwOldValue)
{
hPrgDlg->dwOldValue=hPrgDlg->dwNewValue;
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
(WPARAM)hPrgDlg->dwNewValue, 0);
}
break;
}
case WM_CLOSE:
case WM_QUIT:
case WM_DESTROY:
{
EndDialog(hDlg, FALSE);
break;
}
case WM_COMMAND:
{
switch(LOWORD (wParam))
{
case IDCANCEL:
{
hPrgDlg = (HPRGDLG) GetWindowLong(hDlg, GWL_USERDATA);
ShowWindow(hDlg,SW_HIDE);
hPrgDlg->bCancel=TRUE;
break;
}
}
break;
}
}
return FALSE;
}
UINT PGPscProgressDialog(HWND hwndParent,USERFUNCTION UserFunction,
void *pUserValue,DWORD dwBar,char *szTitle,
char *szFile,char *szInfo,DWORD dwAVIClip)
{
HPRGDLG hPrgDlg;
PGPError err;
hPrgDlg=(HPRGDLG)malloc(sizeof(PRGDLG));
if(hPrgDlg==NULL)
{
return kPGPError_OutOfMemory;
}
memset(hPrgDlg,0x00,sizeof(PRGDLG));
hPrgDlg->hwndParent=hwndParent;
hPrgDlg->UserFunction=UserFunction;
hPrgDlg->pUserValue=pUserValue;
hPrgDlg->dwBar=dwBar;
hPrgDlg->szTitle=szTitle;
hPrgDlg->szFile=szFile;
hPrgDlg->szInfo=szInfo;
// hPrgDlg->dwAVIClip=0;
hPrgDlg->dwAVIClip=dwAVIClip;
// Just to be sure, a semaphore reinforces the barrier
// made by the DialogBox.
hPrgDlg->hSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
hPrgDlg->hKL=GetKeyboardLayout(0);
#if NOPRGDLG
hPrgDlg->hwnd=hwndParent;
PrgDlgThreadRoutine(hPrgDlg);
#else
DialogBoxParam (g_hinst,
MAKEINTRESOURCE(IDD_PRGDLG),
hwndParent,
(DLGPROC)PrgDlgProc,
(LPARAM)hPrgDlg);
WaitForSingleObject (hPrgDlg->hSemaphore, INFINITE);
#endif
CloseHandle (hPrgDlg->hSemaphore);
err=hPrgDlg->err;
free(hPrgDlg);
return err;
}
UINT PGPscProgressSetBar(HWND hwnd,DWORD dwBarValue,BOOL bForce)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
if(hPrgDlg==0)
return kPGPError_NoErr;
hPrgDlg->dwNewValue=dwBarValue;
if(bForce)
{
hPrgDlg->dwOldValue=hPrgDlg->dwNewValue;
SendDlgItemMessage (hPrgDlg->hwnd, IDC_PROGRESS, PBM_SETPOS,
(WPARAM)dwBarValue, 0);
}
if(hPrgDlg->bCancel)
return kPGPError_UserAbort;
return kPGPError_NoErr;
}
UINT PGPscProgressSetTitle(HWND hwnd,char *szTitle)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
SetWindowText(hPrgDlg->hwnd,szTitle);
return kPGPError_NoErr;
}
UINT PGPscProgressSetFile(HWND hwnd,char *szFile)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGFILE),szFile);
return kPGPError_NoErr;
}
UINT PGPscProgressSetInfo(HWND hwnd,char *szInfo)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGINFO),szInfo);
return kPGPError_NoErr;
}
UINT PGPscProgressSetAVI(HWND hwnd,DWORD dwAVIClip)
{
HWND hwndAVI;
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
hwndAVI=GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI);
hPrgDlg->dwAVIClip=dwAVIClip;
if(hPrgDlg->dwAVIClip!=0)
{
hPrgDlg->bAVIPlaying=TRUE;
Animate_Open(hwndAVI,
MAKEINTRESOURCE(hPrgDlg->dwAVIClip));
ShowWindow(hwndAVI,SW_SHOW);
}
else
{
hPrgDlg->bAVIPlaying=FALSE;
ShowWindow(hwndAVI,SW_HIDE);
Animate_Close(hwndAVI);
}
return kPGPError_NoErr;
}
BOOL PGPscProgressGetCancel(HWND hwnd)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
// No progress dialog, so no cancel. Tough luck
if(hPrgDlg==0)
return FALSE;
return hPrgDlg->bCancel;
}
void *PGPscProgressGetUserValue(HWND hwnd)
{
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
return hPrgDlg->pUserValue;
}
void PGPscProgressSetNewFilename(HWND hwnd,char *szInfoFormat,
char *infile,BOOL bResetBar)
{
char *p;
char *name;
char *directory;
char filename[1000];
char info[1000];
HPRGDLG hPrgDlg;
hPrgDlg = (HPRGDLG) GetWindowLong(hwnd, GWL_USERDATA);
name=directory=NULL;
strcpy(filename,infile);
// Just get the filename
p=strrchr(filename,'\\');
if(p!=NULL)
{
*p=0;
p++;
name=p;
// Now look for directory
p=strrchr(filename,'\\');
if(p!=NULL)
{
*p=0;
p++;
directory=p;
}
else
{
directory=filename;
}
}
else
{
// oops... must be in the root or something
name=filename;
}
if(directory!=NULL)
{
sprintf(info,szInfoFormat,directory,directory);
}
else
{
strcpy(info,"");
}
PGPscProgressSetFile(hPrgDlg->hwnd,name);
PGPscProgressSetInfo(hPrgDlg->hwnd,info);
if(bResetBar)
PGPscProgressSetBar(hPrgDlg->hwnd,0,TRUE);
}
/*__Editor_settings____
Local Variables:
tab-width: 4
End:
vi: ts=4 sw=4
vim: si
_____________________*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -