DIALOGS.C

//*********************************************************************** 
//
// dialogs.c
//
// Contains all the dialog procedures for WinCap Windows Screen Capture
// Program.
//
// Dialog Functions:
//
// AboutDlgProc() // About Box
// PrintDlgProc() // Print Options Dialog
// SavingDlgProc() // Dialog which displays "Saving to file..."
//
// Written by Microsoft Product Support Services, Developer Support.
// Copyright 1991-1998 Microsoft Corporation. All rights reserved.
//***********************************************************************

#define STRICT // enable strict type checking

#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include "WINCAP.h"
#include "DIALOGS.h"
#include "commdlg.h"
#include "resource.h"

// Global variables which are set in main program

extern char szAppName[20]; /// Name of app
extern HINSTANCE ghInst; /// Handle to instance
extern HWND ghWndMain; /// Handle to main window
extern BOOL gbNowCapturing;
extern BOOLgbCaptRect;

//**********************************************************************
//
//"About" Dialog Box Window Procedure
//
// Notable features: This dialog box draws the application's icon
// in the dialog box itself. The icon is actually stretched larger to
// fit in the specified area, which must be done manually.
// See WM_PAINT case.
//
//
//***********************************************************************

BOOL APIENTRY AboutDlgProc(HWND hWndDlg, UINT Message, WPARAM wParam, LONG
lParam)
{
static HBITMAP ghAboutBmp = NULL;

switch (Message)
{
// Set focus on the OK button. Since we set focus, return FALSE

case WM_INITDIALOG:
SetFocus(GetDlgItem(hWndDlg, IDOK));
ghAboutBmp = LoadBitmap(ghInst, "ABOUTBMP");
return FALSE;

//Closing the Dialog behaves the same as Cancel

case WM_CLOSE:
PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
break;

case WM_COMMAND:
switch (wParam)
{
case IDOK:

case IDCANCEL:
EndDialog(hWndDlg, FALSE);
if (ghAboutBmp)
DeleteObject(ghAboutBmp);

break;
}
break; //End of WM_COMMAND

// Paint our bitmap in the about box in the WM_PAINT case

case WM_PAINT:
{
HBITMAP hbm;
HDC hdcMem;
PAINTSTRUCT ps;
RECT r1; // Coordinates of TEXT1 control
POINT p1; // Used to convert screen to client coords
BITMAP bm; // For getting info about "About" bitmap

BeginPaint(hWndDlg, &ps);

// Place screen coords of TEXT1 in r1

GetWindowRect(GetDlgItem(hWndDlg, IDC_TEXT1), &r1);
p1.x = r1.left;
p1.y = r1.top;

ScreenToClient(hWndDlg, &p1);

// p1 now describes the location of upper-left corner
// for the top text in the dialog. Let's use this
// to make sure we don't draw our bitmap over the text

r1.left = 12;
r1.top = p1.y;
r1.right = p1.x - 25;
r1.bottom = r1.top + (r1.right - r1.left); // Make it square

if (hdcMem = CreateCompatibleDC(ps.hdc))
{
GetObject(ghAboutBmp, sizeof(BITMAP), (LPVOID)&bm);
hbm = SelectObject(hdcMem, ghAboutBmp);
StretchBlt(ps.hdc, r1.left, r1.top, r1.right, r1.bottom, hdcMem,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
SelectObject(hdcMem, hbm);
DeleteDC(hdcMem);
}

EndPaint(hWndDlg, &ps);
break;
}

default:
return FALSE;
}

return TRUE;
} // End of DIALOGSMsgProc


//***********************************************************************
//
// "Print" Dialog Box Window Procedure
//
// This procedure takes care of the processing for the "Print" dialog
// box, which contains the printing options.
//
// This Dialog Box Procedure is called using DialogBoxParam. This
// allows us to pass a parameter into the dialog box procedure -- the
// parameter that gets passed in here is a LPSTR to a structure holding
// all the options that the user specified in this dialog box. This
// allows passing the options back to the main program WITHOUT using
// global variables.
//
//***********************************************************************

BOOL APIENTRY PrintDlgProc(HWND hWndDlg, UINT Message, WPARAM wParam,
LPARAM lParam)
{
static LPOPTIONSTRUCT lpOS;

switch (Message)
{
case WM_INITDIALOG:
{

// Because DialogBoxParam() was used to invoke this dialog box,
// lParam contains a pointer to the OPTIONSTRUCT.
// Place user input in this structure before returning.

lpOS = (LPOPTIONSTRUCT)lParam;

// Check the default button -- "BEST FIT"

CheckRadioButton(hWndDlg, IDC_BESTFIT, IDC_STRETCHTOPAGE, IDC_BESTFIT);

// Gray out the stuff under "SCALE"

EnableWindow(GetDlgItem(hWndDlg, IDC_XAXIS), FALSE);
EnableWindow(GetDlgItem(hWndDlg, IDC_YAXIS), FALSE);
EnableWindow(GetDlgItem(hWndDlg, IDC_XTEXT), FALSE);
EnableWindow(GetDlgItem(hWndDlg, IDC_YTEXT), FALSE);
break;
}

// Closing the Dialog should behave the same as Cancel

case WM_CLOSE:
PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
break;

case WM_COMMAND:
switch (wParam)
{
case IDC_BESTFIT:

case IDC_STRETCHTOPAGE:

case IDC_SCALE:

// Check the correct button

CheckRadioButton(hWndDlg, IDC_BESTFIT, IDC_SCALE, wParam);

// And enable or disable the options under "Scale",
// depending on whether or not the IDC_SCALE button
// is checked

EnableWindow(GetDlgItem(hWndDlg, IDC_XAXIS),
(BOOL)(wParam == IDC_SCALE));
EnableWindow(GetDlgItem(hWndDlg, IDC_YAXIS),
(BOOL)(wParam == IDC_SCALE));
EnableWindow(GetDlgItem(hWndDlg, IDC_XTEXT),
(BOOL)(wParam == IDC_SCALE));
EnableWindow(GetDlgItem(hWndDlg, IDC_YTEXT),
(BOOL)(wParam == IDC_SCALE));
break;

case IDOK:
{
char szTmp[100];

// Save the user's selection into the OPTIONSTRUCT

if (!lpOS)
{
EndDialog(hWndDlg, FALSE);
break;
}

if (IsDlgButtonChecked(hWndDlg, IDC_BESTFIT))
lpOS->iOption = IDC_BESTFIT;

if (IsDlgButtonChecked(hWndDlg, IDC_STRETCHTOPAGE))
lpOS->iOption = IDC_STRETCHTOPAGE;

if (IsDlgButtonChecked(hWndDlg, IDC_SCALE))
lpOS->iOption = IDC_SCALE;

if (GetDlgItemText(hWndDlg, IDC_XAXIS, (LPSTR)szTmp, 100))
lpOS->iXScale = atoi(szTmp);

if (GetDlgItemText(hWndDlg, IDC_YAXIS, (LPSTR)szTmp, 100))
lpOS->iYScale = atoi(szTmp);

EndDialog(hWndDlg, TRUE);
break;
}


case IDCANCEL:
EndDialog(hWndDlg, FALSE);
break;
} // End of WM_COMMAND

break;

default:
return FALSE;
}

return TRUE;
}


//***********************************************************************
//
// "Saving file to..." Dialog Box Window Procedure
//
// This is a modeless dialog box which is called when we save the bitmap
// to a file (so the user dosen't think his machine has hung).
//
//***********************************************************************

BOOL APIENTRY SavingDlgProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_SETFOCUS:
MessageBeep(0);
break;

case WM_INITDIALOG:

// Set the text of the filename in the dialog box. This dialog
// should be called with DialogBoxParam, and the parameter should
// be a pointer to the filename. It shows up as the lParam here.

SetDlgItemText(hDlg, IDC_FILETEXT, (LPSTR)lParam);
return TRUE;
break;

case WM_DESTROY:
return TRUE;
break;

default:
return FALSE;
}
}


//***********************************************************************
//
// Selection Help Dialog Box Window Procedure
//
// This is a modeless dialog box which displays how to select a window to
// be captured
//
//***********************************************************************
BOOL APIENTRY SelectDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
HGLOBAL hMem;
char *szText;

hMem = GlobalAlloc(GHND, 200);
szText = (char *)GlobalLock(hMem);
if(szText == NULL)
return TRUE;

LoadString(ghInst, IDS_SELECT2, szText, 200);
SetDlgItemText(hDlg, IDC_STATIC_SELECT2, szText);
LoadString(ghInst, IDS_SELECT3, szText, 200);
SetDlgItemText(hDlg, IDC_STATIC_SELECT3, szText);

GlobalUnlock(hMem);
GlobalFree(hMem);

return TRUE;
}

case WM_COMMAND:
if ((wParam) != IDCANCEL)
return FALSE;
else
{
ShowWindow(hDlg, SW_HIDE);
gbNowCapturing = FALSE;
return TRUE;
}

case WM_SYSCOMMAND:
if(wParam == SC_CLOSE)
{
ShowWindow(hDlg, SW_HIDE);
gbNowCapturing = FALSE;
return TRUE;
}
else
return FALSE;

case WM_DESTROY:
return TRUE;

default:
return FALSE;
}
}


//***********************************************************************
//
// Selection Help Dialog Box Window Procedure
//
// This is a modeless dialog box which displays how to select a window to
// be captured
//
//***********************************************************************
BOOL APIENTRY RectangleDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
HGLOBAL hMem;
char *szText;

hMem = GlobalAlloc(GHND, 200);
szText = (char *)GlobalLock(hMem);
if(szText == NULL)
return TRUE;

LoadString(ghInst, IDS_RECT2, szText, 200);
SetDlgItemText(hDlg, IDC_STATIC_RECT2, szText);
LoadString(ghInst, IDS_RECT3, szText, 200);
SetDlgItemText(hDlg, IDC_STATIC_RECT3, szText);

GlobalUnlock(hMem);
GlobalFree(hMem);

return TRUE;
}

case WM_COMMAND:
if ((wParam) != IDCANCEL)
return FALSE;
else
{
ShowWindow(hDlg, SW_HIDE);
gbNowCapturing = FALSE;
gbCaptRect = FALSE;
return TRUE;
}

case WM_SYSCOMMAND:
if(wParam == SC_CLOSE)
{
ShowWindow(hDlg, SW_HIDE);
gbNowCapturing = FALSE;
return TRUE;
}
else
return FALSE;

case WM_DESTROY:
return TRUE;

default:
return FALSE;
}
}