现在有一个ATL复合控件,而且我通过CoCreateinstance已经成功创建了,现在我要把它显示到视图或对话框上面来怎么做简单?微软的ActiveX Test Container的方式太复杂,希望能象在复合控件里面动态创建控件一样简单最好,在复合控件里因其本身就是一个容器,所以可以用类似如下的代码:
LPUNKNOWN pUnkCont;
CAxWindow m_hOcxWnd;
hr= m_spFramer.CreateInstance( __uuidof(DSOFramer::FramerControl) );
if(FAILED(hr))return FALSE;
m_hOcxWnd.Attach(m_hWnd);
m_hOcxWnd.AttachControl(m_spFramer, &pUnkCont);
if( m_spFramer != NULL )
{
m_spFramer->Open( (_variant_t)strFullPath );
bRet = TRUE;
}那么在MFC程序里怎么办呢?请教高手,不过自己通过Insert Component的方式生成Wraper Class然后new的方式就免谈了。

解决方案 »

  1.   

    这是个动态创建swflash.ocx控件的例子你可以参考:
    ////////////////////////////////////////////////////////////////////////////////  
    //  Use  swflash.ocx  to  play  flash    
    //  if  it  works,  it  is  written  by  masterz,  otherwise  I  don't  know  who  writes  it(*_*)  
    ////////////////////////////////////////////////////////////////////////////////  
    #define  MAX_LOADSTRING  100  
    #import  "c:\winnt\system32\macromed\flash\flash.ocx"    
    #include  <atlbase.h>  
     CComModule  _Module;  
    #include  <atlwin.h>  
    #pragma  comment(lib,"atl")  
    #define  ODS(x)  OutputDebugString(x)  
     
     
    //  Global  Variables:  
    HINSTANCE  hInst;  //  current  instance  
    TCHAR  szTitle[MAX_LOADSTRING];   //  The  title  bar  text  
    TCHAR  szWindowClass[MAX_LOADSTRING];  //  The  title  bar  text  
    CAxWindow  m_container;  
    using  namespace  ShockwaveFlashObjects;  
    IShockwaveFlash*  shwaveflash;  
     
    //  Foward  declarations  of  functions  included  in  this  code  module:  
    ATOM   MyRegisterClass(HINSTANCE hInstance);  
    BOOL   InitInstance(HINSTANCE,  int);  
    LRESULT  CALLBACK  WndProc(HWND,  UINT,  WPARAM,  LPARAM);  
     
    int  APIENTRY  WinMain(HINSTANCE  hInstance,  HINSTANCE  hPrevInstance,  LPSTR          lpCmdLine, int  nCmdShow)  
    {  
               MSG  msg;  
               //  Initialize  global  strings  
               wsprintf(szTitle,"use  flash  control  in  sdk  exe");  
               wsprintf(szWindowClass,"flashinsdk");  
               MyRegisterClass(hInstance);  
               CoInitialize(NULL);  
               //  Perform  application  initialization:  
               if  (!InitInstance  (hInstance,  nCmdShow))    
                           return  FALSE;  
               while  (GetMessage(&msg,  NULL,  0,  0))    
               {  
                       TranslateMessage(&msg);  
                       DispatchMessage(&msg);  
               }  
               CoUninitialize();  
               return  msg.wParam;  
    }  
       
    //    FUNCTION:  MyRegisterClass()  
    //    PURPOSE:  Registers  the  window  class.  
    ATOM  MyRegisterClass(HINSTANCE  hInstance)  
    {  
               WNDCLASSEX  wcex;  
               wcex.cbSize  =  sizeof(WNDCLASSEX);    
               wcex.style  =  CS_HREDRAW | CS_VREDRAW;  
               wcex.lpfnWndProc =  (WNDPROC)WndProc;  
               wcex.cbClsExtra  =  0;  
               wcex.cbWndExtra   =  0;  
               wcex.hInstance =  hInstance;  
               wcex.hIcon  =  LoadIcon(NULL, IDI_APPLICATION);  
               wcex.hCursor  =  LoadCursor(NULL,  IDC_ARROW);  
               wcex.hbrBackground  =  (HBRUSH)(COLOR_WINDOW+1);  
               wcex.lpszMenuName  =  NULL;//(LPCSTR)IDC_FLSH;  
               wcex.lpszClassName  =  szWindowClass;  
               wcex.hIconSm  =  LoadIcon(NULL,  IDI_APPLICATION);  
               return  RegisterClassEx(&wcex);  
    }  
     
    //FUNCTION:  InitInstance(HANDLE,  int)  
    // PURPOSE:  Saves  instance  handle  and  creates  main  window  
    BOOL  InitInstance(HINSTANCE  hInstance,  int  nCmdShow)  
    {  
         HWND  hWnd;  
         hInst  =  hInstance;  //  Store  instance  handle  in  our  global  variable  
         AtlAxWinInit();  
         hWnd  =  CreateWindow(szWindowClass,  szTitle,  WS_OVERLAPPEDWINDOW,  
               CW_USEDEFAULT,  0,  CW_USEDEFAULT,  0,  NULL,  NULL,  hInstance,  NULL);  
         if  (!hWnd)  
               return  FALSE;  
         ShowWindow(hWnd,  nCmdShow);  
         UpdateWindow(hWnd);  
         return  TRUE;  
    }  HWND  heditfilepath;  
     
    LRESULT  CALLBACK  WndProc(HWND  hWnd,  UINT  message,  WPARAM  wParam,  LPARAM  lParam)  
    {  
               int  wmId,  wmEvent;  
               PAINTSTRUCT  ps;  
               HDC  hdc;  
               TCHAR  szHello[MAX_LOADSTRING];  
               wsprintf(szHello,"use  flash  control  in  sdk");  
               HWND  hbtnstart;  
               RECT  rc;  
               switch  (message)    
               {  
                           case  WM_CREATE:  
                                       GetClientRect(hWnd,  &rc  );  
                                       rc.top  =  (rc.bottom+rc.top)/2;  
                                       m_container.Create(  hWnd,  rc,  LPCTSTR("ShockwaveFlash.ShockwaveFlash.1"),  WS_CHILD  |WS_VISIBLE  |WS_HSCROLL  |WS_VSCROLL  );//create  a  browser  control  
                                       hbtnstart=CreateWindow("BUTTON","play",WS_CHILD  |WS_VISIBLE,0,0,120,30,hWnd,(HMENU)0x100,hInst,0);  
                                       heditfilepath=CreateWindow("EDIT","filepath",WS_CHILD  |WS_VISIBLE  |WS_BORDER,0,40,420,30,hWnd,(HMENU)0x101,hInst,0);  
                                       SetWindowText(heditfilepath,"c:\\downloads\\Sayforever.swf");  
                                       m_container.QueryControl(  __uuidof(IShockwaveFlash),  reinterpret_cast<void**>(&shwaveflash)  );  
                                       break;  
                           case  WM_SIZING:  
                                       GetClientRect(hWnd,  &rc  );  
                                       rc.top  =  (rc.bottom+rc.top)/2;  
                                       m_container.MoveWindow(&rc,true);  
                                       break;  
                           case  WM_COMMAND:  
                                       wmId        =  LOWORD(wParam);    
                                       wmEvent  =  HIWORD(wParam);    
                                       //  Parse  the  menu  selections:  
                                       switch  (wmId)  
                                       {  
                                                   case  0x100:  
                                                               {  
                                                                           ODS("0x100");  
                                                               char  buf[256];  
                                                               GetWindowText(heditfilepath,buf,255);  
                                                               _bstr_t  bstr((char*)buf);  
                                                               ODS(buf);  
                                                               //bstr=_bstr_t("c:\\2.1.swf");  
                                                               shwaveflash->put_Movie(bstr);  //  you  have  to  change  the  path  here  
                                                               shwaveflash->Play();  
                                                               }  
                                                               break;                                                                                      
                                                   default:  
                                                         return  DefWindowProc(hWnd,  message,  wParam,  lParam);  
                                       }  
                                       break;  
                           case  WM_PAINT:  
                                       hdc  =  BeginPaint(hWnd,  &ps);  
                                       RECT  rt;  
                                       GetClientRect(hWnd,  &rt);  
                                       DrawText(hdc,  szHello,  strlen(szHello),  &rt,  DT_CENTER);  
                                       EndPaint(hWnd,  &ps);  
                                       break;  
                           case  WM_DESTROY:  
                                       PostQuitMessage(0);  
                                       break;  
                           default:  
                                       return  DefWindowProc(hWnd,  message,  wParam,  lParam);  
         }  
         return  0;  
    }
      

  2.   

    《windows程序设计 》有例子!