C++ Win32控件类内的一个程序

C++ Win32控件类内的一个程序,c++,winapi,stored-procedures,C++,Winapi,Stored Procedures,我想做的是在类中创建一个编辑控件和过程。我尝试了各种方法,并尝试使用我问过的类似问题的部分内容: 当时,我把它们拆开了 main_class.h class MainClass { private: HWND hwndMain; // main windows handle HINSTANCE hInstanceMain; // main windows instance HWND hTextarea; public: bool init(HWND _hwn

我想做的是在类中创建一个编辑控件和过程。我尝试了各种方法,并尝试使用我问过的类似问题的部分内容:

当时,我把它们拆开了

main_class.h

class MainClass {

private:
    HWND hwndMain; // main windows handle
    HINSTANCE hInstanceMain; // main windows instance
    HWND hTextarea;

public:
    bool init(HWND _hwnd, HINSTANCE _hInstance);
    bool ShowInfoTextarea();
};



main_class.cpp
// Heres the question
bool MainClass::ShowInfoTextarea() {

    if (hTextarea != NULL) return true; // if it is not null, the textarea is likely already displayed.

    // Creating the EDIT textarea
    hTextarea = CreateWindowEx(0, L"EDIT", L"", 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 
        SCREEN_WIDTH+5, 0, WINDOW_WIDTH-SCREEN_WIDTH-10, WINDOW_HEIGHT-30, hwndMain, (HMENU)IDC_CTRL_EDIT, GetModuleHandle(NULL), NULL);

    if (hTextarea == NULL) { MessageBox(NULL, L"Could not create the test text control. The program will now close.", NULL, MB_OK | MB_ICONEXCLAMATION); return false; }

    // Dozens of attempts with something like:
    // lpEditWndProc = (WNDPROC)SetWindowLongPtr(hTextarea, GWLP_WNDPROC, (LONG_PTR)EditControlProc); 
    // lpEditWndProc = (WNDPROC)SetWindowLongPtr(hTextarea, GWLP_WNDPROC, (LONG_PTR)MainClass::EditControlProc);
    // tried static callback functions, etc.

    //Every try the compiler said: Are there missing braces ( ) with EditControlProc

}


// To get working, I separated:
    WNDPROC lpEditWndProc;        
    LRESULT CALLBACK EditControlProc(HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam) {

        switch (uMsg) {
            default:
                return CallWindowProc(lpEditWndProc, hwndEdit, uMsg, wParam, lParam); 

        }

        return 0; // DONE
    }
在我的各种尝试中,编译器说:EditControlProc是否缺少大括号,或者在试图定义lpEditWndProc时所说的类型不匹配

我可能错过了一些简单的事情

用途:

main.cpp
MainClass mainclass;
mainclass.ShowInfoTextarea();

谢谢。如果缺少任何信息,请告诉我。

乔纳森·波特的评论就是解决办法

对于阅读以下内容的任何人:

 mainclass.h

class MainClass {

    private:
        HWND hwndMain;
        HINSTANCE hInstanceMain;
        HWND hTextarea;
        static LRESULT CALLBACK EditControlProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData);
    public:
        bool init(HWND _hwnd, HINSTANCE _hInstance);
        bool ShowInfoTextarea();


};



mainclass.cpp

// To Show the Textarea
bool MainClass::ShowInfoTextarea() {

    if (hTextarea != NULL) return true; // if it is not null, the textarea is likely already displayed.

    // Creating the EDIT textarea
    hTextarea = CreateWindowEx(0, L"EDIT", L"", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 
    SCREEN_WIDTH+5, 0, WINDOW_WIDTH-SCREEN_WIDTH-10, WINDOW_HEIGHT-30, hwndMain, (HMENU)IDC_CTRL_EDIT, GetModuleHandle(NULL), NULL);

        if (hTextarea == NULL) { MessageBox(NULL, L"Could not create the test text control. The program will now close.", NULL, MB_OK | MB_ICONEXCLAMATION); return false; }

    SetWindowSubclass(hTextarea, EditControlProc, 0, 0);

}


// Now Works
LRESULT CALLBACK MainClass::EditControlProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {

    switch (msg) {
        case WM_KEYDOWN:
            MessageBox(0,0,0,0);
        break;
        default:
            return DefSubclassProc(hWnd, msg, wParam, lParam);
        break;
    }

    return 0; // DONE
}
EditControlProc是类成员函数吗?如果是这样,则需要将其声明为静态。另外,请查看如何使用SetWindowsSubClass而不是SetWindowLongPtr。