2011-02-22 25 views
1

我正在學習C++中的Windows編程。我創建了我的第一個Windows,但有一件事我不太明白:WNDCLASS中的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的方式只是沒有道理給我。有人能幫助我理解這一點嗎?

回答

7

WNDPROC是一個函數指針類型。其定義如下:

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

函數(類似於數組)在某些上下文中自動衰減爲指針。示例程序中的&是可選的。

+0

哦,我明白了。但是如何在結構體定義中像數據類型那樣使用它?另外,爲什麼它必須在返回LRESULT之前作爲CALLBACK返回? – Amumu 2011-02-22 18:34:51

+0

@Amumu,之後`typedef`,你可以使用`WNDPROC`像系統中的任何其他類型。 – 2011-02-22 18:35:31

1

MSDN說,

的lpfnWndProc

類型:WNDPROC

的指針窗口過程。您必須使用CallWindowProc函數調用窗口過程。

WINUSER.H將其定義爲,

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); 
相關問題