CARDPPG.CPP
//=--------------------------------------------------------------------------= 
// CardPPG.Cpp 
//=--------------------------------------------------------------------------= 
// Copyright 1995 - 1998 Microsoft Corporation.  All Rights Reserved. 
// 
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
// PARTICULAR PURPOSE. 
//=--------------------------------------------------------------------------= 
// 
// property page implementations for Card control. 
// 
#include "IPServer.H" 
 
#include "LocalObj.H" 
#include "CARDPPG.H" 
#include "CARDCtl.H" 
#include "Resource.H" 
#include "Util.H" 
 
 
// for ASSERT and FAIL 
// 
SZTHISFILE 
 
//=--------------------------------------------------------------------------= 
// Property Page messages 
//=--------------------------------------------------------------------------= 
// in addition to regular windows messages you'll receive for a dialog box, 
// you'll receive the following messages in your property page implementation: 
// 
// PPM_NEWOBJECTS: 
//    wParam = 0; 
//    lParam = (LPARAM)(HRESULT *)hr 
// 
//  - in this message, you should call FirstControl() to get a pointer to a 
//    control, and initialize the values in the property page dialog with 
//    values from the control object.  put results from the operation in 
//    the HRESULT pointed to by LPARAM. 
// 
// PPM_APPLY: 
//    wParam = 0; 
//    lParam = (LPARAM)(HRESULT *)hr 
// 
//  - this message is sent to your dialog whenever the user clicks APPLY or OK 
//    in the dialog.  you should have a loop with the following code in it: 
// 
//      for (pUnk = FirstControl(&dwCookie) ; pUnk; pUnk = NextControl(&dwCookie)) { 
//            hr = pUnk->QueryInterface(IID_IMyCtlInterface, (void **)&pMyCtl); 
//            // set properties here!!! 
//      } 
// 
//    call PropPageException() if there is an error while setting propertites 
//    to show the exception set up by the property set routine. 
// 
// PPM_EDITPROPERTY: 
//    wParam = dispid 
//    lParam = (LPARAM)(HRESULT *)hr 
// 
//  - sent to your dialog when somebody wants you to set the focus to a specific 
//    property [typically, one will see a call to this when one returns a page 
//    from IPerPropertyBrowsing::MapPropertyToPage].  you can use this 
//    to bring up dialogs, or do whatever flaps your flagella. 
// 
 
 
//=--------------------------------------------------------------------------= 
// CCardGeneralPage::Create 
//=--------------------------------------------------------------------------= 
// global static creation function. 
// 
// Parameters: 
//    IUnknown *    - [in] controlling unknown 
// 
// Output: 
//    IUnknown *    - new prop page. 
// 
// Notes: 
// 
IUnknown *CCardGeneralPage::Create 
( 
    IUnknown *pUnkOuter 
) 
{ 
    return (IUnknown *)new CCardGeneralPage(pUnkOuter); 
} 
 
//=--------------------------------------------------------------------------= 
// CCardGeneralPage::CCardGeneralPage 
//=--------------------------------------------------------------------------= 
// constructor. 
// 
// Parameters: 
//    IUnknown *        - [in] controlling unknown. 
// 
// Notes: 
// 
CCardGeneralPage::CCardGeneralPage 
( 
    IUnknown *pUnkOuter 
) 
: CPropertyPage(pUnkOuter, OBJECT_TYPE_PPGCARDGENERAL) 
{ 
    // initialize local variables here. 
} 
 
//=--------------------------------------------------------------------------= 
// CCardGeneralPage::~CCardGeneralPage 
//=--------------------------------------------------------------------------= 
// destructor. 
// 
// Notes: 
// 
CCardGeneralPage::~CCardGeneralPage() 
{ 
    // clean up 
} 
 
static int SimpleAtoi( const char *str ) 
{ 
int num = 0; 
const char *s; 
 
for( s = (*str == '-' ? str+1 : str); *s >= '0' && *s <= '9'; s++ ) 
num = num * 10 + (*s - '0'); 
 
return( *str == '-' ? -num : num ); 
} 
 
static void SetDropDown( HWND hwnd, const char *strs[], int id, short set ) 
{ 
short newset; 
int i; 
 
newset = -1000; 
for( i = 0; strs[i]; i++ ) 
{ 
SendMessage( GetDlgItem( hwnd, id ), CB_ADDSTRING,  
0, (LPARAM) strs[i] ); 
if( SimpleAtoi(strs[i]) == set ) 
newset = i; 
} 
if( newset != -1000 ) 
SendMessage( GetDlgItem( hwnd, id ), CB_SETCURSEL, 
(WPARAM) newset, 0 ); 
} 
 
//=--------------------------------------------------------------------------= 
// CCardGeneralPage::DialogProc 
//=--------------------------------------------------------------------------= 
// our dialog proc. 
// 
// Parameters: 
//    - see win32sdk docs on DialogProc 
// 
// Notes: 
// 
BOOL CCardGeneralPage::DialogProc 
( 
    HWND   hwnd, 
    UINT   msg, 
    WPARAM wParam, 
    LPARAM lParam 
) 
{ 
    HRESULT     hr; 
    ICard *pCard; 
    IUnknown   *pUnk; 
    DWORD       dwDummy; 
    enumCardNumber number; 
    enumCardSuite suite; 
    enumCardAlignment cardalignment; 
VARIANT_BOOL invert; 
 
static const char *numstr[] = { 
"1   - Ace", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", 
"11  - Jack", 
"12  - Queen", 
"13  - King", 
        "14  - Joker", 
NULL }; 
 
static const char *alignstr[] = { 
"0   - Top Left", 
"1   - Top Center", 
"2   - Top Right", 
"3   - Center Left", 
"4   - Center", 
"5   - Center Right", 
"6   - Bottom Left", 
"7   - Bottom Center", 
"8   - Bottom Right", 
"9   - Stretch", 
NULL }; 
 
static const char *suitestr[] = { 
"0   - Invisible", 
"1   - Clubs",  
"2   - Spades",  
"3   - Hearts",  
"4   - Diamonds", 
"-1  - Card Back: Weave 1", 
"-2  - Card Back: Weave 2", 
"-3  - Card Back: Robot", 
"-4  - Card Back: Roses", 
"-5  - Card Back: Vine 1 (black)", 
"-6  - Card Back: Vine 2 (blue)", 
"-7  - Card Back: Fish 1 (light blue)", 
"-8  - Card Back: Fish 2 (dark blue)", 
"-9  - Card Back: Seashell", 
"-10 - Card Back: Castel", 
"-11 - Card Back: Beach", 
"-12 - Card Back: Hand", 
"-13 - Card Back: Casino",  
NULL }; 
 
    switch (msg) { 
 
      // we've been given some new objects, so go and re-set up the dialog page. 
      // 
      case PPM_NEWOBJECTS: 
        { 
 
        pUnk = FirstControl(&dwDummy); 
        if (!pUnk) return FALSE; 
 
        hr = pUnk->QueryInterface(IID_ICard, (void **)&pCard); 
        if (FAILED(hr)) return FALSE; 
 
        pCard->get_Number(&number); 
        pCard->get_Suite(&suite); 
        pCard->get_Invert(&invert); 
pCard->get_CardAlignment(&cardalignment); 
 
SetDropDown( hwnd, suitestr, IDC_SUITE, suite ); 
SetDropDown( hwnd, numstr, IDC_NUMBER, number ); 
SetDropDown( hwnd, alignstr, IDC_ALIGNMENT, cardalignment ); 
 
CheckDlgButton( hwnd, IDC_INVERT, invert == VARIANT_TRUE ? 1 : 0 ); 
 
        pCard->Release(); 
        } 
        return TRUE; 
 
      case PPM_APPLY: 
        { 
        char      szTmp[128]; 
 
        // get all the controls we have to update. 
        // 
        for (pUnk = FirstControl(&dwDummy) ; pUnk; pUnk = NextControl(&dwDummy))  
{ 
            hr = pUnk->QueryInterface(IID_ICard, (void **)&pCard); 
            if (FAILED(hr)) continue; 
     
            GetDlgItemText(hwnd, IDC_NUMBER, szTmp, 128); 
    number = (enumCardNumber) SimpleAtoi(szTmp); 
            GetDlgItemText(hwnd, IDC_SUITE, szTmp, 128); 
    suite = (enumCardSuite) SimpleAtoi(szTmp); 
            GetDlgItemText(hwnd, IDC_ALIGNMENT, szTmp, 128); 
    cardalignment = (enumCardAlignment) SimpleAtoi(szTmp); 
    invert = IsDlgButtonChecked( hwnd, IDC_INVERT ) ? VARIANT_TRUE : VARIANT_FALSE; 
     
            pCard->put_Number(number); 
    pCard->put_Suite(suite); 
    pCard->put_Invert(invert); 
    pCard->put_CardAlignment(cardalignment); 
            pCard->Release(); 
        } 
        } 
        return TRUE; 
 
      case WM_COMMAND: 
        switch (LOWORD(wParam)) { 
          case IDC_SUITE: case IDC_NUMBER: case IDC_ALIGNMENT: 
            if (HIWORD(wParam) == CBN_SELCHANGE) 
                MakeDirty(); 
  case IDC_INVERT: 
    if( HIWORD(wParam) == BN_CLICKED ) 
MakeDirty(); 
        } 
        break; 
    } 
 
return(FALSE); 
}