Microsoft™ Visual C++ OLE sample program

This program sample is provided on an as-is basis.

A licensee of the Content Manager OnDemand product is free to copy, revise, modify, and make derivative works of this program sample as they see fit.

#include "stdafx.h"
#include [winspool.h]

#include "vcole32.h"
#include "MainDlg.h"
#include "AttrsDlg.h"

static CMainDlg * pMainDlg;

#define COLOR_MAP struct _ColorMap
COLOR_MAP
{
  short  color;
  char * pText;
};

static COLOR_MAP Colors[;]; =
  { { ARS_OLE_COLOR_BLACK,   "Black" },
    { ARS_OLE_COLOR_WHITE,   "White" },
    { ARS_OLE_COLOR_RED,     "Red" },
    { ARS_OLE_COLOR_BLUE,    "Blue" },
    { ARS_OLE_COLOR_GREEN,   "Green" },
    { ARS_OLE_COLOR_YELLOW,  "Yellow" },
    { ARS_OLE_COLOR_GRAY,    "Gray" },
    { ARS_OLE_COLOR_CYAN,    "Cyan" },
    { ARS_OLE_COLOR_MAGENTA, "Magenta" } };

#define NUM_COLORS  ( sizeof(Colors) / sizeof(COLOR_MAP) )

#define ERROR_MAP struct _ErrorMap
ERROR_MAP
{
  short  code;
  char * pMsg;
};

static ERROR_MAP Errors[;]; =
  { { ARS_OLE_RC_NO_MEMORY,              "insufficient memory" },
    { ARS_OLE_RC_UNKNOWN_FOLDER,         "unknown folder" },
    { ARS_OLE_RC_NO_FOLDERS_AVAILABLE,   "no folders availble" },
    { ARS_OLE_RC_SERVER_ERROR,           "server error" },
    { ARS_OLE_RC_FOLDER_ALREADY_OPEN,    "folder already open" },
    { ARS_OLE_RC_NOT_LOGGED_ON,          "not logged on" },
    { ARS_OLE_RC_ALREADY_LOGGED_ON,      "already logged on" },
    { ARS_OLE_RC_INVALID_DIRECTORY,      "invalid directory" },
    { ARS_OLE_RC_FOLDER_NOT_OPEN,        "folder not open" },
    { ARS_OLE_RC_DOC_ALREADY_OPEN,       "document already open" },
    { ARS_OLE_RC_DOC_NOT_OPEN,           "no document is open" },
    { ARS_OLE_RC_OPEN_DOC_FAILED,        "open doc failed" },
    { ARS_OLE_RC_UNAUTHORIZED_OPERATION, "unauthorized operation" },
    { ARS_OLE_RC_USER_CANCELLED,         "user cancelled operation" },
    { ARS_OLE_RC_INVALID_INDEX,          "invalid index" },
    { ARS_OLE_RC_INVALID_FIELD,          "invalid field" },
    { ARS_OLE_RC_INVALID_OPERATOR,       "invalid operator" },
    { ARS_OLE_RC_INVALID_MESSAGE_MODE,   "invalid message mode" },
    { ARS_OLE_RC_INVALID_ZOOM_PERCENT,   "invalid zoom percent" },
    { ARS_OLE_RC_DOC_CANNOT_HORZ_SCROLL, "cannot horz scroll" },
    { ARS_OLE_RC_INVALID_PAGE_NUMBER,    "invalid page number" },
    { ARS_OLE_RC_INVALID_CONTROL_ID,     "invalid other control" },
    { ARS_OLE_RC_INVALID_ROTATION,       "invalid rotation" },
    { ARS_OLE_RC_NO_DOC_AVAILABLE,       "no document for hit" },
    { ARS_OLE_RC_NOT_SUPPORTED,          "not supported" },
    { ARS_OLE_RC_FILE_ERROR,             "file error" },
    { ARS_OLE_RC_INVALID_COPIES,         "invalid copies" },
    { ARS_OLE_RC_INVALID_ORIENTATION,    "invalid orientation" },
    { ARS_OLE_RC_INVALID_PRINTER,        "invalid printer" },
    { ARS_OLE_RC_INVALID_FIND_TYPE,      "invalid find type" },
    { ARS_OLE_RC_ERROR_DURING_PRINT,     "error during print" },
    { ARS_OLE_RC_INVALID_COLOR,          "invalid color" } };

#define NUM_ERRORS  ( sizeof(Errors) / sizeof(ERROR_MAP) )

BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
        //{{AFX_MSG_MAP(CMainDlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_PRINT, OnPrint)
        ON_LBN_DBLCLK(IDC_DOCLIST, OnDblclkDoclist)
        ON_BN_CLICKED(IDC_CLOSE, OnCloseDlg)
        ON_WM_HSCROLL()
        ON_WM_VSCROLL()
        ON_WM_CLOSE()
        ON_BN_CLICKED(IDC_ATTRIBUTES, OnSetDocAttrs)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CMainDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CMainDlg)
        ON_EVENT(CMainDlg, IDC_ARSCTRL, 4, OnFolderSearchCompletedArsctrl, VTS_NONE)
        ON_EVENT(CMainDlg, IDC_ARSCTRL, 3, OnDocOpenedArsctrl, VTS_NONE)
        ON_EVENT(CMainDlg, IDC_ARSCTRL, 1, OnDocClosedArsctrl, VTS_NONE)
        //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CMainDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CMainDlg)
                // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CMainDlg::CMainDlg()
{
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CMainDlg)
                // NOTE: the ClassWizard will add DDX and DDV calls here
        //}}AFX_DATA_MAP
}

/////////////////////////////////////////////////////////////////////////////
// CMainDlg message handlers

BOOL CMainDlg::OnInitDialog()
{
    VARIANT   var;
    short     rc;
    char      Misc[1024;];
    CArsOle * pArsCtrl;
    int       index;

    pMainDlg = this;

    m_DocOpened = FALSE;

    ( (CButton*)GetDlgItem( IDC_PRINT ) )->EnableWindow( FALSE );
    ( (CButton*)GetDlgItem( IDC_ATTRIBUTES ) )->EnableWindow( FALSE );

    SetIcon(m_hIcon, FALSE);

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );

    ( (CScrollBar*)GetDlgItem( IDC_HORZ_SCROLLBAR ) )->SetScrollRange( 0, ARS_OLE_SCROLL_RANGE );
    ( (CScrollBar*)GetDlgItem( IDC_VERT_SCROLLBAR ) )->SetScrollRange( 0, ARS_OLE_SCROLL_RANGE );
    ( (CScrollBar*)GetDlgItem( IDC_HORZ_SCROLLBAR ) )->ShowScrollBar( FALSE );
    ( (CScrollBar*)GetDlgItem( IDC_VERT_SCROLLBAR ) )->ShowScrollBar( FALSE );

    // Begin calling functions in the Content Manager OnDemand OLE control

    rc = pArsCtrl->SetUserMessageMode( ARS_OLE_USER_MSG_MODE_SHOW );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "SetUserMessageMode" );

    rc = pArsCtrl->Logon( "gunnar", "demo", " " );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "Logon" );

    rc = pArsCtrl->OpenFolder( "Credit Card Statements" );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "OpenFolder" );
        return FALSE;
    }

    rc = pArsCtrl->GetNumFolderDisplayFields( &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "GetNumFolderDisplayFields" );
        return FALSE;
    }
    m_NumDisplayFields = var.iVal;

    rc = pArsCtrl->SearchFolder( FALSE );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "SearchFolder" );
        return FALSE;
    }

    // Get the list of local printers
    CComboBox * pPrintersList;
    PRINTER_INFO_2 * pPrinterInfoArray;
    DWORD size, num_printer_infos, printer_info_index, port_index;
    char * pPortNames, * pIndividualPortName;
    pPrintersList = (CComboBox*)GetDlgItem( IDC_PRINTERS );
    EnumPrinters( PRINTER_ENUM_LOCAL |; PRINTER_ENUM_CONNECTIONS,
                  NULL, 2, NULL, 0, &size;, &num_printer_infos; );
    pPrinterInfoArray = (PRINTER_INFO_2*)new char[; size ];
    EnumPrinters( PRINTER_ENUM_LOCAL |; PRINTER_ENUM_CONNECTIONS,
                  NULL, 2, (BYTE*)pPrinterInfoArray, size, &size;, &num_printer_infos; );
    if ( num_printer_infos > 0 )
    {
        for ( printer_info_index = 0;
          printer_info_index < num_printer_infos; printer_info_index++ )
        {
            pPortNames =
              new char[; strlen( pPrinterInfoArray[printer_info_index;].pPortName; ) + 1 ];
            strcpy( pPortNames, pPrinterInfoArray[printer_info_index;].pPortName; );
            for ( pIndividualPortName = strtok( pPortNames, "," ), port_index = 0;
                  pIndividualPortName != NULL;
                  pIndividualPortName = strtok( NULL, "," ), port_index++ )
            {
                strcpy( Misc, pPrinterInfoArray[printer_info_index;].pPrinterName; );
                strcat( Misc, " on " );
                strcat( Misc, pIndividualPortName );
                index = pPrintersList->AddString( Misc );
            }
            delete pPortNames;
        }
        pPrintersList->SetCurSel( 0 );
    }
    delete [;]; pPrinterInfoArray;

    return TRUE;
}

void CMainDlg::DisplayMsg( short rc, char * pMsg )
{
    int   j;
    char  Misc[1024;];

    if ( rc == ARS_OLE_RC_SUCCESS )
        AfxMessageBox( pMsg );
    else
    {
        for ( j = 0; j < NUM_ERRORS; j++ )
            if ( Errors[j;].code; == rc )
                break;
        sprintf( Misc, "%s returned '%s'.", pMsg, j < NUM_ERRORS
                            ? Errors[j;].pMsg;                            : "***INVALID RETURN CODE***" );
        AfxMessageBox( Misc );
    }
}

void CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
       CDialog::OnSysCommand(nID, lParam);
}

void CMainDlg::OnPaint()
{
       if (IsIconic())
       {
       CPaintDC dc(this); // device context for painting

       SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

       // Center icon in client rectangle
       int cxIcon = GetSystemMetrics(SM_CXICON);
       int cyIcon = GetSystemMetrics(SM_CYICON);
       CRect rect;
       GetClientRect(&rect;);
       int x = (rect.Width() - cxIcon + 1) / 2;
       int y = (rect.Height() - cyIcon + 1) / 2;

       // Draw the icon
       dc.DrawIcon(x, y, m_hIcon);
       }
       else
       {
       CDialog::OnPaint();
       }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMainDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CMainDlg::OnPrint()
{
    CArsOle  * pArsCtrl;
    CListBox * pDocsList;
    short      rc;
    char       printer[100;];

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );
    pDocsList = (CListBox*)GetDlgItem( IDC_DOCLIST );

    GetDlgItem( IDC_PRINTERS )->GetWindowText( printer, sizeof(printer) );

    rc = pArsCtrl->PrintDoc (-1,     // the open doc
                             0,      // entire document
                             printer,
                             1,      // local printer (not server)
                             1,      // # of copies
                             ARS_OLE_ORIENTATION_PORTRAIT,
                             .5, .5, .5, .5, // margins
                             0);     // margins in inches
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "PrintDoc" );
        return;
    }
}

void CMainDlg::OnDblclkDoclist()
{
    CArsOle  * pArsCtrl;
    CListBox * pDocsList;
    short      index;
    short      rc;
    char       printer[100;];

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );
    pDocsList = (CListBox*)GetDlgItem( IDC_DOCLIST );

    if( m_DocOpened )
        pArsCtrl->CloseDoc();

    index = pDocsList->GetCurSel();

    rc = pArsCtrl->OpenDoc( index, NULL, 0 );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "OpenDoc" );
        return;
    }

    m_DocOpened = TRUE;

    GetDlgItem( IDC_PRINTERS )->GetWindowText( printer, sizeof(printer) );
    if( printer != NULL && printer[0;]; != '\0' )
        ( (CButton*)GetDlgItem( IDC_PRINT ) )->EnableWindow( TRUE );

    ( (CButton*)GetDlgItem( IDC_ATTRIBUTES ) )->EnableWindow( TRUE );
}

void CMainDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    VARIANT     var;
    CArsOle   * pArsCtrl;
    short       rc;

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );

    var.vt = VT_I2;
    var.iVal = nPos;
    rc = pArsCtrl->ScrollDocHorz( (short)nSBCode, &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "ScrollDocHorz" );
    else
        pScrollBar->SetScrollPos( var.iVal );
}

void CMainDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    VARIANT     var;
    CArsOle   * pArsCtrl;
    short       rc;

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );

    var.vt = VT_I2;
    var.iVal = nPos;
    rc = pArsCtrl->ScrollDocVert( (short)nSBCode, &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "ScrollDocVert" );
    else
        pScrollBar->SetScrollPos( var.iVal );
}

void CMainDlg::RefreshDocList( )
{
    VARIANT     var;
    CArsOle   * pArsCtrl;
    ArsOleValue * pValues;
    CListBox  * pDocsList;
    char        temp[21;];
    short       rc;
    long        num_docs = 0, j;

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );
    pDocsList = (CListBox*)GetDlgItem( IDC_DOCLIST );

    if ( pArsCtrl == NULL |;|; pDocsList == NULL )
        return;

    rc = pArsCtrl->GetNumDocsInList( &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "GetNumDocsInList" );
        return;

    }
    num_docs = var.lVal;

    pValues = new ArsOleValue[; max( m_NumDisplayFields, 1 ) ];
    pDocsList->ResetContent( );

    for ( j = 0; j < num_docs; j++ )
    {
        rc = pArsCtrl->GetDocDisplayValues( j, (IUnknown*)pValues, m_NumDisplayFields );
        if ( rc != ARS_OLE_RC_SUCCESS )
        {
            DisplayMsg( rc, "GetDocDisplayValues" );
            break;
        }
        sprintf( temp, "%s\t%s\t%s", pValues[0;];, pValues[3;];, pValues[2;]; );
        pDocsList->InsertString( -1, temp );
    }
    pDocsList->SetCurSel( 0 );

    delete [;]; pValues;
}

void CMainDlg::OnFolderSearchCompletedArsctrl()
{
    RefreshDocList( );
}

void CMainDlg::OnDocOpenedArsctrl()
{
    VARIANT     var;
    BOOL        required;
    CScrollBar * pHorz, * pVert;
    CArsOle    * pArsCtrl;
    short       rc;

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );

    rc = pArsCtrl->GetDocNumPages( &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "GetDocNumPages" );
        return;
    }
    m_NumPages = var.lVal;

    rc = pArsCtrl->IsDocHorzScrollRequired( &var; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        DisplayMsg( rc, "IsDocHorzScrollRequired" );
        return;
    }
    required = var.iVal;

    m_CurrentPage = 1;

    pHorz = (CScrollBar*)GetDlgItem( IDC_HORZ_SCROLLBAR );
    pVert = (CScrollBar*)GetDlgItem( IDC_VERT_SCROLLBAR );

    pHorz->ShowScrollBar( required );
    pVert->ShowScrollBar( TRUE );
    pHorz->SetScrollPos( 0 );
    pVert->SetScrollPos( 0 );
}

void CMainDlg::OnDocClosedArsctrl()
{
    CScrollBar * pBar;

    pBar = (CScrollBar*)GetDlgItem( IDC_HORZ_SCROLLBAR );
    if ( pBar != NULL )
        pBar->ShowScrollBar( FALSE );

    pBar = (CScrollBar*)GetDlgItem( IDC_VERT_SCROLLBAR );
    if ( pBar != NULL )
        pBar->ShowScrollBar( FALSE );
}

void CMainDlg::OnCloseDlg()
{
    short      rc;
    CArsOle  * pArsCtrl;

    pArsCtrl = (CArsOle*)GetDlgItem( IDC_ARSCTRL );

    if( m_DocOpened )
        pArsCtrl->CloseDoc();

    rc = pArsCtrl->CloseFolder( );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "CloseFolder" );

    rc = pArsCtrl->Logoff( );
    if ( rc != ARS_OLE_RC_SUCCESS )
        DisplayMsg( rc, "Logoff" );

    EndDialog(0);
}

void CMainDlg::OnSetDocAttrs()
{
        CAttrsDlg dlg;
        dlg.DoModal( );
}


/////////////////////////////////////////////////////////////////////////////
// CAttrsDlg dialog


CAttrsDlg::CAttrsDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CAttrsDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CAttrsDlg)
                // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void CAttrsDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CAttrsDlg)
                // NOTE: the ClassWizard will add DDX and DDV calls here
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAttrsDlg, CDialog)
        //{{AFX_MSG_MAP(CAttrsDlg)
        ON_BN_CLICKED(IDC_BACK_COLOR, OnBackColor)
        ON_BN_CLICKED(IDC_IMAGE_COLOR, OnImageColor)
        ON_BN_CLICKED(IDC_ROTATION, OnRotation)
        ON_BN_CLICKED(IDC_ZOOM, OnZoom)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAttrsDlg message handlers

BOOL CAttrsDlg::OnInitDialog()
{
    CArsOle  * pArsCtrl;
    CListBox * pBackList, * pImageList;
    CEdit    * pZoom, * pRotation;
    VARIANT    var1, var2, var3;
    BOOL       chg;
    short      rc, j, back_color, image_color, zoom, rotation, min, max;
    int        index;
    char       data[10;];

    pArsCtrl = (CArsOle*)pMainDlg->GetDlgItem( IDC_ARSCTRL );

    pBackList = (CListBox*)GetDlgItem( IDC_BACK_COLORS );
    pImageList = (CListBox*)GetDlgItem( IDC_IMAGE_COLORS );
    pZoom = (CEdit*)GetDlgItem( IDC_ZOOMPCT );
    pRotation = (CEdit*)GetDlgItem( IDC_ROT );

    rc = pArsCtrl->GetDocBackgroundColor( &var1;, &var2; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "GetDocBackgroundColor" );
        EndDialog( IDABORT );
        return TRUE;
    }
    back_color = var1.iVal;
    chg = var2.iVal;

    rc = pArsCtrl->GetDocImageColor( &var1;, &var2; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "GetDocImageColor" );
        EndDialog( IDABORT );
        return TRUE;
    }
    image_color = var1.iVal;
    chg = var2.iVal;

    for ( j = 0; j < NUM_COLORS; j++ )
    {
        index = pBackList->AddString( Colors[j;].pText; );
        pBackList->SetItemData( index, Colors[j;].color; );
        if ( Colors[j;].color; == back_color )
            pBackList->SetCurSel( index );
        index = pImageList->AddString( Colors[j;].pText; );
        pImageList->SetItemData( index, Colors[j;].color; );
        if ( Colors[j;].color; == image_color )
            pImageList->SetCurSel( index );
    }

    rc = pArsCtrl->GetDocZoom( &var1;, &var2;, &var3; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "GetDocZoom" );
        EndDialog( IDABORT );
        return TRUE;
    }
    zoom = var1.iVal;
    min = var2.iVal;
    max = var3.iVal;

    sprintf( data, "%d", (int)zoom );
    pZoom->SetWindowText( data );

    rc = pArsCtrl->GetDocRotation( &var1;, &var2; );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "GetDocRotation" );
        EndDialog( IDABORT );
        return TRUE;
    }
    rotation = var1.iVal;
    chg = var2.iVal;

    sprintf( data, "%d", (int)rotation );
    pRotation->SetWindowText( data );

    return TRUE;
}

void CAttrsDlg::OnBackColor()
{
    CArsOle  * pArsCtrl;
    CListBox * pList;
    VARIANT    var1, var2;
    BOOL       chg;
    short      rc, j, color;

    pArsCtrl = (CArsOle*)pMainDlg->GetDlgItem( IDC_ARSCTRL );
    pList = (CListBox*)GetDlgItem( IDC_BACK_COLORS );

    color = (short)pList->GetItemData( pList->GetCurSel( ) );

    rc = pArsCtrl->SetDocBackgroundColor( color );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "SetDocBackgroundColor" );
        rc = pArsCtrl->GetDocBackgroundColor( &var1;, &var2; );
        if ( rc != ARS_OLE_RC_SUCCESS )
            pMainDlg->DisplayMsg( rc, "GetDocBackgroundColor" );
        else
        {
            color = var1.iVal;
            chg = var2.iVal;
            for ( j = 0; j < NUM_COLORS; j++ )
            {
                if ( (short)pList->GetItemData(j) == color )
                {
                    pList->SetCurSel(j);
                    break;
                }
            }
        }
    }
}

void CAttrsDlg::OnImageColor()
{
    CArsOle  * pArsCtrl;
    CListBox * pList;
    VARIANT    var1, var2;
    BOOL       chg;
    short      rc, j, color;

    pArsCtrl = (CArsOle*)pMainDlg->GetDlgItem( IDC_ARSCTRL );
    pList = (CListBox*)GetDlgItem( IDC_IMAGE_COLORS );

    color = (short)pList->GetItemData( pList->GetCurSel( ) );

    rc = pArsCtrl->SetDocImageColor( color );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "SetDocImageColor" );
        rc = pArsCtrl->GetDocImageColor( &var1;, &var2; );
        if ( rc != ARS_OLE_RC_SUCCESS )
            pMainDlg->DisplayMsg( rc, "GetDocImageColor" );
        else
        {
            color = var1.iVal;
            chg = var2.iVal;
            for ( j = 0; j < NUM_COLORS; j++ )
            {
                if ( (short)pList->GetItemData(j) == color )
                {
                    pList->SetCurSel(j);
                    break;
                }
            }
        }
    }
}

void CAttrsDlg::OnRotation()
{
    CArsOle * pArsCtrl;
    CEdit   * pRotation;
    VARIANT   var1, var2;
    BOOL      chg;
    short     rc, value;
    char      data[10;];

    pArsCtrl = (CArsOle*)pMainDlg->GetDlgItem( IDC_ARSCTRL );
    pRotation = (CEdit*)GetDlgItem( IDC_ROT );

    pRotation->GetWindowText( data, sizeof(data) );

    rc = pArsCtrl->SetDocRotation( (short)atoi( data ) );
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "SetDocRotation" );
        rc = pArsCtrl->GetDocRotation( &var1;, &var2; );
        if ( rc != ARS_OLE_RC_SUCCESS )
            pMainDlg->DisplayMsg( rc, "GetDocRotation" );
        else
        {
            value = var1.iVal;
            chg = var2.iVal;
            sprintf( data, "%d", (int)value );
            pRotation->SetWindowText( data );
        }
    }
    else
        OnZoom();
}

void CAttrsDlg::OnZoom()
{
    CArsOle    * pArsCtrl;
    CEdit      * pZoom;
    CScrollBar * pHorz, * pVert;
    VARIANT      var1, var2, var3;
    BOOL         required;
    short        rc, value, min, max, horz_pos, vert_pos;
    char         data[10;];

    pArsCtrl = (CArsOle*)pMainDlg->GetDlgItem( IDC_ARSCTRL );
    pZoom = (CEdit*)GetDlgItem( IDC_ZOOMPCT );

    pZoom->GetWindowText( data, sizeof(data) );

    rc = pArsCtrl->SetDocZoom( (short)atoi( data ), &var1;, &var2; );
    horz_pos = var1.iVal;
    vert_pos = var2.iVal;
    if ( rc != ARS_OLE_RC_SUCCESS )
    {
        pMainDlg->DisplayMsg( rc, "SetDocZoom" );
        rc = pArsCtrl->GetDocZoom( &var1;, &var2;, &var3; );
        if ( rc != ARS_OLE_RC_SUCCESS )
            pMainDlg->DisplayMsg( rc, "GetDocZoom" );
        else
        {
            value = var1.iVal;
            min = var2.iVal;
            max = var3.iVal;
            sprintf( data, "%d", (int)value );
            pZoom->SetWindowText( data );
        }
    }

    else
    {
        rc = pArsCtrl->IsDocHorzScrollRequired( &var1; );
        if ( rc != ARS_OLE_RC_SUCCESS )
        {
            pMainDlg->DisplayMsg( rc, "IsDocHorzScrollRequired" );
            return;
        }
        required = var1.iVal;

        pHorz = (CScrollBar*)pMainDlg->GetDlgItem( IDC_HORZ_SCROLLBAR );
        pVert = (CScrollBar*)pMainDlg->GetDlgItem( IDC_VERT_SCROLLBAR );

        pHorz->ShowScrollBar( required );
        pHorz->SetScrollPos( horz_pos );
        pVert->SetScrollPos( vert_pos );
    }
}