|
|
/*++
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; }
|