找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7416|回復(fù): 0
收起左側(cè)

MFC 各控件的使用

[復(fù)制鏈接]
ID:60266 發(fā)表于 2014-8-18 02:08 | 顯示全部樓層 |閱讀模式
3:Slider control 控件使用

滑動控件是Windows中最常用的控件之一。一般而言它是由一個滑動條,一個滑塊和可選的刻度組成,用戶可以通過移動滑塊在相應(yīng)的控件中顯示對應(yīng)的值。通常,在滑動控件附近一定有標(biāo)簽控件或編輯框控件,用于顯示相應(yīng)的值;瑒涌丶趹(yīng)用程序中用途級為廣泛,如在桌面的屬性中就可以看到。為此,讓我們一起來看一下它的實現(xiàn)方法。
(1)在VC++ 6.0中新建一個對話框文檔的工程。
(2)打開資源管理器,在對話框中放置一個EDIT控件,然后在它旁邊放上一個Slider控件;镜目蚣芤呀(jīng)完成了。
(3)對Slider控件右擊,選擇“建立類向?qū)А,對剛才的Slider控件定義一個變量m_Slider,類型為CSliderCtrl。
(4)在對話框初始化的代碼BOOLCMy601Dlg::OnInitDialog(),后添加相應(yīng)的屬性。以下是常用的屬性設(shè)置函數(shù):

* GetRange,SetRange函數(shù)
用于查詢和設(shè)置滑動條的取值范圍,默認(rèn)為0~100。函數(shù)定義形式如下:
void GetRange(int &nMin,int &nMax)const;
void SetRange(int nMin,int nMax,BOOL bRedrGETaw=FALSE);

* GetPos,SetPos函數(shù)
用于查詢和設(shè)置滑動條的當(dāng)前值。函數(shù)定義形式如下:
int GetPos() const;
int SetPos(int nPos);

* GetLineSize,SetLineSize函數(shù)
用于查詢和設(shè)置在按一下右或左箭頭時滑塊的移動量,默認(rèn)為1個單位。函數(shù)定義形式如下:
int GetLineSize() const;
int SetLineSize(int nSize);

* GetPageSize,SetPageSize函數(shù)
用于查詢和設(shè)置函滑塊和塊移動量,塊移動量是指當(dāng)按下PgUp或PgDown時滑塊的移動量。函數(shù)定 義形式如下:
int GetPageSize() const;
int SetPageSize(int nSize);

* SetTicFreq函數(shù)
用于設(shè)置滑動條刻度的頻度。默認(rèn)為一個單位一個函數(shù)。函數(shù)定義形式如下:
void SetTicFreq(int nFreq);

* SetTic函數(shù)
用于在指定的位置設(shè)置刻度。Windows默認(rèn)的刻度是均勻的。函數(shù)定義形式如下:
BOOL SetTic(int nTic);

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

我們在初始化時寫入以下語句:

m_Slider.SetRange(-100,100);m_Slider.SetTicFreq(10);即:設(shè)置范圍為-100到100,刻度為每10個單位一個。

(5)現(xiàn)在我們加入事件過程代碼。
選擇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的變量。至此我們的編輯工作結(jié)束了。
2:畫點畫線
(1)畫點

SetPixel()函數(shù)可以在指定的坐標(biāo)位置按指定的顏色畫點。函數(shù)原型說明如下:
COLORREF CDC:: SetPixel(int X, intY, COLORREF crColor);
其中,(X,Y)為點的坐標(biāo)位置,crColor參數(shù)為點的顏色值。如果函數(shù)調(diào)用成功,則函數(shù)返回像素的顏色值,否則返回值為-1。顏色值通過RGB(Red,Green,Blue)來設(shè)置,其中三個參數(shù)取值0~255。例如,在VcAPP項目中,在CVcAppView類中的OnDraw()函數(shù)中加入下列畫點語句:
//繪制一組彩色點
//繪制一組彩色點
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));
運行程序,查看運行結(jié)果。
(2)畫直線和折線

畫直線需要LineTo()和MoveTo()兩個函數(shù)的配合使用。
LineTo()函數(shù)以當(dāng)前位置所在的點為直線的起點,另指定一個點為直線的終點,畫出一段直線。直線的顏色通過畫筆的顏色來設(shè)定,在后面介紹。LineTo()函數(shù)原型說明如下:
直線的終點位置由(nXEnd,nYEnd)指定。如果函數(shù)調(diào)用成功,那么該點就成為當(dāng)前位置,并返回TRUE,否則返回FALSE。
MoveTo()函數(shù)只是將當(dāng)前位置移動到指定位置,它并沒有畫出直線,其函數(shù)說明為:
BOOL CDC:: LineTo(int nXEnd, intnYEnd);
BOOL CDC:: MoveTo (int X, intY);
示例:在CVcAppView類中的OnDraw()函數(shù)中加入下列畫點語句:
//繪制直線
pDC->TextOut(20,60,"Line:");
pDC->MoveTo(20,90);
pDC->LineTo(160,90);
Polyline()函數(shù)用來畫一條折線,而PolyPolyline()函數(shù)則用來畫多條折線,它們的函數(shù)原型說明如下:
DWORD cCount);
BOOL CDC::PolyPolyline(COUST POINT *lppt, COUST DWORD *lpdwPolyPoints,
BOOL CDC::Polyline(COUST POINT*lppt, int cPoints);
在Polyline()函數(shù)中,lppt是指向折線頂點數(shù)組的指針,而cPoints是折線頂點數(shù)組中的頂點數(shù)。例如,繪制一條具有4個頂點的折線,程序如下:
POINTpolylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};
pDC->Polyline(polylinepoint,4);
在PolyPolyline()函數(shù)中,lppt是指向保存頂點數(shù)組的指針,而各條折線的頂點數(shù)則保存在lpdwPolyPoints參數(shù)所指向的數(shù)組中,最后的cCount參數(shù)指定折線的數(shù)目。例如:
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數(shù)組中的數(shù)不應(yīng)該小于2。
(3)畫弧線和曲線

通過Arc()函數(shù)畫弧線或整個橢圓。橢圓限定在一個矩形內(nèi),稱為外接矩形。Arc()函數(shù)的圓形說明如下:
int nXStartArc, int nYStartArc, intnXEndArc, int nYEndArc);
BOOL CDC:: Arc(int nLeftRect, intnTopRect, int nRightRect, int nBottomRect,
其中,(nLeftRect,nTopRect)是外接矩形的左上角坐標(biāo)值,(nRightRect,nBottomRect)是外接矩形的右下角坐標(biāo)值。而橢圓中心與點(nXStartArc,nYStartArc)所構(gòu)成的射線與橢圓的交點成為弧線的起點,橢圓中心與點(nXEndArc,nYEndArc)所構(gòu)成的射線與橢圓的交點成為弧線的終點。橢圓上從始點到終點就形成一條弧線。
在Windows系統(tǒng)中,弧線從始點到終點的方向是逆時針方向,但可以通過SetArcDirection()函數(shù)將繪制弧線方向設(shè)置為順時針方向。
示例,用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曲線是最常見的非規(guī)則曲線之一。Bezier曲線屬于三次曲線,需要四個控制頂點來確定一條Bezier曲線,其中曲線通過第一點和最后一點,并且第一條邊和最后一條邊是曲線在起點和終點處的切線,從而確定了曲線的走向。PolyBezier()函數(shù)可以畫出一條或多條Bezier曲線,其函數(shù)原型說明如下:
BOOL CDC:: PolyBezier(CONST POINT *lppt, DWORD cPoints);
其中,lppt參數(shù)是曲線控制頂點所組成的數(shù)組,cPoints參數(shù)表示lppt數(shù)組中的頂點數(shù),一條Bezier曲線需要四個控制頂點。如果lppt數(shù)組用于畫多條Bezier曲線,第二條以后的曲線只需要三個控制頂點,因為后面的曲線總是把前一條曲線的終點作為自己的起點。
示例,給出四個控制頂點,畫出一條Bezier曲線和特征多邊形。
//繪制Bezier 曲線
POINTpolyBezier[4]={{20,310},{60,240},{120,300},{160,330}};
pDC->Polyline(polyBezier,4);
pDC->PolyBezier(polyBezier,4);
(4)畫封閉曲線

Windows中提供了一組畫封閉曲線的函數(shù),包括繪制矩形、多邊性、橢圓等,這些畫封閉曲線的函數(shù)不但可以利用畫筆來畫出輪廓線,同時還可以利用畫刷來填充這些封閉曲線所圍成的區(qū)域。
Rectangle()函數(shù)用來畫矩形,其函數(shù)原型說明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Rectangle(int nLeftRect,int nTopRect,
其中,參數(shù)nLeftRect和nTopRect給出了矩形左上角的坐標(biāo),而nRightRect和nBottomRect則給出矩形的右下角坐標(biāo)。
Ellipse()函數(shù)的作用則是畫橢圓形。在Ellipse()函數(shù)中,橢圓是由其外接矩形來確定的,外接矩形的中心與橢圓中心重合,矩形的長與寬和橢圓的長短軸相等。函數(shù)說明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Ellipse(int nLeftRect,int nTopRect,
其中的參數(shù)說明與Rectangle()函數(shù)相同。
RoundRect()函數(shù)用來畫圓角矩形,其函數(shù)的原型說明如下:
int nWidth, int nHeight);
int nRightRect, intnBottomRect,
BOOL CDC:: RoundRect(int nLeftRect,int nTopRect,
其中的前四個參數(shù)與Rectangle()函數(shù)相同,nWidth表示圓角的寬度, nHeight表示圓角的高度。
Polygon()函數(shù)用來畫封閉的任意多邊形,其函數(shù)原型說明如下:
BOOL CDC:: Polygon((COUST POINT*lpPoints, int cCount);
其中的參數(shù)說明與Polyline()函數(shù)相同。但兩個函數(shù)有區(qū)別,Polygon()函數(shù)會自動將起點和終點相連形成封閉的多邊形,而Polyline()函數(shù)則畫出多條折線,只有當(dāng)最后一點與起點相同時才畫出封閉的多邊形。
示例,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:
//繪制矩形、圓角矩形、橢圓和多邊形
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)畫筆
當(dāng)繪制圖形時,線條的屬性,包括顏色、寬度、樣式等都是由畫筆來確定的。程序員可以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩的圖形。
創(chuàng)建畫筆包括CreatePen()和CreatePenIndirect()兩個函數(shù)。MFC將這些函數(shù)封裝在CPen類中,這樣畫筆就能夠被視為對象進(jìn)行處理。下面介紹創(chuàng)建畫筆的方法。
方法一:直接構(gòu)造一個CPen對象,并將定義畫筆的參數(shù)傳給它,例如:
CPenpen(PS-SOLID,1,RGB(255,0,0));
創(chuàng)建一個寬度為一個像素、實線和紅色的畫筆。
方法二:首先聲明一個沒有初始化的CPen類對象,然后再用CreatePen()函數(shù)定義畫筆的屬性。例如,
CPen Pen;
Pen->CreatePen(PS-SOLID,1,RGB(255,0,0));
方法三:先聲明一個CPen類對象和一個描述畫筆結(jié)構(gòu)的LOGPEN類對象,并填入畫筆的屬性值,然后調(diào)用CreatePenIndirect()函數(shù)來創(chuàng)建畫筆。如下所示:
CPen Pen;
LOGPEN LogPen;
LogPen.lopnStyle=PS_SOLID;
LogPen.lopnWidth=1;
LogPen.lpenColor=RGB(255,0,0);
Pen.CreatePenIndirect(&LogPen);
如果畫筆被成功創(chuàng)建,那么兩個函數(shù)返回TRUE,否則返回FALSE。
畫筆包括樣式、寬度和顏色三個屬性。表3.2列出了GDI畫筆的樣式。
表3.2 GDI畫筆的樣式
樣式
說 明
PS_SOLID
創(chuàng)建實線筆
PS_DASH
創(chuàng)建虛線筆,只有當(dāng)畫筆寬度小于或等于1時有效
PS_DOT
創(chuàng)建點線筆,只有當(dāng)畫筆寬度小于或等于1時有效
PS_DASHDOT
點劃線筆,只有當(dāng)畫筆寬度小于或等于1時有效
PS_DASHDOTDOT
雙點劃線筆,只有當(dāng)畫筆寬度小于或等于1時有效
PS_NULL
創(chuàng)建NULL筆,不繪制任何圖形
PS_INSIDEFRAME
創(chuàng)建可以在封閉框架內(nèi)部繪制直線的畫筆。
畫筆的寬度用像素個數(shù)來確定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT參數(shù)要求畫筆寬度只能為1,其它參數(shù)可以創(chuàng)建任意寬度的畫筆。畫筆的顏色是一個24位的RGB顏色,由RGB(rColor,gColor,bColor)來定義,三個參數(shù)取值0~255。
Windows預(yù)定義了三個實線、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++)
{
//構(gòu)造新筆
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);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯提示
AfxMessageBox("CreatePenErroe!!");
}
//刪除新筆
delete pNewPen;
}
//用不同的寬度的筆繪圖
for(i1=0;i1<7;i1++)
{
//構(gòu)造新筆
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);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯提示
AfxMessageBox("CreatePenErroe!!");
}
//刪除新筆
delete pNewPen;
}
//設(shè)置顏色表
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++)
{
//構(gòu)造新筆
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);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯提示
AfxMessageBox("CreatePenErroe!!");
}
//刪除新筆
delete pNewPen;
}
//畫筆程序結(jié)束
(2)畫刷
在進(jìn)行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。MFC把GDI畫刷封裝在CBrush類中。畫刷分三種基本類型:純色畫刷、陰影畫刷和圖案畫刷。
純色畫刷繪圖使用單色來定義,顏色由RGB()函數(shù)來確定。純色畫刷可以采用直接聲明的方法,例如:
CBrush Brush(RGB(255,0,0));創(chuàng)建一個紅色畫刷。
也可以采用分步方法,由CreateSolidBrush()函數(shù)創(chuàng)建。
CBrush Brush;
Brush->Create->CreateSolidBrush(RGB(255,0,0));
Windows預(yù)定義了七種畫刷,包括:BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH。可以參照CPen類的方法,采用CreateStockObject()來使用預(yù)定義的畫刷。
陰影畫刷使用預(yù)定義的六種陰影樣式進(jìn)行繪圖。表3.3列出了六種陰影樣式。
表3.3六種陰影樣式
陰影樣式
說明
HS_BDIAGONAL
45度向下陰影線(從左到右)
HS_CROSS
水平線與垂直線交叉陰影
HS_DIAGCROSS
45度方向的交叉陰影線
HS_FDIAGONAL
45度向上陰影線(從左到右)
HS_HORIZONTAL
水平陰影線
HS_VERTICAL
垂直陰影線
創(chuàng)建陰影畫刷的方法與純色畫刷的創(chuàng)建方法相似,例如創(chuàng)建一個45度方向的交叉陰影線的畫刷,方法如下:
CBrushBrush(HS_DIAGCROSS,RGB(255,0,0));
或者
CBrush Brush;
Brush->CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
函數(shù)中有兩個參數(shù),第一個參數(shù)是畫刷的陰影樣式,第二個參數(shù)是陰影線的顏色。
示例:繪制缺省畫刷的矩形,純色畫刷矩形和繪制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);
//恢復(fù)原有畫刷
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.你在編輯狀態(tài)下點那個控件的向下的三角形,就出冒出來一個可以調(diào)高度的東東。將高度調(diào)高,否則在執(zhí)行時會不能顯示下拉選項。
2.為combo box添加選項,在編輯狀態(tài)下選combobox控件的屬性,選Data標(biāo)簽,在編輯框中添加選項,按Ctrl-Enter來添加下一個選項。
3.為combo box添加變量
combo box有兩個變量,CComboBox類變量和CString變量。
CComboBox變量用來設(shè)置combobox的屬性,一般在cdialog類中的oninitdialog()函數(shù)中使用。添加方法是在classwizard中添加變量,添加時Category中選Control。例如:CComboBox.SetCurSel(0)用來設(shè)置下拉菜單初始值,具體看MSDN。   
CString變量用來存儲下拉菜單所選的選項值。同樣,當(dāng)選項發(fā)生變化時要使用UpdateData(TRUE)函數(shù)更新該變量的值。
-----------------------------------------------------------------------------------------------------------------------------
一、初始化Combo Box控件
(1)在資源視圖中,選擇控件的"Properties",然后在Data選項卡里為控件添加初始化數(shù)據(jù),換行是按Ctrl+Enter,然后,再修改Style選項卡里的Type屬性為DropList。
(2)在程序初始化時動態(tài)添加
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID為IDC_COMBO_CF現(xiàn)有所有內(nèi)容
for(int i=1;i<=100;i++)
{
   strTemp.Format("%d",i);
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp); //為控件添加初始化數(shù)據(jù)
}
(3)刪除
DeleteString( UINT nIndex ) //刪除指定行
(4)插入
InsertString( int nIndex, LPCTSTR lpszItem) //將行插入到指定位置
(5)查找
FindString( int nStartAfter, LPCTSTR lpszItem) //可以在當(dāng)前所有行中查找指定的字符傳的位置,nStartAfter指明從那一行開始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以選中包含指定字符串的行
二、如何控制ComboBox的下拉長度
1,首先要知道兩點:一、那就是在設(shè)計界面里,點擊一下Combo Box的下拉箭頭,此時出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個 No integral height鉤選項,表示最大長度為設(shè)計長度,如果實際內(nèi)容比設(shè)計長度多,就出現(xiàn)滾動條,少就以實際長度顯示。
三、選擇其中的某行
(1)選中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //當(dāng)前選中的行。
(2)設(shè)置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //設(shè)置第n行內(nèi)容為顯示的內(nèi)容。
四、取得Combo Box框內(nèi)容
(1)取當(dāng)前內(nèi)容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //將獲取的值存放到CString類型變量strTemp中。
如果定義了關(guān)聯(lián)的變量,例如m_combo,可以直接獲。簃_combo->GetWindowText(strTemp);
(2)取其他行內(nèi)容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);  //其中n為從0開始的索引值
五、獲取當(dāng)前選擇的行數(shù)
例如:((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel() 返回的是當(dāng)前選中值的行數(shù),是整型。
或者:UINT m_row = m_combo->GetCurSel()
六、獲得焦點
通常要判斷控件是否獲得了焦點,可以用GetFocus()函數(shù)
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內(nèi)。
但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成的
所以獲得焦點要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
------------------------------------------------------------------------------------------------------------------------------
一、如何添加/刪除Combo Box內(nèi)容
1,在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車。
2,在程序初始化時動態(tài)添加
如: //控件內(nèi)容初始化
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除現(xiàn)有所有內(nèi)容
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(); //取得目前已經(jīng)有的行數(shù)
if(iCount<1)//防止重復(fù)多次添加
{
  ((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) //可以在當(dāng)前所有行中查找指定的字符傳的位置,nStartAfter指明從那一行開始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以選中包含指定字符串的行

二、如何控制Combo Box的下拉長度
1,首先要知道兩點:一、那就是在設(shè)計界面里,點擊一下Combo Box的下拉箭頭,此時出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個 No integral height鉤選項,表示最大長度為設(shè)計長度,如果實際內(nèi)容比設(shè)計長度多,就出現(xiàn)滾動條,少就以實際長度顯示。

三、選擇其中的某行
1,選中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //當(dāng)前選中的行。
2,設(shè)置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //設(shè)置第n行內(nèi)容為顯示的內(nèi)容。
四、取得Combo Box框內(nèi)容
1取當(dāng)前內(nèi)容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);
2取其他行內(nèi)容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);
------------------------------------------------------------------------------------------------------------------------------
兩個DropDownList控件,選擇第一個后,第二個根據(jù)第一個搜索數(shù)據(jù)庫表內(nèi)容填充信息。
問題是,第一個DropDownList控件,我實現(xiàn)了SelectedIndexChanged事件,不過好像沒反應(yīng)啊。
謝謝  
把Postback設(shè)成True


3:MFC ComboBox使用方法
2009-04-01 21:46:04|  分類: VC/MFC | 標(biāo)簽:combo  box vc  mfc   |字號訂閱

一、如何添加/刪除Combo Box內(nèi)容
1,在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車。
2,在程序初始化時動態(tài)添加
如: //控件內(nèi)容初始化
CString strTemp;
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除現(xiàn)有所有內(nèi)容
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();//取得目前已經(jīng)有的行數(shù)
if(iCount<1)//防止重復(fù)多次添加
{
((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)//可以在當(dāng)前所有行中查找指定的字符傳的位置,nStartAfter指明從那一行開始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem)//可以選中包含指定字符串的行
二、如何控制Combo Box的下拉長度

1,首先要知道兩點:一、那就是在設(shè)計界面里,點擊一下Combo Box的下拉箭頭,此時出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個 No integral height鉤選項,表示最大長度為設(shè)計長度,如果實際內(nèi)容比設(shè)計長度多,就出現(xiàn)滾動條,少就以實際長度顯示。

三、選擇其中的某行
1,選中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//當(dāng)前選中的行。
2,設(shè)置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//設(shè)置第n行內(nèi)容為顯示的內(nèi)容。

四、取得Combo Box框內(nèi)容
1取當(dāng)前內(nèi)容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);

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

四、獲得焦點

通常要判斷控件是否獲得了焦點,可以用GetFocus()函數(shù)

例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內(nèi)。

但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成的

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


      Combo Box(組合框)控件很簡單,可以節(jié)省空間。從用戶角度來看,這個控件是由一個文本輸入控件和一個下拉菜單組成的。用戶可以從一個預(yù)先定義的列表里選擇一個選項,同時也可以直接在文本框里面輸入文本。下面的例子簡要說明如何利用MFC CComboBox Class來操作字符串列表。

1、定義控件對應(yīng)變量
假定已經(jīng)創(chuàng)建了一個Dialog,并且從控件工具箱將 Combo Box 控件拖放到上面。打開 ClassWizard,添加控件對應(yīng)變量,如:CComboBox m_cbExamble;
在后面的代碼中會不斷使用這個變量。
2、向控件添加 Items
      1) 在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車。
2) 利用函數(shù) AddString() 向 Combo Box 控件添加 Items,如:
m_cbExample.AddString(“StringData1”);
m_cbExample.AddString(“StringData2”);
m_cbExample.AddString(“StringData3”);
3) 也可以調(diào)用函數(shù) InsertString() 將 Item 插入指定位置 nIndex,如:
m_cbExample.InsertString( nIndex, “StringData” );
3、從控件得到選定的Item
假設(shè)在控件列表中已經(jīng)選定某項,現(xiàn)在要得到被選定項的內(nèi)容,首先要得到該項的位置,然后得到對應(yīng)位置的內(nèi)容。這里會用到兩個函數(shù),如:
int nIndex = m_cbExample.GetCurSel();
CString strCBText;
m_cbExample.GetLBText( nIndex, strCBText);
這樣,得到的內(nèi)容就保存在 strCBText 中。
若要選取當(dāng)前內(nèi)容,可調(diào)用函數(shù)GetWindowText(strCBText)。
4、在控件中查找給定Item
這種操作一般用于在程序中動態(tài)修改控件中該項的值,可以用函數(shù)FindStringExact() 精確匹配,如:
int nIndex = m_cbExample.FindStringExact( nStartAfter, “valueto be found”);
nStartAfter指明從哪一行開始查找。如果查找成功,返回的是該項的位置;否則,返回CB_ERR。
也可以選中包含指定字符串的項,如:
int nIndex = m_cbExample.SelectString( nStartAfter, “value tobe selected”);
5、刪除控件中的Item
該操作可以利用函數(shù)DeleteString(),需要指定被刪除項的位置,如:
m_cbExample.DeleteString(nIndex);
也可以使用函數(shù)ResetContent(),清除目前的所有項,如:
m_cbExample.ResetContent();
6、顯示控件中的某項
int nIndex = m_cbExample.GetCurSel(); //當(dāng)前選中的項
m_cbExample.SetCurSel(nIndex); //設(shè)置第nIndex項為顯示的內(nèi)容
7、得到或設(shè)置輸入框中被選中的字符位置
DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, intnEndChar );
BOOL LimitText( int nMaxChars ); 設(shè)置輸入框中可輸入的最大字符數(shù)。
8、列表框常用消息映射宏
      ON_CBN_DBLCLK  鼠標(biāo)雙擊
ON_CBN_DROPDOWN  列表框被彈出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產(chǎn)生
ON_CBN_SELCHANGE  列表框中選擇的行發(fā)生改變
ON_CBN_EDITUPDATE  輸入框中內(nèi)容被更新









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只允許輸入數(shù)字
如果設(shè)置EditControl中只能輸入數(shù)字,在VC6.0中需要編寫一個派生類來達(dá)到目的,而在VC++2005下只需要在屬性對話框中將Number的屬性值設(shè)

為True就可以了.

2獲取EditControl的內(nèi)容
兩種方法
第一種,利用MFC應(yīng)用程序向?qū)梢粋基于對話框的應(yīng)用程序,從資源視圖中選擇該Dialog窗體,利用右側(cè)的工具箱,向Dialog內(nèi)添加一個

EditControl項,聲明控件變量的類別為Value,變量類型為CString,變量名為m_sEdit_Content.


CString m_sEdit_Content;
CString s;
UpdateData(true);
s=m_sEdit_Content.GetString();
MessageBox(s,_T("獲取編輯框的內(nèi)容"),MB_OK);
s.ReleaseBuffer();

這樣就取得了編輯框的內(nèi)容

UpdateData(true);這句代碼很重要,它的作用是將輸入的數(shù)據(jù)裝入EditControl對應(yīng)的變量m_sEdit_Content中.
由于MFC應(yīng)用程序向?qū)J(rèn)是使用Unicode庫,所以MessageBox中的字符串需要用_T(),否則會出現(xiàn)constchar[]轉(zhuǎn)換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("獲取文本框的內(nèi)容"),MB_OK);
s.ReleaseBuffer();

如果不是Unicode下獲取編輯框內(nèi)容的函數(shù)就是GetWindowTextA

3將EditControl中的內(nèi)容轉(zhuǎn)化為整數(shù)

在限制編輯框只能數(shù)字之后,要將字符串轉(zhuǎn)化為整數(shù)
聲明控件變量的類別為Value,變量類型為CString,變量名為m_sEdit_Content.
CString s;
UpdateData(true);
s=m_sEdit_Content.GetString();
int n=_tstoi(s);
s.ReleaseBuffer();
n就是所需要的整數(shù)
在VC2005下字符串轉(zhuǎn)換成整數(shù)需要_tstoi這個函數(shù)

4限制編輯框的輸入長度
聲明控件變量的類別為Control,變量類型為CEdit,變量名為m_Edit_Content.
在對話框初始化的地方寫m_Edit_Content.SetLimitText(1);
編輯框就只能輸入一個字符了.


1:各控件變量的關(guān)聯(lián)與消息映射
DoDataExchange為各控件的變量進(jìn)行關(guān)聯(lián),其中控件的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);
}
這里為消息映射,回調(diào)函數(shù),注冊
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()



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表