繁体   English   中英

类中的C ++ Win32控制过程

[英]C++ Win32 Control Procedure within a Class

我正在尝试做的是在一个类中创建一个编辑控件和过程。 我尝试了各种方法,并尝试使用了类似的问题: Win32 C ++在Class中创建窗口和过程

此刻,我把它们分开了。

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM