友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第33部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
的// TODO注释:
m_lsSelectable。ResetContent();
m_lsSelectable。Dir(0x17;〃*。*〃);
上面的代码先调用成员函数ResetContent清除列表框
IDC_LISTSELECTABLE中的所有项,再调用成员函数Dir使用当前目录
下的文件名来填充该列表框。第一个参数0x17是文件类型屏蔽位,它
等于0x01|0x02|0x04|0x10,它包括了所有常规属性文件、只读文
件、系统文件和目录名,第二个参数为所显示的文件名,在参数中可
以使用通配符。
为按钮IDC_BTNCHANGEDIR的BN_CLICKED命令添加下面的处理函数
OnBtnChangeDir:
void CListBoxDemoDlg::OnBtnChangeDir()
…………………………………………………………Page 372……………………………………………………………
{
CInputDlg dlg;
CString str=dlg。GetInput(〃输入目录〃;〃输入新的目录名:〃);
if (str!=〃〃 && str。Left(1)!=〃”)
{
str+=〃”;
}
if (str!=〃〃)
{
m_lsSelectable。ResetContent();
int iResult=m_lsSelectable。Dir(0x17;str+〃*。*〃);
if (iResult==LB_ERR)
{
MessageBox(〃添加文件名出错!〃);
}
else if (iResult==LB_ERRSPACE)
{
MessageBox(〃无法为列表框分配足够的内存!〃);
}
}
}
上面的代码首先定义一个类型为CInputDlg的成员变量,然后调用其
成员函数GetInput (我们已在前面讨论过该成员函数)获得用户输入
的列表目录名,如果用户输入的目录名不为空字符串,则调用类
CListBox的成员函数将指定目录下的文件名添加到列表框
IDC_LISTSELECTABLE中,如果添加失败,则弹出相应的出错信息。
为按钮IDC_BTNADD的BN_CLICKED命令添加下面的处理函数OnBtnAdd:
…………………………………………………………Page 373……………………………………………………………
void CListBoxDemoDlg::OnBtnAdd()
{
CString str;
for (int i=0; i…1; i……)
{
if (m_lsSelected。GetSel(i))
{
m_lsSelected。DeleteString(i);
}
}
…………………………………………………………Page 374……………………………………………………………
}
上面的代码从最末一项开始,检查列表框IDC_LISTSELECTED中每一项
的选定状态,如果发现该项被选定,则将它从列表框中删除。从列表
框中删除一项使用类CListBox的成员函数DeleteString,其参数为所
删除项的索引值。
l 注意:
l 我们在上面的代码 中使用的for循环为
l for (int i=m_lsSelected。GetCount()…1; i》…1; i……)
l {
l 。。。
l }
而不是
l for (int i=0; iitemHeight=GetItemHeight(0);
…………………………………………………………Page 381……………………………………………………………
}
图6。 55 从CboBox派生新类CClrboBox
函数MeasureItem在自绘制样式的组合框创建时由框架调用。该函数
将每一项的高度放入MEASUREITEMSTRUCT结构的成员中。如果对话框
以CBS_OWNERDRAWVARIABLE样式创建,框架将为列表框中的每一项调
用一次该成员函数,否则,该成员函数只被调用一次。
接着,在CClrboBox的重载基类的DrawItem成员函数,其代码如
下:
void CClrboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC=CDC::FromHandle(lpDrawItemStruct…》hDC);
COLORREF cr=(COLORREF)lpDrawItemStruct…》itemData;
// 注意到在出错的情况下,GetCurSel 和 GetItemData 返回 CB_ERR,而常量
// CB_ERR 被定义为 …1,这时不应把它视为一种系统颜色。
if (cr==CB_ERR)
cr=GetSysColor(COLOR_WINDOW);
if (lpDrawItemStruct…》itemAction & ODA_DRAWENTIRE)
{
…………………………………………………………Page 382……………………………………………………………
// 需要重绘整个项
// 以该项所对应的颜色填充整个项
CBrush br(cr);
pDC…》FillRect(&lpDrawItemStruct…》rcItem; &br);
// 反色居中显示该颜色的 RGB 组成
CString str;
str。Format(〃R: %d G: %d B: %d〃; GetRValue(cr); GetGValue(cr); GetBValue(cr));
CSize size;
size=pDC…》GetTextExtent(str);
CRect rect=lpDrawItemStruct…》rcItem;
COLORREF tcr;
tcr=~cr & 0x00FFFFFF; // 获得背景色的反色,不能简单的使用 ~cr
pDC…》SetTextColor(tcr);
pDC…》SetBkColor(cr);
pDC…》TextOut(rect。left+(rect。Width()…size。cx)/2;
rect。top+(rect。Height()…size。cy)/2; str);
}
if ((lpDrawItemStruct…》itemState & ODS_SELECTED) &&
(lpDrawItemStruct…》itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
// 选中状态由未选中变为选中,其边框被加亮显示
COLORREF crHilite=~cr & 0x00FFFFFF;
CBrush br(crHilite);
pDC…》FrameRect(&lpDrawItemStruct…》rcItem; &br);
}
if (!(lpDrawItemStruct…》itemState & ODS_SELECTED) &&
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!