📄 list.c
字号:
// **************************************************
// 声明:static LRESULT DoGETTEXT( HWND hWnd, int index, void * lpBuf )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// OUT lpBuf - 用于接受项目文本的缓存
// 返回值:
// 假如成功,返回实际拷贝的内容长度; 否则,返回 LB_ERR
// 功能描述:
// 得到指定项目文本内容
// 处理 LB_GETTEXT 消息
// 引用:
//
// ************************************************
static LRESULT DoGETTEXT( HWND hWnd, int index, void * lpBuf )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_LPLISTITEM lpItem;
_ASSERT( lpListData );
if( (DWORD)index < lpListData->count )
{
lpItem = At( lpListData, index );
if( (DWORD)GetWindowLong( hWnd, GWL_STYLE ) & LBS_HASSTRINGS )
{ // 是字符串内容
strcpy( lpBuf, lpItem->lpszItem );
return lpItem->typeData;
}
else
{ // 用户自定义内容,拷贝其设定的值
memcpy( lpBuf, &lpItem->dwItemData, 4 );
return 4;
}
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETTEXTLEN( HWND hWnd, int index )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// 返回值:
// 假如成功,返回项目字符串内容长度; 否则,返回 LB_ERR
// 功能描述:
// 得到指定项目字符串内容长度
// 处理 LB_GETTEXTLEN 消息
// 引用:
//
// ************************************************
static LRESULT DoGETTEXTLEN( HWND hWnd, int index )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
if( (DWORD)index < lpListData->count )
{
if( (DWORD)GetWindowLong( hWnd, GWL_STYLE ) & LBS_HASSTRINGS )
return At( lpListData, index )->typeData;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoGETTOPINDEX( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回列表框窗口的第一条项目的索引值; 否则,返回 LB_ERR
// 功能描述:
// 得到列表框窗口的第一条项目的索引值
// 处理 LB_GETTOPINDEX 消息
// 引用:
//
// ************************************************
static LRESULT DoGETTOPINDEX( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
return lpListData->topIndex;
}
// **************************************************
// 声明:static LRESULT DoRESETCONTENT( HWND hWnd )
// 参数:
// IN hWnd - 窗口句柄
// 返回值:
// 假如成功,返回0; 否则,返回 LB_ERR
// 功能描述:
// 清除列表框的所有项目
// 处理 LB_RESETCONTENT 消息
// 引用:
//
// ************************************************
static LRESULT DoRESETCONTENT( HWND hWnd )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
DWORD dwStyle = (DWORD)GetWindowLong( hWnd, GWL_STYLE );
int i, fOwner;
_ASSERT( lpListData );
//是否自绘风格
fOwner = (int)(dwStyle & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE));
//删除每一个项目
for( i = lpListData->count - 1; i >= 0; i-- )
{
DeleteItem( hWnd, dwStyle, lpListData, i );
}
lpListData->caret = -1;
lpListData->curSel = -1;
lpListData->topIndex = 0;
lpListData->limit = 0;
if( !fOwner )
{ // 非自绘风格,更新窗口
InvalidateRect( hWnd, NULL, FALSE );
UpdateWindow( hWnd );
}
//2005-01-26, add code
ReflashScrollBar( hWnd, dwStyle, lpListData );
//2005-01-26
return 0;
}
// **************************************************
// 声明:static LRESULT DoSELECTSTRING( HWND hWnd, int indexStart, LPCSTR lpcstr )
// 参数:
// IN hWnd - 窗口句柄
// IN indexStart - 项目索引
// IN lpcstr - 需要匹配的字符串
// 返回值:
// 假如成功,返回设置的项目索引号
// 功能描述:
// 将字符串匹配的项目设为被选择项
// 处理 LB_SELECTSTRING 消息
// 引用:
//
// ************************************************
static LRESULT DoSELECTSTRING( HWND hWnd, int indexStart, LPCSTR lpcstr )
{
indexStart = DoFINDSTRING( hWnd, indexStart, lpcstr, FALSE );
if( indexStart != LB_ERR )
{
DoSETSEL( hWnd, TRUE, indexStart );
}
return indexStart;
}
// **************************************************
// 声明:static LRESULT DoSELITEMRANGE( HWND hWnd, BOOL fSelect, int first, int last )
// 参数:
// IN hWnd - 窗口句柄
// IN fSelect - 是否将项目设为选择状态或是清除其选择状态
// IN first - 起始项目索引
// IN last - 结束项目索引
// 返回值:
// 假如成功,返回0;否则,返回 LB_ERR
// 功能描述:
// 将从 first开始 到 last 结束的项目设为选择状态,适用于有 LBS_MULTIPLESEL 风格的列表框
// 处理 LB_SELITEMRANGE 消息
// 引用:
//
// ************************************************
static LRESULT DoSELITEMRANGE( HWND hWnd, BOOL fSelect, int first, int last )
{
int i;
if( GetWindowLong( hWnd, GWL_STYLE ) & LBS_MULTIPLESEL )
{
for( i = first; i <= last; i++ )
DoSETSEL( hWnd, fSelect, i );
return 0;
}
else
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoSETANCHORINDEX( HWND hWnd, int index )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// 返回值:
// 返回0
// 功能描述:
// 设置列表框的 ANCHOR 项
// 处理 LB_SETANCHORINDEX 消息
// 引用:
//
// ************************************************
static LRESULT DoSETANCHORINDEX( HWND hWnd, int index )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
DoSELITEMRANGE( hWnd, FALSE, 0, lpListData->count-1 );
DoSETSEL( hWnd, TRUE, index );
return 0;
}
// **************************************************
// 声明:static LRESULT DoSETCARETINDEX( HWND hWnd, int index, BOOL fScroll )
// 参数:
// IN hWnd - 窗口句柄
// IN index - 项目索引
// IN fScroll - 滚动功能。假如为FALSE, 则将滚动该项目直到其完全可视;否则,局部可视也行
// 返回值:
// 假如成功,返回0;否则,返回 LB_ERR
// 功能描述:
// 设置列表框的 CARET 项
// 处理 LB_SETCARETINDEX 消息
// 引用:
//
// ************************************************
static LRESULT DoSETCARETINDEX( HWND hWnd, int index, BOOL fScroll )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
RECT rect, clientRect;
HDC hdc;
DWORD dwStyle;
int iRowNum;
_ASSERT( lpListData );
//得到客户区坐标
GetClientRect( hWnd, &clientRect );
//得到窗口风格
dwStyle = GetWindowLong( hWnd, GWL_STYLE );
//得到窗口所能容纳的行数
iRowNum = GetRows( lpListData, dwStyle, &clientRect );
if( index != lpListData->caret &&
index >= -1 &&
index < lpListData->count )
{ // 有效并需要重新设置
if( index >= 0 )
{ // 调整项目直到其可视
rect = clientRect;
//得到项目矩形坐标
GetItemRect( lpListData, index, &rect, dwStyle );
if( !IntersectRect( &rect, &rect, &clientRect ) ) //可视吗 ?
{ //不可视
if( dwStyle & LBS_MULTICOLUMN )
{ //如果列表框是多列风格,则滚动列
ScrollCol( hWnd,
index / iRowNum -
lpListData->topIndex / iRowNum );
}
else
{ //单列,滚动行
if( index < lpListData->topIndex )
ScrollRow( hWnd, (index - lpListData->topIndex) );
else
ScrollRow( hWnd, (index - (lpListData->topIndex+iRowNum-1) ) );
}
}
}
// 假如可能,重新设置 并绘制 caret
if( lpListData->caret != index )
{ //分配绘图DC
hdc = GetListDC( hWnd, NULL, lpListData );//GetDC( hWnd );
if( lpListData->caret != -1 )
{ // 存在老的caret, 清除它 remove old caret
rect = clientRect;
GetItemRect( lpListData, lpListData->caret, &rect, dwStyle );
DrawItemContents ( hWnd, lpListData, dwStyle, hdc, lpListData->caret, &rect, FALSE, ODA_SELECT );
}
if( index >= 0 && (dwStyle & (LBS_OWNERDRAWVARIABLE|LBS_OWNERDRAWFIXED)) == 0 )
{ // 显示新的 caret show new
rect = clientRect;
GetItemRect( lpListData, index, &rect, dwStyle );
DrawCaret( hdc, &rect );
}
//设置 caret
lpListData->caret = index;
//释放绘图DC
ReleaseListDC( hWnd, hdc, NULL );//ReleaseDC( hWnd, hdc );
}
return 0;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoSETCOLUMNWIDTH( HWND hWnd, int cxWidth )
// 参数:
// IN hWnd - 窗口句柄
// IN cxWidth - 新的列宽
// 返回值:
// 假如成功,返回0;否则,返回 LB_ERR
// 功能描述:
// 设置列表框的列宽
// 处理 LB_SETCOLUMNWIDTH 消息,适用于有 LBS_MULTICOLUMN 风格的列表框
// 引用:
//
// ************************************************
static LRESULT DoSETCOLUMNWIDTH( HWND hWnd, int cxWidth )
{ //得到列表框窗口的列表框数据对象指针
_LPLISTDATA lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
RECT rect;
if( (GetWindowLong( hWnd, GWL_STYLE ) & LBS_MULTICOLUMN) && cxWidth > 0 )
{ //有效
lpListData->colWidth = cxWidth;
//得到窗口的客户区
GetClientRect( hWnd, &rect );
//新的列数
lpListData->colNum = GetCols( lpListData, &rect );
//无效窗口客户区
InvalidateRect( hWnd, 0, TRUE );
return 0;
}
return LB_ERR;
}
// **************************************************
// 声明:static LRESULT DoSETCOUNT( HWND hWnd, short count )
// 参数:
// IN hWnd - 窗口句柄
// IN count - 新的项目数
// 返回值:
// 假如成功,返回0;否则,假如没有内存,返回LB_ERRSPACE, 其它错误返回 LB_ERR
// 功能描述:
// 设置列表框的可以容纳的项目数
// 处理 LB_SETCOUNT 消息,适用于有 LBS_NODATA 和非 LBS_HASSTRINGS 风格的列表框
// 引用:
//
// ************************************************
static LRESULT DoSETCOUNT( HWND hWnd, short count )
{ //得到窗口风格
DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
_LPLISTDATA lpListData;
if( (dwStyle & LBS_NODATA) && (dwStyle & LBS_HASSTRINGS)==0 )
{ //得到列表框窗口的列表框数据对象指针
lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
_ASSERT( lpListData );
if( count != Count( lpListData ) )
{ //需要重设
if( ResetLimit( lpListData, count ) == FALSE )
{ //失败,向父发送LBN_ERRSPACE消息
SendNotify( hWnd, LBN_ERRSPACE );
return LB_ERRSPACE;
}
}
return 0;
}
return LB_ERR;
}
// **************************************************
// 声明:static void ShowSelectIndex( _LPLISTDATA lpListData,
// HWND hWnd,
// int index,
// HDC hdc,
// LPCRECT lpcrect,
// DWORD dwStyle,
// BOOL fShow )
// 参数:
// IN lpListData - 列表框对象指针
// IN hWnd - 窗口句柄
// IN index - 项目号
// IN hdc - 绘图DC
// IN lpcrect - 列表框窗口矩形
// IN dwStyle - 列表框风格
// IN fShow - 是否设置或清除选择状态
// 返回值:
// 无
// 功能描述:
// 设置列表框的可以容纳的项目数
// 处理 LB_SETCOUNT 消息,适用于有 LBS_NODATA 和非 LBS_HASSTRINGS 风格的列表框
// 引用:
//
// ************************************************
static void ShowSelectIndex( _LPLISTDATA lpListData,
HWND hWnd,
int index,
HDC hdc,
LPCRECT lpcrect,
DWORD dwStyle,
BOOL fShow )
{
RECT rect = *lpcrect;
_ASSERT( index >= 0 );
SetItemState( lpListData, index, ODS_SELECTED, fShow );
//得到项目矩形
GetItemRect( lpListData, index, &rect, dwStyle );
//画项目内容
DrawItemContents ( hWnd, lpListData, dwStyle, hdc, index, &rect, index == lpListData->caret, ODA_SELECT );
}
// **************************************************
// 声明:static LRESULT DoSETCURSEL( HWND hWnd, int index, BOOL bNotify )
// 参数:
// IN hWnd - 窗口句柄
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -