首页 > 其他 > 详细

组合框的使用

时间:2014-03-22 22:58:10      阅读:704      评论:0      收藏:0      [点我收藏+]

原文来自http://users.ugent.be/~skdmeule/Programming/ProgrammingQuestions.html

动态创建一个组合框

向需要使用组合框的类中添加成员CComboBox* m_pComboBox,比如对话框或属性页。在需要时创建它,比如在对话框的OnInitDialog() 函数中,或属性页的OnSetActive()函数中。当不再需要它的时候就销毁掉,如在对话框的PostNcDestroy() 函数或属性页的OnKillActive() 函数中。

示例如下:

声明:
CComboBox* m_pComboBox;

创建组合框:
m_pComboBox = new CComboBox();


m_pComboBox->Create( WS_VISIBLE | WS_CHILD | WS_BORDER
                   | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT,
                     CRect(20,20,100,40), this, ID_SOME_ID );

销毁:
m_pComboBox->DestroyWindow();

delete m_pComboBox;

添加消息函数到这些动态创建的组合框中

现在我们已经动态创建组合框了,接下来就要为其添加一些功能。 下面的例子演示了如何重写CBN_SETFOCUS 消息函数。把下面这段代码加入到对话框的头文件中的消息映射中:


//{{AFX_MSG(C***Dialog)
...
afx_msg void OnSetfocusCombo();
...
//}}AFX_MSG 

在实现文件里的消息映射中添加如下代码:


//{{AFX_MSG(C***Dialog)
...
ON_CBN_SETFOCUS(ID_SOME_ID,OnSetfocusCombo)
...
//}}AFX_MSG

添加函数体:

void C***Dialog::OnSetfocusCombo()
{
 // 功能代码
}

动态设置组合框的字体


之前创建的组合框的字体都是标准的粗体,下面的例子将把他设置为其他类型的,去掉其粗体的属性。因此,在此添加一个CFont成员m_newFont到对话框所属的容器中。你需要先创建字体并在不需要字体时删除对象内存。

添加字体:


CFont m_newFont;

创建字体:


LOGFONT LogFont;
GetFont()->GetLogFont(&LogFont); 
LogFont.lfWeight = 400;
m_newFont.CreateFontIndirect(&LogFont); 
m_pComboBox->SetFont(&m_newFont);


删除字体:


m_newFont.DeleteObject();

更改样式

设置组合框是否排序,需要重新创建来使其达到效果。在重建后要重新获取所有的列表项,列表项的数据,当前选中的项,输入的文本等。


设置为只读模式

常规的办法是通过Class Wizard 添加一个CComboBox类的成员m_ctrlComboBox,然后使用下面的代码:


((CEdit*)m_ctrlComboBox.GetWindow(GW_CHILD))->SetReadOnly(TRUE);


不使用界面创建:


((CEdit*)((CComboBox*)GetDlgItem(IDC_COMBO))->GetWindow(GW_CHILD))->SetReadOnly(TRUE);


设置只读模式组合框的颜色


为了美观,你不希望只读模式的组合框是灰色的。下面的例子演示如何给对话框的组合框设置颜色。通常的方法是添加要让组合框颜色不再是灰色就要重写对话框的 WM_CTLCOLOR并在OnCtlColor重实现:


HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


 //编辑框部分为 灰色


 if ( pWnd->m_hWnd == m_ctrlComboBox.GetWindow(GW_CHILD)->m_hWnd )
 {
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(255,255,255));


  hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
 }


 //静态文本部分为灰色


 if ( pWnd->m_hWnd == m_ctrlComboBox.m_hWnd )
 {
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(255,255,255));


  hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
 }


 return hbr;
}


不用Class Wizard添加控件:

HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


 // 编辑框部分是灰色的 


 if ( pWnd->m_hWnd == ((CComboBox*)GetDlgItem(IDC_COMBO))->GetWindow(GW_CHILD)->m_hWnd )
 {
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(255,255,255));


  hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
 }


 // 静态文本部分是灰色的


 if ( pWnd->m_hWnd == ((CComboBox*)GetDlgItem(IDC_COMBO))->m_hWnd )
 {
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(255,255,255));


  hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
 }


 return hbr;
}

放大下拉列表


有时,放大下拉列表的尺寸是必要的,尤其是组合框是动态创建的且下拉列表中没有对象。常规方法使用Class Wizard添加一个CComboBox的变量m_ctrlComboBox,通过下面的代码放大之后,你的组合框估计可以放下4个项了。


CRect rect; m_ctrlComboBox.GetClientRect(&rect);


m_ctrlComboBox.SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height() * 5, SWP_NOMOVE);


使用代码实现:

CRect rect; ((CComboBox*)GetDlgItem(IDC_COMBO))->GetClientRect(&rect);


((CComboBox*)GetDlgItem(IDC_COMBO))->SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height() * 5, SWP_NOMOVE);

译者小结

关于MFC动态创建控件的基本步骤

声明控件的变量

在需要的时候调用Create函数

在不需要的时候消耗delete即可

适当的时候可以通过成员函数实现一些功能

消息机制根据其支持的消息类型添加响应函数



组合框的使用,布布扣,bubuko.com

组合框的使用

原文:http://blog.csdn.net/giantchen547792075/article/details/21809201

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!