是这样的,我在做一个,当用户双击该CListView中的某个单元格之后,在该单元格创建一个CIPAddressCtrl,然后接收用户对IP地址的修改等操作,遇到的两个问题如下:1、IPAddressCtrl中有4个IP输入点,即Field,当在Field0输入完数字后,点击“.”,按通常的操作,光标会自动跳到Field1,但是现在程序直接就执行了KillFocus相应,在这里我用的是ON_EN_KILLFOCUS响应事件,在CSDN上看到相关的帖子,就焦点的问题,解决了一些问题,但是此问题没有解决。
另外,如果用鼠标点击Field1的时候,也会相应ON_EN_KILLFOCUS事件,郁闷!!如何解决?2、在相应ON_EN_KILLFOCUS事件之后,手动创建的IPAddressCtrl会Destroy掉,同时对应的ListView单元格字符也会根据用户输入的进行更新,这个都实现了,但是,IPAddressCtrl的父窗口,也就是ListView以及ListView的父窗口中所有文字字符的字体全部变了,我试着在用了SetFont都没有用。贴代码:/// CPP file
CPopIPAddress::CPopIPAddress(CListCtrl* pListCtrl, LPCTSTR lpText, int nRow, int nCol)
: m_pListCtrl(pListCtrl)
, m_iItem(nRow)
, m_iSubItem(nCol)
, m_sInitText(lpText)
, m_bESC(0)
{
}CPopIPAddress::CPopIPAddress()
{
}CPopIPAddress::~CPopIPAddress()
{
}BEGIN_MESSAGE_MAP(CPopIPAddress, CWnd)
//{{AFX_MSG_MAP(CPopIPAddress)
ON_WM_CREATE()
ON_WM_NCDESTROY()
ON_WM_MOUSEWHEEL()
//}}AFX_MSG_MAP
ON_EN_KILLFOCUS(2006,OnEnKillFocus)
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CPopIPAddress message handlersint CPopIPAddress::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CIPAddressCtrl::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CFont* pFont = GetParent()->GetFont();

SetFont(pFont);
char szIP[16]=_T("0");// 255.255.255.255
strcpy(szIP,(LPCTSTR)m_sInitText);
this->SetAddress(IpTextToDWORD(szIP)); SetFocus();
return 0;
}BOOL CPopIPAddress::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
if( pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_RETURN
|| pMsg->wParam == VK_DELETE
|| pMsg->wParam == VK_ESCAPE
|| GetKeyState( VK_CONTROL)
)
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE;      // DO NOT process further
}
}
return CWnd::PreTranslateMessage(pMsg);
}void CPopIPAddress::OnEnKillFocus() 
{
CWnd* pWnd=GetFocus();
if(pWnd==this) 
return;
// CWnd::OnKillFocus(pNewWnd);
/*
// TODO: Add your message handler code here
DWORD dw;
GetAddress(dw);
CString str=IpDWORDToText(dw); // 如果对应的单元格数据修改, 则向实际CReportCtrl对象发送一个NM_CELLVALUE_CHANGED通知
// 通过这个通知就可以得到是那个单元格修改了什么数据
if(strcmp((LPCTSTR)str,(LPCTSTR)m_sInitText)!=0 && !m_bESC)
{
m_pListCtrl->SetItemText(m_iItem,m_iSubItem,str);
NMLISTVIEW lv;
lv.hdr.code=NM_CELLVALUE_CHANGED;
lv.hdr.hwndFrom=GetSafeHwnd();
lv.hdr.idFrom=GetDlgCtrlID();
lv.iItem=m_iItem; // 行索引;
lv.iSubItem=m_iSubItem; // 列索引;
lv.lParam=(LPARAM)&m_sInitText; // 原来的单元格字符串;
::SendNotifyMessage(GetParent()->GetParent()->m_hWnd,WM_NOTIFY,GetParent()->GetDlgCtrlID(),(LPARAM)&lv);
}
*/
SetNotify();
DestroyWindow();
}void CPopIPAddress::OnNcDestroy() 
{
// TODO: Add your message handler code here
CIPAddressCtrl::OnNcDestroy(); delete this;
}BOOL CPopIPAddress::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
// TODO: Add your message handler code here and/or call default
m_bESC=TRUE;
DestroyWindow();
return TRUE;
}void CPopIPAddress::SetNotify()
{
CString str;
DWORD dwIP;
GetAddress(dwIP);
str=IpDWORDToText(dwIP);
// 如果对应的单元格数据修改, 则向实际CReportCtrl对象发送一个NM_CELLVALUE_CHANGED通知
// 通过这个通知就可以得到是那个单元格修改了什么数据
if(strcmp((LPCTSTR)str,(LPCTSTR)m_sInitText)!=0 && !m_bESC)
{
m_pListCtrl->SetItemText(m_iItem, m_iSubItem, str);
NMLISTVIEW lv;
lv.hdr.code=NM_CELLVALUE_CHANGED;
lv.hdr.hwndFrom=GetSafeHwnd();
lv.hdr.idFrom=GetDlgCtrlID();
lv.iItem=m_iItem; // 行索引;
lv.iSubItem=m_iSubItem; // 列索引;
lv.lParam=(LPARAM)&m_sInitText; // 原来的单元格字符串;
::SendNotifyMessage(::GetParent(m_hWnd),WM_NOTIFY,::GetDlgCtrlID(::GetParent(m_hWnd)),(LPARAM)&lv);
}
}/// head file
class CPopIPAddress : public CIPAddressCtrl  
{
// Construction
public:
CPopIPAddress(CListCtrl* pListCtrl, LPCTSTR lpText, int nRow, int nCol);
CPopIPAddress();// Implementation
virtual ~CPopIPAddress();// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPopIPAddress)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL // Generated message map functions
protected:
//{{AFX_MSG(CPopIPAddress)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnNcDestroy();
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
//}}AFX_MSG
afx_msg void OnEnKillFocus(); DECLARE_MESSAGE_MAP()
private:
void SetNotify();
BOOL    m_bESC;   // To indicate whether ESC key was pressed
int m_iItem;
int m_iSubItem;
DWORD m_dwIP;
CString m_sInitText;
CListCtrl* m_pListCtrl; CRect m_rect; // rectangle of IPAddressCtrl;
HWND m_hParent;
};