GetDlgItem的用法小结 – 浩天之家

GetDlgItem用于获得物指出控制ID的窗体方针,应变量原模式列举如下:


HWND GetDlgItem(
  HWND hDlg,
  int  nIDDlgItem
);

CWnd* GetDlgItem(int NID) const; 

它的整理中有很条款线。,The returned pointer may be temporary and should not be stored for later 专心致志。
,那阐明,由它重提的方针可能性是有效的。,它可能性是有效的。,不提议保持不变以备后续专心致志。。因而成绩就来了。,

  • 为什么经过GetDlgItem重提的方针不时不乱,不时不不乱?

  • 在实践专心致志中,若何正确处置GetDlgItem的重提值?

率先答复第第一成绩。, GetDlgItem重提的数据典型是CWnd*典型,外面有第一。 HWND m_hWnd 处置分子,该处置分子是第一4音节(64位顺序中为8音节)的无记分有创造力的,它代表内存中抱反感物理学地址列表的参考,对应于参考的满意的是假定的物理学地址。。因Windows的内存凑合着活下去战略会投递免费时期内存、改动等柄状物,当专心致志顺序再次被专心致志时,该体系将重行专心致志于物理学内存。,因而抱反感的物理学地址会改动。,Windows经过句柄处置专心致志顺序的更改。。当专心致志顺序平均数探望抱反感时,只必要将通信的的句柄印记给体系。,体系胸怀检索抱反感的最新地址。

C 击中要害方针也表现地址。。就不寻常的抱反感在专心致志顺序和不寻常的范例击中要害同样的,Windows难承认的事经过其地址正好探望内核抱反感。,只是经过识别或许参考方针的句柄(HANDLE)来探望抱反感通讯。

如上所述,Windows的内存凑合着活下去战略将在FR上运转。,从其设想,当Windows以为专心致志顺序免费时期时,,它将对专心致志顺序的免费时期抱反感举行柄状物。。

GetDlgItem实践上是使调动CWnd::FromHandle应变量来实施效能的,先看CWnd::FromHandle应变量


CWnd::FromHandle(HWND hWnd)

    -->CHandleMap* pMap = afxMapHWND(TRUE); //create map if not exist

        -->AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();

        -->pState->m_pmapHWND = new CHandleMap

    -->CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
    -->pWnd->AttachControlSite(pMap);

再看一下CWIAPAP::OnDID应变量。,OnIdle应变量的公务员解说:

CWinApp::OnIdle

OnIdle is called in the default message loop when the 专心致志顺序的 message queue is

空的。 Use your override to call your own background idle-handler 指定。

MFC顺序中免费时期国务的的处置:

因为MFC的ONIDLE相关性工艺过程列举如下:


    CWinApp::OnIdle

        --> CWinThread::OnIdle(lCount)

            -->AfxUnlockTempMaps()

                --> AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
                --> pState->m_pmapHWND->DeleteTemp();

在CWIAPP上带来义务:OnIdle,重提到非零表现免费时期。 处置指定,因而下次,On怠将持续执行遗产管理人的职责。。重提0,预示不必要处置免费时期指定。。MFC陷害顺序中OnDID的不隐瞒的膨胀

好多效能,如FromHandle、FiffWindows专心致志了暂时抱反感技术。,一起专心致志这些暂时抱反感。,不克不及保持不变和用于停止有意。。默许境遇下,MFC陷害将在免费时期时期清空暂时抱反感。。

充分地,答复开端时现在时的的成绩。:

  • 当执行遗产管理人的职责默许免费时期行动方向时,停止暂时抱反感句柄。

  • 就GetDlgItem这类的应变量,随用随取,不要把它存到另第一适用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注