· | ON_EN_CHANGE | 用戶采取的行動可能會改變編輯控件的文本。與EN_UPDATE通知消息不同,該通知是在Windows更新顯示之后發送的。 |
· | ON_EN_ERRSPACE | 編輯控件不能為特定請求分配足夠的空間。 |
· | ON_EN_HSCROLL | 用戶單擊了編輯控件中的水平滾動條,父窗口在屏幕更新之前被通知。 |
· | ON_EN_KILLFOCUS | 編輯控件失去輸入焦點。 |
· | ON_EN_MAXTEXT | 當前輸入超過了為編輯控件指定的數目,並作截尾處理。當編輯控件不具有ON_EN_HSCROLL風格且要輸入的字符會超過編輯控件的寬度時,發送消息。當編輯控件不具有ON_EN_VSCROLL風格且要輸入的字符會超過編輯控件的高度時,也會發送消息。 |
· | ON_EN_SETFOCUS | 編輯控件獲得焦點。 |
· | ON_EN_UPDATE | 編輯控件將要顯示變動的文本。在控件對文本格式化之后但在顯示文本之前發送消息,以便在必要時改變窗口尺寸。 |
· | ON_EN_VSCROLL | 用戶單擊了編輯控件中的垂直滾動條,父窗口在屏幕更新之前被通知。 |
CEdit | 構造一個CEdit控件對象 |
Create | 創建一個Windows編輯控件,並將其與CEdit對象連接 |
CanUndo | 決定一個編輯控件操作是否能夠被撤銷 |
GetLineCount | 獲得多行編輯控件中的行數 |
GetModify | 決定編輯控件的內容是否被修改 |
SetModify | 為編輯控件設置或清除修改標記 |
GetRect | 為編輯控件獲取格式化的矩形 |
GetHandle | 獲得為當前多行編輯控件分配的內存的句柄 |
SetHandle | 設置為多行編輯控件使用的本地內存的句柄 |
SetMargins | 為CEdit設置左邊和右邊的空白邊界 |
GetMargins | 獲得為CEdit設置左邊和右邊的空白邊界 |
SetLimitText | 設置CEdit能夠容納的文本的最大量 |
GetLimitText | 獲得CEdit能夠容納的文本的最大量 |
PosFromChar | 獲得指定字符索引的左上角的坐標 |
CharFromPos | 獲得最靠近指定位置的字符的行和字符索引 |
GetLine | 從編輯控件中獲得一行文本 |
GetPasswordChar | 獲得當用戶輸入文本時在編輯控件中顯示的口令 |
GetFirstVisibleLeLine | 決定在編輯控件中最頂部的可視的行 |
EmptyUndoBuffer | 重新設置(清除)編輯控件的撤銷標記 |
FmtLines | 設置在多行編輯控件中的軟回車打開或關閉 |
LimitText | 用戶在輸入文本時的文本長度限制 |
LineFromChar | 獲得包含指定字符索引的行的數目 |
LineIndex | 獲得在多行編輯控件中的某行的字符索引 |
LineLength | 獲得編輯控件中的行的長度 |
LineScroll | 在多行編輯控件中滾動文本 |
ReplaceSel | 用指定文本覆蓋編輯控件中當前被選中的文本 |
SetPasswordChar | 設置或清除當用戶輸入文本時在編輯控件中顯示的口令 |
SetRect | 設置多行編輯控件的帶格式的矩形,並更新該控件 |
SetRectNP | 設置多行編輯控件的帶格式的矩形,而不必重新繪制 |
SetSel | 在編輯控件中選定文本SetTabStops設置多行編輯控件的制表鍵停頓位 |
SetReadOnly | 為編輯控件設置只讀狀態 |
Undo | 撤銷上一次的編輯控件操作 |
Clear | 刪除(清除)編輯控件中當前選中的文本 |
Copy | 將編輯控件中的當前選中文本以CF_TEXT格式拷貝到剪貼板中 |
Cut | 刪除編輯控件中當前選中的文本,並將刪除的文本以CF_TEXT格式拷貝到剪貼板中 |
Paste | 在當前光標位置插入剪貼板內的文本。只有在剪貼板數據為CF_TEXT格式時才進行插入 |
CEdit::SetLimitText
void SetLimitText( UINT nMax );
參數說明
nMax
The new text limit, in bytes.
新的文本限制,以字節計算。
備注
Call this member function to set the text limit for this CEdit object. The text limit is the maximum amount of text, in bytes, that the edit control can accept.
調用此成員函數設置編輯控件中的文本的長度限制。此限制是編輯控件可以接收的以字節形式表示的文本大小。
Changing the text limit restricts only the text the user can enter. It has no effect on any text already in the edit control, nor does it affect the length of the text copied to the edit control by the SetWindowText member function in CWnd. If an application uses the SetWindowText function to place more text into an edit control than is specified in the call toLimitText, the user can delete any of the text within the edit control. However, the text limit will prevent the user from replacing the existing text with new text, unless deleting the current selection causes the text to fall below the text limit.
改變文本限定僅使用戶能輸入的文本受到限制,而對已在編輯控件中的文本沒有影響,也不影響用CWnd中的SetWindowText成員函數能拷貝到編輯控件中的文本的長度。如果用SetWindowText函數輸入的文本超過調用LimitText函數所指定的值,則用戶可以在編輯控件中刪除任何文本,但文本限制會禁止用戶將已存在的文本替換為新文本,直到刪除當前所選文本而使文本大小降至限制以內。
詳情:
用VC++6.0編程的時候,文本編輯控件Edit Box是一個經常用到的控件。如果你是用它輸入一些簡單的文字、數字等信息,直接拿來用就可以了,但如果你用它制作大文本的編輯軟件,就會覺得不好控制,許多功能無法實現,即便用CEditView,也只會生成一個類似於記事本的東西,再想加入些自己編寫的功能也很困難。下面我以CEdit為基類定義了一個CEditBox類,加入了許多文本編輯時經常要用到的接口函數,用它來控制Edit Box控件就很容易制作出具有較強文本編輯功能的編輯軟件了。
在這個擴展類中主要增加了以下功能:
①增加控件的容量,使它能容納大文本;
②可設置編輯控件文字顏色、背景色和字體;
③對控件內的文本和選擇文本的訪問;
④直接裝入文件到控件和保存控件內容到文件;
⑤自定義的右鍵菜單;
⑥多重ReDo/UnDo功能。
這些功能基本上都是獨立的,實際使用時可根據需要選用所需功能。
准備工作:用ClassWizard在工程中加入一個新類,基類選為CEdit,類名設置為CEditBox。
一、設置控件的容量:
EditBox控件默認情況下只能裝入64K的文本,如果超出,多出部分會被自動截掉。利用CEdit類的SetLimitText()函數可重新設置控件容量。
函數原型為:
void SetLimitText(UINT nMax);
參數為nMax為控件可接收的文本最大字節數。
設置方法:用ClassWizard在CEditBox類中添加消息函數PreSubclassWindow(),把設置文本容量的語句放在里面即可。
void CEditBox::PreSubclassWindow() |
因為nMax為無符號整型,-1是把它設置為可以取到的最大值。你也可以根據需要設置控件的容量。
注意:在不同操作系統下,控件可設置的最大容量也不同。如果是Windows98,這個值就是64K,無法再增大了,而在Windows2000和WindowsXP下這個值要大得多,才可以起到增加控件容量的目的。
二、設置編輯控件的前景色、背景色和字體:
在CEditBox的頭文件中加入以下變量定義:
COLORREF m_ForeColor; //文本顏色 |
在CEditBox的構造函數中設置它們的初值:
CEditBox::CEditBox() |
在CEditBox的析構函數中回收創建的字體資源:
CEditBox::~CEditBox() |
這里只設置了前景色和背景色的默認值,如果想設置默認字體,可在上面的PreSubclassWindow()函數中進行設置:
void CEditBox::PreSubclassWindow() |
這里使用了比較簡單的CreatePointFont()函數創建字體,它只需給出字體尺寸和字體名。如果想創建更復雜的字體,可以改用CreateFont()函數。本例中設置控件的初始字體為尺寸為100(0.1點)的“宋體”字。
如果你想用EditBox本身的默認字體作為初始字體,就不要在PreSubclassWindow()函數中加入這些語句。
用ClassWizard添加消息反射函數CtlColor()來修改控件的文本顏色和背景色。
注意:在ClassWizard下可看到有兩個很相似的消息,一個是“=WM_CTLCOLOR”消息,另一個是“WM_CTLCOLOR”消息,這里必須用“=WM_CTLCOLOR”消息添加函數。如果誤用了“WM_CTLCOLOR”消息將得不到想要的效果。
HBRUSH CEditBox::CtlColor(CDC* pDC, UINT nCtlColor) |
PreSubclassWindow()和CtlColor()函數都是消息函數,為了設置控件顏色和字體,還需定義接口函數在使用時調用:
//設置文本顏色 |
至此,用CEditBox類可以定義出可設置顏色和字體的Edit Box控件了。使用時,先在對話框中加入一個Edit Box控件,用ClassWizard為定義一個控制變量m_Edit,類型設定為CEditBox。然后用m_Edit.SetForeColor(color)、m_Edit.SetBkColor()和m_Edit.SetTextFont(FontHight,FontName)為控件設置顏色和字體,這樣就可以作出一個美觀的文本框了。
說明:Edit Box控件只能放入純文本,不支持對文本格式的設置,也就不能對局部的文字顏色和字體進行設置,所以,以上設置都是針對整個控件的。
三、訪問編輯控件的內容:
Edit Box控件已經提供了幾種訪問控件內容的方法:
①定義一個與控件關聯的變量,類型可設置為CString或其它類型,用UpdateData()函數來更新控件或變量。
②用GetWindowText()獲取控件內文本,用SetWindowText()設置控件文本。
③用SetSel()設置控件內的選擇區,用GetSel()獲取控件中選擇文本的位置,用ReplaceSel()替換選擇的文本。
但只用這幾種方法還是不太方便,所以在CEditBox類中又增加了幾個訪問接口函數。
1、讀取控件文本ReadText()
int CEditBox::ReadText(CString& str) |
參數str是字符串的引用,用於接收讀取的控件內容,返回值是控件中文本字節數。
2、用字符串設置控件內容SetText()
void CEditBox::SetText(LPCTSTR str) |
參數str是准備設置控件的內容,要求是字符串。
3、讀取當前選擇的文本ReadSelText()
int CEditBox::ReadSelText(CString& str) |
參數str是字符串的引用,用於接收讀出的文本,返回值是讀出的文本字節數。
如果當前控件中有內容被選擇,則讀出選擇文本,並返回長度;如果沒有選擇的文本,讀出的是空串,返回為0。
4、設置選擇區SetSelText()
void CEditBox::SetSelText(int nStartChar,int nSelLen) |
參數nStartChar為選擇區起點(從0算起),nSelLen為選擇區長度。
功能是把控件的指定區域設置為選擇的狀態。
5、當前是否有選擇isSelect()
BOOL CEditBox::isSelect() |
如果當前控件中有選擇的文本,返回非0值,否則返回0。
以上是為了使控件訪問更方便而增加的接口函數。再配合CEdit本身提供的訪問函數,很多操作都可輕易實現了。
CEdit控件提供訪問函數主要有:
int GetWindowText(LPCTSTR lpszStringBuf,intnMaxCount);
獲取控件文本,與ReadText()功能相同。
void SetWindowText(LPCTSTR lpszString);
設置控件文本。
void GetSel(int& nStartChar,int& nEndChar);
獲取選擇區的位置
void SetSel(int nStartChar,intnEndChar,BOOL bNoScroll=FALSE);
設置選擇區,參數為起點和終點,用SetSel(0,-1)可設置為全選
void ReplaceSel(LPCTSTR lpszNewText,BOOLbCanUndo=FALSE);
用字符串替換選擇的文本
四、與文件的接口:
這部分接口函數供“打開文件”和“保存文件”等操作調用。把它們定義在CEditBox類中,增強了控件的封裝性,也可以簡化應用中“打開”和“保存”的操作。
1、文件內容裝入Edit控件
void CEditBox::LoadFile(LPCTSTR PathName) |
參數PathName為文件路徑名,調用該函數可以把指定文件裝入編輯控件。如果文件不存在,直接返回。
2、保存編輯控件內容到文件
void CEditBox::SaveFile(LPCTSTR PathName) |
參數PathName為文件路徑名,調用該函數可以把控件內容寫入指定文件。如果建立文件失敗,直接返回。
3、新建文件
void CEditBox::NewFile() |
供“新建”文件菜單消息調用,功能是清空控件。
4、是否有文件打開
BOOL CEditBox::isOpenFile() |
如果控件中已經有打開的文件,返回非0,否則返回0。
5、獲取打開的文件名
CString CEditBox::GetPathName() |
如果控件中已經有打開的文件,返回文件路徑名,否則返回空串。
這5個函數中的m_PathName是在CEditBox中定義的字符串變量,並初始化為空串。
五、自定義右鍵菜單:
文本編輯框已經提供了一個默認右鍵菜單,如果你想重新定義一個來代替它,可以按下面的方法制作。
在VC++的Project菜單下選擇AddTo Project下的Components and Controls,在彈出的對話框中打開Visual C++Components,找到Pop-up Menu,單擊Insert按鈕,選擇加入的類為CEditBox,確定。關閉對話框。
這時,你在CEditBox類中會看到已經加入了下面的代碼:
void CEditBox::OnContextMenu(CWnd*, CPoint point) |
再到資源的Menu下,你可以找到一個ID號為CG_IDR_POPUP_EDIT_BOX的新菜單,編輯它就可得到你想要的右鍵菜單了。這和其它菜單的做法沒有區別,我就不再詳細介紹了。
1.讓List Control有Check Box
用SetExtendedStyle方法可以設置,看代碼:
(CListCtrl m_ListCtrl;)
DWORD dwStyle = m_ListCtrl.GetStyle();
dwStyle |= LVS_EX_CHECKBOXES;
m_ListCtrl.SetExtendedStyle(dwStyle);
2.讓List Box有Check Box
首先,聲明Control變量的時候用CCheckListBox代替CListBox。
然后,將List Box的Has Strings屬性改為True;把Ower Draw屬性改為Fixed。
3.Spin Control與Edit Control的綁定
首先,要讓Spin Control的Tap Order緊跟着Edit Control(就是說,Spin Control的Tap Order是Edit Control的Tap Order加1)。
然后,設置Spin Control的Auto Buddy和Set Buddy Integer屬性為True。
4.可以設置背景和文字顏色的Static控件
從CStatic類繼承一個自己的Static類,相應WM_CTLCOLOR消息。下面是代碼:
.h文件:
class ClxStatic : public CStatic
{
DECLARE_DYNAMIC(ClxStatic)
public:
ClxStatic();
virtual ~ClxStatic();
afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);
void SetBackColor(COLORREF clrBack);
void SetTextColor(COLORREF clrText);
protected:
DECLARE_MESSAGE_MAP()
CBrush m_brushBack;
COLORREF m_clrBack;
COLORREF m_clrText;
};
.cpp文件:
IMPLEMENT_DYNAMIC(ClxStatic, CStatic)
ClxStatic::ClxStatic()
{
m_clrBack = ::GetSysColor(COLOR_BTNFACE);
m_clrText = ::GetSysColor(COLOR_BTNTEXT);
}
ClxStatic::~ClxStatic()
{
}
void ClxStatic::SetBackColor(COLORREF clrBack)
{
m_clrBack = clrBack;
}
void ClxStatic::SetTextColor(COLORREF clrText)
{
m_clrText = clrText;
}
BEGIN_MESSAGE_MAP(ClxStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
HBRUSH ClxStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
// TODO: Change any attributes of the DC here
m_brushBack.Detach();
m_brushBack.CreateSolidBrush(m_clrBack);
pDC->SetBkColor(m_clrBack);
pDC->SetTextColor(m_clrText);
// TODO: Return a non-NULL brush if the parent's handler should not be called
//return NULL;
return (HBRUSH)m_brushBack.GetSafeHandle();
}
5.在Static控件中顯示BMP
首先,給Static控件添加一個Control變量(ID要改了以后才能添加變量,也就是說ID不能為IDC_STATIC),本例為m_staticTest。
然后,用ModifyStyle函數修改Static控件的Style,讓它可以顯示圖片:
m_staticTest.ModifyStyle(0, SS_BITMAP | SS_CENTERIMAGE);
最后,就是Load文件顯示出來:
CRect rect;
m_staticTest.GetWindowRect(&rect);
// 下面的方法是按照Static控件的大小顯示bmp,如果要安裝圖片實際大小顯示,用這個方法Load圖片:
// HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\test.bmp"), IMAGE_BITMAP, rect.Width(), rect.Height(), LR_LOADFROMFILE);
m_staticTest.SetBitmap(hBmp);
DeleteObject(hBmp);