,連線directshow filter
cvideo
類中,這樣程式簡潔明瞭,易於操作,不容易出錯,提高了程式的魯棒性。
1. 類的定義:
類是定義同一類所有物件的變數和方法的藍圖或原型。例如,可以建立乙個定義包含當前檔位等例項變數的自行車類。這個類也定義和提供了例項方法(變檔、剎車)的實現。例項變數的值由類的每個例項提供。因此,當你建立自行車類以後,必須在使用之前對它進行例項化。當建立類的例項時,就建立了這種型別的乙個物件,然後系統為類定義的例項變數分配記憶體。然後可以呼叫物件的例項方法實現一些功能。相同類的例項共享相同的例項方法。
c++ 程式設計允許程式設計師使用類
(class)
定義特定程式中的資料型別。這些資料型別的例項被稱為物件,這些事例可以包含程式設計師定義的成員變數、常量、成員函式,以及過載的運算子。語法上,類是
c中結構體(
struct
)的擴充套件,結構體不能包含函式以及過載的運算子。
2. 區別:類和物件
物件和類的說明很相似。實際上,類和物件之間的差別經常是一些困惑的起源。在現實世界中很明顯,類不是它描述的物件 -
自行車的藍圖不是自行車。但是在軟體中就有點難區分類和物件。這部分是由於軟體物件只是現實世界的電子模型或抽象概念。但是也由於很多人用「物件」指類和它們的例項這兩者。
3. videocapture中封裝類的具體實現
(a)利用
classwizard
新建乙個基於
cwnd
的mfc
類,類名
cvideo。
(b)在attributes中定義變數igraphbuilder * pgraph;用於建立graph filter manager
定義icapturegraphbuilder2 *pbuilder2;用於建立graph stream流
定義imediacontrol *pcontrol;用於**流的控制
定義imediaevent *pevent;用於***體流事件
(c)在類定義的標頭檔案中,變數是不能被初始化的,變數的初始化在
video
類的建構函式中,在
cpp檔案中,即
cvideo
::cvideo()
中,定義
5個指標變數的初始值為
null
,指標定義的使用之前一定要初始化,這裡為
null。
cvideo的成員函式
getinte***ce()建立
filter graph
的介面
getdevice()獲得系統的攝像頭裝置
mediacontrol()對**流進行控制
void cvideo::getinte***ce() //建立
filter graph
的介面
//graph介面的建立
hresult hr = cocreateinstance(clsid_filtergraph, null, clsctx_inproc,
iid_igraphbuilder, (void **) &pgraph);
if (failed(hr))
messagebox("create graph failed");
// capture graph builder的建立
hr = cocreateinstance (clsid_capturegraphbuilder2 , null, clsctx_inproc,
iid_icapturegraphbuilder2, (void **) &pbuilder2);
if(failed(hr))
messagebox("create capture graph failed");
// 把filter graph 連線到 capture graph
hr = pbuilder2->setfiltergraph(pgraph);
// 獲得**控制和**視窗
hr = pgraph->queryinte***ce(iid_imediacontrol,(lpvoid *) &pcontrol);
if (failed(hr))
messagebox("error");
hr = pgraph->queryinte***ce(iid_ivideowindow, (lpvoid *) &pwindow);
if (failed(hr))
messagebox("error");
hr = pgraph->queryinte***ce(iid_imediaevent, (lpvoid *) &pevent);
if (failed(hr))
messagebox("error");
void cvideo:: getdevice() //獲得系統的攝像頭裝置
icreatedevenum *pdevenum = null;//建立乙個裝置列舉器
hr = cocreateinstance(clsid_systemdeviceenum, null, clsctx_inproc,
iid_icreatedevenum, (void **) &pdevenum);
if(failed(hr))
messagebox("error");
ienummoniker *pclassenum = null;//建立乙個裝置**型別
hr = pdevenum->createclassenumerator(clsid_videoinputdevicecategory, &pclassenum, 0);
if(failed(hr))
messagebox("error");
if(pclassenum==null)
messagebox("pclassenum=null");
// use the first video capture device on the device list.
// note that if the next() call succeeds but there are no monikers,
// it will return s_false (which is not a failure). therefore, we
// check that the return code is s_ok instead of using succeeded() macro.
imoniker *pmoniker =null; //建立乙個**裝置
ibasefilter * psrc = null; //指向裝置的指標
ulong cfetched;
int count = 0;
while(s_ok == (pclassenum->next(1,&pmoniker,&cfetched)))
//把裝置繫結到裝置指標
count++;
if(count == 1)
hr = pmoniker->bindtoobject(0,0,iid_ibasefilter,(void**)&psrc);
if(failed(hr))
messagebox("pmoniker failed");
4. 效能測試
的類物件即可。
cvideo
類的物件完成攝像頭的
filter
cvideo
C 中的類與封裝
c 中的類與封裝 1,類的組合 1,類不是孤立存在的,類之間都會有一些關係,組合就是類的基本關係之一 2,電腦一般而言是由 cpu 記憶體 主機板 鍵盤和硬碟等部件組合而成 3,學習電腦組裝需要多少時間?學習電腦組裝是否需要學習顯示器 鍵盤 滑鼠 主機板 記憶體等部件的設計與製造?1,我們可以使用乙...
c 中類的封裝性
c 中類的三個特性 1 封裝性 2 繼承性 3 多型性 這裡談一下對類的封裝性的理解 c語言中,我們將多個不同型別的資料放在一起,用struct結構體 c 中,進行了豐富,將資料 成員變數 和函式 成員函式 封裝在一起,起了乙個新的名字class類。struct中預設的變數都是public clas...
C 中的類與封裝
1,類的組合 1,類不是孤立存在的,類之間都會有一些關係,組合就是類的基本關係之一 2,電腦一般而言是由 cpu 記憶體 主機板 鍵盤和硬碟等部件組合而成 3,學習電腦組裝需要多少時間?學習電腦組裝是否需要學習顯示器 鍵盤 滑鼠 主機板 記憶體等部件的設計與製造?1,我們可以使用乙個類,但是可能對類...