2014-10-27 4 views
0

Что я пытаюсь сделать, это создать элемент управления и процедуру редактирования внутри класса. Я пробовал разные вещи и пытался использовать части аналогичного вопроса, которые я задал: Win32 C++ Create a Window and Procedure Within a Class.Процедура управления C++ Win32 в классе

В настоящий момент я их разделил.

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.

Возможно, я пропустил что-то простое?

Useage:

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

Спасибо. Если отсутствует какая-либо информация, дайте мне знать.

+2

Является 'EditControlProc' функция член класса? Если это так, его нужно объявить как «статический». Также посмотрите на использование 'SetWindowSubclass', а не' SetWindowLongPtr'. –

ответ

0

Комментарий Джонатана Поттера был решением.

Для тех, кто читает:

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 
} 
Смежные вопросы