VC常见问题解答

Q 如何处理ComboBox中的回车键?避免退出程序?
A 在一般的EDIT中采用的方法是处理PretranlateMessage(),执行代码
CWnd *pWnd = GetFocus();
if(pWnd != NULL)
 {
  if(pWnd == GetDlgItem(IDC_EDIT1)
  {
   ...//IDC_EDIT1具有焦点
  }
 }
但在ComboBox中好象不同,是ComboBox的编辑控件得到了焦点,所以判断代码:
BOOL CDlg::PreTranslateMessage(MSG *pMsg)
{
  if(pMsg->message==WM_KEYDOWN && pMsg->wParam == VK_RETURN)
  {
    CWnd *pWnd = GetFocus();
    if(pWnd != NULL)
    {
      if(pWnd->GetParent() == GetDlgItem(IDC_COMBO1)//更改ID
      {
       return TRUE;
      }
    }
  }
  return CDialog::PreTranslateMessage(pMsg);
}
//-------------------------------------------------

Q 动态创建的组合框如何设置下拉列表框的高度?
A m_combo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SORT | CBS_DROPDOWNLIST | WS_TABSTOP, ct(320,10,580,280),this,114);
   //CRect的最后一个参数(这里是280)就表示下拉大小

//-------------------------------------------------

Q 是否能不选择下拉列表样式而禁止用户输入值,有什么方法可以实现?
A 将下拉列表的编辑控件设置为只读的,方法如下:
CComboBox *pcombo;
CWnd *pWnd = pcombo->GetWindow(GW_CHILD);
while(pWnd)
 {
   char classname[256];
   ::GetClassName(pWnd->m_hWnd,classname,256)
   if(strcmp(classname,"edit") == 0)
   {
      CEdit *pEdit;
      pEdit = new CEdit();
      pEdit->SubClassWindow(pWnd->m_hWnd);
      pEdit->SetReadOnly();
      pWnd = pWnd->GetNextWindow();
      delete pEdit;
   }
   if(pWnd) pWnd = pWnd->GetNextWindow();
}

//-------------------------------------------------

Q ComboBox的自定义弹出菜单,想在右击组合框的编辑部分的时候弹出菜单?
A 一种方法就是在CCustomCombo的OnCtlColor函数里进行,生成ComboBox中编辑框的子类,示例:
HBRUSH CCustomCombo::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor)
{
   if(nCtlColor == CTLCOLOR_EDIT)
   {
      if(m_edit.GetSafeHwnd()==NULL)
        m_eidt.SubClassWindow(pWnd->GetSafeHwnd());
   }
   HBRUSH hbr = CComboBox::OnCtlColor(pDC,pWnd,nCtlColor);
   return hbr;
} //其中m_edit是CEdit类的实现,它在WM_RBUTTONUP上显示右键菜单

//-------------------------------------------------

Q 如何给按钮加位图
A 对动态创建的按钮:
CButton button;
button.Create(_T("My Button"),WS_CHILD | WS_VISIBLE | BS_BITMAP,CRect      (10,10,60,50),pParentWnd,1);
button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));
或者修改风格:
UINT Style = Button.GetButtonStyle();
Style = Style | BS_BITMAP;
Button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));

//-------------------------------------------------

Q 如何在CButton派生类中以及父对话框中捕获BN_CLICKED消息?
 A 于WM_NOTIFY消息相反,通知消息BN_CLICKED作为WM_COMMAND消息发送。因此应用程序应该使用ON_CONTROL_REFLECT_EC而不是ON_NOTIFY_REFLECT

//-------------------------------------------------

Q 如何判断某个对象是否具有当前焦点?
A return (CWnd::GetFocus() == pWnd);

//-------------------------------------------------

Q 如何设置编辑控件的数字限制属性?
A long Style = GetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE);
Style |= ES_NUMBER;
SetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE,Style);

//-------------------------------------------------

Q 希望在LISTCTRL中显示文件,如何才能得到explorer使用的相同图象?
A 可以将系统的ImageList加到LISTCTRL上,然后用具有SHGFI_ICON标志的SHGetFileInfo获取适当的图标索引:
//图象列表设置
HIMAGELIST himagelist;
SHFILEINFO fi;
CImageList m_smalllist;
//得到系统小图标列表的句柄
himagelist = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C://"),0,&fi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//添加到小图象列表
m_smalllist.Attach(himagelist); //设置LISTCTRL的图象列表
 m_listCtrl.SetImageList(&m_smalllist,LVSIL_SMALL); //分离图象列表 m_smalllist.Detach();

//-------------------------------------------------

Q 如何在列表的任何一列显示图标,而不是第一列?
A LV_ITEM item;
...
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
item.iItem = ...//设置行号
item.lParam = ...//如何需要就设置lparam参数
item.iSubItem = ...//设置列号,从0开始的
item.stateMask = LVIS_STATEIMAGEMASK;

你可能感兴趣的:(IBM,command,null,delete,button,imagelist)