windows-nt/Source/XPSP1/NT/base/ntsetup/books/bkthrdlg.c
2020-09-26 16:20:57 +08:00

245 lines
5.1 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
bkthrdlg.c
Abstract:
Routines that implement a billboard-type dialog, for displaying
a message while the program carries out some action.
Author:
Ted Miller (tedm) 5-Jan-1995
Revision History:
--*/
#include "books.h"
//
// Define structure used internally to communicate information
// to the billboard dialog procedure.
//
typedef struct _BILLBOARDPARAMS {
PTHREAD_START_ROUTINE ThreadEntry;
PWSTR Caption;
PWSTR Text;
PVOID UserData;
HWND OwnerWindow;
} BILLBOARDPARAMS, *PBILLBOARDPARAMS;
//
// Custom window message the dialog sends to itself
// to indicate that WM_INITDIALOG is done.
//
// lParam = thread handle of action worker thread
//
#define WMX_I_AM_READY (WM_USER+567)
//
// Name of property we use to store thread parameters.
//
PWSTR ThreadParamsPropertyName = L"__threadparams";
INT_PTR
CALLBACK
DlgProcBillboard(
IN HWND hdlg,
IN UINT msg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Dialog procedure for the 'billboard-with-associated-action'
dialog. When the dialog is initializing we create a worker thread
to perform the action. This allows us to remain responsive to the
user without yielding, etc.
Arguments:
hdlg - supplies handle of dialog box
msg - supplies the message on which the dialog procedure is to act
wParam - supplies message-dependent data
lParam - supplies message-dependent data
Return Value:
Message-dependent.
--*/
{
PBILLBOARDPARAMS Params;
HANDLE h;
DWORD ThreadId;
PACTIONTHREADPARAMS params;
switch(msg) {
case WM_INITDIALOG:
Params = (PBILLBOARDPARAMS)lParam;
CenterDialogInWindow(hdlg,Params->OwnerWindow);
//
// Set the text fields.
//
SetWindowText(hdlg,Params->Caption);
SetDlgItemText(hdlg,IDT_BILLBOARD_TEXT,Params->Text);
//
// Create the thread parameters
//
params = MyMalloc(sizeof(ACTIONTHREADPARAMS));
if (params) {
SetProp(hdlg,ThreadParamsPropertyName,(HANDLE)params);
params->hdlg = hdlg;
params->UserData = Params->UserData;
} else {
OutOfMemory();
}
//
// Create the worker thread. The worker thread
// should have a sleep(100) as its first thing to let the
// billboard finish coming up. And when it's done it has
// to send us a WM_COMMAND as notification.
//
h = CreateThread(
NULL,
0,
Params->ThreadEntry,
params,
CREATE_SUSPENDED,
&ThreadId
);
if(h == NULL) {
OutOfMemory();
} else {
PostMessage(hdlg,WMX_I_AM_READY,0,(LPARAM)h);
}
break;
case WMX_I_AM_READY:
//
// Dialog is displayed; kick off the worker thread.
//
ResumeThread((HANDLE)lParam);
CloseHandle((HANDLE)lParam);
break;
case WM_COMMAND:
//
// End the dialog.
//
if(LOWORD(wParam) == IDOK) {
{
HANDLE tmpparams = GetProp(hdlg,ThreadParamsPropertyName);
if (tmpparams) {
MyFree((PVOID)tmpparams);
}
}
EndDialog(hdlg,(int)lParam);
return(FALSE);
}
break;
default:
return(FALSE);
}
return(TRUE);
}
DWORD
ActionWithBillboard(
IN PTHREAD_START_ROUTINE ThreadEntry,
IN HWND OwnerWindow,
IN UINT CaptionStringId,
IN UINT TextStringId,
IN PVOID UserData
)
/*++
Routine Description:
Main entry point for carrying out an action with a 'please wait'
dialog box.
Arguments:
ThreadEntry - supplies the address of a worker thread that will carry
out the action.
OwnerWindow - supplies the window handle of the window that is to own
the billboard dialog.
CaptionStringId - supplies the resource string id of the string to be
used as the billboard caption.
TextStringId - supplies the resource string id of the string ot be
used as the billboard text.
UserData - supplies a caller-defined value that is meaningful to the
worker thread. This valus is passed to the thread as the UserData
member of the ACTIONTHREADPARAMS structure.
Return Value:
The value returned by the action's worker thread.
--*/
{
BILLBOARDPARAMS p;
DWORD i;
//
// Load the two strings and create a params structure.
//
p.Caption = MyLoadString(CaptionStringId);
p.Text = MyLoadString(TextStringId);
p.ThreadEntry = ThreadEntry;
p.UserData = UserData;
p.OwnerWindow = OwnerWindow;
i = (DWORD)DialogBoxParam(
hInst,
MAKEINTRESOURCE(DLG_BILLBOARD),
OwnerWindow,
DlgProcBillboard,
(LPARAM)&p
);
MyFree(p.Text);
MyFree(p.Caption);
return i;
}