下面是一个edit 的子类化:
m_hEdit=CreateEdit(hwnd);
WNDPROC EdOldProc = (WNDPROC)SetWindowLong(m_hEdit, GWL_WNDPROC, (LONG)EDProc);
SetProp(m_hEdit,// handle of window
"EditOldProc",  // atom or address of string
EdOldProc);// 

解决方案 »

  1.   


    LRESULT CALLBACK EDProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {// get oldproc
    WNDPROC OldEdProc=(WNDPROC)GetProp(hWnd,"EditOldProc");
    char buf[100]= {0};
    switch(Msg)
        {
    case WM_NOTIFY:
    // OutputDebugString("notify\n");
    break;
    case WM_KEYUP:
    // OutputDebugString("WM_KEYUP\n");
    break;
    case WM_CHAR:
    if((TCHAR) wParam==VK_RETURN)
    {
    CallWindowProc(OldEdProc, hWnd, Msg, wParam, lParam);
    POINT pt;
    DWORD pos;
    int idx;
    // insert the indent 
    GetCaretPos(&pt);
    pos=SendMessage(hWnd,EM_CHARFROMPOS,0,MAKELPARAM(pt.x, pt.y));
    idx=LOWORD(pos);
    SendMessage(hWnd,EM_SETSEL,idx,idx);
    SendMessage(hWnd,EM_REPLACESEL,0,(LPARAM)"    ");
    return 0;
    }
    break;
    #if 0
    case WM_PAINT:
    hdc=BeginPaint(hWnd,&ps);
    // WS_BORDER 
    Rectangle(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom);
    // ES_MULTILINE
    lines=SendMessage(hWnd,EM_GETLINECOUNT,0,0);
    for(jj=0;jj<lines;jj++)
    {// use GetWindowText will lost CR
    got=SendMessage(hWnd,EM_GETLINE,jj,(LPARAM)txt);
    txt[got]=0;
    if(jj==1)
    {
    SetTextColor(hdc,RGB(255,0,0));
    TextOut(hdc,2,2 + jj*16,txt,got);
    }
    else
    {
    SetTextColor(hdc,RGB(0,0,0));
    TextOut(hdc,2,2 + jj*16,txt,got);
    }
    }
    EndPaint(hWnd,&ps);
    return 0;
    #endif
    }
    return CallWindowProc(OldEdProc, hWnd, Msg, wParam, lParam);