很多時候真的很羨慕VB/DELPHI程序員,他們可以方便的用各種控件來搭建一個應用程序。
而我們呢,要使用ActiveX控件都要找大半天資料,而且還要手工做大量工作,真是不公平(呵呵,想想人家寫硬件驅動的程序員,我們還是輕松多了嘛)。
下面我就簡單的來講一下如何引用一個ActiveX控件,我以Flash控件為例:
這里我就不一步一步講了,有興趣的話就下載源代碼吧:)
點擊這里下載工程源代碼
// 首先要包含幾個COM頭文件
// 因為要用到ATL容器窗口,所以需要初始化一個CComModule以及包含atlwin.h頭文件
#include
CComModule _Module;
#include
#include
#pragma comment(lib,"atl")
// 引入FLASH控件,這里的路徑為自己計算機上的FLASH控件的實際路徑
#import "C:\WINNT\system32\Macromed\Flash\Flash.ocx"
using namespace ShockwaveFlashObjects;
// 在WinMain中做初始化
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
CoInitialize(NULL);
AtlAxWinInit();
.
.
.
CoUninitialize();
return msg.wParam;
}
// 開始創建ATL容器窗口,并通過QueryControl()方法獲得FLASH控件對象
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static CAxWindow WinContainer;
static CComPtr
switch(message)
{
case WM_CREATE:
RECT rc;
GetClientRect(hWnd,&rc);
WinContainer.Create(hWnd,&rc,LPCTSTR("ShockwaveFlash.ShockwaveFlash"),WS_CHILD | WS_VISIBLE);
HRESULT hr;
hr = WinContainer.QueryControl(__uuidof(IShockwaveFlash),(void**)&pFlash);
if(FAILED(hr))return -1L;
hr = pFlash->put_Movie(CComBSTR(L".\\sample.swf"));
if(SUCCEEDED(hr))pFlash->Play();
break;
.
.
.
case WM_DESTROY:
pFlash.Release();
WinContainer.DestroyWindow();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0L;
}
好了,終于我也可以在我的程序中播放FLASH動畫了,高興啊:)
下面再示范一下如何在程序中創建WebBrower控件:
1. 將下面語句
#import "C:\WINNT\system32\Macromed\Flash\Flash.ocx"
using namespace ShockwaveFlashObjects;
替換成:
#include "exdisp.h"
2. 將對象變量
static CComPtr
替換成:
static CComPtr
3. 將下面的語句
RECT rc;
GetClientRect(hWnd,&rc);
WinContainer.Create(hWnd,&rc,LPCTSTR("ShockwaveFlash.ShockwaveFlash"),WS_CHILD | WS_VISIBLE);
HRESULT hr;
hr = WinContainer.QueryControl(__uuidof(IShockwaveFlash),(void**)&pFlash);
if(FAILED(hr))return -1L;
hr = pFlash->put_Movie(CComBSTR(L".\\sample.swf"));
if(SUCCEEDED(hr))pFlash->Play();
替換成:
RECT rc;
GetClientRect(hWnd,&rc);
WinContainer.Create(hWnd,&rc,LPCTSTR("Microsoft.IExplorer.4"),WS_CHILD | WS_VISIBLE);
HRESULT hr;
hr = WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&pWebBrowser);
if(FAILED(hr))return -1L;
VARIANT url;
VARIANT v;
url.vt = VT_BSTR;
url.bstrVal = SysAllocString(L"http://www.shnenglu.com/azhisoft/");
hr = pWebBrowser->Navigate2(&url,&v,&v,&v,&v);
4. 最后一點
pFlash.Release();
WinContainer.DestroyWindow();
PostQuitMessage(0);
替換成:
pWebBrowser.Release();
WinContainer.DestroyWindow();
PostQuitMessage(0);
此為拋磚引玉,希望能給大家帶來借鑒效果,呵呵!!!
以后不用羨慕VB/DELPHI程序員了,因為我們同樣可以,哈哈,高興。
但好像使用flash.ocx有版權問題吧...
我現在想找開源的SWF庫...但都沒有合適的...
我想在游戲中用FLASH動畫...
只要能逐幀提取動畫的BITMAP...就可以了...
不過具體我也不太清楚,你可以問問。
至于 SWF 的開源庫,我也沒發現……
恩,我沒用過CShockwaveFlash類,所以談不上講原理
不過如果你有興趣知道的話,多看看COM、ATL方面的書,會有幫助的:)
能否替換右鍵菜單就要看包容的控件的支持能力了。
只要連接控件的事件,在程序中實現一個接口,連接到控件就可以了。
IE 是可以屏蔽或者替換的,FLASH 可以響應右鍵事件。
其他的就不知道了
麻煩您給我發一個到郵箱好么??
principal@163.com
多謝多謝
麻煩您給我發一個到郵箱好么??
hzh0512@gmail.com
thank you!thank you!!
麻煩您給我發個郵箱好么???
275401168@qq.com
zyfzuse@hotmail.com