245 lines
5.1 KiB
C
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;
|
|
}
|