?? lib.h
字號:
//////////////////////////////////// 接口:
// 創建單元,成功時返回HUNIT,失敗返回NULL。
typedef HUNIT (WINAPI *PFN_CREATE_UNIT) (
LPBYTE pAllPropertyData, // 指向本窗口單元的已有屬性數據,由本窗口單元的
// ITF_GET_PROPERTY_DATA接口產生,如果沒有數據則為NULL。
INT nAllPropertyDataSize, // 提供pAllPropertyData所指向數據的尺寸,如果沒有則為0。
DWORD dwStyle, // 預先設置的窗口風格。
HWND hParentWnd, // 父窗口句柄。
UINT uID, // 在父窗口中的ID。
HMENU hMenu, // 未使用。
INT x, INT y, INT cx, INT cy, // 指定位置及尺寸。
DWORD dwWinFormID, DWORD dwUnitID, // 本窗口單元所在窗口及本身的ID,用作通知到系統。
HWND hDesignWnd = 0, // 如果blInDesignMode為真,則hDesignWnd提供所設計窗口的窗口句柄。
BOOL blInDesignMode = FALSE); // 說明是否被易語言IDE調用以進行可視化設計,運行時為假。
// 如果指定屬性目前可以被操作,返回真,否則返回假。
typedef BOOL (WINAPI *PFN_PROPERTY_UPDATE_UI) (
HUNIT hUnit, // 由PFN_CREATE_UNIT返回的已創建窗口單元的句柄,下同。
INT nPropertyIndex); // 所需要查詢屬性的索引值,下同。
// 用作設置類型為UD_CUSTOMIZE的單元屬性。
// 如果需要重新創建該單元才能修改單元外形,請返回真。
typedef BOOL (WINAPI *PFN_DLG_INIT_CUSTOMIZE_DATA) (
HUNIT hUnit,
INT nPropertyIndex,
BOOL* pblModified = NULL, // 如果pblModified不為NULL,請在其中返回是否
// 被用戶真正修改(便于易語言IDE建立UNDO記錄)。
LPVOID pReserved = NULL); // 保留未用。
// 用作記錄某屬性的具體屬性值。
union UNIT_PROPERTY_VALUE
{
INT m_int; // 對應的屬性類別:UD_INT、UD_PICK_INT,下同。
DOUBLE m_double; // UD_DOUBLE
BOOL m_bool; // UD_BOOL
DATE m_dtDateTime; // UD_DATE_TIME
COLORREF m_clr; // UD_COLOR、UD_COLOR_TRANS、UD_COLOR_BACK
LPTSTR m_szText; // UD_TEXT、UD_PICK_TEXT、UD_EDIT_PICK_TEXT、
// UD_ODBC_CONNECT_STR、UD_ODBC_SELECT_STR
LPTSTR m_szFileName; // UD_FILE_NAME
// UD_PIC、UD_ICON、UD_CURSOR、UD_MUSIC、UD_FONT、UD_CUSTOMIZE、UD_IMAGE_LIST
struct
{
LPBYTE m_pData;
INT m_nDataSize;
} m_data;
UNIT_PROPERTY_VALUE ()
{
memset ((LPBYTE)this, 0, sizeof (UNIT_PROPERTY_VALUE));
}
};
typedef UNIT_PROPERTY_VALUE* PUNIT_PROPERTY_VALUE;
// 通知某屬性(非UD_CUSTOMIZE類別屬性)數據被用戶修改,需要根據該修改相應更改
// 內部數據及外形,如果確實需要重新創建才能修改單元外形,請返回真。
// 注意:必須進行所傳入值的合法性校驗。
typedef BOOL (WINAPI *PFN_NOTIFY_PROPERTY_CHANGED) (
HUNIT hUnit,
INT nPropertyIndex,
PUNIT_PROPERTY_VALUE pPropertyValue, // 用作修改的相應屬性數據。
LPTSTR* ppszTipText = NULL); // 目前尚未使用。
// 取某屬性數據到pPropertyValue中,成功返回真,否則返回假。
/* 注意:如果在設計時(由調用PFN_CREATE_UNIT時的blInDesignMode參數決定),
pPropertyValue必須返回所存儲的值。如果在運行時(blInDesignMode為假),必須
返回實際的當前實時值。
比如說,編輯框窗口單元的“內容”屬性,設計時必須返回內部所保存的值,而
運行時就必須調用 GetWindowText 去實時獲取。 */
typedef BOOL (WINAPI *PFN_GET_PROPERTY_DATA) (
HUNIT hUnit,
INT nPropertyIndex,
PUNIT_PROPERTY_VALUE pPropertyValue); // 用作接收欲讀取屬性的數據。
// 返回本窗口單元的全部屬性數據,由該窗口單元的實現代碼自行設計格式將
// 所有屬性數據組合到一起。此窗口單元的PFN_CREATE_UNIT接口必須能夠正確解
// 讀此數據。
typedef HGLOBAL (WINAPI *PFN_GET_ALL_PROPERTY_DATA) (HUNIT hUnit);
// 詢問單元是否需要指定的按鍵信息,如果需要,返回真,否則返回假。
typedef BOOL (WINAPI *PFN_IS_NEED_THIS_KEY) (
HUNIT hUnit,
WORD wKey);
////////////////////////////////////
#define UNIT_BMP_SIZE 24 // 單元標志位圖的寬度和高度。
#define UNIT_BMP_BACK_COLOR (RGB (192, 192, 192)) // 單元標志位圖的背景顏色。
struct LIB_DATA_TYPE_INFO // 庫定義數據類型結構
{
LPTSTR m_szName; // 名稱
LPTSTR m_szEGName; // 英文名稱,可為空或NULL。
LPTSTR m_szExplain; // 詳細解釋,如無則可為NULL。
INT m_nCmdCount; // 本數據類型成員方法的數目(可為0)。
LPINT m_pnCmdsIndex; // 順序記錄本類型中所有成員方法命令在支持庫命令表中的索引值,可為NULL。
// 本類型是否為隱含類型(即不能由用戶直接用作定義的類型,如被廢棄
// 但為了保持兼容性又要存在的類型)。
#define LDT_IS_HIDED (1 << 0)
// 本類型在本庫中不能使用,具有此標志一定隱含。
// 即使具有此標志,本類型的類型數據也必須完整定義。
#define LDT_IS_ERROR (1 << 1)
// 是否為窗口單元,如此標志置位則m_nElementCount必為0,
#define LDT_WIN_UNIT (1 << 6)
// 是否為容器型窗口單元,如有此標志,LDT_WIN_UNIT必須置位。
#define LDT_IS_CONTAINER (1 << 7)
// 是否為僅用作提供功能的窗口單元(如時鐘),如此標志置位則LDT_WIN_UNIT必置位。
// 具有此標志的單元在運行時無可視外形。
#define LDT_IS_FUNCTION_PROVIDER (1 << 15)
// 僅用作窗口單元,如此標志置位則表示此單元不能接收輸入焦點,不能TAB鍵停留。
#define LDT_CANNOT_GET_FOCUS (1 << 16)
// 僅用作窗口單元,如此標志置位則表示此單元可以接收輸入焦點,但默認不停留TAB鍵,
// 本標志與上標志互斥。
#define LDT_DEFAULT_NO_TABSTOP (1 << 17)
// 是否為需要自調整位置或尺寸的條狀窗口單元(如工具條、狀態條等),對于具有此標志的單元,
// 所在窗口尺寸改變后易語言運行時環境會自動發送給WU_SIZE_CHANGED消息。
// 注意:條狀窗口單元如果需要自動頂部對齊必須具有 CCS_TOP 窗口風格,如果需要自動底部
// 對齊必須具有 CCS_BOTTOM 窗口風格。
#define LDT_BAR_SHAPE (1 << 20)
DWORD m_dwState;
////////////////////////////////////////////
// 以下成員只有在為窗口單元、菜單時才有效。
DWORD m_dwUnitBmpID; // 指定在支持庫中的單元圖像資源ID(注意不同于上面的圖像索引),0為無。
// 尺寸必須為 24 X 24 ,背景顏色為 RGB (192, 192, 192) 。
INT m_nEventCount; // 本單元的事件數目。
PEVENT_INFO m_pEventBegin; // 定義本單元的所有事件。
INT m_nPropertyCount;
PUNIT_PROPERTY m_pPropertyBegin;
// 用作提供本窗口單元的所有接口。
PFN_GET_INTERFACE m_pfnGetInterface;
////////////////////////////////////////////
// 以下成員只有在不為窗口單元、菜單時才有效。
// 本數據類型中子成員的數目(可為0)。如為窗口、菜單單元,此變量值必為0。
INT m_nElementCount;
PLIB_DATA_TYPE_ELEMENT m_pElementBegin; // 指向子成員數組的首地址。
};
typedef LIB_DATA_TYPE_INFO* PLIB_DATA_TYPE_INFO;
/*////////////////////////////////////////////*/
struct LIB_CONST_INFO // 庫常量數據結構
{
LPTSTR m_szName;
LPTSTR m_szEGName;
LPTSTR m_szExplain;
SHORT m_shtReserved; // 必須為 1 。
#define CT_NULL 0
#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;
//////////////////////////////////////////// 常用數據結構。
typedef struct
{
DWORD m_dwFormID;
DWORD m_dwUnitID;
}
MUNIT, *PMUNIT;
#pragma pack (push, old_value) // 保存VC++編譯器結構對齊字節數。
#pragma pack (1) // 設置為以一字節對齊。
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,以便于處理。
// 指針所指向數據的格式見前面的描述。
// !!!只可讀取而不可更改其中的內容。
DWORD m_dwSubCodeAdr; // SDT_SUB_PTR,為子程序代碼地址指針。
MUNIT m_unit; // 窗口單元、菜單數據類型的數據。
void* m_pCompoundData;// 復合數據類型數據指針,指針所指向數據的格式見前面的描述。
// !!! 只可讀取而不可更改其中的內容。
void* m_pAryData; // 數組數據指針,指針所指向數據的格式見前面的描述。
// 注意如果為文本或字節集數組,則成員數據指針可能為NULL。
// !!! 只可讀取而不可更改其中的內容。
// 第二部分。
// 為指向變量地址的指針,僅當參數具有AS_RECEIVE_VAR或AS_RECEIVE_VAR_ARRAY或
// AS_RECEIVE_VAR_OR_ARRAY標志時才被使用。
BYTE* m_pByte; // SDT_BYTE 數據類型變量的地址,下同。
SHORT* m_pShort; // SDT_SHORT
INT* m_pInt; // SDT_INT
INT64* m_pInt64; // SDT_INT64
FLOAT* m_pFloat; // SDT_FLOAT
DOUBLE* m_pDouble; // SDT_DOUBLE
DATE* m_pDate; // SDT_DATE_TIME
BOOL* m_pBool; // SDT_BOOL
char** m_ppText; // SDT_TEXT,注意*m_ppText可能為NULL(代表空文本)。
// 寫入新值之前必須釋放前值,例句:NotifySys (NRS_MFREE, (DWORD)*m_ppText)。
// !!!不可直接更改*m_ppText所指向的內容,只能釋放原指針后設置入NULL(空文本)
// 或使用NRS_MALLOC通知分配的新內存地址指針(下同)。
LPBYTE* m_ppBin; // SDT_BIN,注意*m_ppBin可能為NULL(代表空字節集)。
// 寫入新值之前必須釋放前值,例句:NotifySys (NRS_MFREE, (DWORD)*m_ppBin)。
// !!!不可直接更改*m_ppBin所指向的內容,只能釋放原指針后設置入NULL(空字節集)
// 或新指針。
DWORD* m_pdwSubCodeAdr; // SDT_SUB_PTR,子程序代碼地址變量地址。
PMUNIT m_pUnit; // 窗口單元、菜單數據類型變量地址。
void** m_ppCompoundData; // 復合數據類型變量地址。
// !!!注意寫入新值之前必須使用NRS_MFREE通知逐一釋放所有成員(即:SDT_TEXT、
// SDT_BIN及復合數據類型成員)及原地址指針。
// !!!不可直接更改*m_ppCompoundData所指向的內容,只能釋放原指針后設置入新指針。
void** m_ppAryData; // 數組數據變量地址,注意:
// 1、寫入新值之前必須釋放原值,例句:NotifySys (NRS_FREE_ARY,
// m_dtDataType, (DWORD)*m_ppAryData),注意:此例句只適用于
// m_dtDataType為系統基本數據類型時的情況,如果為復合數據類型,
// 必須根據其定義信息逐一釋放。
// 2、如果為文本或字節集數組,則其中成員的數據指針可能為NULL。
// !!!不可直接更改*m_ppAryData所指向的內容,只能釋放原指針后設置入新指針。
};
// 1、當用作傳遞參數數據時,如果該參數具有 AS_RECEIVE_VAR_OR_ARRAY 或
// AS_RECEIVE_ALL_TYPE_DATA 標志,且為數組數據,則包含標志 DT_IS_ARY ,
// 這也是 DT_IS_ARY 標志的唯一使用場合。
// DT_IS_ARY 的定義為:
// #define DT_IS_ARY 0x20000000
// 2、當用作傳遞參數數據時,如果為空白數據,則為 _SDT_NULL 。
DATA_TYPE m_dtDataType;
};
typedef MDATA_INF* PMDATA_INF;
// !!! ASSERT (sizeof (MDATA_INF) == sizeof (DWORD) * 3);
// 尺寸必須等于 sizeof (DWORD) * 3 。
#pragma pack (pop, old_value) // 恢復VC++編譯器結構對齊字節數。
//////////////////////////////////////////// 通知用數據結構。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -