Tom*_*ica 6 c++ oop winapi class
我正在尝试创建一个在父窗口中显示控制台窗口的小类.(你可以想象那里显示的聊天或调试信息)
现在,由于不同的instanes确实有不同的私有变量(例如消息数组或父窗口),我需要使用非静态方法作为Windows事件的回调.
我已经想到了方法,我将实际的类实例传递给静态回调函数,然后在其上调用正确的方法,但是在winAPI中,一切都是使用TranslateMessage
并且DispatchMessage
没有机会使用我自己的参数.
我在这里找到了一些代码:类方法作为winAPI回调,但我不明白,我认为这不是我需要的.如果是,那么请给我进一步解释所提供的代码.
我得到的错误:
错误:类型的参数'LRESULT(
WindowConsole::
)(HWND__ ,UINT,WPARAM,LPARAM)'不匹配'LRESULT(*
)(HWND__,UINT,WPARAM,LPARAM)'
我不知道括号中的那个星是什么意思,但这是不匹配的.
和代码:
class WindowConsole {
char messages[255][255];
HWND mainWindow;
public:
int width;
int height;
inline HWND create(HWND parent);
inline bool update();
inline LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
};
HWND WindowConsole::create(HWND parent) {
HINSTANCE inst = GetModuleHandle (0);
WNDCLASSEX wincl;
/* The Window structure */
wincl.hInstance = inst;
wincl.lpszClassName = "ConsoleClass";
wincl.lpfnWndProc = this->WndProc; /* This function is called by windows */
/* more WNDCLASSEX crap...*/
mainWindow = CreateWindow (
/*PARAMS*/
);
ShowWindow(mainWindow,1);
return mainWindow;
}
bool WindowConsole::update() {
return true;
}
LRESULT CALLBACK WindowConsole::WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) /* handle the messages */
{
/*EVENT crap*/
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 10
通常是这个顺序的东西:
#include <windows.h>
class BaseWindow {
static LRESULT CALLBACK internal_WndProc(HWND hWnd, int msg, WORD wParam, LONG lParam) {
BaseWindow *c = (BaseWindow *)GetWindowLong(hWnd,GWLP_USERDATA);
if (c == NULL)
return DefWindowProc(hWnd, msg, wParam, lParam);
return c->WindowProc(hWnd, msg, wParam, lParam);
}
public:
virtual int WindowProc(HWND hWnd, int msg, WPARAM wParam, LPARAM lParam) = 0;
BaseWindow(HINSTANCE instance) {
WNDCLASS window_class = {0};
HWND window;
HMENU my_menu;
window_class.lpfnWndProc = (WNDPROC)internal_WndProc;
/* fill in window_class here */
RegisterClass(&window_class);
window = CreateWindow(
"My Application", "Stupidity",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, my_menu, instance, NULL);
// save the address of the class as the Window's USERDATA.
SetWindowLong(window, GWLP_USERDATA, (long)this);
}
};
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以从BaseWindow派生一个类.在派生类中,提供一个"WindowProc",它覆盖BaseWindow中的(纯虚拟).这里的技巧是相当简单:因为你不能直接传递参数,你之类的地址存储在窗口的GWLP_USERDATA,然后在窗口过程(尝试)检索并使用它来调用派生类的虚窗口过程.
顺便说一句,请注意这是一个草图,而不是完成的工作(可以这么说).虽然它应编译原来的样子,结果实际上不会,除非你在一个公平的数字,在这里并不是件填写工作(例如,WNDCLASS结构的另一领域是唯一的最明显的一个).
归档时间: |
|
查看次数: |
9454 次 |
最近记录: |