`
jgsj
  • 浏览: 963448 次
文章分类
社区版块
存档分类
最新评论

VC++问题集5

 
阅读更多

41.自动调整组合框的宽度
组合框控件的下拉列表宽度在默认情况下是和组合框宽度相同的,但是如果组合框中的字符串宽

度超过了下拉列表的宽度,那么该字符串将不能完全显示。
我们可以通过自动调整组合框下拉列表的宽度来解决这个问题。
示例代码:
HBRUSH MyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
break;
case CTLCOLOR_LISTBOX:
int iItemNum=GetCount();
int iWidth=0;
CString strItem;
CClientDC dc(this);
int iSaveDC=dc.SaveDC();
dc.SelectObject(GetFont());
int iVSWidth=::GetSystemMetrics(SM_CXVSCROLL);
for(int i=0;i<iItemNum;i++)
{
GetLBText(i,strItem);
int iWholeWidth=dc.GetTextExtent(strItem).cx+iVSWidth;
iWidth=max(iWidth,iWholeWidth);
}
iWidth+=dc.GetTextExtent("a").cx;
dc.RestoreDC(iSaveDC);
if(iWidth>0)
{
CRect rc;
pWnd->GetWindowRect(&rc);
if(rc.Width()!=iWidth)
{
rc.right=rc.left+iWidth;
pWnd->MoveWindow(&rc);
}
}break;
}
return hbr;
}
42.列表控件能够响应鼠标的双击事件,如果用户双击列表控件后,NM_DBLCLK消息就会产生,通过

GetSelectionMark方法可以获得列表所选项的索引。

43.LVN_BEGINDRAG消息在有拖曳动作发生时产生。

44.利用列表标题对列表视图进行数据排序
列表控件在默认情况下不会对单击列标题产生任何动作。要实现对列标题单击事件进行响应,需

要在新建类中处理LVN_COLUMNCLICK消息。如果要对列表进行排序就在LVN_COLUMNCLICK消息的处

理函数中添加SortItems函数,SortItems函数实现了对列表项排序。

45.关于reinterpret_cast
reinterpret_cast是C++里的强制类型转换符,操作符修改了操作数类型,但仅仅是重新解释了给

出的对象的比特模型而没有进行二进制转换。
用法:reinterpret_cast<type-id> (expression)
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一

个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
你可参考:http://hi.baidu.com/mlh2/blog/item/8004bc7feec1080e29388aa3.html

46.如何创建一个具有输入功能的ListControl控件
1.在要编辑的单元格位置创建一个编辑框控件。
2.创建一个编辑框控件,并将该控件移动到要编辑的单元格所在的位置。

注:最好响应WM_KILLFOCUS消息,使其在失去焦点时将数据显示在ListControl控件的单元格中。

47.如何获取磁盘分区:
通过调用GetLogicalDriveStrings函数可以获取磁盘分区的名称。然后我们可以用CFileFind类

的相关成员函数获取相应分区中的文件.具体如何实现请查看MSDN。

48.如何在CRichEdit控件中查找字符串:
void CRichTextCharDlg::OnFind()
{
m_richedit.LineScroll(-lineindex);
CString strfind;
GetDlgItem(IDC_EDFIND)->GetWindowText(strfind);
int ret=tmp.Find(strfind,istartpos);
int strlen=strfind.GetLength();
m_richedit.SetSel(ret,ret+strlen);
istartpos=ret+strlen;
lineindex=m_richedit.LineFromChar(ret);
int linepos=m_richedit.LineIndex(lineindex);
m_richedit.LineScroll(lineindex);
m_richedit.SetFocus();
}

49.使用CRichEdit控件时,一般在InitInstance函数中要调用AfxInitRichEdit()函数,用来初始化

RichEdit控件。

50.关于c++中try throw catch 的使用。
在try中测试代码,测试的代码中如果有异常用throw抛出,然后用catch抓住异常。throw抛出的

异常类型与catch抓住的异常要一样,否则会出错。
如下示例:
try {
throw 2;
}
catch(int){
MessageBox("asdf");
}
正确,能够抓住异常,并进行相应的处理。
try {
throw 2;
}
catch(char ){
MessageBox("wert");
}
不正确,会出现异常
try {
throw 2;
throw "asdf";
}
catch(int){
MessageBox("asdf");
}
catch(char * p){
MessageBox(p);
}
正确,但只执行第一个异常。
try {
throw "asdf";
}
catch(int){
MessageBox("asdf");
}
catch(char * p){
MessageBox(p);
}
正确,抛出异常和抓住异常能够传递参数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics