3:Slider control 控件使用 滑動(dòng)控件是Windows中最常用的控件之一。一般而言它是由一個(gè)滑動(dòng)條,一個(gè)滑塊和可選的刻度組成,用戶可以通過(guò)移動(dòng)滑塊在相應(yīng)的控件中顯示對(duì)應(yīng)的值。通常,在滑動(dòng)控件附近一定有標(biāo)簽控件或編輯框控件,用于顯示相應(yīng)的值。滑動(dòng)控件在應(yīng)用程序中用途級(jí)為廣泛,如在桌面的屬性中就可以看到。為此,讓我們一起來(lái)看一下它的實(shí)現(xiàn)方法。
(1)在VC++ 6.0中新建一個(gè)對(duì)話框文檔的工程。
(2)打開(kāi)資源管理器,在對(duì)話框中放置一個(gè)EDIT控件,然后在它旁邊放上一個(gè)Slider控件;镜目蚣芤呀(jīng)完成了。
(3)對(duì)Slider控件右擊,選擇“建立類向?qū)А保瑢?duì)剛才的Slider控件定義一個(gè)變量m_Slider,類型為CSliderCtrl。
(4)在對(duì)話框初始化的代碼BOOLCMy601Dlg::OnInitDialog(),后添加相應(yīng)的屬性。以下是常用的屬性設(shè)置函數(shù):
* GetRange,SetRange函數(shù)
用于查詢和設(shè)置滑動(dòng)條的取值范圍,默認(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)條的當(dāng)前值。函數(shù)定義形式如下:
int GetPos() const;
int SetPos(int nPos);
* GetLineSize,SetLineSize函數(shù)
用于查詢和設(shè)置在按一下右或左箭頭時(shí)滑塊的移動(dòng)量,默認(rèn)為1個(gè)單位。函數(shù)定義形式如下:
int GetLineSize() const;
int SetLineSize(int nSize);
* GetPageSize,SetPageSize函數(shù)
用于查詢和設(shè)置函滑塊和塊移動(dòng)量,塊移動(dòng)量是指當(dāng)按下PgUp或PgDown時(shí)滑塊的移動(dòng)量。函數(shù)定 義形式如下:
int GetPageSize() const;
int SetPageSize(int nSize);
* SetTicFreq函數(shù)
用于設(shè)置滑動(dòng)條刻度的頻度。默認(rèn)為一個(gè)單位一個(gè)函數(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);
我們?cè)诔跏蓟瘯r(shí)寫(xiě)入以下語(yǔ)句: m_Slider.SetRange(-100,100);m_Slider.SetTicFreq(10);即:設(shè)置范圍為-100到100,刻度為每10個(gè)單位一個(gè)。
(5)現(xiàn)在我們加入事件過(guò)程代碼。
選擇Slider的“事件”然后選擇第一個(gè)過(guò)程(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:畫(huà)點(diǎn)畫(huà)線
(1)畫(huà)點(diǎn)
SetPixel()函數(shù)可以在指定的坐標(biāo)位置按指定的顏色畫(huà)點(diǎn)。函數(shù)原型說(shuō)明如下:
COLORREF CDC:: SetPixel(int X, intY, COLORREF crColor);
其中,(X,Y)為點(diǎn)的坐標(biāo)位置,crColor參數(shù)為點(diǎn)的顏色值。如果函數(shù)調(diào)用成功,則函數(shù)返回像素的顏色值,否則返回值為-1。顏色值通過(guò)RGB(Red,Green,Blue)來(lái)設(shè)置,其中三個(gè)參數(shù)取值0~255。例如,在VcAPP項(xiàng)目中,在CVcAppView類中的OnDraw()函數(shù)中加入下列畫(huà)點(diǎn)語(yǔ)句:
//繪制一組彩色點(diǎn)
//繪制一組彩色點(diǎn)
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));
運(yùn)行程序,查看運(yùn)行結(jié)果。
(2)畫(huà)直線和折線
畫(huà)直線需要LineTo()和MoveTo()兩個(gè)函數(shù)的配合使用。
LineTo()函數(shù)以當(dāng)前位置所在的點(diǎn)為直線的起點(diǎn),另指定一個(gè)點(diǎn)為直線的終點(diǎn),畫(huà)出一段直線。直線的顏色通過(guò)畫(huà)筆的顏色來(lái)設(shè)定,在后面介紹。LineTo()函數(shù)原型說(shuō)明如下:
直線的終點(diǎn)位置由(nXEnd,nYEnd)指定。如果函數(shù)調(diào)用成功,那么該點(diǎn)就成為當(dāng)前位置,并返回TRUE,否則返回FALSE。
MoveTo()函數(shù)只是將當(dāng)前位置移動(dòng)到指定位置,它并沒(méi)有畫(huà)出直線,其函數(shù)說(shuō)明為:
BOOL CDC:: LineTo(int nXEnd, intnYEnd);
BOOL CDC:: MoveTo (int X, intY);
示例:在CVcAppView類中的OnDraw()函數(shù)中加入下列畫(huà)點(diǎn)語(yǔ)句:
//繪制直線
pDC->TextOut(20,60,"Line:");
pDC->MoveTo(20,90);
pDC->LineTo(160,90);
Polyline()函數(shù)用來(lái)畫(huà)一條折線,而PolyPolyline()函數(shù)則用來(lái)畫(huà)多條折線,它們的函數(shù)原型說(shuō)明如下:
DWORD cCount);
BOOL CDC::PolyPolyline(COUST POINT *lppt, COUST DWORD *lpdwPolyPoints,
BOOL CDC::Polyline(COUST POINT*lppt, int cPoints);
在Polyline()函數(shù)中,lppt是指向折線頂點(diǎn)數(shù)組的指針,而cPoints是折線頂點(diǎn)數(shù)組中的頂點(diǎn)數(shù)。例如,繪制一條具有4個(gè)頂點(diǎn)的折線,程序如下:
POINTpolylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};
pDC->Polyline(polylinepoint,4);
在PolyPolyline()函數(shù)中,lppt是指向保存頂點(diǎn)數(shù)組的指針,而各條折線的頂點(diǎn)數(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個(gè)頂點(diǎn)
pDC->PolyPolyline(polypolylinePt, dwPolyPoints,4);
注:由于一條折線至少需要2個(gè)頂點(diǎn),因此dwPolyPoints數(shù)組中的數(shù)不應(yīng)該小于2。
(3)畫(huà)弧線和曲線
通過(guò)Arc()函數(shù)畫(huà)弧線或整個(gè)橢圓。橢圓限定在一個(gè)矩形內(nèi),稱為外接矩形。Arc()函數(shù)的圓形說(shuō)明如下:
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)值。而橢圓中心與點(diǎn)(nXStartArc,nYStartArc)所構(gòu)成的射線與橢圓的交點(diǎn)成為弧線的起點(diǎn),橢圓中心與點(diǎn)(nXEndArc,nYEndArc)所構(gòu)成的射線與橢圓的交點(diǎn)成為弧線的終點(diǎn)。橢圓上從始點(diǎn)到終點(diǎn)就形成一條弧線。
在Windows系統(tǒng)中,弧線從始點(diǎn)到終點(diǎn)的方向是逆時(shí)針?lè)较,但可以通過(guò)SetArcDirection()函數(shù)將繪制弧線方向設(shè)置為順時(shí)針?lè)较颉?br />
示例,用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曲線是最常見(jiàn)的非規(guī)則曲線之一。Bezier曲線屬于三次曲線,需要四個(gè)控制頂點(diǎn)來(lái)確定一條Bezier曲線,其中曲線通過(guò)第一點(diǎn)和最后一點(diǎn),并且第一條邊和最后一條邊是曲線在起點(diǎn)和終點(diǎn)處的切線,從而確定了曲線的走向。PolyBezier()函數(shù)可以畫(huà)出一條或多條Bezier曲線,其函數(shù)原型說(shuō)明如下:
BOOL CDC:: PolyBezier(CONST POINT *lppt, DWORD cPoints);
其中,lppt參數(shù)是曲線控制頂點(diǎn)所組成的數(shù)組,cPoints參數(shù)表示lppt數(shù)組中的頂點(diǎn)數(shù),一條Bezier曲線需要四個(gè)控制頂點(diǎn)。如果lppt數(shù)組用于畫(huà)多條Bezier曲線,第二條以后的曲線只需要三個(gè)控制頂點(diǎn),因?yàn)楹竺娴那總是把前一條曲線的終點(diǎn)作為自己的起點(diǎn)。
示例,給出四個(gè)控制頂點(diǎn),畫(huà)出一條Bezier曲線和特征多邊形。
//繪制Bezier 曲線
POINTpolyBezier[4]={{20,310},{60,240},{120,300},{160,330}};
pDC->Polyline(polyBezier,4);
pDC->PolyBezier(polyBezier,4);
(4)畫(huà)封閉曲線
Windows中提供了一組畫(huà)封閉曲線的函數(shù),包括繪制矩形、多邊性、橢圓等,這些畫(huà)封閉曲線的函數(shù)不但可以利用畫(huà)筆來(lái)畫(huà)出輪廓線,同時(shí)還可以利用畫(huà)刷來(lái)填充這些封閉曲線所圍成的區(qū)域。
Rectangle()函數(shù)用來(lái)畫(huà)矩形,其函數(shù)原型說(shuō)明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Rectangle(int nLeftRect,int nTopRect,
其中,參數(shù)nLeftRect和nTopRect給出了矩形左上角的坐標(biāo),而nRightRect和nBottomRect則給出矩形的右下角坐標(biāo)。
Ellipse()函數(shù)的作用則是畫(huà)橢圓形。在Ellipse()函數(shù)中,橢圓是由其外接矩形來(lái)確定的,外接矩形的中心與橢圓中心重合,矩形的長(zhǎng)與寬和橢圓的長(zhǎng)短軸相等。函數(shù)說(shuō)明如下:
int nRightRect, intnBottomRect);
BOOL CDC:: Ellipse(int nLeftRect,int nTopRect,
其中的參數(shù)說(shuō)明與Rectangle()函數(shù)相同。
RoundRect()函數(shù)用來(lái)畫(huà)圓角矩形,其函數(shù)的原型說(shuō)明如下:
int nWidth, int nHeight);
int nRightRect, intnBottomRect,
BOOL CDC:: RoundRect(int nLeftRect,int nTopRect,
其中的前四個(gè)參數(shù)與Rectangle()函數(shù)相同,nWidth表示圓角的寬度, nHeight表示圓角的高度。
Polygon()函數(shù)用來(lái)畫(huà)封閉的任意多邊形,其函數(shù)原型說(shuō)明如下:
BOOL CDC:: Polygon((COUST POINT*lpPoints, int cCount);
其中的參數(shù)說(shuō)明與Polyline()函數(shù)相同。但兩個(gè)函數(shù)有區(qū)別,Polygon()函數(shù)會(huì)自動(dòng)將起點(diǎn)和終點(diǎn)相連形成封閉的多邊形,而Polyline()函數(shù)則畫(huà)出多條折線,只有當(dāng)最后一點(diǎn)與起點(diǎn)相同時(shí)才畫(huà)出封閉的多邊形。
示例,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:
//繪制矩形、圓角矩形、橢圓和多邊形
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) 畫(huà)筆與畫(huà)刷
(1)畫(huà)筆
當(dāng)繪制圖形時(shí),線條的屬性,包括顏色、寬度、樣式等都是由畫(huà)筆來(lái)確定的。程序員可以創(chuàng)建畫(huà)筆,定義畫(huà)筆的屬性,從而畫(huà)出多彩的圖形。
創(chuàng)建畫(huà)筆包括CreatePen()和CreatePenIndirect()兩個(gè)函數(shù)。MFC將這些函數(shù)封裝在CPen類中,這樣畫(huà)筆就能夠被視為對(duì)象進(jìn)行處理。下面介紹創(chuàng)建畫(huà)筆的方法。
方法一:直接構(gòu)造一個(gè)CPen對(duì)象,并將定義畫(huà)筆的參數(shù)傳給它,例如:
CPenpen(PS-SOLID,1,RGB(255,0,0));
創(chuàng)建一個(gè)寬度為一個(gè)像素、實(shí)線和紅色的畫(huà)筆。
方法二:首先聲明一個(gè)沒(méi)有初始化的CPen類對(duì)象,然后再用CreatePen()函數(shù)定義畫(huà)筆的屬性。例如,
CPen Pen;
Pen->CreatePen(PS-SOLID,1,RGB(255,0,0));
方法三:先聲明一個(gè)CPen類對(duì)象和一個(gè)描述畫(huà)筆結(jié)構(gòu)的LOGPEN類對(duì)象,并填入畫(huà)筆的屬性值,然后調(diào)用CreatePenIndirect()函數(shù)來(lái)創(chuàng)建畫(huà)筆。如下所示:
CPen Pen;
LOGPEN LogPen;
LogPen.lopnStyle=PS_SOLID;
LogPen.lopnWidth=1;
LogPen.lpenColor=RGB(255,0,0);
Pen.CreatePenIndirect(&LogPen);
如果畫(huà)筆被成功創(chuàng)建,那么兩個(gè)函數(shù)返回TRUE,否則返回FALSE。
畫(huà)筆包括樣式、寬度和顏色三個(gè)屬性。表3.2列出了GDI畫(huà)筆的樣式。
表3.2 GDI畫(huà)筆的樣式
樣式
說(shuō) 明
PS_SOLID
創(chuàng)建實(shí)線筆
PS_DASH
創(chuàng)建虛線筆,只有當(dāng)畫(huà)筆寬度小于或等于1時(shí)有效
PS_DOT
創(chuàng)建點(diǎn)線筆,只有當(dāng)畫(huà)筆寬度小于或等于1時(shí)有效
PS_DASHDOT
點(diǎn)劃線筆,只有當(dāng)畫(huà)筆寬度小于或等于1時(shí)有效
PS_DASHDOTDOT
雙點(diǎn)劃線筆,只有當(dāng)畫(huà)筆寬度小于或等于1時(shí)有效
PS_NULL
創(chuàng)建NULL筆,不繪制任何圖形
PS_INSIDEFRAME
創(chuàng)建可以在封閉框架內(nèi)部繪制直線的畫(huà)筆。
畫(huà)筆的寬度用像素個(gè)數(shù)來(lái)確定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT參數(shù)要求畫(huà)筆寬度只能為1,其它參數(shù)可以創(chuàng)建任意寬度的畫(huà)筆。畫(huà)筆的顏色是一個(gè)24位的RGB顏色,由RGB(rColor,gColor,bColor)來(lái)定義,三個(gè)參數(shù)取值0~255。
Windows預(yù)定義了三個(gè)實(shí)線、1個(gè)像素寬的畫(huà)筆,它們是WHITE_PEN、BLACK_PEN和NULL_PEN,程序中可以直接使用這些畫(huà)筆,方法如下:
CPen Pen;
Pen.CreateStockObject(WHITE_PEN);
示例:在屏幕上繪制三組直線,第一組按不同線型繪制,第二組按不同寬度繪制,第三組按不同顏色繪制。程序如下:
//畫(huà)筆的樣式、寬度和顏色
int i1;
int nPenStyle[]=
{
PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,
PS_INSIDEFRAME,
};
CPen *pNewPen;
CPen *pOldPen;
//用不同樣式的畫(huà)筆
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);//選擇新筆,并保存舊筆
//畫(huà)直線
pDC->MoveTo(20,60+i1*20);
pDC->LineTo(160,60+i1*20);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯(cuò)提示
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);
//畫(huà)直線
pDC->MoveTo(200,60+i1*20);
pDC->LineTo(340,60+i1*20);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯(cuò)提示
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);
//畫(huà)直線
pDC->MoveTo(380,60+i1*20);
pDC->LineTo(520,60+i1*20);
//恢復(fù)原有的筆
pDC->SelectObject(pOldPen);
}
else
{
//出錯(cuò)提示
AfxMessageBox("CreatePenErroe!!");
}
//刪除新筆
delete pNewPen;
}
//畫(huà)筆程序結(jié)束
(2)畫(huà)刷
在進(jìn)行區(qū)域填充或繪制封閉圖形時(shí),需要用到畫(huà)刷。MFC把GDI畫(huà)刷封裝在CBrush類中。畫(huà)刷分三種基本類型:純色畫(huà)刷、陰影畫(huà)刷和圖案畫(huà)刷。
純色畫(huà)刷繪圖使用單色來(lái)定義,顏色由RGB()函數(shù)來(lái)確定。純色畫(huà)刷可以采用直接聲明的方法,例如:
CBrush Brush(RGB(255,0,0));創(chuàng)建一個(gè)紅色畫(huà)刷。
也可以采用分步方法,由CreateSolidBrush()函數(shù)創(chuàng)建。
CBrush Brush;
Brush->Create->CreateSolidBrush(RGB(255,0,0));
Windows預(yù)定義了七種畫(huà)刷,包括:BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH?梢詤⒄誄Pen類的方法,采用CreateStockObject()來(lái)使用預(yù)定義的畫(huà)刷。
陰影畫(huà)刷使用預(yù)定義的六種陰影樣式進(jìn)行繪圖。表3.3列出了六種陰影樣式。
表3.3六種陰影樣式
陰影樣式
說(shuō)明
HS_BDIAGONAL
45度向下陰影線(從左到右)
HS_CROSS
水平線與垂直線交叉陰影
HS_DIAGCROSS
45度方向的交叉陰影線
HS_FDIAGONAL
45度向上陰影線(從左到右)
HS_HORIZONTAL
水平陰影線
HS_VERTICAL
垂直陰影線
創(chuàng)建陰影畫(huà)刷的方法與純色畫(huà)刷的創(chuàng)建方法相似,例如創(chuàng)建一個(gè)45度方向的交叉陰影線的畫(huà)刷,方法如下:
CBrushBrush(HS_DIAGCROSS,RGB(255,0,0));
或者
CBrush Brush;
Brush->CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
函數(shù)中有兩個(gè)參數(shù),第一個(gè)參數(shù)是畫(huà)刷的陰影樣式,第二個(gè)參數(shù)是陰影線的顏色。
示例:繪制缺省畫(huà)刷的矩形,純色畫(huà)刷矩形和繪制100單位的矩形,并且用白色45度交叉線陰影將其填充,程序如下:
//畫(huà)刷程序
pDC->Rectangle(300,300,400,400); //缺省的畫(huà)刷,白色
//純色畫(huà)刷
CBrush *pNewBrush1;
CBrush *pOldBrush1;
pNewBrush1=new CBrush;
if(pNewBrush1->CreateSolidBrush(RGB(255,0,0)))
{
//選擇新畫(huà)刷
pOldBrush1=pDC->SelectObject(pNewBrush1);
//繪制矩形
pDC->Rectangle(200,200,300,400);
//恢復(fù)原有畫(huà)刷
pDC->SelectObject(pOldBrush1);
}
delete pNewBrush1;
//陰影畫(huà)刷
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ǎn)那個(gè)控件的向下的三角形,就出冒出來(lái)一個(gè)可以調(diào)高度的東東。將高度調(diào)高,否則在執(zhí)行時(shí)會(huì)不能顯示下拉選項(xiàng)。
2.為combo box添加選項(xiàng),在編輯狀態(tài)下選combobox控件的屬性,選Data標(biāo)簽,在編輯框中添加選項(xiàng),按Ctrl-Enter來(lái)添加下一個(gè)選項(xiàng)。
3.為combo box添加變量
combo box有兩個(gè)變量,CComboBox類變量和CString變量。
CComboBox變量用來(lái)設(shè)置combobox的屬性,一般在cdialog類中的oninitdialog()函數(shù)中使用。添加方法是在classwizard中添加變量,添加時(shí)Category中選Control。例如:CComboBox.SetCurSel(0)用來(lái)設(shè)置下拉菜單初始值,具體看MSDN。
CString變量用來(lái)存儲(chǔ)下拉菜單所選的選項(xiàng)值。同樣,當(dāng)選項(xiàng)發(fā)生變化時(shí)要使用UpdateData(TRUE)函數(shù)更新該變量的值。
-----------------------------------------------------------------------------------------------------------------------------
一、初始化Combo Box控件
(1)在資源視圖中,選擇控件的"Properties",然后在Data選項(xiàng)卡里為控件添加初始化數(shù)據(jù),換行是按Ctrl+Enter,然后,再修改Style選項(xiàng)卡里的Type屬性為DropList。
(2)在程序初始化時(shí)動(dòng)態(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指明從那一行開(kāi)始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以選中包含指定字符串的行
二、如何控制ComboBox的下拉長(zhǎng)度
1,首先要知道兩點(diǎn):一、那就是在設(shè)計(jì)界面里,點(diǎn)擊一下Combo Box的下拉箭頭,此時(shí)出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個(gè) No integral height鉤選項(xiàng),表示最大長(zhǎng)度為設(shè)計(jì)長(zhǎng)度,如果實(shí)際內(nèi)容比設(shè)計(jì)長(zhǎng)度多,就出現(xiàn)滾動(dòng)條,少就以實(shí)際長(zhǎng)度顯示。
三、選擇其中的某行
(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開(kāi)始的索引值
五、獲取當(dāng)前選擇的行數(shù)
例如:((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel() 返回的是當(dāng)前選中值的行數(shù),是整型。
或者:UINT m_row = m_combo->GetCurSel()
六、獲得焦點(diǎn)
通常要判斷控件是否獲得了焦點(diǎn),可以用GetFocus()函數(shù)
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點(diǎn)是否在編輯框IDC_EDIT_VALUE2內(nèi)。
但是combobox 的焦點(diǎn)不同,因?yàn)樗怯蒭dit和listbox兩部分組成的
所以獲得焦點(diǎn)要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
------------------------------------------------------------------------------------------------------------------------------
一、如何添加/刪除Combo Box內(nèi)容
1,在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車(chē)。
2,在程序初始化時(shí)動(dòng)態(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,下拉的時(shí)候添加
如:
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指明從那一行開(kāi)始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem) //可以選中包含指定字符串的行
二、如何控制Combo Box的下拉長(zhǎng)度
1,首先要知道兩點(diǎn):一、那就是在設(shè)計(jì)界面里,點(diǎn)擊一下Combo Box的下拉箭頭,此時(shí)出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個(gè) No integral height鉤選項(xiàng),表示最大長(zhǎng)度為設(shè)計(jì)長(zhǎng)度,如果實(shí)際內(nèi)容比設(shè)計(jì)長(zhǎng)度多,就出現(xiàn)滾動(dòng)條,少就以實(shí)際長(zhǎng)度顯示。
三、選擇其中的某行
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);
------------------------------------------------------------------------------------------------------------------------------
兩個(gè)DropDownList控件,選擇第一個(gè)后,第二個(gè)根據(jù)第一個(gè)搜索數(shù)據(jù)庫(kù)表內(nèi)容填充信息。
問(wèn)題是,第一個(gè)DropDownList控件,我實(shí)現(xiàn)了SelectedIndexChanged事件,不過(guò)好像沒(méi)反應(yīng)啊。
謝謝
把Postback設(shè)成True
3:MFC ComboBox使用方法
2009-04-01 21:46:04| 分類: VC/MFC | 標(biāo)簽:combo box vc mfc |字號(hào)訂閱
一、如何添加/刪除Combo Box內(nèi)容
1,在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車(chē)。
2,在程序初始化時(shí)動(dòng)態(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,下拉的時(shí)候添加
如: 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指明從那一行開(kāi)始進(jìn)行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem)//可以選中包含指定字符串的行
二、如何控制Combo Box的下拉長(zhǎng)度
1,首先要知道兩點(diǎn):一、那就是在設(shè)計(jì)界面里,點(diǎn)擊一下Combo Box的下拉箭頭,此時(shí)出現(xiàn)的調(diào)整框就是ComboBox的下拉調(diào)整框。
2,二、屬性里有個(gè) No integral height鉤選項(xiàng),表示最大長(zhǎng)度為設(shè)計(jì)長(zhǎng)度,如果實(shí)際內(nèi)容比設(shè)計(jì)長(zhǎng)度多,就出現(xiàn)滾動(dòng)條,少就以實(shí)際長(zhǎng)度顯示。
三、選擇其中的某行
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);
四、獲得焦點(diǎn)
通常要判斷控件是否獲得了焦點(diǎn),可以用GetFocus()函數(shù)
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點(diǎn)是否在編輯框IDC_EDIT_VALUE2內(nèi)。
但是combobox 的焦點(diǎn)不同,因?yàn)樗怯蒭dit和listbox兩部分組成的
所以獲得焦點(diǎn)要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
Combo Box(組合框)控件很簡(jiǎn)單,可以節(jié)省空間。從用戶角度來(lái)看,這個(gè)控件是由一個(gè)文本輸入控件和一個(gè)下拉菜單組成的。用戶可以從一個(gè)預(yù)先定義的列表里選擇一個(gè)選項(xiàng),同時(shí)也可以直接在文本框里面輸入文本。下面的例子簡(jiǎn)要說(shuō)明如何利用MFC CComboBox Class來(lái)操作字符串列表。
1、定義控件對(duì)應(yīng)變量
假定已經(jīng)創(chuàng)建了一個(gè)Dialog,并且從控件工具箱將 Combo Box 控件拖放到上面。打開(kāi) ClassWizard,添加控件對(duì)應(yīng)變量,如:CComboBox m_cbExamble;
在后面的代碼中會(huì)不斷使用這個(gè)變量。
2、向控件添加 Items
1) 在Combo Box控件屬性的Data標(biāo)簽里面添加,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車(chē)。
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àng),現(xiàn)在要得到被選定項(xiàng)的內(nèi)容,首先要得到該項(xiàng)的位置,然后得到對(duì)應(yīng)位置的內(nèi)容。這里會(huì)用到兩個(gè)函數(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
這種操作一般用于在程序中動(dòng)態(tài)修改控件中該項(xiàng)的值,可以用函數(shù)FindStringExact() 精確匹配,如:
int nIndex = m_cbExample.FindStringExact( nStartAfter, “valueto be found”);
nStartAfter指明從哪一行開(kāi)始查找。如果查找成功,返回的是該項(xiàng)的位置;否則,返回CB_ERR。
也可以選中包含指定字符串的項(xiàng),如:
int nIndex = m_cbExample.SelectString( nStartAfter, “value tobe selected”);
5、刪除控件中的Item
該操作可以利用函數(shù)DeleteString(),需要指定被刪除項(xiàng)的位置,如:
m_cbExample.DeleteString(nIndex);
也可以使用函數(shù)ResetContent(),清除目前的所有項(xiàng),如:
m_cbExample.ResetContent();
6、顯示控件中的某項(xiàng)
int nIndex = m_cbExample.GetCurSel(); //當(dāng)前選中的項(xiàng)
m_cbExample.SetCurSel(nIndex); //設(shè)置第nIndex項(xiàng)為顯示的內(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 在輸入框失去/得到輸入焦點(diǎn)時(shí)產(chǎn)生
ON_CBN_SELCHANGE 列表框中選擇的行發(fā)生改變
ON_CBN_EDITUPDATE 輸入框中內(nèi)容被更新
2:EDITCONTROL的使用
MFC里面的EDIT Control控件的用法是怎么樣的,1.怎么樣才能賦值給EDIT Control控件并在EDITControl控件顯示出來(lái);2.怎么取得EDIT Control控件的值并傳遞給一個(gè)變量?希望各位大俠幫幫忙!
//獲得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對(duì)話框中最頻繁的使用的控件之一
VC++2005提供EditControl的屬性和控件事件操作簡(jiǎn)單方便
1只允許輸入數(shù)字
如果設(shè)置EditControl中只能輸入數(shù)字,在VC6.0中需要編寫(xiě)一個(gè)派生類來(lái)達(dá)到目的,而在VC++2005下只需要在屬性對(duì)話框中將Number的屬性值設(shè)
為T(mén)rue就可以了.
2獲取EditControl的內(nèi)容
兩種方法
第一種,利用MFC應(yīng)用程序向?qū)梢粋(gè)基于對(duì)話框的應(yīng)用程序,從資源視圖中選擇該Dialog窗體,利用右側(cè)的工具箱,向Dialog內(nèi)添加一個(gè)
EditControl項(xiàng),聲明控件變量的類別為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對(duì)應(yīng)的變量m_sEdit_Content中.
由于MFC應(yīng)用程序向?qū)J(rèn)是使用Unicode庫(kù),所以MessageBox中的字符串需要用_T(),否則會(huì)出現(xiàn)constchar[]轉(zhuǎn)換LPCTSTR錯(cuò)誤,如果不使用
Unicode庫(kù)就不需要_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這個(gè)函數(shù)
4限制編輯框的輸入長(zhǎng)度
聲明控件變量的類別為Control,變量類型為CEdit,變量名為m_Edit_Content.
在對(duì)話框初始化的地方寫(xiě)m_Edit_Content.SetLimitText(1);
編輯框就只能輸入一個(gè)字符了.
1:各控件變量的關(guān)聯(lián)與消息映射
DoDataExchange為各控件的變量進(jìn)行關(guān)聯(lián),其中控件的control類型變量,用來(lái)控制控件的各種屬性以及顯示等動(dòng)作,Value類型的變量用來(lái)獲取控件的值?梢宰约禾砑右部梢酝ㄟ^(guò)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ù),注冊(cè)
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()
|