/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/
// GUI.C
// ================================================================
// This module contains all of the functions that interface to the
// 'graphical' part of this program. This currently only relates to
// the code that brings up the dialog box, and calls the WinHelp
// engine.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
#include "ConGUI.h"
int DoHelp (char *szHelpTopic);
int GetDialogArgs (char ***pargv);
BOOL CenterWindow (HWND hwnd);
BOOL APIENTRY CLDlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
// Use WINHELP to bring up the applicaiton help file
int DoHelp (char *szHelpTopic)
{
WinHelp (GetFocus(), "ConGUI.HLP", HELP_KEY, (DWORD)(LPSTR)szHelpTopic);
return TRUE;
}
// Bring up the dialog box, and pass back a 'command line' as was
// specified by the user
int GetDialogArgs (char ***pargv)
{
int ret;
HANDLE hinst;
HWND hwnd;
char szFile[80];
hinst = GetModuleHandle (NULL);
hwnd = GetFocus();
ret = DialogBoxParam (hinst, "CL", NULL, CLDlgProc, (LPARAM)pargv);
if (-1 == ret) {
ret = GetLastError();
printf ("Unable to create dialog: %d\n", ret);
GetModuleFileName (hinst, szFile, sizeof(szFile));
printf ("hinst = %d\n", hinst);
printf ("hwnd = %d\n", hwnd);
printf ("File = %s\n", szFile);
return FALSE;
}
return ret;
}
// A quick little routine that will center a window on the screen.
// Handy for dialog boxes
BOOL CenterWindow (HWND hwnd)
{
RECT rect;
int w, h;
int wScreen, hScreen, xNew, yNew;
HDC hdc;
GetWindowRect (hwnd, &rect);
w = rect.right - rect.left;
h = rect.bottom - rect.top;
hdc = GetDC (hwnd);
wScreen = GetDeviceCaps (hdc, HORZRES);
hScreen = GetDeviceCaps (hdc, VERTRES);
ReleaseDC (hwnd, hdc);
xNew = wScreen/2 - w/2;
yNew = hScreen/2 - h/2;
return SetWindowPos (hwnd, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
// Create a data structure that will hold the strings for the combo boxes
// we have in our dialog. This just illustrates 'a' way to do this, not
// necessarily the best.
typedef struct tagDlgCtrls {
int ctrlId;
int def;
char str[25];
char opt[5];
} DlgCtrls;
DlgCtrls dlgctrls[] = {
{ 415, FALSE, "DOS EXE", "..." },
{ 415, FALSE, "Windows 3.0 EXE", "..." },
{ 415, FALSE, "Windows 3.0 DLL", "..." },
{ 415, FALSE, "Windows 3.1 EXE", "..." },
{ 415, FALSE, "Windows 3.1 DLL", "..." },
{ 415, TRUE, "Windows NT EXE", "..." },
{ 415, FALSE, "Windows NT DLL", "..." },
{ 415, FALSE, "Windows NT Console App", "..." },
{ 402, FALSE, "Small", "AS" },
{ 402, FALSE, "Medium", "AM" },
{ 402, FALSE, "Compact", "AC" },
{ 402, TRUE, "Large", "AL" },
{ 402, FALSE, "Huge", "AH" },
{ 402, FALSE, "Customize", "A?" },
{ 404, FALSE, "8086", "G0" },
{ 404, FALSE, "80186", "G1" },
{ 404, TRUE, "80286", "G2" },
{ 404, FALSE, "80386", "G3" },
{ 404, FALSE, "80486", "G4" },
{ 406, TRUE, "stdcall", "Gz" },
{ 406, FALSE, "Pascal", "Gc" },
{ 406, FALSE, "C", "Gd" },
{ 408, FALSE, "Level 0", "W0" },
{ 408, FALSE, "Level 1", "W1" },
{ 408, FALSE, "Level 2", "W2" },
{ 408, TRUE, "Level 3", "W3" },
{ 408, FALSE, "Level 4", "W4" },
{ 411, FALSE, "None", "" },
{ 411, FALSE, "Line Numbers Only", "Zd" },
{ 411, TRUE, "Full Information", "Zi" },
{ 418, FALSE, "Ansi C", "Za" },
{ 418, TRUE, "MS Extensions", "Ze" },
{ 413, FALSE, "None", "" },
{ 413, TRUE, "Protect Mode App", "GA" },
{ 413, FALSE, "Protect Mode DLL", "GD" },
{ 0, 0} // End Of List
};
BOOL APIENTRY CLDlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int wmId;
static char ***pargv;
static char **argv;
int i, item, index, iCtrl, argc;
char *cmd;
char *cmdline;
switch (msg) {
case WM_INITDIALOG:
// We need to initialize stuff in the dialog box...
pargv = (char ***)lParam;
argv = *pargv;
CenterWindow (hdlg);
iCtrl = i = 0;
while (dlgctrls[i].ctrlId) {
if (dlgctrls[i].ctrlId != iCtrl) { // Starting a new list
iCtrl = dlgctrls[i].ctrlId;
}
index = SendDlgItemMessage (hdlg, iCtrl, CB_ADDSTRING, 0, (DWORD)(LPSTR)dlgctrls[i].str);
SendDlgItemMessage (hdlg, iCtrl, CB_SETITEMDATA, index, i);
if (dlgctrls[i].def) {
SendDlgItemMessage (hdlg, dlgctrls[i].ctrlId, CB_SETCURSEL, index, 0);
}
i++;
}
return (TRUE);
case WM_DESTROY:
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
switch (wmId) {
case T_HELP:
DoHelp ("Contents");
break;
case IDOK:
cmd = cmdline = (char *)GlobalAlloc (GPTR, 128);
argv[0] = cmdline;
argc = 0;
if (cmdline) {
iCtrl = i = 0;
while (dlgctrls[i].ctrlId) {
if (dlgctrls[i].ctrlId != iCtrl) {
iCtrl = dlgctrls[i].ctrlId;
index = SendDlgItemMessage(hdlg, iCtrl, CB_GETCURSEL, 0, 0);
if (index) {
item = SendDlgItemMessage (hdlg, iCtrl, CB_GETITEMDATA, index, 0);
wsprintf ((LPSTR)cmd, "-%s", (LPSTR)dlgctrls[item].opt);
cmd += strlen(cmd);
cmd[0] = 0;
argv[++argc] = ++cmd;
}
}
i++;
}
} // if (cmdline)...
EndDialog(hdlg, argc);
return (TRUE);
case IDCANCEL:
EndDialog(hdlg, 0);
return (TRUE);
}
break;
}
return (FALSE);
lParam; // unreferenced formal parameter
}