?? tech.txt
字號:
每種數據類型數據的存儲格式(用對應的C++數據類型說明):
A、如果不為數組:
SDT_BYTE: BYTE
SDT_SHORT: SHORT
SDT_INT: INT
SDT_INT64: INT64
SDT_FLOAT: FLOAT
SDT_DOUBLE: DOUBLE
SDT_DATE_TIME:DATE
SDT_BOOL: BOOL
SDT_TEXT:為一個指針,指針指向以0結束的字符串數據,如果指針值為NULL表示為空串。
SDT_BIN:為一個指針,如果為NULL表示為空字節集。指針所指向的數據格式等同于字節數組,即:
1、一個恒定為數值1的INT;
2、一個INT記錄數據的長度;
3、相應長度的數據;
窗口單元和菜單數據類型:
1、一個DWORD記錄窗口模板ID;
2、一個DWORD記錄窗口單元/菜單項的ID。
復合數據類型(即非窗口單元和菜單的用戶或庫定義數據類型):
為一個必定不為NULL的指針值,該指針所指向的數據格式為:
順序排列所有成員,注意任何成員如果數據尺寸小于4個字節,都會被自動對齊到4個字節。
如以下復合類型:
字節型 A
短整數型 B
整數型 C
則整個復合類型所占用的空間為 12 個字節,其中 A 和 B 都被對齊到 4 個字節,
因此 B 從第 4 個字節開始,C 從第 8 個字節開始。
B、如果為數組:
為一個必定不為NULL的指針值,該指針所指向的數據格式為:
1、一個INT記錄該數組的維數(必定大于0)。
2、對應數目的INT值順序記錄對應維的成員數目(必定大于0)。
3、數組數據本身,格式為:
A、SDT_TEXT、SDT_BIN:
為指針數組,每個指針都指向一個單獨的數據成員地址(注意指針值可能為NULL,
此時表示為一個空文本或者空字節集)。
B、窗口單元、菜單數據類型和簡單數據類型:
為不為數組情況下數據的順序排列;
C、復合數據類型:
為指針數組,每個指針都指向一個單獨的數據成員地址。
C、注意:訪問任何數據時,注意只能訪問等同該數據長度(即非對齊長度)的數據。比如讀
寫一個字節型數據,只能假設只有此一個字節是可以訪問的。有此限制的原因是當以傳址的
方式將一個數組成員的指針傳遞到下一個子程序時,該指針處只有數組成員實際長度是可供
訪問的(數組成員不會以4字節對齊)。
/*****************************************************************/
5、m_pfnNotify 成員說明:
本函數指針所指向的函數用作接收來自易語言IDE或者運行時環境的通知,其原型定義如下:
typedef INT (WINAPI *PFN_NOTIFY_LIB) (INT nMsg, DWORD dwParam1 = 0, DWORD dwParam2 = 0);
例子如下:
PFN_NOTIFY_SYS g_fnNotifySys = NULL;
INT WINAPI ProcessNotifyLib (INT nMsg, DWORD dwParam1, DWORD dwParam2)
{
INT nRet = NR_OK;
switch (nMsg)
{
case NL_SYS_NOTIFY_FUNCTION:
g_fnNotifySys = (PFN_NOTIFY_SYS)dwParam1;
/*
上面代碼獲得用作通知信息到易語言IDE或運行時環境的函數指針,獲得指針后
即可建立類似下面函數用作通知信息到易語言IDE或運行時環境。
INT WINAPI NotifySys (INT nMsg, DWORD dwParam1, DWORD dwParam2)
{
ASSERT (g_fnNotifySys != NULL);
if (g_fnNotifySys != NULL)
return g_fnNotifySys (nMsg, dwParam1, dwParam2);
else
return 0;
}
*/
break;
default:
nRet = NR_ERR;
break;
}
return nRet;
}
/*****************************************************************/
6、m_nLibConstCount、m_pLibConst 成員說明:
下面是 LIB_CONST_INFO 的定義:
struct LIB_CONST_INFO
{
LPTSTR m_szName;
LPTSTR m_szEGName;
LPTSTR m_szExplain;
SHORT m_shtReserved; // 必須為 1 。
#define CT_NUM 1 // sample: 3.1415926
#define CT_BOOL 2 // sample: 1
#define CT_TEXT 3 // sample: "abc"
SHORT m_shtType;
LPTSTR m_szText; // CT_TEXT
DOUBLE m_dbValue; // CT_NUM、CT_BOOL
};
typedef LIB_CONST_INFO* PLIB_CONST_INFO;
例子:
LIB_CONST_INFO s_ConstInfo [] =
{
{ _T("引號"), NULL, _T("半角雙引號"), 1, CT_TEXT, _T("\""), 0 },
{ _T("pi"), NULL, NULL, 1, CT_NUM, NULL, 3.1415926535 },
{ _T("藏青"), NULL, NULL, 1, CT_NUM, NULL, RGB(0,0,128) },
};
m_nLibConstCount 應該等于 m_pLibConst 所指向定義信息數組的成員數目。
/*****************************************************************/
7、m_pfnRunAddInFn、m_szzAddInFnInfo成員說明:
這兩個成員用作為易語言IDE系統添加輔助功能,所提供功能會被自動添加到IDE的“工具”菜單中。
下面為 PFN_RUN_ADDIN_FN 的定義:
typedef INT (WINAPI *PFN_RUN_ADDIN_FN) (INT nAddInFnIndex);
例子:
INT fnAddInFunc (INT nAddInFnIndex)
{
if (nAddInFnIndex == 0) // 是否為第一個功能?
{
// 有關 NotifySys 請見前面的說明。
HWND hWnd = (HWND)NotifySys (NES_GET_MAIN_HWND);
if (hWnd != NULL)
::MessageBox (hWnd, "這是個輔助工具功能!", "輔助工具", MB_YESNO);
}
return 0;
}
在 LIB_INFO 中作以下設置:
m_pfnRunAddInFn = fnAddInFunc;
m_szzAddInFnInfo = _T("輔助功能1\0這是個用作測試的輔助工具功能。\0\0");
/*****************************************************************/
8、如何定義并實現全局命令(即非對象的方法):
需要使用到以下成員:
INT m_nCmdCount; // 必須等于 m_pBeginCmdInfo 所指向的 CMD_INFO 的數目。
PCMD_INFO m_pBeginCmdInfo;
PFN_EXECUTE_CMD* m_pCmdsFunc;
///////////////////////////////////////////////
其中 CMD_INFO 用作提供命令定義,具體定義及說明為:
struct CMD_INFO
{
LPTSTR m_szName; // 命令中文名稱
LPTSTR m_szEGName; // 命令英文名稱,可以為空或NULL。
LPTSTR m_szExplain; // 命令詳細解釋
SHORT m_shtCategory; // 全局命令的所屬類別,從1開始,減一后的值為指向LIB_INFO的
// m_szzCategory成員所提供的某個類別字符串的索引。
// 對象成員命令的此值為-1。
#define CT_IS_HIDED (1 << 2)
// 本命令是否為隱含命令(即不需要由用戶直接輸入的命令(如循環結束命令)或被廢棄
// 但為了保持兼容性又要存在的命令)。
#define CT_IS_ERROR (1 << 3)
// 本命令在本庫中不能使用,具有此標志一定隱含,主要用作在不同語言版本的相同庫中使用,
// 即:A命令在A語言版本庫中可能需要實現并使用,但在B語言版本庫中可能就不需要。如果
// 程序中使用了具有此標志的命令,則只能支持該程序調入和編譯,而不能支持運行。
// 如具有此標志,可以不實現本命令的執行部分。
#define CT_DISABLED_IN_RELEASE_VER (1 << 4)
// 具有本標志的命令在易語言系統編譯RELEASE版易程序時將被跳過,本類型命令必須無返回值。
#define CT_ALLOW_APPEND_NEW_ARG (1 << 5)
// 在本命令的參數表的末尾是否可以添加新的參數,新參數等同于參數表中的最后一個參數。
#define CT_RETURN_ARRAY_DATA (1 << 6)
// 用于說明m_dtRetType,說明是否為返回數組數據。
WORD m_wState;
/* !!!!! 千萬注意:如果返回值類型定義為 _SDT_ALL ,絕對不能返回數組(即CT_RETURN_ARRAY_DATA
置位)或復合數據類型的數據(即用戶或庫自定義數據類型但不包含窗口或菜單單元),
因為用戶程序無法自動刪除復合類型中所分配的額外空間(如文本型或者字節集型成員等)。 */
DATA_TYPE m_dtRetType; // 返回值數據類型。
WORD m_wReserved; // 保留,必須為0。
// 級別宏,用作為用戶提供學習難度說明。
#define LVL_SIMPLE 1 // 初級
#define LVL_SECONDARY 2 // 中級
#define LVL_HIGH 3 // 高級
SHORT m_shtUserLevel; // 命令的學習難度級別,本成員的值為上面的級別宏。
SHORT m_shtBitmapIndex; // 指定圖像索引,從1開始,0表示無。減一后的值為指向支持庫中名為
// "LIB_BITMAP"的BITMAP資源中某一部分16X13位圖的索引。
SHORT m_shtBitmapCount; // 圖像數目(用作為IDE提供動畫圖片).
INT m_nArgCount; // 命令的參數數目
PARG_INFO m_pBeginArgInfo; // 指向本命令的參數定義信息數組
};
typedef CMD_INFO* PCMD_INFO;
///////////////////////////////////////////////
CMD_INFO 中使用 ARG_INFO 用作提供命令的參數定義,具體定義及說明為:
typedef struct
{
LPTSTR m_szName; // 參數名稱
LPTSTR m_szExplain; // 參數詳細解釋
SHORT m_shtBitmapIndex; // 參見 CMD_INFO 中的同名成員
SHORT m_shtBitmapCount; // 參見 CMD_INFO 中的同名成員
DATA_TYPE m_dtDataType; // 參數的數據類型
INT m_nDefault;
// 系統基本類型參數的默認指定值(在編譯時編譯器將自動處理):
// 1、數值型:直接為數值(如為小數,只能指定其整數部分,
// 如為長整數,只能指定不超過INT限值的部分);
// 2、邏輯型:1等于真,0等于假;
// 3、文本型:本成員此時為LPTSTR指針,指向默認文本串;
// 4、其它所有類型參數一律無默認指定值。
#define AS_HAS_DEFAULT_VALUE (1 << 0)
// 本參數有默認值,默認值在m_nDefault中說明,與下標志互斥。
#define AS_DEFAULT_VALUE_IS_EMPTY (1 << 1)
// 本參數有默認值,默認值為空,與上標志互斥。
// 下面五個標志同時只能有一個置位。
#define AS_RECEIVE_VAR (1 << 2)
// 為本參數提供數據時必須提供非數組型容器。
#define AS_RECEIVE_VAR_ARRAY (1 << 3)
// 為本參數提供數據時必須提供數組型容器。
#define AS_RECEIVE_VAR_OR_ARRAY (1 << 4)
// 為本參數提供數據時必須提供數組或非數組型容器。
#define AS_RECEIVE_ARRAY_DATA (1 << 5)
// 為本參數提供數據時必須提供數組型數據。
#define AS_RECEIVE_ALL_TYPE_DATA (1 << 6)
// 為本參數提供數據時可以提供非數組或數組數據。
DWORD m_dwState;
}
ARG_INFO, *PARG_INFO;
///////////////////////////////////////////////
m_pCmdsFunc 用作提供所有命令的實現函數列表,FN_EXECUTE_CMD 的原型為:
typedef void (*PFN_EXECUTE_CMD) (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf);
參數說明:
1、pRetData用作提供返回數據,當對應CMD_INFO中m_dtRetType為_SDT_NULL
(即定義無返回值)時,pRetData無效;
2、pArgInf 提供參數數據本身,所指向的 MDATA_INF 數組記錄每個輸入參數,
成員數目等同于 nArgCount 。
MDATA_INF 的定義為:
struct MDATA_INF
{
union
{
// 注意當對應參數具有AS_RECEIVE_VAR或AS_RECEIVE_VAR_ARRAY或AS_RECEIVE_VAR_OR_ARRAY
// 標志定義時將使用下面的第二部分。
// 第一部分。
BYTE m_byte; // SDT_BYTE 數據類型的數據,下同。
SHORT m_short; // SDT_SHORT
INT m_int; // SDT_INT
INT64 m_int64; // SDT_INT64
FLOAT m_float; // SDT_FLOAT
DOUBLE m_double; // SDT_DOUBLE
DATE m_date; // SDT_DATE_TIME
BOOL m_bool; // SDT_BOOL
char* m_pText; // SDT_TEXT,經過系統預處理,即使是空文本,此指針值也不會為NULL,以便于處理。
// 指針所指向數據的格式見前面的描述。
// !!!為了避免修改到常量段(m_pText有可能會指向易程序常量段區域)中
// 的數據,只可讀取而不可更改其中的內容,下同。
LPBYTE m_pBin; // SDT_BIN,經過系統預處理,即使是空字節集,此指針值也不會為NULL,以便于處理。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -