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

📄 list.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
//	IN index - 列表框项目索引号
//	iN bNotify - 是否向父窗口发通知消息
// 返回值:
//	假如成功,返回被设置的索引值; 否则,返回LB_ERR
// 功能描述:
//	将index设置为当前的选择项目,适用于非多行选择风格的列表框
//	处理 LB_SETCURSEL
// 引用: 
//	
// ************************************************

static LRESULT DoSETCURSEL( HWND hWnd, int index, BOOL bNotify )
{
    DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
    HDC hdc;
    _LPLISTDATA lpListData;
    RECT rect;
    if( (dwStyle & LBS_MULTIPLESEL)==0 && index >= -1 )
    {	//得到列表框窗口的列表框数据对象指针
        lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
        _ASSERT( lpListData );
		// 2004-10-27, modify, 优化
        //if( index < lpListData->count )
		if( index < lpListData->count &&
			index != lpListData->curSel )
		//
        {	//合法
			//得到窗口的客户区坐标
            GetClientRect( hWnd, &rect );
			//分配绘图DC
            hdc = GetListDC( hWnd, NULL, lpListData );//GetDC( hWnd );
            //假如可能,隐含当前的 hide cursel if possible
            if( lpListData->curSel != -1 )
                ShowSelectIndex( lpListData, hWnd, lpListData->curSel, hdc, &rect, dwStyle, FALSE );
			//显示新的
            if( index >= 0 )
                ShowSelectIndex( lpListData, hWnd, index, hdc, &rect, dwStyle, TRUE );
			//设置新的选择项
            lpListData->curSel = index;
			//释放绘图DC
            ReleaseListDC( hWnd, hdc, NULL );//ReleaseDC( hWnd, hdc );
		}
        return index;
    }
    return LB_ERR;
}

// **************************************************
// 声明:static LRESULT DoSETHORIZONTALEXTENT( HWND hWnd, short cx )
// 参数:
//	IN hWnd - 窗口句柄
//	IN cx - 水平宽度
// 返回值:
//	假如成功,返回; 否则,返回LB_ERR
// 功能描述:
//	处理 LB_SETHORIZONTALEXTENT
// 引用: 
//	
// ************************************************

static LRESULT DoSETHORIZONTALEXTENT( HWND hWnd, short cx )
{
    return LB_ERR;
}

// **************************************************
// 声明:static LRESULT DoSETITEMDATA( HWND hWnd, short index, DWORD dwData )
// 参数:
//	IN hWnd - 窗口句柄
//	IN index - 列表框项目索引号
//	IN dwData - 项目数据
// 返回值:
//	假如成功,返回0; 否则,返回LB_ERR
// 功能描述:
//	设置项目数据
//	处理 LB_SETITEMDATA
// 引用: 
//	
// ************************************************

static LRESULT DoSETITEMDATA( HWND hWnd, short index, DWORD dwData )
{	//得到窗口风格
    DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
    _LPLISTDATA lpListData;
	//得到列表框窗口的列表框数据对象指针
	lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
	_ASSERT( lpListData );
	//if( index < lpListData->count && index >=0 )
	if( (DWORD)index < lpListData->count )
		return SetItemData( lpListData, index, dwData );	//
    return LB_ERR;
}

// **************************************************
// 声明:static LRESULT DoSETITEMHEIGHT( HWND hWnd, short index, short height )
// 参数:
//	IN hWnd - 窗口句柄
//	IN index - 列表框项目索引号
//	IN height - 新的项目高度
// 返回值:
//	假如成功,返回0; 否则,返回LB_ERR
// 功能描述:
//	设置项目的显示高度
//	处理 LB_SETITEMHEIGHT
// 引用: 
//	
// ************************************************

static LRESULT DoSETITEMHEIGHT( HWND hWnd, short index, short height )
{	//得到窗口风格
    DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
    _LPLISTDATA lpListData;
    //RECT rect;
	//得到列表框窗口的列表框数据对象指针
    lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
    _ASSERT( lpListData );
    if( dwStyle & LBS_OWNERDRAWVARIABLE )
    {	//如果是可变风格,设置到index指向的项目中
       //if( index < lpListData->count && index >=0 )
		if( (DWORD)index < lpListData->count )
           return SetItemTypeData( lpListData, index, (WORD)height );
    }
    else
    {
        if( height > 0 && index == 0 )
        {	//高度是统一的
            lpListData->rowHeight = height;
            //GetClientRect( hWnd, &rect );
            InvalidateRect( hWnd, 0, TRUE );
            return 0;
        }
    }
    return LB_ERR;
}

// **************************************************
// 声明:static LRESULT DoSELITEMRANGEEX( HWND hWnd, short first, short last )
// 参数:
//	IN hWnd - 窗口句柄
//	IN first - 起始项目索引号
//	IN last - 结束项目索引号
// 返回值:
//	假如成功,返回0; 否则,返回LB_ERR
// 功能描述:
//	将指定的项目范围设为选择状态( 具有 LBS_MULTIPLESEL 风格有效 )
//	处理 LB_SELITEMRANGEEX 消息
// 引用: 
//	
// ************************************************

static LRESULT DoSELITEMRANGEEX( HWND hWnd, short first, short last )
{	//
    if( GetWindowLong( hWnd, GWL_STYLE ) & LBS_MULTIPLESEL )
    {	//
        int i;
        if( first < last )
        {
            for( i = first; i < last; i++ )
                DoSETSEL( hWnd, TRUE, i );
        }
        else
        {
            for( i = last; i < first; i++ )
                DoSETSEL( hWnd, FALSE, i );
        }
        return 0;
    }
    else
        return LB_ERR;    
}

// **************************************************
// 声明:
// 参数:
//	IN 
// 返回值:
//	假如成功,返回; 否则,返回0
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static LRESULT DoSETLOCALE( HWND hWnd, WORD idLocale )
{
    return LB_ERR;
} 

// **************************************************
// 声明:static LRESULT DoSETSEL( HWND hWnd, BOOL fSelect, int index )
// 参数:
//	IN hWnd - 窗口句柄
//	IN fSelect - 是否设置为选择状态或非
//	IN index - 项目索引号
// 返回值:
//	假如成功,返回0; 否则,返回LB_ERR
// 功能描述:
//	将指定的项目设为选择状态, 假如 index = -1, 则选择所有或清除所有.( 具有 LBS_MULTIPLESEL 风格有效 )
//	处理 LB_SETSEL 消息
// 引用: 
//	
// ************************************************

static LRESULT DoSETSEL( HWND hWnd, BOOL fSelect, int index )
{	//得到窗口风格
    DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
    _LPLISTDATA lpListData;
    HDC hdc;
    short i, retv = LB_ERR;
    RECT rect;
	//得到列表框窗口的列表框数据对象指针
    lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
    _ASSERT( lpListData );
    if( dwStyle & LBS_MULTIPLESEL )
    {	//多重风格
        //if( index >= 0 && index < lpListData->count )
		if( (DWORD)index < lpListData->count )
        {	//有效的索引值
            retv = SetItemState( lpListData, index, ODS_SELECTED, fSelect );
            SendNotify( hWnd, LBN_SELCHANGE );
			//分配绘图DC
            hdc = GetListDC( hWnd, NULL, lpListData );//GetDC( hWnd );
			//得到窗口客户矩形
            GetClientRect( hWnd, &rect );
			//得到项目矩形
			GetItemRect( lpListData, index, &rect, dwStyle );
			//画项目内容
            DrawItemContents ( hWnd, lpListData, dwStyle, hdc, index, &rect, lpListData->caret == index, ODA_SELECT );
            //释放DC
			ReleaseListDC( hWnd, hdc, NULL );//ReleaseDC( hWnd, hdc );
        }
        else if( index <= -1 )
        {	//对所有项目做设置或清除工作
            for( i = 0; i < lpListData->count; i++ )
            {
                retv = SetItemState( lpListData, i, ODS_SELECTED, fSelect );
                SendNotify( hWnd, LBN_SELCHANGE );
            }
            InvalidateRect( hWnd, 0, TRUE );
        }
    }
    return retv;
}

// **************************************************
// 声明:static LRESULT DoSETTABSTOPS( HWND hWnd, short num, short * lpArray )
// 参数:
//	IN hWnd - 窗口句柄
//	IN num - 
// 返回值:
//	假如成功,返回; 否则,返回0
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static LRESULT DoSETTABSTOPS( HWND hWnd, short num, short * lpArray )
{
    return LB_ERR;
}

// **************************************************
// 声明:static LRESULT DoSETTOPINDEX( HWND hWnd, int index )
// 参数:
//	IN hWnd - 窗口句柄
//	IN index - 项目索引号
// 返回值:
//	假如成功,返回0; 否则,返回LB_ERR
// 功能描述:
//	设置当前列表框窗口的第一个项目
//	处理 LB_SETTOPINDEX 
// 引用: 
//	
// ************************************************

static LRESULT DoSETTOPINDEX( HWND hWnd, int index )
{
    _LPLISTDATA lpListData;
    //得到列表框窗口的列表框数据对象指针
    lpListData = (_LPLISTDATA)GetWindowLong( hWnd, 0 );
    _ASSERT( lpListData );
    //if( index >= 0 && index < lpListData->count && index != lpListData->topIndex )
	if( (DWORD)index < lpListData->count && index != lpListData->topIndex )
    {	//设置并无效客户区
        lpListData->topIndex = index;
		SetScrollBar( hWnd, lpListData->topIndex, 0 );
        InvalidateRect( hWnd, 0, TRUE );
        return 0;
    }
    return LB_ERR;
}


// **************************************************
// 声明:static VOID _SetListColor( _LPLISTDATA lpListData )
// 参数:
//	IN lpListData - 静态类数据结构
// 返回值:
//	无
// 功能描述:
//	设置窗口显示颜色
// 引用: 
//	
// ************************************************

static VOID _SetListColor( _LPLISTDATA lpListData )
{
	//设置显示颜色
	lpListData->cl_Disable = GetSysColor(COLOR_GRAYTEXT);
	lpListData->cl_DisableBk = GetSysColor(COLOR_WINDOW);
	lpListData->cl_Selection = GetSysColor(COLOR_HIGHLIGHTTEXT);
	lpListData->cl_SelectionBk = GetSysColor(COLOR_HIGHLIGHT);
	lpListData->cl_Text = GetSysColor(COLOR_WINDOWTEXT);
	lpListData->cl_TextBk = GetSysColor(COLOR_WINDOW);

}

// **************************************************
// 声明:static _LPLISTDATA _DoInitListData( HWND hWnd, LPCREATESTRUCT lpcs )
// 参数:
//	IN hWnd - 窗口句柄
//	IN lpcs - 窗口创建结构指针
// 返回值:
//	假如成功,返回 _LISTDATA结构指针; 否则,返回 NULL
// 功能描述:
//	分配并初始化 _LISTDATA结构指针
// 引用: 
//	
// ************************************************

static _LPLISTDATA _DoInitListData( HWND hWnd, LPCREATESTRUCT lpcs )
{
    _LPLISTDATA lpListData;
    //TEXTMETRIC tm;
//    HDC hdc;
    RECT rect;
	//分配一个内存结构	
	lpListData = (_LPLISTDATA)malloc( sizeof( _LISTDATA ) );

	if( lpListData )
	{
		memset( lpListData, 0, sizeof( _LISTDATA ) );
        ResetLimit( lpListData, 0 );

		lpListData->dwStyle = lpcs->style;
		lpcs->style &= ~(WS_VSCROLL | WS_HSCROLL);

		if( lpcs->style & LBS_OWNERDRAWFIXED )
		{	//拥有者自定义风格
			MEASUREITEMSTRUCT mis;
			mis.CtlID = (UINT)lpcs->hMenu;
			mis.CtlType = ODT_LISTBOX;
			mis.itemData = 0;
			mis.itemHeight = 0;
			mis.itemID = 0;
			mis.itemWidth = 0;
			//想父窗口得到行高
			if( SendMessage( lpcs->hParent, WM_MEASUREITEM, mis.CtlID, (LPARAM)&mis ) )
			{
                lpListData->rowHeight = (short)mis.itemHeight;
			}	
		}
		//
		if( lpListData->rowHeight == 0 )
		{	//得到系统默认高度
			//hdc = GetDC( hWnd );
			//GetTextMetrics( hdc, &tm );
			//ReleaseDC( hWnd, hdc );
			//(short)tm.tmHeight + 4;
			lpListData->rowHeight = GetSystemMetrics(SM_CYLISTITEM);//GetSystemMetrics(SM_CYCAPTION);
		}
		//初始化其它参数
        lpListData->colWidth = lpcs->cx;
        lpListData->caret = -1;
        lpListData->curSel = -1;

        lpListData->bCombBoxList= FALSE;
        lpListData->hCombBox = NULL;
		//设置显示颜色
		_SetListColor( lpListData );
		//lpListData->cl_Disable = GetSysColor(COLOR_GRAYTEXT);
		//lpListData->cl_DisableBk = GetSysColor(COLOR_WINDOW);
		//lpListData->cl_Selection = GetSysColor(COLOR_HIGHLIGHTTEXT);
		//lpListData->cl_SelectionBk = GetSysColor(COLOR_HIGHLIGHT);
		//lpListData->cl_Text = GetSysColor(COLOR_WINDOWTEXT);
		//lpListData->cl_TextBk = GetSysColor(COLOR_WINDOW);
		//根据当前窗口坐标得到能显示的列数
        GetClientRect( hWnd, &rect );
        lpListData->colNum = GetCols( lpListData, &rect );

		SetWindowLong( hWnd, 0, (long)lpListData );
		SetWindowLong( hWnd, GWL_STYLE, lpcs->style );
	}
	return lpListData;
}

// **************************************************
// 声明:static LRESULT DoCREATE( HWND hWnd, LPCREATESTRUCT lpcs )
// 参数:
//	IN hWnd - 窗口句柄
//	IN lpcs - 窗口创建结构指针
// 返回值:
//	假如成功,返回0; 否则,返回-1
// 功

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -