如何建立Filter的屬性頁

2021-04-12 19:04:03 字數 4484 閱讀 4509

摘要:

// always create new guids! never copy a guid from an example.

define_guid(iid_isaturation, 0x19412d6e, 0x6401,

0x475c, 0xb0, 0x48, 0x7a, 0xd2, 0x96, 0xe1, 0x6a, 0x19);inte***ce isaturation : public iunknown

;

你也可以用idl定義介面,並用midl編譯器建立標頭檔案,然後在filter上實現這個介面,這個例子採用「get」,「set」方法來設定飽和度的值,注意,修改這個m_lsaturation的值的時候一定要進行保護

class cgrayfilter : public isaturation, /* other inherited classes. */

stdmethodimp setsaturation(long lsat)

m_lsaturation = lsat;

return s_ok;}};

當然你實現介面的一些細節可能和上面的**不一致。反正你自己實現就是了

第二步,實現ispecifypropertypages介面

做完了上一步,下面就要在你個filter中實現ispecifypropertypages介面,這個介面只有乙個方法,getpages,這個方法返回filter所支援的所有的屬性頁的clsid。在這個例子裡,filter只支援乙個屬性頁,

首先產生乙個clsid,並在標頭檔案宣告

// always create new guids! never copy a guid from an example.

define_guid(clsid_saturationprop, 0xa9bd4eb, 0xded5,

0x4df0, 0xba, 0xf6, 0x2c, 0xea, 0x23, 0xf5, 0x72, 0x61);

然後要實現ispecifypropertypages介面的getpages方法:

class cgrayfilter : public isaturation,

public ispecifypropertypages,

/* other inherited classes. */

ppages->pelems[0] = clsid_saturationprop;

return s_ok;

}};

第三步,支援queryinte***ce為了暴露filter的介面,照著下面的步驟作哦

1 在你的filter中包含declare_iunknown巨集的宣告:

public:

declare_iunknown;

2 過載cunknown::nondelegatingqueryinte***ce 方法來檢查兩個介面的iids。

stdmethodimp cgrayfilter::nondelegatingqueryinte***ce(refiid riid,

void **ppv)

if (riid == iid_isaturation)

return cbasefilter::nondelegatingqueryinte***ce(riid, ppv);

}

第四步,建立屬性頁到這一步,filter已經支援乙個屬性頁的所需要的東西了,下一步就是要實現屬性頁本身了。

首先建立乙個對話方塊的資源,然後以這個對話的資源宣告乙個類,要從cbasepropertypage. 派生,

圖1下面的**顯示了部分的宣告,包含了我們在後面將要用到的部分變數。

class cgrayprop : public cbasepropertypage

;

看看建構函式吧

cgrayprop::cgrayprop(iunknown *punk) : 

cbasepropertypage(name("grayprop"), punk, idd_proppage, ids_proppage_title),

m_pgray(0)

下面,你還要記得過載cbasepropertypage 的幾個方法哦

onconnect,當屬性頁建立的時候,會呼叫這個方法,通過這個方法將iunknown指標付給filter。

onactivate 當對話方塊建立的時候被呼叫

onreceivemessage 當對話方塊接收到視窗訊息時被呼叫

ondisconnect 當使用者取消property sheet時呼叫

第五步,儲存filter的乙個指標

通過過載cbasepropertypage::onconnect方法將乙個指標儲存到filter,下面的例子演示了如何通過方法傳遞過來的引數查詢filter支援的介面

hresult cgrayprop::onconnect(iunknown *punk)

assert(m_pgray == null);

return punk->queryinte***ce(iid_isaturation,

reinterpret_cast(&m_pgray));

}

第六步,初始化對話方塊通過過載cbasepropertypage::onactivate方法來初始化乙個對話方塊,在這個例子裡,屬性頁使用了滑動條,所以,在初始化的第一步就是要初始化控制項動態庫,然後再初始化slider。

hresult cgrayprop::onactivate(void)

assert(m_pgray != null);

hresult hr = m_pgray->getsaturation(&m_lval);

if (succeeded(hr))

return hr;

}

第七步,處理視窗訊息過載cbasepropertypage::onreceivemessage方法來處理使用者的輸入等訊息。如果你不想處理訊息,你只需簡單呼叫父類的onreceivemessage 即可。

無論何時使用者改變了屬性,都會做下面的事情

1 將屬性頁的m_bdirty設定為true;

cbasepropertypage::m_ppagesite變數儲存著乙個ipropertypagesite介面

為了簡化步驟,你可以在你的屬性頁中新增下面的**

private:

void setdirty()

}

當使用者改變了屬性的時候,在onreceivemessage方法中呼叫上面的函式。

bool cgrayprop::onreceivemessage(hwnd hwnd,

uint umsg, wparam wparam, lparam lparam)

break;

case wm_hscroll:

return (lresult) 1;

}} // switch.

// let the parent class handle the message.

return cbasepropertypage::onreceivemessage(hwnd,umsg,wparam,lparam);

}

第八步,處理屬性的改變第九步,斷開屬性頁連線
hresult cgrayprop::ondisconnect(void)

return s_ok;

}

第十步,支援com的註冊最後一步就是要支援com的註冊,因此 屬性框才能夠建立你屬性頁的例項,首先在全域性陣列g_templates新增乙個類廠模板的說明。這個全域性的陣列是你的dll中建立的所有的com物件都要用到的。

const amoviesetup_filter filtersetupdata = 

;cfactorytemplate g_templates =

,// this entry is for the property page.

};

如果你用下面的方式宣告全域性陣列,陣列的大小就會自動地得到修改

int g_ctemplates = sizeof(g_templates)/sizeof(g_templates[0]);

同時,還要在屬性頁類中新增乙個createinstance方法

static cunknown * winapi createinstance(lpunknown punk, hresult *phr) 

return pnewobject;

}

如果想測試屬性頁,可以註冊dll,然後將filter載入到graphedit,滑鼠右擊來檢視filter的屬性。

如何建立Filter的屬性頁

always create new guids never copy a guid from an example.define guid iid isaturation,0x19412d6e,0x6401,0x475c,0xb0,0x48,0x7a,0xd2,0x96,0xe1,0x6a,0x19...

檢視文章 MFC建立屬性頁對話方塊

首先 效果如圖 第一步,開啟資源檢視,為屬性表單新增屬性頁資源,如圖 需要幾個屬性頁就新增幾個 同乙個屬性表單的屬性頁資源大小要一樣,也就說統一選擇large 或small等 第二步,為剛才新增的屬性頁資源新增對應類,這裡,屬性頁跟一般對話方塊一樣,如圖 第三步,為整個屬性頁資源新增乙個基於cpro...

CSS3的濾鏡filter屬性

css3的濾鏡filter屬性,可以對網頁中的進行類似photoshop處理的效果,例如背景的毛玻璃效果 老 黑白 火焰效果等。注意 這個 drop shadow 與 box shadow 都是在說陰影,但還是有區別的,看下圖 圖中火焰的,是一張png,除了火焰以外,其他部分是透明的,我們能看見,b...