自己在CQuoteGrid中添加一个CEdit控件,在适当的时候创建(不显示),在需要编辑的时候显示编辑控件,设置大小,内容,在编辑结束之后返回修改结果。简单点可以E我:[email protected]

解决方案 »

  1.   

    呵呵,好像没太好的办法。
    自己从 CEdit 派生一个 CMyEdit 然后再 SubClassWindow 也不行,估计那个 Edit 的 WindowProc 是特殊的,不让你随便改变窗口大小;SetWindowText 却可以。
    自己做吧,我就是这样做的。
    从 CEdit 派生出自己的类 CMyEdit,要处理的消息有:WM_KILLFOCUS
      用 SendMessage 向父窗口(AppWizard 创建的 CListView 派生类)发送一个自定义消息,通知父窗口编辑结束;父窗口收到消息后改变相应 List Item,用 SetListItem。WM_CHAR
      如果是 VK_RETURN/VK_TAB(或其他你认为比较特殊的),得到父窗口,把焦点转移过去,这样就自动触发上面的 OnKillFocus 处理;如果是 VK_ESCAPE,就隐藏窗口。在 CListView 类中,处理 NM_CLICK 通知消息,在适当的位置显示你的 CMyEdit 窗口;重载 WindowProc 以截获自定义消息。还有有很多细节问题,好好研究,很有意思。
    我可提供源程序,不过很复杂;可以给我 email 索要。
      

  2.   

    如此说来,是瘪盖子的错了?
    SetWindowText、GetWindowText都可以。
    GetWindowLong、SetWindowLong改其风
    格也可以,但改动窗口大小、位置的都
    不行。过份!现在虽然很好用,但是编辑的时候有点
    不够美观。有没有简单的方法?复杂的方法一概不
    要!
      

  3.   

    完全可以啊,不可能不行的。
    不知道你是如何做的,但是在BCG的代码中可以实现这个功能。其代码如下:
    BOOL CBCGEditListBox::EditItem(int iIndex)
    {
    ....
    CEdit * pEdit=m_wdnList.EditLable(iIndex);
    CRect rectClient;
    GetClientRect(rectClient);
    CRect recEdit;
    pEdit->GetClientRect(rectEdit);
    pEdit->SetWindowPos(NULL,-1,-1,rectClient.Width()-10,rectEdit.Height(),SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
    return TRUE;
    }
    更详细的内容你可以去下载一个BCG的类库来研究一下。www.codetools.com中有。
      

  4.   

    Wingsun,你真是个高手,以后还请多多赐教!
    谢谢!
      

  5.   

    Wingsun,你真是个高手,以后还请多多赐教!
    不过你的方法还是有问题,虽然刚激活时好像
    可以,但输入时就变了,和以前一样!
      

  6.   

    自已从CEdit类派生一个子类 CMyEdit,在该类中处理 WM_SIZE消息。因为原来的编辑控件每接收到一个字符后,就重新设置大小,所以前面各位提供的方法只能在激活的时候改变窗口大小,输入时就变了。因此应该在WM_SIZE消息处理函数中改变窗口大小。// 在每次开始编辑的时候,子类化编辑控件
    // m_cEdit 是 CTestDlg的一个成员变量,类型是 CMyEdit.
    void CTestDlg::OnBeginlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        
        m_cEdit.SubclassWindow( m_cList.GetEditControl()->m_hWnd );
        *pResult = 0;
    }/*  WM_SIZE 消息处理函数如下:*/
    void CMyEdit::OnSize(UINT nType, int cx, int cy) 
    {
        static int cx1 = 80;
        static int cy1 = 16;        // as you like
        if( cx!=cx1 || cy!=cy1 )    // 防止循环调用
            SetWindowPos(NULL, 0,0, cx1, cy1, SWP_NOZORDER|SWP_NOMOVE );
        CEdit::OnSize(nType, cx, cy);
    }
      

  7.   

    大侠们啊,能不能提供真正有用的方法来?我希望的是直接应用CListCtrl本身提供的
    Edit,如果是自己派生的我就没必要跑到
    这来问了,我自己就有这样的代码。拜托各位了,300分呢!
      

  8.   

    我试验了一下,可以实现你的要求,不知你自己觉得是否麻烦,如下:
    一句话,就是替换原来的窗口函数:
    WNDPROC pOld = NULL;    // 保存原来的窗口函数
    LRESULT CALLBACK EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        if (message == WM_WINDOWPOSCHANGING) {
            LPWINDOWPOS lpwp = (LPWINDOWPOS)lParam;
            lpwp->cx = 200;    // 自己的大小
            lpwp->cy = 100;
            return 0;
        } else
            return CallWindowProc(pOld, hWnd, message, wParam, lParam);
    }void CAaaDlg::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
        // TODO: Add your control notification handler code here
        CEdit *pEdit = m_list.GetEditControl();
        pOld = (WNDPROC)::SetWindowLong(pEdit->m_hWnd, GWL_WNDPROC, (LONG)EditProc);
        *pResult = 0;
    }
      

  9.   

    我有兴趣,e-mail:[email protected]
      

  10.   

    在 OnBeginLabelEditList 里面用 SetWindowPos 之类的函数没用,因为每敲一个字符,都要重新定大小。
      

  11.   

    呵呵。BlackSword还不想从CEdit派生新类。其实,这种方法不复杂呀。
    下面再说一种方法:
    假设CQuoteGrid是CListCtrl的一个派生类,并重载其虚函数OnCommand。BOOL CQuoteGrid::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
        CEdit* pEdit = GetEditControl();
        if( pEdit != NULL && lParam == (long)pEdit->m_hWnd )
        {
            if(HIWORD(wParam)==EN_CHANGE||HIWORD(wParam)==EN_SETFOCUS)
            {
                pEdit->SetWindowPos(NULL,0,0,80,16,SWP_NOZORDER|SWP_NOMOVE);
                pEdit->SetSel( pEdit->GetSel() ); // 设置光标
            }
        }    return CListCtrl::OnCommand(wParam, lParam);
    }我试过,两种方法都可以实现。你要是再嫌麻烦的话,我也没办法了。
      

  12.   

    wuxin同志的办法虽然有闪烁现象,但毕竟
    接近实现了,给200分先。其它的大家分,
    你没意见吧?