MFC 視窗的控制代碼與指標

2021-08-31 15:56:22 字數 2286 閱讀 6354

一、控制代碼

(2)獲取控制代碼

2、獲取子視窗控制代碼

3、獲取視窗中控制項的控制代碼

二、控制代碼、指標、id的轉換

控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以windows給每個使用globalalloc等函式宣告的記憶體區域指定乙個控制代碼(本質上仍是乙個指標,但不要直接操作它),平時你只是在呼叫api函式時利用這個控制代碼來說明要操作哪段記憶體。當你需要對某個記憶體進行直接操作時,可以使用globallock鎖住這段記憶體並獲得指標來直接進行操作。

控制代碼雖然是乙個能相互區別的號碼,但與我們普通的id號又有區別,普通的id號是可以由程式設計師自己定義的,而控制代碼不行,它是物件生成時系統指定的,是為了區別系統中存在的各個物件,這個控制代碼不是由程式設計師賦給的。實際應用中,最常用的就是檔案控制代碼和視窗控制代碼。例如,視窗控制代碼的值是乙個長整數,每個窗體都用乙個控制代碼來表示。所以控制代碼是不會重複的,很多的函式都會用到窗體的控制代碼。

控制代碼其實就是指標,但是他和指標最大的不同是:給你乙個指標,你可以通過這個指標做任何事情,也許是好事,也許是通過這個指標破壞記憶體,幹一些搗亂的事情。這個我想大家都會碰到過,因為亂用指標導致程式崩潰。

控制代碼就沒有這個缺點,通過控制代碼,你只能幹一些windows讓你幹的事情(呼叫一些api函式等等),沒有了指標的壞處。

控制代碼是一些表的索引也就是指向指標的指標,控制代碼和指標都是位址,控制代碼是windows程式設計的乙個關鍵性的概念,編寫windows應用程式總是要和各種控制代碼打交道。

所謂控制代碼,就是乙個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在win32裡,控制代碼是指向乙個「無型別物件」(void*)的指標,也就是乙個4位元組長的資料。1、獲取主視窗的控制代碼

a、主視窗或者子視窗的類中

都可以使用:afxgetmainwnd()->m_hwnd

備註:在提取到各個控制代碼之後,因為初次提取的都是標準類控制代碼,所以,在使用時要注意將標準控制代碼轉換成自己的類的控制代碼

b、在子視窗類中

可以使用:this->getsafehwnd()

或者:this->m_hwnd

或者:this->getparent()->m_hwnd (注意可能需要使用多個getparent()才能得到主視窗的控制代碼)

2、獲取子視窗控制代碼

a、使用:findwindow()

函式原型:hwnd findwindow(lpcstr lpclassname,lpcstr lpwindowname); //成功返回乙個視窗的控制代碼,否則返回零。

引數:lpclassname 如果該引數為null時,將會尋找任何與lpwindowname引數匹配的視窗。

lpwindowname 指向乙個以null字元結尾的、用來指定視窗名(即視窗標題)的字串。如果此引數為null,則匹配所有視窗名。

b、最安全還是使用:getsafehwnd() //得到視窗指標控制代碼。

cwnd *pwnd = findwindow(「window name」,null);

hwnd hwnd = pwnd->getsafehwnd(); //得到它的hwnd

3、獲取視窗中控制項的控制代碼

a、使用getdlgitem()

函式原型:cwindow::getdlgitem hwnd getdlgitem( intnid)const;

引數 nid:接收訊息的控制項的標識;

返回值:標識所標記的控制視窗控制代碼;

cwnd::getdlgitem

cwnd* getdlgitem ( intnid) const;

void cwnd::getdlgitem( int nid, hwnd *phwnd) const;

引數 nid:接收訊息的控制項的標識;

引數phwnd:子類視窗的指標;

返回值:標識所標記的控制項(或子類視窗)的指標;id—>控制代碼-----------hwnd = ::getdlgitem(hparentwnd,id);

id—>指標-----------cwnd::getdlgitem();

控制代碼—>id-----------id = getwindowlong(hwnd,gwl_id);

控制代碼—>指標--------cwnd *pwnd=cwnd::fromhandle(hwnd);

指標—>id----------id = getwindowlong(pwnd->getsafehwnd,gwl_id);

getdlgctrlid();

指標—>控制代碼--------hwnd=cwnd.getsafehandle() or mywnd->m_hwnd;

MFC 視窗指標 視窗控制代碼和視窗ID的相互轉換

接觸mfc一段時間了,發現在進行視窗操作時,最頻繁使用的就是指標 控制代碼和id的相互轉換了,總結了一套方法如下 假設對於同乙個視窗而言,其指標是pwnd,控制代碼是hwnd,id是nid,那麼三者相互轉換了方法如下 指標 控制代碼 hwnd pwnd getsafehwnd id 控制代碼 hwn...

MFC 視窗控制代碼獲取

控制代碼獲取方法 獲取該視窗的控制代碼後,即可向該視窗類類傳送訊息 處理程式 0。獲取所在類視窗的控制代碼 this m hwnd 1。主視窗的控制代碼 無論在主視窗類內,還是子視窗類內,獲取主視窗控制代碼的方法 afxgetmainwnd m hwnd,如 sendmessage afxgetma...

MFC獲取視窗控制代碼的方法

afxgetmainwnd afxgetmainwnd獲取自身視窗控制代碼 hwnd hwnd afxgetmainwnd m hwnd gettopwindow 函式功能 該函式檢查與特定父視窗相聯的子視窗z序 z序 垂直螢幕的方向,即疊放次序 並返回在z序頂部的子視窗的控制代碼。函式原型 hwn...