簡體   English   中英

MAKEINTRESOURCE和WM_NOTIFY如何運作?

[英]How MAKEINTRESOURCE and WM_NOTIFY works?

大家好,我對我們使用的一些Win32 API數據類型和宏有一些困惑:

首先 - :關於WM_NOTIFY消息。 lparam包含指向NMHDR結構的指針。 因此,如果它是一個指針,為什么這樣訪問NMHDR結構是非法的:

(*lparam)->idFrom

我的意思是如果它是一個指針然后我可以使用一個間接運算符來到結構。 LPARAM本身是從LONG_PTR中定義的。 為什么我要寫這樣的代碼 - :

((LPNMHDR)lparam)->idFrom

什么是LPNMHDR? LPNMHDR按以下方式進行類型定義:

typedef NMHDR FAR * LPNMHDR;

FAR *再次按以下方式定義 - :

#define FAR _far

什么是_far以及為什么我必須使用LPNMHDR強制轉換來從LPARAM訪問NMHDR結構?

其次 - : MAKEINTRESOURCE宏做什么? 我看到很多作者在為函數指定資源時使用了純字符串。 例如-:

CreateDialog(hInst,"Dialog Box",
                hwnd,(DLGPROC)DialogFunc);

但在現代編譯器中我們使用 - :

CreateDialog(hInst,MAKEINTRESOURCE(DIALOG_BOX),
                hwnd,(DLGPROC)DialogFunc);

我知道如果我們在資源文件中使用字符串標識符而不是數字,那么我們可以省略這個宏,因此這個宏將數字轉換為字符串。 例如它將23轉換為“23”? 因為如果它確實那么我將能夠使用 - :

CreateDialog(hInst,"23",
                hwnd,(DLGPROC)DialogFunc);

如果我的對話框資源定義為23.但這不起作用。

所以我想知道這個宏處理標識符后的結果是什么? 它是如何工作的? 為了在消息框中打印MAKEINTRESOURCE的值,我需要做什么,因為我在使用sprintf函數將值復制到字符串時遇到問題。 但我知道MAKEINTRESOURCE輸出LPSTR,因為它是按以下方式定義的:

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))

我還沒有找到關於這個宏如何工作的任何文檔。 msdn聲明MAKEINTRESOURCE是一個宏,它將“ 整數值轉換為與資源管理函數兼容的資源類型 ”。 謝謝。

lParam不是指針,它是一個整數類型參數,因此在使用它之前必須將其強制轉換為正確的指針類型。

LPNMHDR只是一個用於歷史原因的typedef。 您也可以使用NMHDR* FAR和_far限定符與16位Windows一起使用,只是從那時起留下的噪音。

MAKEINTRESOURCE是Windows C語言接口使用的一種技巧,用於模擬重載函數在C ++中的作用。 這樣,您可以使用指針(字符串)參數或整數參數調用CreateDialog 這使用了永遠不會在非常低的地址分配字符串的知識,因此可以將這些字符串保留為資源ID的別名。 一個相當丑陋的黑客!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM