作为一种类型的功能?

时间:2011-02-22 18:16:00

标签: c++ windows

我正在学习C ++中的Windows编程。我创建了我的第一个Windows,但有一点我不太明白:WNDPASS中的WNDPROC。结构记录如下:

typedef struct tagWNDCLASS {
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
} WNDCLASS, *PWNDCLASS;

现在为了分配给lpfnWndProc,我必须有一个像这样的回调函数WindowProc:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

然后我必须像这样分配lfpnWndProc:

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;

据我所知,WindowProc是一个功能。如果我像这样分配,这意味着我正在分配WNDCLASS中的函数指针。但是在WNDCLASS定义中,没有任何东西表明它是一个函数指针。此外,它看起来像我的数据类型而不是函数指针。

通常我会得到一个像这样的函数指针作为参数传入或用作变量:

#include <stdio.h>

void my_int_func(int x)
{
    printf("%d\n",x);
}

int main(void)
{
    void (*foo) (int);
    foo = &my_int_func;

    foo(2);
    (*foo)(2);
}

但是我必须分配WindowProc的方式对我来说没有意义。有人能帮助我理解这个吗?

2 个答案:

答案 0 :(得分:7)

WNDPROC是函数指针类型。定义是:

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

函数,有点像数组,在某些上下文中自动衰减成指针。示例程序中的&是可选的。

答案 1 :(得分:1)

MSDN说,

  

lpfnWndProc

     

输入: WNDPROC

     

指向窗口过程的指针。必须使用CallWindowProc函数调用窗口过程。

WinUser.h 将其定义为,

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);