📄 list.c
字号:
RedrawItem( lpListData, hWnd, dwStyle, hdc, index, lpListData->count, TRUE );
ReleaseListDC( hWnd, hdc, NULL );//ReleaseDC( hWnd, hdc ); //
ReflashScrollBar( hWnd, dwStyle, lpListData );
}
//if( cur >= 0 )
//DoSETCURSEL( hWnd, cur, FALSE );
}
return retv;
}
// **************************************************
// 声明:static LRESULT DoDIR( HWND hWnd, WORD attrib, LPCSTR lpName )
// 参数:
// IN hWnd - 窗口句柄
// IN attrib - 文件属性
// IN lpName - 文件名
// 返回值:
// 假如成功,返回最后增加的项目索引号; 否则,假如没有内存, 返回LB_ERRSPACE, 其它错误返回LB_ERR
// 功能描述:
// 增加文件或文件夹中的文件到列表框
// 处理 LB_DIR
// 引用:
//
// ************************************************
static LRESULT DoDIR( HWND hWnd, WORD attrib, LPCSTR lpName )
{
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoFINDSTRING( HWND hWnd, int indexStart, LPCSTR lpFindStr, BOOL bExact )
// 参数:
// IN hWnd - 窗口句柄
// IN indexStart - 搜索的起始索引号
// IN lpFindStr - 需要匹配的字符串
// IN bExact - 是否精确匹配(精确匹配意味其长度也要匹配)
// 返回值:
// 假如成功,返回项目索引号; 否则,返回LB_ERR
// 功能描述:
// 搜索匹配的项目
// 处理 LB_FINDSTRING 和 LB_FINDSTRINGEXACT
// 引用:
//
// ************************************************
static LRESULT DoFINDSTRING( HWND hWnd, int indexStart, LPCSTR lpFindStr, BOOL bExact )
{
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );//得到列表框窗口的列表框数据对象指针
short i;
DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );//得到列表框风格
_ASSERT( lpListData );
if( indexStart == -1 )
indexStart = 0; //从0开始
// 从indexStart开始搜索所有的项目
for( i = 0; i < lpListData->count; i++, indexStart++ )
{
if( indexStart >= lpListData->count )
indexStart = 0; // 如果没有搜索完所有的项目,从第一个开始
if( dwStyle & LBS_HASSTRINGS )
{ // 字符串类型
if( bExact )
{ // 精确匹配
if( stricmp( At( lpListData, indexStart )->lpszItem, lpFindStr ) == 0 )
return indexStart;
}
else
{ // 查找字符串
if( strstr( At( lpListData, indexStart )->lpszItem, lpFindStr ) )
return indexStart;
}
}
else if( dwStyle & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE) )
{ // 用户数据
if( At( lpListData, indexStart )->dwItemData == (DWORD)lpFindStr )
return indexStart;
}
else
break; // error
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETANCHORINDEX( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框被选择项目中的第一个项目索引; 否则,返回LB_ERR
//
// 功能描述:
// 得到列表框被选择项目中的第一个项目索引(用于多行选择)
// 处理 LB_GETANCHORINDEX 消息
// 引用:
//
// ************************************************
static LRESULT DoGETANCHORINDEX( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
int i;
_ASSERT( lpListData );
for( i = 0; i < lpListData->count; i++ )
{
if( At( lpListData, i )->state & ODS_SELECTED )
return i; //找到
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETCARETINDEX( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框被选择项目中的最后一个项目索引; 否则,返回LB_ERR
// 功能描述:
// 得到列表框被选择项目中的最后一个项目索引(用于多行选择)
// 处理 LB_GETCARETINDEX
// 引用:
//
// ************************************************
static LRESULT DoGETCARETINDEX( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
return lpListData->caret;
}
// **************************************************
// 声明:static LRESULT DoGETCOUNT( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框的项目总数; 否则,返回LB_ERR
// 功能描述:
// 得到列表框的项目总数
// 处理 LB_GETCOUNT
// 引用:
//
// ************************************************
static LRESULT DoGETCOUNT( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
return Count( lpListData );
}
// **************************************************
// 声明:static LRESULT DoGETCURSEL( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框被选择项目中的有焦点的项目索引; 否则,返回LB_ERR
//
// 功能描述:
// 如果列表框是多行选择风格,得到列表框被选择项目中的有焦点的项目索引
// 如果列表框是单行选择风格,得到列表框被选择项目的项目索引
// 处理 LB_GETCURSEL 消息
// 引用:
//
// ************************************************
static LRESULT DoGETCURSEL( HWND hWnd )
{ // 得到窗口风格
DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
//得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
int i;
_ASSERT( lpListData );
if( dwStyle & LBS_MULTIPLESEL )
{ // 多行选择风格
for( i = 0; i < lpListData->count; i++ )
{
if( At( lpListData, i )->state & ODS_FOCUS )
return i; //
}
}
else
{ // 单行选择 single-sel style
return lpListData->curSel;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETHORIZONTALEXTENT( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框的水平宽度; 否则,返回LB_ERR
//
// 功能描述:
// 得到之前调用 LB_SETHORIZONTALEXTENT 设置的水平宽度
// 处理 LB_GETHORIZONTALEXTENT 消息
// 引用:
//
// ************************************************
static LRESULT DoGETHORIZONTALEXTENT( HWND hWnd )
{
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETITEMDATA( HWND hWnd, int index )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// 返回值:
// 假如成功,返回列表框项目的项目数据; 否则,返回LB_ERR
// 功能描述:
// 得到列表框项目的项目数据
// 处理 LB_GETITEMDATA 消息
// 引用:
//
// ************************************************
static LRESULT DoGETITEMDATA( HWND hWnd, int index )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
if( (DWORD)index < lpListData->count )
{ // 有效的索引
return (LRESULT)At( lpListData, index )->dwItemData;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETITEMHEIGHT( HWND hWnd, int index )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// 返回值:
// 假如成功,返回列表框项目的项目高度; 否则,返回LB_ERR
// 功能描述:
// 得到列表框项目的项目高度( 列表框必须有 LBS_OWNERDRAWVARIABLE 风格;否则index必须为0 )
// 处理 LB_GETITEMHEIGHT 消息
// 引用:
//
// ************************************************
static LRESULT DoGETITEMHEIGHT( HWND hWnd, int index )
{ // 得到窗口风格
DWORD dwStyle = (DWORD)GetWindowLong( hWnd, GWL_STYLE );
//得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
if( (DWORD)index < lpListData->count )
{
if( dwStyle & LBS_OWNERDRAWVARIABLE )
return At( lpListData, index )->typeData;
else if( index == 0 )
return lpListData->rowHeight;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETITEMRECT( HWND hWnd, int index, LPRECT lpRect )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// OUT lpRect - 用于接受项目矩形
// 返回值:
// 假如成功,返回0,lpRect返回项目矩形坐标; 否则,返回LB_ERR
// 功能描述:
// 得到项目矩形坐标
// 处理 LB_GETITEMRECT 消息
// 引用:
//
// ************************************************
static LRESULT DoGETITEMRECT( HWND hWnd, int index, LPRECT lpRect )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
GetClientRect( hWnd, lpRect );
if( GetItemRect( lpListData , index, lpRect, GetWindowLong( hWnd, GWL_STYLE ) ) )
return 0;
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETLOCALE( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回; 否则,返回LB_ERR
// 功能描述:
// 不支持
// 引用:
//
// ************************************************
static LRESULT DoGETLOCALE( HWND hWnd )
{
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETSEL( HWND hWnd, int index )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// 返回值:
// 假如成功,返回当前列表框被选择的项目; 否则,返回 LB_ERR
// 功能描述:
// 得到列表框被选择的项目
// 处理 LB_GETSEL 消息
// 引用:
//
// ************************************************
static LRESULT DoGETSEL( HWND hWnd, int index )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
if( (DWORD)index < lpListData->count )
{
return At( lpListData, index )->state & ODS_SELECTED;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETSELCOUNT( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回当前列表框被选择的项目数; 否则,返回 LB_ERR
// 功能描述:
// 得到列表框被选择的项目数(用于多行选择)
// 处理 LB_GETSELCOUNT 消息
// 引用:
//
// ************************************************
static LRESULT DoGETSELCOUNT( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
int i, n = 0;
if( GetWindowLong( hWnd, GWL_STYLE ) & LBS_MULTIPLESEL )
{ //多行风格
_ASSERT( lpListData );
for( i = 0; i < lpListData->count; i++ )
{
if( At( lpListData, i )->state & ODS_SELECTED )
n++;
}
return n;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETSELITEMS( HWND hWnd, int maxItems, LPINT lpArray )
// 参数:
// IN hWnd - 窗口句柄
// IN maxItems - 需要返回的最大项目数
// IN lpArray - 用于接受项目索引号的数组
// 返回值:
// 假如成功,返回实际拷贝的项目索引数; 否则,返回 LB_ERR
// 功能描述:
// 得到列表框中当前处于被选择状态的项目数,适用于有 LBS_MULTIPLESEL 风格的列表框
// 处理 LB_GETSELITEMS 消息
// 引用:
//
// ************************************************
static LRESULT DoGETSELITEMS( HWND hWnd, int maxItems, LPINT lpArray )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
int i, m = 0;
_ASSERT( lpListData );
if( GetWindowLong( hWnd, GWL_STYLE ) & LBS_MULTIPLESEL )
{ //
for( i = 0; i < lpListData->count && m < maxItems ; i++ )
{
if( At( lpListData, i )->state & ODS_SELECTED )
{ // 符合条件
*lpArray++ = i;
m++;
}
}
return m;
}
return LB_ERR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -