📄 list.c
字号:
// 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 + -