摘要:關於MFC應用程式中指標使用的注意事項。
步驟/方法
GetNextView()括號中的引數用的是引用方式,因此執行後值可能改變。
GetFirstViewPosition()用於返回第一個檢視位置(返回的並非檢視類指標,而是一個POSITION型別值)
GetNextView()有兩個功能:返回下一個檢視類的指標以及用引用呼叫的方式來改變傳入的POSITION型別引數的值。
很明顯,在Test程式中,只有一個檢視類,因此只需將這兩個函式呼叫一次即可得到CTestView的指標如下(需定義一個POSITION結構變數來輔助操作):
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
這樣,便可到了CTestView類的指標pTestView。執行完幾句後,變數pos=NULL,因為沒有下一個檢視類,自然也沒有下一個檢視類的POSITION.但是這幾條語句太簡單,不具有太強的通用性和安全特徵;當象前面說的那樣,當要在多個檢視為中返回某個指定類的指標時,我們需要遍歷所有檢視類,直到找到指定類為止。判斷一個類指標指向的是否某個類的例項時,可用IsKindOf()成員函式時行檢查,如下所示:
pView-> IsKindOf(RUNTIME_CLASS(CTestView));
這樣即可檢查pView所指是否是CTestView類。
有了以上基礎,我們已經可以從文件類取得任何類的指標。為了方便,我們將其作為一個文件類的成員函式,它有一個引數,表示要獲得哪個類的指標。
實現如下:
CView* CTestDoc::GetView(CRuntimeClass* pClass)
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL)
{
pView=GetNextView(pos);
if(!pView-> IsKindOf(pClass))
break;
}
if(!pView-> IsKindOf(pClass))
{
AfxMessageBox( "Connt Locate the View.\r\n ");
return NULL;
}
return pView;
}
其中用了兩次檢視類的成員函式IsKindOf()來判斷,是因為退出while迴圈有三種