友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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) &&  
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!