home *** CD-ROM | disk | FTP | other *** search
- // UserFuncDlg.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "VCDemo.h"
- #include "UserFuncDlg.h"
- #include "funcguidedlg.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #include <afxpriv.h>
-
- /////////////////////////////////////////////////////////////////////////////
- // CUserFuncDlg dialog
-
-
- CUserFuncDlg::CUserFuncDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CUserFuncDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CUserFuncDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
-
-
- void CUserFuncDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CUserFuncDlg)
- DDX_Control(pDX, IDC_SGCTRL1, m_ctrl);
- //}}AFX_DATA_MAP
- }
-
-
- BEGIN_MESSAGE_MAP(CUserFuncDlg, CDialog)
- //{{AFX_MSG_MAP(CUserFuncDlg)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CUserFuncDlg message handlers
-
- BOOL CUserFuncDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
-
- // TODO: Add extra initialization here
- m_ctrl.SetCols( 8 );
- m_ctrl.SetCols( 38 );
-
- short type[4];
- short defaultpara[4];
-
- type[0] = 0; //float number( double )
- type[1] = 1; //string
- type[2] = 2; //cell
- type[3] = 3; //area
-
- //the second parameter can't be absebt
- defaultpara[0] = 1;
- defaultpara[1] = 0;
- defaultpara[2] = 1;
- defaultpara[3] = 1;
-
- char funchelp1[] = "MyFunc1( p1, p2, p3, p4 )\r\n"
- " p1 -- number, such as 5.6\r\n"
- " p2 -- string, such as \"asdf\"\r\n"
- " p3 -- cell, such as c3\r\n"
- " p4 -- area, such as a1:c3\r\n\r\n"
- " return a number";
- char funchelp2[] = "MyFunc2( [p1], p2, [p3], [p4] )\r\n"
- " p1 -- number, such as 5.6\r\n"
- " p2 -- string, such as \"asdf\"\r\n"
- " p3 -- cell, such as c3\r\n"
- " p4 -- area, such as a1:c3\r\n\r\n"
- " return a string";
-
- if( !m_ctrl.DoAddUserFunction( "User function", "MyFunc1", 0, 4, type, funchelp1 ) )
- AfxMessageBox( "Failed" );
- if( !m_ctrl.DoAddUserFunctionEx( "User function", "MyFunc2", 1, 4, type, defaultpara, funchelp2 ) )
- AfxMessageBox( "Failed" );
-
- m_ctrl.DoSetFormula( 1, 1, "cos(sin( myfunc1( 12, \"welcome\", a1, a1:a3 )))" );
- m_ctrl.DoSetFormula( 1, 2, "myfunc2( , \"welcome\" )+\" how are you\"" );
-
- m_ctrl.SetPageLabelVisible( FALSE );
- COleVariant var( "VCDEMO" );
- m_ctrl.DoSetMessageTitle( var );
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
-
- BEGIN_EVENTSINK_MAP(CUserFuncDlg, CDialog)
- //{{AFX_EVENTSINK_MAP(CUserFuncDlg)
- ON_EVENT(CUserFuncDlg, IDC_SGCTRL1, 29 /* OnExecuteUserFunc */, OnOnExecuteUserFuncSgctrl1, VTS_BSTR VTS_I2 VTS_I2 VTS_PI4 VTS_PVARIANT)
- ON_EVENT(CUserFuncDlg, IDC_SGCTRL1, 50 /* OnUserFuncGuide */, OnOnUserFuncGuideSgctrl1, VTS_I4 VTS_BSTR VTS_PVARIANT)
- //}}AFX_EVENTSINK_MAP
- END_EVENTSINK_MAP()
-
- void CUserFuncDlg::OnOnExecuteUserFuncSgctrl1(LPCTSTR name, short rettype, short paranum, long FAR* paratype, VARIANT FAR* funcResult)
- {
- // TODO: Add your control notification handler code here
- USES_CONVERSION; //add #include <afxpriv.h> in your stdafx.h
-
- COleVariant v1;
- char buffer[40];
-
- CString tmp( "parameter1: numeric " );
- m_ctrl.DoFetchFuncParameter( 0, &v1);
- if( v1.vt == VT_R8 ) //check var type you can know it's absent or not
- sprintf( buffer, "%f", v1.dblVal);
- else if( v1.vt == 0 )
- sprintf( buffer, "%s", " parameter absent" );
- tmp += CString(buffer);
-
- tmp += "\nparameter2: string ";
- m_ctrl.DoFetchFuncParameter( 1, &v1);
- if( v1.vt == VT_BSTR )
- tmp += W2A(V_BSTR(&v1));
- else if( v1.vt == 0 ){
- sprintf( buffer, "%s", " parameter absent" );
- tmp += buffer;
- }
-
- tmp += "\nparameter3: cell ";
- m_ctrl.DoFetchFuncParameter( 2, &v1);
- if( v1.vt == VT_I4 ){
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" row ")+buffer;
- m_ctrl.DoFetchFuncParameter( 3, &v1);
- if( v1.vt == VT_I4 ){
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" col ") + CString( buffer );
- }
- }
- else if( v1.vt == 0 ){
- sprintf( buffer, "%s", " parameter absent" );
- tmp += buffer;
- }
-
- tmp += "\nparameter4: range ";
- m_ctrl.DoFetchFuncParameter( 4, &v1);
- if( v1.vt == VT_I4 ){
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" row ")+buffer;
- m_ctrl.DoFetchFuncParameter( 5, &v1);
- if( v1.vt == VT_I4 )
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" col ")+buffer;
- m_ctrl.DoFetchFuncParameter( 6, &v1);
- if( v1.vt == VT_I4 )
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" row ")+buffer;
- m_ctrl.DoFetchFuncParameter( 7, &v1);
- if( v1.vt == VT_I4 )
- sprintf( buffer, "%d", v1.lVal);
- tmp += CString(" col ")+buffer;
- }
- else if( v1.vt == 0 ){
- sprintf( buffer, "%s", " parameter absent" );
- tmp += buffer;
- }
-
- v1.Clear();
- if( stricmp( name, "MyFunc1" ) == 0 ){
- v1 = 54.35;
- tmp += CString("\nreturn: 54.35 ");
- }
- else if( stricmp( name, "MyFunc2" ) == 0 ){
- v1 = "hello!"; //changed here!!
- tmp += CString("\nreturn: hello ");
- }
- AfxMessageBox( tmp );
- *funcResult = v1.Detach();
-
- }
-
- void CUserFuncDlg::OnOnUserFuncGuideSgctrl1(long parent, LPCTSTR funcname, VARIANT FAR* guidestring)
- {
- // TODO: Add your control notification handler code here
- if( stricmp( funcname, "myfunc1" ) == 0 ){
- CWnd* pwnd = CWnd::FromHandle( HWND( parent ) );
- CFuncGuideDlg dlg( pwnd );
- if( dlg.DoModal() == IDOK ){
- COleVariant var;
- CString result;
- result = "MyFunc1( ";
- result += dlg.m_para1;
- result += ", \"";
- result += dlg.m_para2;
- result += "\", ";
- result += dlg.m_para3;
- result += ", ";
- result += dlg.m_para4;
- result += " )";
- var = result;
- *guidestring = var.Detach();
- }
- }
- }
-