Click here to Skip to main content
15,880,469 members
Articles / Desktop Programming / ATL
Article

MSFlexGrid Control on an ATL Composite Control

Rate me:
Please Sign up or sign in to vote.
4.89/5 (6 votes)
27 Mar 2003CPOL2 min read 181K   1.6K   35   30
How To Use MSFlexGrid Control on an ATL Composite Control

Introduction

It is bit tricky to use MSFlexGrid Control in ATL projects (I struggled lot with MSDN and net) because:

  1. MSFlexGrid Control is a Visual Basic control
  2. MSFlexGrid Control requires runtime control license.

To check the problem you can do the following:

  1. Create ATL Server Dll
  2. Add ATL Composite Control
  3. Right Click and insert MSFlexGrid Control
  4. Add Event by right clicking and expose some events.
  5. Build Dll.
  6. Deploy in a test machine along with MSFlex.ocx and other support libraries. Please Note that it will work fine on the development machine (Machine which has visual studio installed) because when you install visual studio it provides design time and runtime license for the current system by default.

See Details on:

Result

It won’t work on test machine (The machine which only has OS installed). If you are Using Visual Basic as client it will display page not found kind of HTML page in place of control.

How To use MSFlexGrid Then?

  1. Create ATL Server Dll.
  2. Add ATL Composite Control.
  3. Import msflxgrd.ocx in control header file.
    #import "C:\WINNT\System32\msflxgrd.ocx" raw_interfaces_only, 
        raw_native_types, no_namespace, named_guids
  4. Add #pragma warning(disable:4146) before #import "...msflxgrid.ocx..." otherwise it will give warning.
  5. Now the problem is: at the time of creating control you need to get the runtime license for MSFlexGrid Control. I had made a function to do so:
    // Create Control
    void CreateObject()
    {
      CComPtr<IUNKNOWN> pUnkCont;
      ComQIPtr <IPERSISTSTREAMINIT> spPerStm;
      CComPtr<ICLASSFACTORY2> pCF;
      // Add CLSID of MSFlexGrid for Runtime license
      CComBSTR bstrLicKey = "72E67120-5959-11cf-91F6-C2863C385E30";
      HRESULT hr = CoGetClassObject(CLSID_MSFlexGrid,
       CLSCTX_ALL,
       NULL,
           IID_IClassFactory2,
       reinterpret_cast<void**>(&pCF) );
    
      // Call CreateInstanceLic to create instance of control
      // with runtime license
      if( !FAILED( hr ) )
       hr =pCF->CreateInstanceLic(NULL,NULL,IID_IUnknown,bstrLicKey,
         reinterpret_cast<void**>(&pUnk));
    
      spPerStm=pUnk;
      spPerStm->InitNew();
    
      wnd.Attach(m_hWnd);
      wnd.AttachControl(pUnk, &pUnkCont);
      m_VarGrid = pUnk;
     // Start event connection
     DispEventAdvise(pUnk);
    }
    
  6. Add the following member variables. I’ve added it the following member variables as public.
    CAxWindow wnd;
    IUnknownPtr pUnk;
    IMSFlexGridPtr m_Grid;
    
  7. Next step is to catch the events of flxgrid control which can be done by adding the following line in class declaration:
    public IDispEventImpl < ID_VAR_GRID,CAuthorVar,&DIID_DMSFlexGridEvents,
        &LIBID_MSFlexGridLib,1,0 >
  8. Add Sink Entry (I’m feeling lazy and just using click event if you want you can use no of events as per ur requirement)
    BEGIN_SINK_MAP(CFlxCtrl)
        //Make sure the Event Handlers have __stdcall calling convention
        SINK_ENTRY_EX(ID_GRID,DIID_DMSFlexGridEvents, DISPID_CLICK, 
          OnClick_grid)
    END_SINK_MAP()   
  9. In Resource.h file add #define ID_GRID 201 or any ID which you like.
  10. Add Event Handler:
    VOID __stdcall Click_grid()
    {
        AfxMessageBox("Clicked");
    }
  11. You can also add a method to initialize gird i.e..
    void InitGrid()
    {
        CString Cols[5]={"Name","Phone No","MailID"};
        m_VarGrid->put_FixedRows(1);
        m_VarGrid->put_FixedCols(0);
        m_VarGrid->put_Rows(2);
        m_VarGrid->put_Cols(3);
    
        for(int i = 0;i!=3;i++)
        {
            m_VarGrid->put_TextMatrix(0,i,(_bstr_t)Cols[i]);
            m_VarGrid->put_ColWidth(i,1260);
        }
    }
    
  12. In the OnInitDialog call CreateObject() function and InitGrid().
  13. Add a method to interface ie.
    STDMETHODIMP CAuthorVar::Stop()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    
        if(pUnk)
        {
            HRESULT hr= DispEventUnadvise(pUnk);//
        }
        m_Grid.Release();
        return S_OK;
    }
  14. Test the control in ActiveX Control Test Container and don't forget to call stop method before closing.

I also had noticed another problem which is:

Every time you need to call DispEventUnadvise(pUnk)/DispEventAdvise(pUnk) method and it won't process any messages from container window or other controls placed there. The easiest solution I found is just wrap up your first control into another Composite Control and it will make your life easy.

If you are still feeling lazy or has already created control and don’t want to rewrite then you can cheat the test machine by adding the following in registry:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Licenses\72E67120-5959-11cf-91F6-C2863C385E30]
@="ibcbbbebqbdbciebmcobmbhifcmciibblgmf"

and be happy but I won’t recommend it. So, Have a fun with MSFlexGrid and ATL Composite Control.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Barclays Wealth
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Generalcomposite Activex Pin
Nikkiee3-Dec-08 10:43
Nikkiee3-Dec-08 10:43 
GeneralRe: composite Activex Pin
Uttam Kumar Unik!3-Dec-08 22:51
Uttam Kumar Unik!3-Dec-08 22:51 
GeneralRe: composite Activex Pin
Nikkiee4-Dec-08 1:56
Nikkiee4-Dec-08 1:56 
GeneralRe: composite Activex Pin
Nikkiee4-Dec-08 2:02
Nikkiee4-Dec-08 2:02 
GeneralRe: composite Activex Pin
Uttam Kumar Unik!4-Dec-08 2:08
Uttam Kumar Unik!4-Dec-08 2:08 
GeneralRe: composite Activex Pin
Nikkiee4-Dec-08 2:41
Nikkiee4-Dec-08 2:41 
GeneralRe: composite Activex Pin
Uttam Kumar Unik!4-Dec-08 2:04
Uttam Kumar Unik!4-Dec-08 2:04 
GeneralRe: composite Activex [modified] Pin
Nikkiee4-Dec-08 2:25
Nikkiee4-Dec-08 2:25 
GeneralCrashes in release mode Pin
rahulagarwal3318-Feb-08 20:03
rahulagarwal3318-Feb-08 20:03 
QuestionHow to handle ctrl/shift keys Pin
kirrik5-Mar-07 17:27
kirrik5-Mar-07 17:27 
GeneralMS WEb Browser Control on a composite control. Pin
Shashikant_200611-May-06 23:31
Shashikant_200611-May-06 23:31 
GeneralCreate ActiveX Control using ATL Pin
rajesh_kapure15-Nov-05 0:26
rajesh_kapure15-Nov-05 0:26 
GeneralRe: Create ActiveX Control using ATL Pin
Uttam Kumar Unik!15-Nov-05 0:54
Uttam Kumar Unik!15-Nov-05 0:54 
GeneralFlexGrid ATL Composite Control and Windows Server 2003 Pin
doris791-Jun-05 2:33
doris791-Jun-05 2:33 
GeneralEventIDs for MSFlexGrid control Pin
VKatti11-Feb-05 4:44
VKatti11-Feb-05 4:44 
GeneralCreating a dialog in ATL composite control Pin
Member 52663013-Sep-04 3:46
Member 52663013-Sep-04 3:46 
GeneralRe: Creating a dialog in ATL composite control Pin
Uttam Kumar Unik!13-Sep-04 8:03
Uttam Kumar Unik!13-Sep-04 8:03 
GeneralRe: Creating a dialog in ATL composite control Pin
Member 52663014-Sep-04 6:06
Member 52663014-Sep-04 6:06 
Hi Uttam,

I am not creating a ATL dialog. I have a simple
dialog (derived from CDailog) implememted with me
in the project. I want to create this dialog on
the ATL composite control. This is where creation
is failing. I am trying to create it in OnInitDialog
of this control.

During the investigation I found out that if I create
this dialog later, after the control is up, on some event
say a button click, it works. Looks like some creation
proecss glitch.



Thanks,
-Sundeep
GeneralComposite Control and Slider EDGE Pin
Balkrishna Talele22-Jul-04 19:49
Balkrishna Talele22-Jul-04 19:49 
QuestionCode for CreateObject() ? Pin
1of318-Jun-04 20:53
1of318-Jun-04 20:53 
Generaluse of ms flex grid Pin
Anonymous22-Apr-04 5:55
Anonymous22-Apr-04 5:55 
QuestionHow to use msflexgrid control w/ unicode? Pin
Anonymous13-Feb-04 23:41
Anonymous13-Feb-04 23:41 
GeneralProblem with VS.Net 2003 Pin
raisch426-Feb-04 9:26
raisch426-Feb-04 9:26 
GeneralPlease help in creating MappointControl on ATL Composite control Pin
bahubali1-May-03 12:46
bahubali1-May-03 12:46 
GeneralZip file corrupted Pin
TW29-Mar-03 1:45
TW29-Mar-03 1:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.