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);
 }
 正确,抛出异常和抓住异常能够传递参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值