1.如何正确的得到ComBox的指针

CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB);

CComboBox *mComb = (CComboBox*)::GetDlgItem(m_hWnd,IDC_DuanCB);

2.CComboBox控件详解

CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).

CComboBox控件的常用设置属性说明:

type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,droplist为静态控件.

Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,

Sort 属性:对添加到下拉列表框中的数据自动进行排序,假如你不想他改变你的显示序列,把他设置成False.

控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.

:m_cbox CComboBox控件的关联变量,m_endEDIT控件的关联变量

1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码

int i;

CString str;

i=m_cbox.GetCount();

str.Format ("%d",i);

m_end="一共有" str "个数据";

UpdateData(FALSE);

2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,假如没有选择任何选项将会返回-1 Int GetCurSel() const

int i;

CString str;

i=m_cbox.GetCurSel ();

str.Format ("%d",i 1);

if (i==-1) m_end="你什么都没有选";

else m_end="你选的是第" str "";

UpdateData(FALSE);

3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;

if(m_i<3) m_cbox.SetCurSel (m_i );//m_iint型变量 用以计数

else

{

m_cbox.SetCurSel (-1);

m_i=0;

}

4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar, int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.

m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果

//其作用就是选中第3到第5个字符作为热点

5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有爱好的朋友可以自己试试.

6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); nMaxChars0,不是不能输入,而是长度最大化为65535字节

7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度

m_cbox.GetLBText (2,m_end); // GetLBText按钮

UpdateData(0);

CString str; //GetLBTextLen按钮

int i=m_cbox.GetLBTextLen (2);

str.Format ("%d",i);

m_end=str;

UpdateData(FALSE);

8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.

9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.

以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.

1.关于CComboBox在对话框中没有下拉项目的问题

: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.

2.请问怎样能让CCombobox记住用户的输入.下次使用时还有

: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.

3. CCOMBOBOX如何使它只读,不能编辑

: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!

4. 我要让界面一显示,就能在Combo框中显示默认的数据

: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.

5. 如何把选好的内容赋给变量

: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.

6. CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?

: 没有直接的方法,你必须自己对齐, 比如最大长度是10

posted @ 2008-04-02 18:52 wrh 阅读(737) | 评论 (0)编辑 收藏

1.如何让对话框中的编辑框接收对话框的消息

////////////////////////////////////////////////
// 如何让对话框中的CEdit控件类接收对话框的消息
////////////////////////////////////////////////
1、在对话框中增加一个ID IDC_EDIT1CEdit1控件
2、通过ClassWizard 生成一个基于CEdit的新类CMyEdit,
CMyEdit m_wndEdit;
3、在对话框OnInitDialog()中,将m_wndEdit子类化,使其能够接受对话框的消息。
m_wndEdit.SubclassDlgItem (IDC_EDIT1,this);

2.如何防止密码被非法获取?

[问题提出]
这两天大家比较专注在获取Edit密码框的密码.在盗取时,我们如何防范呢?

[解决方法]
此方法针对于通过SendMessage向此窗口发送WM_GETTEXTEM_GETLINE消息来取得密码.跟我来.

[程序实现]
方法很简单,CWnd::DefWindowProc函数拦截得到的消息(Edit发的).
建立名为My的对话框工程.建立一个Edit控件ID=IDC_EDIT1.建一个新类名为CMyProtectEdit,派生于CEdit.
MyDlg.cpp中声明全局变量:BOOL g_bIdentity;
BOOL g_bIdentity;

MyProtecEdit.cpp:
extern BOOL g_bIdentity;

响应CMyProtectEditDefWindowProc函数:
LRESULT CMyProtectEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
// Edit的内容获取必须通过以下两个消息之一,不对其采用默认的处理:
if(( message == WM_GETTEXT) || ( message == EM_GETLINE))
{ //检查是否为合法
if(!g_bIdentity)
{ //非法获取,显示非法信息
AfxMessageBox(_T("不能让你看我的密码,:( !"));
return 0;
)
g_bIdentity = FALSE;//合法获取
}

return CEdit::DefWindowProc(message, wParam, lParam);
}

然后在MyDlg.cpp
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGetPasswordDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
if( pDX->m_bSaveAndValidate)
{
g_bIdentity = TRUE;
}
//}}AFX_DATA_MAP
}
即可.找个程序(盗取)的试试.

3.如何在编辑控件中以追加的方式添入字符?

[问题提出]
SetDlgItemText可以向Edit控件中输入字符,发送更新的消息也可是Edit控件显示与其关联的变量的值,但若是向已有的Edit字符后追加字符,该如何做?
[程序实现]
建立名为My的对话框工程,添加一个Edit和一个Button控件.EditID=IDC_EDIT1,ButtonID=IDC_BUTTON1.建立和IDC_BUTTON1的响应函数:OnButton1()
void CMyDlg::OnButton1()
{
CString pText="你好";
CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);
int nLen=m_Edit->GetWindowTextLength();
m_Edit->SetFocus();
m_Edit->SetSel(nLen, nLen);
m_Edit->ReplaceSel(pText);
}
Edit控件中输入字符,想追加时按IDC_BUTTON1按钮.看看效果.

4.怎样实现3D效果?

在对话框中怎样实现EditListboxes控件的3D效果?(环境95/NT VC5.0)

1). 使用带WS_EX_CLIENTEDGE标志的::CreateWindowEx来替换::CreateWindow 或者用CWnd::CreateEx替换CWnd::Create.
2).在建立控件之后,调用ModifyStyleEx(0, WS_EX_CLIENTEDGE).

5.RichEdit加入后,对话框打不开

Dialog(FormView中打开)中加入CRichEdit控件后,这个dialog 为什么打不开如何处理?
[解决方法]
在函数:InitInstance的第一句加入AfxInitRichEdit();

6.Richedit设置背景图片的办法

1:继续CRichEditCtrl::OnEraseBkgnd(CDC* pDC)消息事件中,给Richedit控件绘制上背景图片:m_bmpBackground.DrawDIB(pDC, 0, 0, rc.Width(), rc.Height());当然也可以通过subclass richedit window之后,在回调函数中处理WM_ERASEBKGND消息。

2:设置了Richedit控件的透明属性;

3:依照kenwhale所说的,HookGDI32.DLL中的ExtTextOut函数,将RichEdittext-output options去除ETO_OPAQUE style

。综上所述,即可实现RichEdit控件的背景图片效果。

据此,我还实现了RichEdit控件背景绘制AVI动画效果。

7.改变编辑框的背景色(WM_CTLCOLOR消息)

首先要明白:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)

实现步骤:
生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。在About dialog中添加两个Edit control,设定其IDIDC_EDIT1IDC_EDIT2

第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。

1. CAboutDlg中添加一个数据成员:HBRUSH m_brMine;
2. 利用向导映射AboutDlgWM_CTLCOLOR消息,产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
pDCAboutDlg的设备上下文,pWndAboutDlg中发送该消息的control指针,nCtlColorControl的类型编码。对其进行如下修改:

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
{
COLORREF clr = RGB(255,0,0);
pDC->SetTextColor(clr); //设置红色的文本
clr = RGB(0,0,0);
pDC->SetBkColor(clr); //设置黑色的背景
m_brMine = ::CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
else
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
}

第二种方法(对应于IDC_EDIT2):
利用MFC 4.0的新特性: Message reflection

1.利用向导添加一个新的类:CColorEdit,基类为CEdit;
2.CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;
3.利用向导映射CColorEdit"=WM_CTLCOLOR"消息,产生函数:

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor);

对其进行如下修改:

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
COLORREF clr = RGB(0,0,0);
pDC->SetTextColor(clr); //设置黑色的文本
clr = RGB(255,0,0);
pDC->SetBkColor(clr); //设置红色的背景
m_bkBrush = ::CreateSolidBrush(clr);
return m_bkBrush; //作为约定,返回背景色对应的刷子句柄
}

4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;
5.在定义CAboutDlgcolor.cpp文件中加入:#include "coloredit.h"

posted @ 2008-04-02 18:51 wrh 阅读(1204) | 评论 (0)编辑 收藏
仅列出标题
共25页: First 17 18 19 20 21 22 23 24 25 

导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(19)

随笔档案

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜