久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7367|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩综合在线 | 天天操天天干天天曰 | 欧美寡妇偷汉性猛交 | 国产在线一区二区三区 | 男女羞羞视频网站 | 亚洲精品久久久一区二区三区 | 亚洲视频在线观看一区二区三区 | 欧美日韩在线一区二区 | 日本一区二区三区视频在线 | 天天草视频| 9999视频| 精品国产乱码久久久久久蜜柚 | 国产欧美一区二区精品忘忧草 | 黄色毛片大全 | 欧美高清视频 | 一a级片 | 欧美日韩久久精品 | 五月婷婷亚洲 | 99热国产免费 | 成人亚洲| 国产精品日韩欧美一区二区三区 | 亚洲人成人一区二区在线观看 | 亚洲成人免费在线 | 免费在线h视频 | 亚洲福利 | 男人天堂久久 | 国产又爽又黄的视频 | 欧美一区二区视频 | 久久久久久久一区 | 欧美日韩在线观看一区 | 中文字幕精品一区 | 亚洲一区二区中文字幕 | 成人在线免费观看 | 免费精品视频 | 国产在线高清 | 日韩成人 | 碰碰视频| 亚洲国产91 | 天天拍天天操 | 欧美日韩a| 国产一区影院 |