VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3151|回复: 4

有个API不会用,求大神指教

[复制链接]
发表于 2015-10-13 10:25:53 | 显示全部楼层 |阅读模式
本帖最后由 Yang201511 于 2015-10-13 10:28 编辑

int EnumFonts(
  HDC hdc,                  // handle to DC
  LPCTSTR lpFaceName,       // font typeface name
  FONTENUMPROC lpFontFunc,  // callback function
  LPARAM lParam             // application-supplied data
);

//这个函数,我能看懂一点,不懂的是后面的回调函数
int CALLBACK EnumFontsProc(
  CONST LOGFONT *lplf,     // logical-font data
  CONST TEXTMETRIC *lptm,  // physical-font data
  DWORD dwType,            // font type
  LPARAM lpData            // application-defined data
)

//前面的枚举函数emumfonts的参数表中,只提供了回调函数的指针和一个参数,但回调函数却有4个参数,前三个参数如何传递呢?

//我的代码是无效的。
HDC hdc = GetDC(NULL);
EnumFonts(hdc,NULL,EnumFontsProc,NULL);
ReleaseDC(NULL,hdc);
 楼主| 发表于 2015-10-13 10:51:26 | 显示全部楼层
自己搞懂了。
回复 支持 反对

使用道具 举报

发表于 2015-10-13 14:48:55 | 显示全部楼层
本帖最后由 bxc1995 于 2015-10-13 14:53 编辑

回调函数,就是这个函数由你自己实现,然后调用函数在内部会call你传递的函数地址。
EnumFontsProc这个是由你实现的,所以给出了函数原型。
至于你说的回调函数参数,LPARAM lParam这个是在回调EnumFontsProc传递的LPARAM lpData参数,可有可无。
具体传递什么,看你的EnumFontsProc函数构造了。

//前面的枚举函数emumfonts的参数表中,只提供了回调函数的指针和一个参数,但回调函数却有4个参数,前三个参数如何传递呢?

前三个参数是EnumFonts赋值并传递的。

//我的代码是无效的。

你的代码里没有EnumFontsProc的实现,肯定是无效的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-13 23:37:56 | 显示全部楼层
bxc1995 发表于 2015-10-13 14:48
回调函数,就是这个函数由你自己实现,然后调用函数在内部会call你传递的函数地址。
EnumFontsProc这个是由 ...

谢谢你,不过不是我要的答案,我只是知道回调函数的前三个参数 是怎么传递初始化的。

例如我下面的能运行的代码,我并没有给那三个参数赋值。
  1. #include<stdio.h>
  2. #include<windows.h>
  3. #include<string.h>

  4. #define GO_ON 1
  5. #define MAXLENGTH 1028

  6. //declare enumfontsproc function
  7. int CALLBACK EnumFontsProc(
  8.   CONST LOGFONT *lplf,     // logical-font data
  9.   CONST TEXTMETRIC *lptm,  // physical-font data
  10.   DWORD dwType,            // font type
  11.   LPARAM lpData            // application-defined data
  12. );

  13. char g_szBuf[MAXLENGTH];        //global variable;

  14. int main()
  15. {
  16.         HDC hDC = GetDC(NULL);
  17.         EnumFonts(hDC,NULL,EnumFontsProc,(LPARAM)g_szBuf);        //the last parameter passing a char pointer.
  18.         ReleaseDC(NULL,hDC);
  19.         printf("%s",g_szBuf);        //show the result
  20.         return 0;
  21. }

  22. //define enumfontsproc function
  23. int CALLBACK EnumFontsProc(
  24.   CONST LOGFONT *lplf,     // logical-font data
  25.   CONST TEXTMETRIC *lptm,  // physical-font data
  26.   DWORD dwType,            // font type
  27.   LPARAM lpData            // application-defined data
  28. ){
  29.         char *pTemp = (char*)lpData;       
  30.         strcat(pTemp,lplf->lfFaceName);
  31.         strcat(pTemp,"\n");
  32.         return GO_ON;
  33. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-10-14 11:58:35 | 显示全部楼层
本帖最后由 bxc1995 于 2015-10-14 12:01 编辑
Yang201511 发表于 2015-10-13 23:37
谢谢你,不过不是我要的答案,我只是知道回调函数的前三个参数 是怎么传递初始化的。

例如我下面的能运 ...


这么给你解释吧:
假设以下是EnumFonts函数的实现代码:
  1. int EnumFonts(
  2.   HDC hdc,                  // handle to DC
  3.   LPCTSTR lpFaceName,       // font typeface name
  4.   FONTENUMPROC lpFontFunc,  // callback function
  5.   LPARAM lParam             // application-supplied data
  6. )
  7. {
  8.   ...
  9.   LOGFONT lf;
  10.   TEXTMETRIC tm;
  11.   
  12.   ...
  13.   lf.XX = XX;
  14.   ...
  15.   tm.XX = XX;
  16.   ...


  17.   if (XX)
  18.   {
  19.     lpFontFunc(&lf, &tm, XXA, lParam);
  20.   }
  21.   else
  22.   {
  23.     lpFontFunc(&lf, &tm, XXB, lParam);
  24.   }

  25.   ...
  26.   return **;
  27. }
复制代码
这里只是演示下EnumFonts是如何回调EnumFontsProc的。
实际流程肯定与以上代码无关。
EnumFontsProc该函数的前3个参数,不是由你控制的,懂了吗。
不懂的话,IDA Pro F5一下EnumFonts。

不过我看你的问题,你好像还不理解参数和变量。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-2-3 14:06

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表