• 关于SubclassWindow


    #define SubclassWindow(hwnd, lpfn)
    ((WNDPROC)SetWindowLongPtr((hwnd), GWLP_WNDPROC, (LPARAM)(WNDPROC)(lpfn)))

    从该宏可以看出是调用SetWindowLongPtr

    具体的详解:http://blog.csdn.net/sunliangyuan/article/details/6028425

    由于照着上面的链接敲的时候遇到了两个问题:

    1、OnChar无法响应

    2、当按回车键的时候整个程序直接退出了

    一、其实也是看链接里面的介绍,要进行消息映射,而我只是简单的创建一个类,然后继承CEdit

    .h

    class SuperEdit : public CEdit
    {
    public:
        SuperEdit(void);
        ~SuperEdit(void);
        void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    };
    View Code

    这样一种无法进入onchar函数,后来觉得CEdit也应该是一个窗体,既然是窗体就应该要有自己的消息映射函数

    于是就写如下代码

    //.h
    class SuperEdit : public CEdit
    {
        DECLARE_DYNAMIC(SuperEdit)
    public:
        SuperEdit(void);
        ~SuperEdit(void);
        void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    protected:
        DECLARE_MESSAGE_MAP()
    };
    
    // .cpp
    #include "StdAfx.h"
    #include "SuperEdit.h"
    
    SuperEdit::SuperEdit(void)
    {
    }
    
    SuperEdit::~SuperEdit(void)
    {
    }
    IMPLEMENT_DYNAMIC(SuperEdit, CEdit)
    void SuperEdit::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags )
    {
        // TODO: Add your message handler code here and/or call default
        TCHAR ch[20];
        GetWindowText(ch,20);
        if (wcslen(ch) == 1 && (nChar <= 'C' && nChar >= 'A'))
            return;
        if (nChar != 'A' && nChar != 'B' && nChar != 'C' )
            return;
        CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
    
    BEGIN_MESSAGE_MAP(SuperEdit, CEdit)
        ON_WM_CHAR()
    END_MESSAGE_MAP()
    View Code

    很幸运的成功了。 那究竟为何这样才能成功呢?

    WNDPROC* lplpfn = GetSuperWndProcAddr();
        WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
            (INT_PTR)AfxGetAfxWndProc());

    设置自身的回掉函数。具体如样例的描述解释。

    二、第二个问题的解释

    具体详解:http://tech.163.com/05/0906/09/1SV5EEQF00091589.html

  • 相关阅读:
    Spring Boot第四弹,一文教你如何无感知切换日志框架?
    Spring Boot 第三弹,一文带你了解日志如何配置?
    UVa 1625
    UVa 11584
    UVa 11400
    UVa 12563
    UVa 116
    UVa 1347
    UVa 437
    UVa 1025
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4419401.html
Copyright © 2020-2023  润新知