home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
appwiz
/
customwz
/
seqdlg.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-05
|
7KB
|
256 lines
// seqdlg.cpp : implementation file
//
// Copyright (c) 1985-1998, Microsoft Corporation. All rights reserved.
//
#include "stdafx.h"
#include "customwz.h"
#include "seqdlg.h"
#include "sampleaw.h"
#include "typedlg.h"
#include "options.h"
#include "paint.h"
#ifdef _PSEUDO_DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// Retrieve language suffix ("enu" or "fra", etc.)
void GetLangSuffix(CString& strLang)
{
int nLeftParen = strLang.Find(_T('('));
ASSERT(nLeftParen != -1);
strLang = strLang.Mid(nLeftParen+1); // Now, strLang starts at the DLL name
strLang.MakeLower();
int nPeriod = strLang.Find(_T('.'));
ASSERT(nPeriod != -1);
ASSERT(strLang.Left(5) == _T("appwz"));
strLang = strLang.Mid(5, nPeriod-5);
}
/////////////////////////////////////////////////////////////////////////////
// CSequenceDlg dialog
CSequenceDlg::CSequenceDlg()
: CAppWizStepDlg(CSequenceDlg::IDD)
{
//{{AFX_DATA_INIT(CSequenceDlg)
m_nApwzSeq = APWZSEQ_EXE;
//}}AFX_DATA_INIT
SetSeqBitmap();
DefineDefaultLangMacros();
}
void CSequenceDlg::DoDataExchange(CDataExchange* pDX)
{
CAppWizStepDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSequenceDlg)
DDX_Radio(pDX, IDC_APWZ_SEQ, m_nApwzSeq);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSequenceDlg, CAppWizStepDlg)
//{{AFX_MSG_MAP(CSequenceDlg)
ON_COMMAND_EX(IDC_APWZ_SEQ, OnClickedRadio)
ON_WM_PAINT()
ON_COMMAND_EX(IDC_APWZ_SEQ2, OnClickedRadio)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSequenceDlg message handlers
#define STEP2AB_LEFT 8
#define STEP2AB_TOP 40
#define STEP2AB_WIDTH 179
#define STEP2AB_HEIGHT 180
// Override OnPaint to draw pictures on the left side
void CSequenceDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
PaintBackground(&dc, this);
CDC dcMem;
if (!dcMem.CreateCompatibleDC(&dc))
return;
// picture
PaintBitmap(m_nSeqBitmap, STEP2AB_LEFT, STEP2AB_TOP, STEP2AB_WIDTH, STEP2AB_HEIGHT, &dc, &dcMem);
}
// Set member variable to the bitmap ID corresponding to the currently
// selected AppWizard sequence
void CSequenceDlg::SetSeqBitmap()
{
static UINT nBmps[] = {IDB_STEP2A, IDB_STEP2B};
ASSERT (m_nApwzSeq == 0 || m_nApwzSeq == 1);
m_nSeqBitmap = nBmps[m_nApwzSeq];
}
// This handler allows us to dynamically change the bitmap as soon
// as a new AppWizard sequence is selected.
BOOL CSequenceDlg::OnClickedRadio(UINT nID)
{
UpdateData(TRUE);
SetSeqBitmap();
// Invalidate the portion of this dialog on which we draw the picture
CRect rect(STEP2AB_LEFT, STEP2AB_TOP, STEP2AB_LEFT + STEP2AB_WIDTH, STEP2AB_TOP + STEP2AB_HEIGHT);
RedrawWindow(&rect, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
EnableLangListbox(m_nApwzSeq == APWZSEQ_EXE);
return TRUE;
}
void CSequenceDlg::DefineDefaultLangMacros()
{
ScanForAvailableLanguages(m_strlLanguages);
// m_strlLanguages is now a stringlist whose entries are of the form:
// "U.S. English (appwzenu.dll);0x040904e4" For the purposes of the
// listbox, we want to strip out the translation identifiers
// (0x040904e4). However, we retain the POSITION in m_strlLanguages
// for each entry, so that when we generate the custom AppWizard, its
// code will correctly call SetSupportedLanguages with the original
// entries that AppWizard gave us here, complete with the translation
// identifiers (see InitLangList() below).
POSITION pos = m_strlLanguages.GetHeadPosition();
int nLanguageCount = 0;
CString strSupportedLangs;
while (pos != NULL)
{
CString strLang = m_strlLanguages.GetNext(pos);
strSupportedLangs += _T("\\n") + strLang;
GetLangSuffix(strLang);
DefineStringMacro(_T("CUSTOM_LANG_SUFFIX"), nLanguageCount++, strLang);
}
ASSERT(!strSupportedLangs.IsEmpty());
strSupportedLangs = strSupportedLangs.Mid(2); // Chop off leading '\n'
DefineStringMacro(_T("SUPPORTED_LANGS"), strSupportedLangs);
DefineIntMacro(_T("NUM_CUSTOM_LANGS"), nLanguageCount);
}
// Set macros corresponding to the languages selected
#define MAX_SELECTED_LANGS 32
BOOL CSequenceDlg::DefineLangMacros()
{
CString strSupportedLangs;
int pnSelectedLangs[MAX_SELECTED_LANGS];
CListBox* pList = (CListBox*) GetDlgItem(IDC_LANGS);
int nSelCount = pList->GetSelCount();
if (nSelCount > MAX_SELECTED_LANGS)
{
// We use a stack-allocated, static-size array for storing the
// listbox selections, since it's cheaper than using the heap.
// Print error in the unlikely event there are over 32 languages
// installed & selected.
CString strPrompt;
strPrompt.LoadString(IDP_TOO_MANY_LANGS);
strPrompt.Format(strPrompt, MAX_SELECTED_LANGS);
AfxMessageBox(strPrompt);
return FALSE;
}
// Make sure at least one language is selected
if (nSelCount == 0)
{
AfxMessageBox(IDP_NO_LANGS_SELECTED);
return FALSE;
}
// Go through listbox and make a string of the names of the selected
// languages. The string will be of the form:
// "U.S. English (appwzenu.dll)\nFrench (appwzfra.dll)"
pList->GetSelItems(MAX_SELECTED_LANGS, pnSelectedLangs);
for (int i=0; i < nSelCount; i++)
{
POSITION pos = (POSITION) pList->GetItemData(pnSelectedLangs[i]);
CString strLang = m_strlLanguages.GetAt(pos);
strSupportedLangs += _T("\\n") + strLang;
// Retrieve language suffix ("enu" or "fra", etc.)
GetLangSuffix(strLang);
DefineStringMacro(_T("CUSTOM_LANG_SUFFIX"), i, strLang);
}
ASSERT(!strSupportedLangs.IsEmpty());
strSupportedLangs = strSupportedLangs.Mid(2); // Chop off leading '\n'
DefineStringMacro(_T("SUPPORTED_LANGS"), strSupportedLangs);
DefineIntMacro(_T("NUM_CUSTOM_LANGS"), nSelCount);
return TRUE;
}
// Set step-related template macros before dismissing
BOOL CSequenceDlg::OnDismiss()
{
if (!UpdateData(TRUE))
return FALSE;
if (m_nApwzSeq == APWZSEQ_EXE && !DefineLangMacros())
return FALSE;
g_options.m_nApwzSeq = m_nApwzSeq;
g_options.DefineDlgMacros();
return TRUE;
}
void CSequenceDlg::EnableLangListbox(BOOL bEnable)
{
GetDlgItem(IDC_LANGS)->EnableWindow(bEnable);
GetDlgItem(IDC_LANGS_STATIC)->EnableWindow(bEnable);
}
void CSequenceDlg::InitLangList()
{
CListBox* pList = (CListBox*) GetDlgItem(IDC_LANGS);
int i = 0;
POSITION pos = m_strlLanguages.GetHeadPosition();
while (pos != NULL)
{
POSITION posCurrent = pos;
CString strLang = m_strlLanguages.GetNext(pos);
int nSemicolon = strLang.Find(_T(';'));
ASSERT(nSemicolon != -1);
// Add the entry minus the translation ID to the listbox
i = pList->AddString(strLang.Left(nSemicolon));
// Retain original POSITION for use when generating the wizard
pList->SetItemData(i, (DWORD) posCurrent);
}
// By default, the custom AppWizard will support the languages AppWizard
// supports. Thus, we start off the listbox by selecting all languages.
if (i == 0)
pList->SetSel(0, TRUE);
else
pList->SelItemRange(TRUE, 0, i);
EnableLangListbox(m_nApwzSeq == APWZSEQ_EXE);
}
BOOL CSequenceDlg::OnInitDialog()
{
CAppWizStepDlg::OnInitDialog();
InitLangList();
return TRUE;
}