// 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.然後要實現ispecifypropertypages介面的getpages方法:define_guid(clsid_saturationprop, 0xa9bd4eb, 0xded5,
0x4df0, 0xba, 0xf6, 0x2c, 0xea, 0x23, 0xf5, 0x72, 0x61);
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 的幾個方法哦cbasepropertypage(name("grayprop"), punk, idd_proppage, ids_proppage_title),
m_pgray(0)
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:當使用者改變了屬性的時候,在onreceivemessage方法中呼叫上面的函式。void setdirty()
}
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)如果想測試屬性頁,可以註冊dll,然後將filter載入到graphedit,滑鼠右擊來檢視filter的屬性。return pnewobject;
}
如何建立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,0...
檢視文章 MFC建立屬性頁對話方塊
首先 效果如圖 第一步,開啟資源檢視,為屬性表單新增屬性頁資源,如圖 需要幾個屬性頁就新增幾個 同乙個屬性表單的屬性頁資源大小要一樣,也就說統一選擇large 或small等 第二步,為剛才新增的屬性頁資源新增對應類,這裡,屬性頁跟一般對話方塊一樣,如圖 第三步,為整個屬性頁資源新增乙個基於cpro...
CSS3的濾鏡filter屬性
css3的濾鏡filter屬性,可以對網頁中的進行類似photoshop處理的效果,例如背景的毛玻璃效果 老 黑白 火焰效果等。注意 這個 drop shadow 與 box shadow 都是在說陰影,但還是有區別的,看下圖 圖中火焰的,是一張png,除了火焰以外,其他部分是透明的,我們能看見,b...