⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:

// **************************************************
// 声明: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 + -