维护到一个古老的gm工具的时候 需要这个功能 在网上找到一份很好用的代码 贴到这里 再次感谢那位同僚
#pragma once//#include "OrangeMessage.h"// COrangeEditclass COrangeEdit : public CEdit{ DECLARE_DYNAMIC(COrangeEdit)public: COrangeEdit(); virtual ~COrangeEdit();protected: DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow();public: afx_msg void OnKillFocus(CWnd* pNewWnd);};
// OrangeEdit.cpp : 实现文件//#include "stdafx.h"//#include "ListDemo.h"#include "OrangeEdit.h"#include "WindowManager.h"// COrangeEditIMPLEMENT_DYNAMIC(COrangeEdit, CEdit)COrangeEdit::COrangeEdit(){}COrangeEdit::~COrangeEdit(){}BEGIN_MESSAGE_MAP(COrangeEdit, CEdit) ON_WM_KILLFOCUS()END_MESSAGE_MAP()// COrangeEdit 消息处理程序void COrangeEdit::PreSubclassWindow(){ // TODO: 在此添加专用代码和/或调用基类 CEdit::PreSubclassWindow();}void COrangeEdit::OnKillFocus(CWnd* pNewWnd){ CEdit::OnKillFocus(pNewWnd); // TODO: 在此处添加消息处理程序代码 CWnd* pParent = this->GetParent(); ::SendMessage(pParent->GetSafeHwnd(),ORANGE_LVN_ENDEDIT,0,0);}
#pragma once#include "orangeedit.h"//#include "OrangeMessage.h"// COrangeListCtrlclass COrangeListCtrl : public CListCtrl{ DECLARE_DYNAMIC(COrangeListCtrl)public: COrangeListCtrl(); virtual ~COrangeListCtrl();protected: DECLARE_MESSAGE_MAP()public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); afx_msg void OnLButtonDown(UINT nFlags, CPoint point);protected: virtual void PreSubclassWindow(); afx_msg LRESULT OnEndEdit(WPARAM wParam,LPARAM lParam); void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);private: int m_nItem;//主项 int m_nSubItem;//子项 COrangeEdit m_Edit_ctlItem; CFont m_FontItem; int m_nRowHeight;public: void SetRowHeigt(int nHeight);};
// OrangeListCtrl.cpp : 实现文件//#include "stdafx.h"#include "WindowManager.h"#include "OrangeListCtrl.h"// COrangeListCtrlIMPLEMENT_DYNAMIC(COrangeListCtrl, CListCtrl)COrangeListCtrl::COrangeListCtrl(){ m_nRowHeight=0;}COrangeListCtrl::~COrangeListCtrl(){}BEGIN_MESSAGE_MAP(COrangeListCtrl, CListCtrl) ON_WM_LBUTTONDOWN() ON_MESSAGE(ORANGE_LVN_ENDEDIT, OnEndEdit) ON_WM_MEASUREITEM() ON_WM_MEASUREITEM_REFLECT()END_MESSAGE_MAP()// COrangeListCtrl 消息处理程序void COrangeListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ // TODO: 添加您的代码以绘制指定项 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); LVITEM lvi = { 0}; lvi.mask = LVIF_STATE; lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ; lvi.iItem = lpDrawItemStruct->itemID; BOOL bGet = GetItem(&lvi); BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED) && ((GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS)))); CRect rcBack = lpDrawItemStruct->rcItem; if( bHighlight ) //高亮显示 { pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillRect(rcBack, &CBrush(::GetSysColor(COLOR_HIGHLIGHT))); } else { pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); pDC->FillRect(rcBack, &CBrush(::GetSysColor(COLOR_WINDOW))); } //绘制文本 CString strText=L""; CRect rcItem; if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) { for (int i = 0; i < GetHeaderCtrl()-> GetItemCount();i++) { if ( !GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem )) continue; strText = GetItemText( lpDrawItemStruct->itemID, i ); pDC->DrawText(strText,strText.GetLength(), &rcItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_BOTTOM); } }}void COrangeListCtrl::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CListCtrl::OnLButtonDown(nFlags, point); CRect rcCtrl; LVHITTESTINFO lvhti; lvhti.pt = point; m_nItem =SubItemHitTest(&lvhti); if (m_nItem == -1) return; m_nSubItem = lvhti.iSubItem; GetSubItemRect(m_nItem,m_nSubItem,LVIR_LABEL,rcCtrl); if (m_Edit_ctlItem.m_hWnd == NULL) { m_Edit_ctlItem.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,99); m_Edit_ctlItem.ShowWindow(SW_HIDE); m_FontItem.CreateStockObject(DEFAULT_GUI_FONT); m_Edit_ctlItem.SetFont(&m_FontItem); m_FontItem.DeleteObject(); } CString strItem=GetItemText(m_nItem,m_nSubItem); m_Edit_ctlItem.MoveWindow(&rcCtrl); m_Edit_ctlItem.ShowWindow(SW_SHOW); m_Edit_ctlItem.SetWindowText(strItem); m_Edit_ctlItem.SetFocus(); m_Edit_ctlItem.SetSel(-1); }void COrangeListCtrl::PreSubclassWindow(){ // TODO: 在此添加专用代码和/或调用基类 ModifyStyle(0,LVS_OWNERDRAWFIXED); CListCtrl::PreSubclassWindow();}LRESULT COrangeListCtrl::OnEndEdit(WPARAM wParam,LPARAM lParam){ CString strText; m_Edit_ctlItem.GetWindowText(strText); SetItemText(m_nItem,m_nSubItem,strText); m_Edit_ctlItem.ShowWindow(SW_HIDE); return 0;}void COrangeListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct){ if (m_nRowHeight>0) { lpMeasureItemStruct->itemHeight = m_nRowHeight; }}void COrangeListCtrl::SetRowHeigt(int nHeight){ m_nRowHeight = nHeight; CRect rcWin; GetWindowRect(&rcWin); WINDOWPOS wp; wp.hwnd = m_hWnd; wp.cx = rcWin.Width(); wp.cy = rcWin.Height(); wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER; SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);}void COrangeListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);}