找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6648|回复: 0
打印 上一主题 下一主题
收起左侧

MFC 各控件的使用

[复制链接]
跳转到指定楼层
楼主
ID:60266 发表于 2014-8-18 02:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3:Slider control 控件使用

滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值。滑动控件在应用程序中用途级为广泛,如在桌面的属性中就可以看到。为此,让我们一起来看一下它的实现方法。
(1)在VC++ 6.0中新建一个对话框文档的工程。
(2)打开资源管理器,在对话框中放置一个EDIT控件,然后在它旁边放上一个Slider控件。基本的框架已经完成了。
(3)对Slider控件右击,选择“建立类向导”,对刚才的Slider控件定义一个变量m_Slider,类型为CSliderCtrl。
(4)在对话框初始化的代码BOOLCMy601Dlg::OnInitDialog(),后添加相应的属性。以下是常用的属性设置函数:

* GetRange,SetRange函数
用于查询和设置滑动条的取值范围,默认为0~100。函数定义形式如下:
void GetRange(int &nMin,int &nMax)const;
void SetRange(int nMin,int nMax,BOOL bRedrGETaw=FALSE);

* GetPos,SetPos函数
用于查询和设置滑动条的当前值。函数定义形式如下:
int GetPos() const;
int SetPos(int nPos);

* GetLineSize,SetLineSize函数
用于查询和设置在按一下右或左箭头时滑块的移动量,默认为1个单位。函数定义形式如下:
int GetLineSize() const;
int SetLineSize(int nSize);

* GetPageSize,SetPageSize函数
用于查询和设置函滑块和块移动量,块移动量是指当按下PgUp或PgDown时滑块的移动量。函数定 义形式如下:
int GetPageSize() const;
int SetPageSize(int nSize);

* SetTicFreq函数
用于设置滑动条刻度的频度。默认为一个单位一个函数。函数定义形式如下:
void SetTicFreq(int nFreq);

* SetTic函数
用于在指定的位置设置刻度。Windows默认的刻度是均匀的。函数定义形式如下:
BOOL SetTic(int nTic);

* ClearTics函数
用于清除所有的刻度。函数定义形式如下:
void ClearTics(BOOL bRedraw=FALSE);

我们在初始化时写入以下语句:

m_Slider.SetRange(-100,100);m_Slider.SetTicFreq(10);即:设置范围为-100到100,刻度为每10个单位一个。

(5)现在我们加入事件过程代码。
选择Slider的“事件”然后选择第一个过程(NM_CUSTOMDRAW)随后加入以下代码:void CMy601Dlg::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult) {UpdateData(TRUE);m_Int=m_Slider.GetPos();UpdateData(FALSE); *pResult = 0;}其中m_Int是定义的EDIT控件的类型为INT的变量。至此我们的编辑工作结束了。
2:画点画线
(1)画点

SetPixel()函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:
COLORREF CDC:: SetPixel(int X, intY, COLORREF crColor);
其中,(X,Y)为点的坐标位置,crColor参数为点的颜色值。如果函数调用成功,则函数返回像素的颜色值,否则返回值为-1。颜色值通过RGB(Red,Green,Blue)来设置,其中三个参数取值0~255。例如,在VcAPP项目中,在CVcAppView类中的OnDraw()函数中加入下列画点语句:
//绘制一组彩色点
//绘制一组彩色点
pDC->TextOut(20,20,"point:");
pDC->SetPixel(100,20,RGB(255,0,0));
pDC->SetPixel(110,20,RGB(0,255,0));
pDC->SetPixel(120,20,RGB(0,0,255));
pDC->SetPixel(100,20,RGB(255,255,0));
pDC->SetPixel(100,20,RGB(255,0,255));
pDC->SetPixel(100,20,RGB(0,255,255));
pDC->SetPixel(100,20,RGB(0,0,0));
pDC->SetPixel(100,20,RGB(255,255,255));
运行程序,查看运行结果。
(2)画直线和折线

画直线需要LineTo()和MoveTo()两个函数的配合使用。
LineTo()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。直线的颜色通过画笔的颜色来设定,在后面介绍。LineTo()函数原型说明如下:
直线的终点位置由(nXEnd,nYEnd)指定。如果函数调用成功,那么该点就成为当前位置,并返回TRUE,否则返回FALSE。
MoveTo()函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:
BOOL CDC:: LineTo(int nXEnd, intnYEnd);
BOOL CDC:: MoveTo (int X, intY);
示例:在CVcAppView类中的OnDraw()函数中加入下列画点语句:
//绘制直线
pDC->TextOut(20,60,"Line:");
pDC->MoveTo(20,90);
pDC->LineTo(160,90);
Polyline()函数用来画一条折线,而PolyPolyline()函数则用来画多条折线,它们的函数原型说明如下:
DWORD cCount);
BOOL CDC::PolyPolyline(COUST POINT *lppt, COUST DWORD *lpdwPolyPoints,
BOOL CDC::Polyline(COUST POINT*lppt, int cPoints);
在Polyline()函数中,lppt是指向折线顶点数组的指针,而cPoints是折线顶点数组中的顶点数。例如,绘制一条具有4个顶点的折线,程序如下:
POINTpolylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};
pDC->Polyline(polylinepoint,4);
在PolyPolyline()函数中,lppt是指向保存顶点数组的指针,而各条折线的顶点数则保存在lpdwPolyPoints参数所指向的数组中,最后的cCount参数指定折线的数目。例如:
POINTpolypolylinePt[9]={{95,160},{120,185},{120,250},{145,160},{120,185},
{90,185},{150,185},{80,210},{160,210}};
DWORD dwPolyPoints[4]={3,2,2,2};//分四段折线,分别占用3,2,2,2个顶点
pDC->PolyPolyline(polypolylinePt, dwPolyPoints,4);
注:由于一条折线至少需要2个顶点,因此dwPolyPoints数组中的数不应该小于2。
(3)画弧线和曲线

通过Arc()函数画弧线或整个椭圆。椭圆限定在一个矩形内,称为外接矩形。Arc()函数的圆形说明如下:
int nXStartArc, int nYStartArc, intnXEndArc, int nYEndArc);
BOOL CDC:: Arc(int nLeftRect, intnTopRect, int nRightRect, int nBottomRect,
其中,(nLeftRect,nTopRect)是外接矩形的左上角坐标值,(nRightRect,nBottomRect)是外接矩形的右下角坐标值。而椭圆中心与点(nXStartArc,nYStartArc)所构成的射线与椭圆的交点成为弧线的起点,椭圆中心与点(nXEndArc,nYEndArc)所构成的射线与椭圆的交点成为弧线的终点。椭圆上从始点到终点就形成一条弧线。
在Windows系统中,弧线从始点到终点的方向是逆时针方向,但可以通过SetArcDirection()函数将绘制弧线方向设置为顺时针方向。
示例,用Arc()绘制圆、圆弧和椭圆,程序如下:
for(i=0;i<6;i++)
{
pDC->Arc(260-5*i,70-5*i,260+5*I,70+5*i,260+5*i,70,260+5*i,70);
}
for(i=3;i<6;i++)
{
pDC->Arc(260-10*i,70-10*i, 260+10*i, 70+10*i,
(int)260+10*i*cos(60*3.1415926/180),
(int)70+10*i*sin(60*3.1415926/180),
(int)260+10*i*cos(60*3.1415926/180),
(int)70-10*i*sin(60*3.1415926/180));
pDC->Arc(260-10*i,70-10*i, 260+10*i, 70+10*i,
(int)260-10*i*cos(60*3.1415926/180),
(int)70-10*i*sin(60*3.1415926/180),
(int)260-10*i*cos(60*3.1415926/180),
(int)70+10*i*sin(60*3.1415926/180));
}
Bezier曲线是最常见的非规则曲线之一。Bezier曲线属于三次曲线,需要四个控制顶点来确定一条Bezier曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。PolyBezier()函数可以画出一条或多条Bezier曲线,其函数原型说明如下:
BOOL CDC:: PolyBezier(CONST POINT *lppt, DWORD cPoints);
其中,lppt参数是曲线控制顶点所组成的数组,cPoints参数表示lppt数组中的顶点数,一条Bezier曲线需要四个控制顶点。如果lppt数组用于画多条Bezier曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。
示例,给出四个控制顶点,画出一条Bezier曲线和特征多边形。
//绘制Bezier 曲线
POINTpolyBezier[4]={{20,310},{60,240},{120,300},{160,330}};
pDC->Polyline(polyBezier,4);
pDC->PolyBezier(polyBezier,4);
(4)画封闭曲线

Windows中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。
Rectangle()函数用来画矩形,其函数原型说明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Rectangle(int nLeftRect,int nTopRect,
其中,参数nLeftRect和nTopRect给出了矩形左上角的坐标,而nRightRect和nBottomRect则给出矩形的右下角坐标。
Ellipse()函数的作用则是画椭圆形。在Ellipse()函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Ellipse(int nLeftRect,int nTopRect,
其中的参数说明与Rectangle()函数相同。
RoundRect()函数用来画圆角矩形,其函数的原型说明如下:
int nWidth, int nHeight);
int nRightRect, intnBottomRect,
BOOL CDC:: RoundRect(int nLeftRect,int nTopRect,
其中的前四个参数与Rectangle()函数相同,nWidth表示圆角的宽度, nHeight表示圆角的高度。
Polygon()函数用来画封闭的任意多边形,其函数原型说明如下:
BOOL CDC:: Polygon((COUST POINT*lpPoints, int cCount);
其中的参数说明与Polyline()函数相同。但两个函数有区别,Polygon()函数会自动将起点和终点相连形成封闭的多边形,而Polyline()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。
示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下:
//绘制矩形、圆角矩形、椭圆和多边形
pDC->Rectangle(190,270,250,310);
pDC->RoundRect(265,270,330,310,30,20);
pDC->Ellipse(260-50,200-30,260+50,200+30);
POINTpolygonPts[3]={{390,160},{430,220},{350,210}};
pDC->Polygon(polygonPts,3);
(5) 画笔与画刷

(1)画笔
当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。
创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen类中,这样画笔就能够被视为对象进行处理。下面介绍创建画笔的方法。
方法一:直接构造一个CPen对象,并将定义画笔的参数传给它,例如:
CPenpen(PS-SOLID,1,RGB(255,0,0));
创建一个宽度为一个像素、实线和红色的画笔。
方法二:首先声明一个没有初始化的CPen类对象,然后再用CreatePen()函数定义画笔的属性。例如,
CPen Pen;
Pen->CreatePen(PS-SOLID,1,RGB(255,0,0));
方法三:先声明一个CPen类对象和一个描述画笔结构的LOGPEN类对象,并填入画笔的属性值,然后调用CreatePenIndirect()函数来创建画笔。如下所示:
CPen Pen;
LOGPEN LogPen;
LogPen.lopnStyle=PS_SOLID;
LogPen.lopnWidth=1;
LogPen.lpenColor=RGB(255,0,0);
Pen.CreatePenIndirect(&LogPen);
如果画笔被成功创建,那么两个函数返回TRUE,否则返回FALSE。
画笔包括样式、宽度和颜色三个属性。表3.2列出了GDI画笔的样式。
表3.2 GDI画笔的样式
样式
说 明
PS_SOLID
创建实线笔
PS_DASH
创建虚线笔,只有当画笔宽度小于或等于1时有效
PS_DOT
创建点线笔,只有当画笔宽度小于或等于1时有效
PS_DASHDOT
点划线笔,只有当画笔宽度小于或等于1时有效
PS_DASHDOTDOT
双点划线笔,只有当画笔宽度小于或等于1时有效
PS_NULL
创建NULL笔,不绘制任何图形
PS_INSIDEFRAME
创建可以在封闭框架内部绘制直线的画笔。
画笔的宽度用像素个数来确定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT参数要求画笔宽度只能为1,其它参数可以创建任意宽度的画笔。画笔的颜色是一个24位的RGB颜色,由RGB(rColor,gColor,bColor)来定义,三个参数取值0~255。
Windows预定义了三个实线、1个像素宽的画笔,它们是WHITE_PEN、BLACK_PEN和NULL_PEN,程序中可以直接使用这些画笔,方法如下:
CPen Pen;
Pen.CreateStockObject(WHITE_PEN);
示例:在屏幕上绘制三组直线,第一组按不同线型绘制,第二组按不同宽度绘制,第三组按不同颜色绘制。程序如下:
//画笔的样式、宽度和颜色
int i1;
int nPenStyle[]=
{
PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,
PS_INSIDEFRAME,
};
CPen *pNewPen;
CPen *pOldPen;
//用不同样式的画笔
for(i1=0;i1<7;i1++)
{
//构造新笔
pNewPen=new CPen;
if(pNewPen->CreatePen(nPenStyle[i1],1,RGB(0,0,0)))
{
pOldPen=pDC->SelectObject(pNewPen);//选择新笔,并保存旧笔
//画直线
pDC->MoveTo(20,60+i1*20);
pDC->LineTo(160,60+i1*20);
//恢复原有的笔
pDC->SelectObject(pOldPen);
}
else
{
//出错提示
AfxMessageBox("CreatePenErroe!!");
}
//删除新笔
delete pNewPen;
}
//用不同的宽度的笔绘图
for(i1=0;i1<7;i1++)
{
//构造新笔
pNewPen=new CPen;
if(pNewPen->CreatePen(PS_SOLID,i1+1,RGB(0,0,0)))
{
pOldPen=pDC->SelectObject(pNewPen);
//画直线
pDC->MoveTo(200,60+i1*20);
pDC->LineTo(340,60+i1*20);
//恢复原有的笔
pDC->SelectObject(pOldPen);
}
else
{
//出错提示
AfxMessageBox("CreatePenErroe!!");
}
//删除新笔
delete pNewPen;
}
//设置颜色表
struct tagColor
{
int r,g,b;
} color[7]=
{
{255,0,0},{0,255,0},{0,0,255},
{255,255,0},{255,0,255},{0,255,255},{0,0,0},
};
//用不同颜色绘图
for(i1=0;i1<7;i1++)
{
//构造新笔
pNewPen=new CPen;
if(pNewPen->CreatePen(PS_SOLID,2,RGB(color[i1].r,color[i1].g,color[i1].b)))
{
pOldPen=pDC->SelectObject(pNewPen);
//画直线
pDC->MoveTo(380,60+i1*20);
pDC->LineTo(520,60+i1*20);
//恢复原有的笔
pDC->SelectObject(pOldPen);
}
else
{
//出错提示
AfxMessageBox("CreatePenErroe!!");
}
//删除新笔
delete pNewPen;
}
//画笔程序结束
(2)画刷
在进行区域填充或绘制封闭图形时,需要用到画刷。MFC把GDI画刷封装在CBrush类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。
纯色画刷绘图使用单色来定义,颜色由RGB()函数来确定。纯色画刷可以采用直接声明的方法,例如:
CBrush Brush(RGB(255,0,0));创建一个红色画刷。
也可以采用分步方法,由CreateSolidBrush()函数创建。
CBrush Brush;
Brush->Create->CreateSolidBrush(RGB(255,0,0));
Windows预定义了七种画刷,包括:BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH。可以参照CPen类的方法,采用CreateStockObject()来使用预定义的画刷。
阴影画刷使用预定义的六种阴影样式进行绘图。表3.3列出了六种阴影样式。
表3.3六种阴影样式
阴影样式
说明
HS_BDIAGONAL
45度向下阴影线(从左到右)
HS_CROSS
水平线与垂直线交叉阴影
HS_DIAGCROSS
45度方向的交叉阴影线
HS_FDIAGONAL
45度向上阴影线(从左到右)
HS_HORIZONTAL
水平阴影线
HS_VERTICAL
垂直阴影线
创建阴影画刷的方法与纯色画刷的创建方法相似,例如创建一个45度方向的交叉阴影线的画刷,方法如下:
CBrushBrush(HS_DIAGCROSS,RGB(255,0,0));
或者
CBrush Brush;
Brush->CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。
示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制100单位的矩形,并且用白色45度交叉线阴影将其填充,程序如下:
//画刷程序
pDC->Rectangle(300,300,400,400); //缺省的画刷,白色
//纯色画刷
CBrush *pNewBrush1;
CBrush *pOldBrush1;
pNewBrush1=new CBrush;
if(pNewBrush1->CreateSolidBrush(RGB(255,0,0)))
{
//选择新画刷
pOldBrush1=pDC->SelectObject(pNewBrush1);
//绘制矩形
pDC->Rectangle(200,200,300,400);
//恢复原有画刷
pDC->SelectObject(pOldBrush1);
}
delete pNewBrush1;
//阴影画刷
CBrushBrush(HS_DIAGCROSS,RGB(255,255,255));
CBrush *pOldBrush;
pOldBrush=pDC->SelectObject(&Brush);
pDC->SetBkColor(RGB(192,192,192));
pDC->Rectangle(0,0,100,100);
pDC->SelectObject(pOldBrush);


1: combo box控件的使用1.你在编辑状态下点那个控件的向下的三角形,就出冒出来一个可以调高度的东东。将高度调高,否则在执行时会不能显示下拉选项。
2.为combo box添加选项,在编辑状态下选combobox控件的属性,选Data标签,在编辑框中添加选项,按Ctrl-Enter来添加下一个选项。
3.为combo box添加变量
combo box有两个变量,CComboBox类变量和CString变量。
CComboBox变量用来设置combobox的属性,一般在cdialog类中的oninitdialog()函数中使用。添加方法是在classwizard中添加变量,添加时Category中选Control。例如:CComboBox.SetCurSel(0)用来设置下拉菜单初始值,具体看MSDN。   
CString变量用来存储下拉菜单所选的选项值。同样,当选项发生变化时要使用UpdateData(TRUE)函数更新该变量的值。
-----------------------------------------------------------------------------------------------------------------------------
一、初始化Combo Box控件
(1)在资源视图中,选择控件的"Properties",然后在Data选项卡里为控件添加初始化数据,换行是按Ctrl+Enter,然后,再修改Style选项卡里的Type属性为DropList。
(2)在程序初始化时动态添加
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID为IDC_COMBO_CF现有所有内容
for(int i=1;i<=100;i++)
{
   strTemp.Format("%d",i);
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp); //为控件添加初始化数据
}
(3)删除
DeleteString( UINT nIndex ) //删除指定行
(4)插入
InsertString( int nIndex, LPCTSTR lpszItem) //将行插入到指定位置
(5)查找
FindString( int nStartAfter, LPCTSTR lpszItem) //可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以选中包含指定字符串的行
二、如何控制ComboBox的下拉长度
1,首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是ComboBox的下拉调整框。
2,二、属性里有个 No integral height钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。
三、选择其中的某行
(1)选中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
四、取得Combo Box框内容
(1)取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //将获取的值存放到CString类型变量strTemp中。
如果定义了关联的变量,例如m_combo,可以直接获取:m_combo->GetWindowText(strTemp);
(2)取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);  //其中n为从0开始的索引值
五、获取当前选择的行数
例如:((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel() 返回的是当前选中值的行数,是整型。
或者:UINT m_row = m_combo->GetCurSel()
六、获得焦点
通常要判断控件是否获得了焦点,可以用GetFocus()函数
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的
所以获得焦点要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
------------------------------------------------------------------------------------------------------------------------------
一、如何添加/删除Combo Box内容
1,在Combo Box控件属性的Data标签里面添加,一行表示ComboBox下拉列表中的一行。换行用ctrl+回车。
2,在程序初始化时动态添加
如: //控件内容初始化
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除现有所有内容
for(int i=1;i<=100;i++)
{
   strTemp.Format("%d",i);
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
}
3,下拉的时候添加
如:
CString strTemp;
intiCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount(); //取得目前已经有的行数
if(iCount<1)//防止重复多次添加
{
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();
   for(inti=1;i<=100;i++)
   {
   strTemp.Format("%d",i);
   ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
   }
}
4,删除
DeleteString( UINT nIndex ) //删除指定行,
5,插入
InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置
6,查找
FindString( int nStartAfter, LPCTSTR lpszItem) //可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以选中包含指定字符串的行

二、如何控制Combo Box的下拉长度
1,首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是ComboBox的下拉调整框。
2,二、属性里有个 No integral height钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。

三、选择其中的某行
1,选中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
2,设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
四、取得Combo Box框内容
1取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);
2取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);
------------------------------------------------------------------------------------------------------------------------------
两个DropDownList控件,选择第一个后,第二个根据第一个搜索数据库表内容填充信息。
问题是,第一个DropDownList控件,我实现了SelectedIndexChanged事件,不过好像没反应啊。
谢谢  
把Postback设成True


3:MFC ComboBox使用方法
2009-04-01 21:46:04|  分类: VC/MFC | 标签:combo  box vc  mfc   |字号订阅

一、如何添加/删除Combo Box内容
1,在Combo Box控件属性的Data标签里面添加,一行表示ComboBox下拉列表中的一行。换行用ctrl+回车。
2,在程序初始化时动态添加
如: //控件内容初始化
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有内容
for(int i=1;i<=100;i++)
{
  strTemp.Format("%d",i);
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
}
3,下拉的时候添加
如: CString strTemp;
intiCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount();//取得目前已经有的行数
if(iCount<1)//防止重复多次添加
{
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();
  for(inti=1;i<=100;i++)
  {
  strTemp.Format("%d",i);
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
  }
}
4,删除
DeleteString( UINT nIndex )//删除指定行,
5,插入
InsertString( int nIndex, LPCTSTR lpszItem )//将行插入到指定位置
6,查找
FindString( int nStartAfter, LPCTSTR lpszItem)//可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem)//可以选中包含指定字符串的行
二、如何控制Combo Box的下拉长度

1,首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是ComboBox的下拉调整框。
2,二、属性里有个 No integral height钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。

三、选择其中的某行
1,选中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//当前选中的行。
2,设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//设置第n行内容为显示的内容。

四、取得Combo Box框内容
1取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);

2取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);

四、获得焦点

通常要判断控件是否获得了焦点,可以用GetFocus()函数

例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。

但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的

所以获得焦点要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))


      Combo Box(组合框)控件很简单,可以节省空间。从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的。用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本。下面的例子简要说明如何利用MFC CComboBox Class来操作字符串列表。

1、定义控件对应变量
假定已经创建了一个Dialog,并且从控件工具箱将 Combo Box 控件拖放到上面。打开 ClassWizard,添加控件对应变量,如:CComboBox m_cbExamble;
在后面的代码中会不断使用这个变量。
2、向控件添加 Items
      1) 在Combo Box控件属性的Data标签里面添加,一行表示ComboBox下拉列表中的一行。换行用ctrl+回车。
2) 利用函数 AddString() 向 Combo Box 控件添加 Items,如:
m_cbExample.AddString(“StringData1”);
m_cbExample.AddString(“StringData2”);
m_cbExample.AddString(“StringData3”);
3) 也可以调用函数 InsertString() 将 Item 插入指定位置 nIndex,如:
m_cbExample.InsertString( nIndex, “StringData” );
3、从控件得到选定的Item
假设在控件列表中已经选定某项,现在要得到被选定项的内容,首先要得到该项的位置,然后得到对应位置的内容。这里会用到两个函数,如:
int nIndex = m_cbExample.GetCurSel();
CString strCBText;
m_cbExample.GetLBText( nIndex, strCBText);
这样,得到的内容就保存在 strCBText 中。
若要选取当前内容,可调用函数GetWindowText(strCBText)。
4、在控件中查找给定Item
这种操作一般用于在程序中动态修改控件中该项的值,可以用函数FindStringExact() 精确匹配,如:
int nIndex = m_cbExample.FindStringExact( nStartAfter, “valueto be found”);
nStartAfter指明从哪一行开始查找。如果查找成功,返回的是该项的位置;否则,返回CB_ERR。
也可以选中包含指定字符串的项,如:
int nIndex = m_cbExample.SelectString( nStartAfter, “value tobe selected”);
5、删除控件中的Item
该操作可以利用函数DeleteString(),需要指定被删除项的位置,如:
m_cbExample.DeleteString(nIndex);
也可以使用函数ResetContent(),清除目前的所有项,如:
m_cbExample.ResetContent();
6、显示控件中的某项
int nIndex = m_cbExample.GetCurSel(); //当前选中的项
m_cbExample.SetCurSel(nIndex); //设置第nIndex项为显示的内容
7、得到或设置输入框中被选中的字符位置
DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, intnEndChar );
BOOL LimitText( int nMaxChars ); 设置输入框中可输入的最大字符数。
8、列表框常用消息映射宏
      ON_CBN_DBLCLK  鼠标双击
ON_CBN_DROPDOWN  列表框被弹出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在输入框失去/得到输入焦点时产生
ON_CBN_SELCHANGE  列表框中选择的行发生改变
ON_CBN_EDITUPDATE  输入框中内容被更新









2:EDITCONTROL的使用
MFC里面的EDIT Control控件的用法是怎么样的,1.怎么样才能赋值给EDIT Control控件并在EDITControl控件显示出来;2.怎么取得EDIT Control控件的值并传递给一个变量?希望各位大侠帮帮忙!

//获得EDIT
CEdit* pBoxOne;
pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1);
//付值
pBoxOne->SetWindowText( _T"FOO" );
//取值
CString str;
pBoxOne->GetWindowText(str);



GetDlgItem(IDC_EDIT1)->SetWindowText( _T"FOO");
也可以

//取值
CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);

EditControl是在MFC对话框中最频繁的使用的控件之一

VC++2005提供EditControl的属性和控件事件操作简单方便

1只允许输入数字
如果设置EditControl中只能输入数字,在VC6.0中需要编写一个派生类来达到目的,而在VC++2005下只需要在属性对话框中将Number的属性值设

为True就可以了.

2获取EditControl的内容
两种方法
第一种,利用MFC应用程序向导生成一个基于对话框的应用程序,从资源视图中选择该Dialog窗体,利用右侧的工具箱,向Dialog内添加一个

EditControl项,声明控件变量的类别为Value,变量类型为CString,变量名为m_sEdit_Content.


CString m_sEdit_Content;
CString s;
UpdateData(true);
s=m_sEdit_Content.GetString();
MessageBox(s,_T("获取编辑框的内容"),MB_OK);
s.ReleaseBuffer();

这样就取得了编辑框的内容

UpdateData(true);这句代码很重要,它的作用是将输入的数据装入EditControl对应的变量m_sEdit_Content中.
由于MFC应用程序向导默认是使用Unicode库,所以MessageBox中的字符串需要用_T(),否则会出现constchar[]转换LPCTSTR错误,如果不使用

Unicode库就不需要_T().

第二种方法
声明控件变量的类别为Control,变量类型为CEdit,变量名为m_Edit_Content.
代码如下(Unicode)
CString s;
s.GetBufferSetLength(1024);
m_Edit_Content.GetWindowTextW(s.GetBuffer(),s.GetLength());
MessageBox(s,_T("获取文本框的内容"),MB_OK);
s.ReleaseBuffer();

如果不是Unicode下获取编辑框内容的函数就是GetWindowTextA

3将EditControl中的内容转化为整数

在限制编辑框只能数字之后,要将字符串转化为整数
声明控件变量的类别为Value,变量类型为CString,变量名为m_sEdit_Content.
CString s;
UpdateData(true);
s=m_sEdit_Content.GetString();
int n=_tstoi(s);
s.ReleaseBuffer();
n就是所需要的整数
在VC2005下字符串转换成整数需要_tstoi这个函数

4限制编辑框的输入长度
声明控件变量的类别为Control,变量类型为CEdit,变量名为m_Edit_Content.
在对话框初始化的地方写m_Edit_Content.SetLimitText(1);
编辑框就只能输入一个字符了.


1:各控件变量的关联与消息映射
DoDataExchange为各控件的变量进行关联,其中控件的control类型变量,用来控制控件的各种属性以及显示等动作,Value类型的变量用来获取控件的值。可以自己添加也可以通过MFC添加。
void CdisplaywaveDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, Serial_Port_Choose);
DDX_CBString(pDX, IDC_COMBO2, BaudRateChoose);
DDX_CBString(pDX, IDC_COMBO1, SerialPortValue);
DDX_Control(pDX, IDC_EDIT1, RxDataArea);
}
这里为消息映射,回调函数,注册
BEGIN_MESSAGE_MAP(CdisplaywaveDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_COMBO1,&CdisplaywaveDlg::OnCbnSelchangeCombo1)
ON_STN_CLICKED(IDC_STATIC4,&CdisplaywaveDlg::OnStnClickedStatic4)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1,&CdisplaywaveDlg::OnNMCustomdrawSlider1)
ON_BN_CLICKED(IDC_BUTTON7,&CdisplaywaveDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON2,&CdisplaywaveDlg::OnBnClickedButton2)

END_MESSAGE_MAP()



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表