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。