介紹
在很多VC技術(shù)論壇中經(jīng)??吹揭恍┤颂岢鰜?lái)許多的問(wèn)題,其中有很多的問(wèn)題具有很多的針對(duì)性和普片性,這里就兩個(gè)問(wèn)題進(jìn)行簡(jiǎn)要的回答,也許很多高手有更簡(jiǎn)單的解答方法,不過(guò)這里的方法希望能給各位或者初學(xué)者有幫助.
正文
問(wèn)題一.如何是ED99v支持小數(shù)的輸入.
一般的ED99v控件支持很多格式的輸入,如果要支持?jǐn)?shù)據(jù)的輸入的話,你可以修改ED99v控件屬性,選中NUMBER屬性就可以了,但是這樣不支持.號(hào)的輸入,也就是不支持小數(shù)的輸入了.
這里的解決方法是派生一個(gè)類(lèi)CED99v,然后映射消息EN_CHANGE,因?yàn)槿绻愕目丶褂眠@個(gè)派生類(lèi)的話,在你進(jìn)行你的ED99v控件進(jìn)行輸入字符改變的時(shí)候都會(huì)觸發(fā)這個(gè)事件,不用為你的控件每個(gè)觸發(fā)EN_CHANGE事件了.然后判斷新輸入的字符,如果這個(gè)字符符合數(shù)字規(guī)則或者.號(hào)規(guī)則,再計(jì)算已經(jīng)出現(xiàn)的.號(hào)次數(shù),當(dāng)符合這種條件時(shí)允許輸入操作,否則刪除剛輸入的字符,進(jìn)行重新設(shè)置編輯框字符串的操作.
可能涉及到的問(wèn)題,1:如何判斷一個(gè)字符串是數(shù)字還是別的類(lèi)型.2:如何查找一個(gè)字符串中某個(gè)符號(hào)出現(xiàn)的次數(shù).3:如何設(shè)置ED99v光標(biāo)的位置.
1 問(wèn)題的解決方法可以利用下面的方法解決.
CString strtemp=szTemp.SpanIncluding(\"0123456789\");
if(!strtemp.IsEmpty())
//這個(gè)字符串為數(shù)字
else
//非數(shù)字
2 問(wèn)題我用循環(huán)遞歸的方法實(shí)現(xiàn),首先查找最先出現(xiàn)的符號(hào)位置,然后利用字符串分割技術(shù)取RIGHT部分再進(jìn) 行循環(huán)調(diào)用就可以了,相關(guān)代碼可以見(jiàn)下:
int CNumEditCtrl::GetStringNum(CString szVal)//獲得字符串中間.號(hào)的個(gè)數(shù)
{
int nNum=0;
while(1)
{
int nCount=szVal.Find(\’.\’);
if(nCount==-1)
break;
szVal=szVal.Right(szVal.GetLength()-nCount-1);
nNum++;
}
return nNum;
}
3 問(wèn)題可以采用獲得ED99v控件句柄發(fā)送EM_SETSEL消息的方法實(shí)現(xiàn).
所以基本代碼可以實(shí)現(xiàn)見(jiàn)下了:
void CNumEditCtrl::OnChange()
{
// TODO: If this is a RICHED99v control, the control will not
// send this notification unless you override the CEdit::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
CString m_estr,szTemp;
GetWindowText(m_estr);
int nLen=m_estr.GetLength();
if(!m_estr.IsEmpty())
{
szTemp=m_estr.Right(1);
BOOL bNum=TRUE;
CString strtemp=szTemp.SpanIncluding(\"0123456789\");
if(!strtemp.IsEmpty())
bNum=TRUE;
else
bNum=FALSE;
nPoint=GetStringNum(m_estr);
if(strcmp(szTemp,\".\")==0 || bNum)
{
if(nPoint>1)
{
nPoint--;
::AfxMessageBox(\".號(hào)出現(xiàn)次數(shù)超過(guò)兩次!\");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
else
{
::AfxMessageBox(\"輸入格式錯(cuò)誤\");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
// TODO: Add your control notification handler code here
}
問(wèn)題二.如何使用PICTURE控件顯示ED99v控件內(nèi)容
PICTURE控件不能進(jìn)行SETWINDOWTEXT操作,所以不能直接使用控件不能顯示字符.但是如果派生CSTATIC,然后處理WM_PAINT消息進(jìn)行控件的重繪操作就可以實(shí)現(xiàn)了.代碼其實(shí)都是狠簡(jiǎn)單的.下面的方法可以參考.
void CShowStrPicWnd::OnPaint()
{
CPaintDC dc(this); // d
m_Brush.DeleteObject();
m_Brush.CreateSolidBrush(RGB(255,128,64));
CDC* pDC = GetDC();
pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(RGB(255,128,64));
pDC->SelectObject(&m_Brush);
CRect rc;
GetClientRect(&rc);
ScreenToClient(&rc);
pDC->Rectangle(0, 0, rc.Width(), rc.Height());
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(2, 2, strText.GetBuffer(strText.GetLength()));
// Do not call CStatic::OnPaint() for painting messages
}
然后觸發(fā)控件EN_CHANGE消息,這樣就能夠?qū)⑿畔鬟f到PIC了,再調(diào)用INVALIDATERECT進(jìn)行界面的重繪工作.
在很多VC技術(shù)論壇中經(jīng)??吹揭恍┤颂岢鰜?lái)許多的問(wèn)題,其中有很多的問(wèn)題具有很多的針對(duì)性和普片性,這里就兩個(gè)問(wèn)題進(jìn)行簡(jiǎn)要的回答,也許很多高手有更簡(jiǎn)單的解答方法,不過(guò)這里的方法希望能給各位或者初學(xué)者有幫助.
正文
問(wèn)題一.如何是ED99v支持小數(shù)的輸入.
一般的ED99v控件支持很多格式的輸入,如果要支持?jǐn)?shù)據(jù)的輸入的話,你可以修改ED99v控件屬性,選中NUMBER屬性就可以了,但是這樣不支持.號(hào)的輸入,也就是不支持小數(shù)的輸入了.
這里的解決方法是派生一個(gè)類(lèi)CED99v,然后映射消息EN_CHANGE,因?yàn)槿绻愕目丶褂眠@個(gè)派生類(lèi)的話,在你進(jìn)行你的ED99v控件進(jìn)行輸入字符改變的時(shí)候都會(huì)觸發(fā)這個(gè)事件,不用為你的控件每個(gè)觸發(fā)EN_CHANGE事件了.然后判斷新輸入的字符,如果這個(gè)字符符合數(shù)字規(guī)則或者.號(hào)規(guī)則,再計(jì)算已經(jīng)出現(xiàn)的.號(hào)次數(shù),當(dāng)符合這種條件時(shí)允許輸入操作,否則刪除剛輸入的字符,進(jìn)行重新設(shè)置編輯框字符串的操作.
可能涉及到的問(wèn)題,1:如何判斷一個(gè)字符串是數(shù)字還是別的類(lèi)型.2:如何查找一個(gè)字符串中某個(gè)符號(hào)出現(xiàn)的次數(shù).3:如何設(shè)置ED99v光標(biāo)的位置.
1 問(wèn)題的解決方法可以利用下面的方法解決.
CString strtemp=szTemp.SpanIncluding(\"0123456789\");
if(!strtemp.IsEmpty())
//這個(gè)字符串為數(shù)字
else
//非數(shù)字
2 問(wèn)題我用循環(huán)遞歸的方法實(shí)現(xiàn),首先查找最先出現(xiàn)的符號(hào)位置,然后利用字符串分割技術(shù)取RIGHT部分再進(jìn) 行循環(huán)調(diào)用就可以了,相關(guān)代碼可以見(jiàn)下:
int CNumEditCtrl::GetStringNum(CString szVal)//獲得字符串中間.號(hào)的個(gè)數(shù)
{
int nNum=0;
while(1)
{
int nCount=szVal.Find(\’.\’);
if(nCount==-1)
break;
szVal=szVal.Right(szVal.GetLength()-nCount-1);
nNum++;
}
return nNum;
}
3 問(wèn)題可以采用獲得ED99v控件句柄發(fā)送EM_SETSEL消息的方法實(shí)現(xiàn).
所以基本代碼可以實(shí)現(xiàn)見(jiàn)下了:
void CNumEditCtrl::OnChange()
{
// TODO: If this is a RICHED99v control, the control will not
// send this notification unless you override the CEdit::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
CString m_estr,szTemp;
GetWindowText(m_estr);
int nLen=m_estr.GetLength();
if(!m_estr.IsEmpty())
{
szTemp=m_estr.Right(1);
BOOL bNum=TRUE;
CString strtemp=szTemp.SpanIncluding(\"0123456789\");
if(!strtemp.IsEmpty())
bNum=TRUE;
else
bNum=FALSE;
nPoint=GetStringNum(m_estr);
if(strcmp(szTemp,\".\")==0 || bNum)
{
if(nPoint>1)
{
nPoint--;
::AfxMessageBox(\".號(hào)出現(xiàn)次數(shù)超過(guò)兩次!\");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
else
{
::AfxMessageBox(\"輸入格式錯(cuò)誤\");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
// TODO: Add your control notification handler code here
}
問(wèn)題二.如何使用PICTURE控件顯示ED99v控件內(nèi)容
PICTURE控件不能進(jìn)行SETWINDOWTEXT操作,所以不能直接使用控件不能顯示字符.但是如果派生CSTATIC,然后處理WM_PAINT消息進(jìn)行控件的重繪操作就可以實(shí)現(xiàn)了.代碼其實(shí)都是狠簡(jiǎn)單的.下面的方法可以參考.
void CShowStrPicWnd::OnPaint()
{
CPaintDC dc(this); // d
m_Brush.DeleteObject();
m_Brush.CreateSolidBrush(RGB(255,128,64));
CDC* pDC = GetDC();
pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(RGB(255,128,64));
pDC->SelectObject(&m_Brush);
CRect rc;
GetClientRect(&rc);
ScreenToClient(&rc);
pDC->Rectangle(0, 0, rc.Width(), rc.Height());
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(2, 2, strText.GetBuffer(strText.GetLength()));
// Do not call CStatic::OnPaint() for painting messages
}
然后觸發(fā)控件EN_CHANGE消息,這樣就能夠?qū)⑿畔鬟f到PIC了,再調(diào)用INVALIDATERECT進(jìn)行界面的重繪工作.