zoukankan      html  css  js  c++  java
  • [转]回调函数在MFC中的使用

    调函数的简单定义就是你定义的由Windows来调用。以下两个函数摘自《Programming Windows with MFC》,这里暂且不管函数的具体作用,在FillListBox中有一个API函数,它调用的回调函数是EnumFontFamProc,回调函数的声明形式一般都是相对固定的,具体可以参考MSDN

    static int CALLBACK EnumFontFamProc (ENUMLOGFONT* lpelf,

                  NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam);

    void CMainWindow::FillListBox ()

    {

        m_wndListBox.ResetContent ();

        CClientDC dc (this);

        ::EnumFontFamilies ((HDC) dc, NULL, (FONTENUMPROC) EnumFontFamProc,

            (LPARAM) this);

    }

    int CALLBACK CMainWindow::EnumFontFamProc (ENUMLOGFONT* lpelf,

        NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam)

    {

        CMainWindow* pWnd = (CMainWindow*) lParam;

        if ((pWnd->m_wndCheckBox.GetCheck () == BST_UNCHECKED) ||

            (nFontType & TRUETYPE_FONTTYPE))

            pWnd->m_wndListBox.AddString (lpelf->elfLogFont.lfFaceName);

        return 1;

    }

    请注意这里的函数EnumFontFamilies中的最后一个参数传递的是this即该CMainWindow对象的指针,为什么要这样呢,可以看到EnumFontFamProc的声明是static,在C++static函数是不能调用非static成员的,所以这里传递一个this就不是很奇怪了。但是为什么要将该函数声明为static呢,这就要归咎于C++的特殊性了,众所周知C++编译器在编译的时候都会在对象中添加一个this指针,在成员函数调用中又会附加一个参数保存this指针,但是Windows的回调函数有严格的定义就是必须按照参数列表传递的参数,加了this指针后参数列表就会与Windows期望的参数列表不一致了,因此这里将其声明为staticstatic成员函数不会传递this指针,这点说起来总是知道,但是真正用时总是忘了,唉)。

           另外在Windows中使用callback函数很常见,恰好许多支持回调函数的API函数都像这里的EnumFontFamilies一样支持自定义的LPARAM参数,刚好可以传递this,如果使用的API函数不支持这样的自定义的LPARAM参数,就需要其他的方法了,一种比较简单的方法是将this复制为global变量使得回调函数可以使用。

  • 相关阅读:
    WebApp匯入資料之對話框實現
    JSON學習
    [JSON]jQuery的parseJSON()函數使用
    DataTable.Merge()一次應用
    WebApp匯入資料之From Excel
    含有HTML碼的欄位寫入資料庫處理方法
    访问Webservice错误
    ASP.NET整合應用實例後端Services合作
    强直性脊柱炎活动指数(ASDAS)在日常诊疗种评估生物制剂治疗患者的应用-来自葡萄牙登记系统风湿病患者
    脊柱炎症水平在疾病活动度高低不等的脊柱关节炎患者中表现相似-来自一项群体研究结果
  • 原文地址:https://www.cnblogs.com/answer/p/1360027.html
Copyright © 2011-2022 走看看