📄 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 + -