I
Igorg
Здравствуйте. Может кто-нибудь сможет предложить какое-нибудь решение следующей задачи:
Имеется класс DirectDrawWindow. Экземпляры класса представляют собой окна HWND, рисуемые в главном окне (их может быть несколько, без заголовков, не MDI, главное окно является родителем). При создании экземпляра создается и окно. В классе DirectDrawWindow определен метод static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); Этот метод, естественно, обрабатывает сообщения окна, которое создается в экземпляре класса (он указывается в поле структуры WNDCLASSEX класса окна), окон может быть несколько, а этот метод один. Понятно, что доступа к полям экземпляра WindowProc не имеет (ну кроме как к HWND hWnd, который передается в качестве параметра). Так вот, вопрос в том, как этот доступ обеспечить? Для сообщений, определенных пользователем, можно указатель на экземпляр передавать в wParam (или lParam
, это понятно. А если надо обработать сообщение WM_PAINT (например, вывести в окно часть рисунка, содержащегося в буфере конкретного экземпляра)? Нестатическим WindowProc сделать не получится -- потребует передачи неявного указателя на экземпляр, чего Windows делать не будет...
[codebox]
class DirectDrawWindow
{
public:
DirectDrawWindow(HINSTANCE hInstance, HWND hParentWindow)
{
// Регистрация класса окна и прочая инициализация (которую надо бы в статическом конструкторе сделать...)
...
_window = CreateWindow(...); // а вот это уже сугубо к экземпляру относится
...
}
void Draw(unsigned char *picture)
{
memcpy(buffer, picture, _w * _h * 3);
PostMessage(_window, WM_USER_DRAW_PICTURE, (WPARAM)this, 0);
}
private:
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
...
case WM_PAINT:
// ЗАГВОЗДОЧКА!
// Как отобразить buffer, например, если надо восстановить часть окна после перекрытия, если экземпляр класса не известен,
// известен лишь дескриптор окна?
...
break;
case WM_USER_DRAW_PICTURE:
// из wParam извлекаем указатель на экземпляр и так далее
...
HDC hDC = BeginPaint(...);
...
}
private:
HWND _window; // дескриптор окна
unsigned char buffer[...]; // здесь лежит какой-нибудь рисунок (в формате RGB, не суть), добавленный сюда методом Draw(...)
int _w, _h;
};
[/codebox]
Может моя концепция вообще не верна? Или я туплю и не вижу очевидного решения? Черт... Заранее прошу извинить, если так -- голова не варит...
Имеется класс DirectDrawWindow. Экземпляры класса представляют собой окна HWND, рисуемые в главном окне (их может быть несколько, без заголовков, не MDI, главное окно является родителем). При создании экземпляра создается и окно. В классе DirectDrawWindow определен метод static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); Этот метод, естественно, обрабатывает сообщения окна, которое создается в экземпляре класса (он указывается в поле структуры WNDCLASSEX класса окна), окон может быть несколько, а этот метод один. Понятно, что доступа к полям экземпляра WindowProc не имеет (ну кроме как к HWND hWnd, который передается в качестве параметра). Так вот, вопрос в том, как этот доступ обеспечить? Для сообщений, определенных пользователем, можно указатель на экземпляр передавать в wParam (или lParam
![Smile :-) :-)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
[codebox]
class DirectDrawWindow
{
public:
DirectDrawWindow(HINSTANCE hInstance, HWND hParentWindow)
{
// Регистрация класса окна и прочая инициализация (которую надо бы в статическом конструкторе сделать...)
...
_window = CreateWindow(...); // а вот это уже сугубо к экземпляру относится
...
}
void Draw(unsigned char *picture)
{
memcpy(buffer, picture, _w * _h * 3);
PostMessage(_window, WM_USER_DRAW_PICTURE, (WPARAM)this, 0);
}
private:
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
...
case WM_PAINT:
// ЗАГВОЗДОЧКА!
// Как отобразить buffer, например, если надо восстановить часть окна после перекрытия, если экземпляр класса не известен,
// известен лишь дескриптор окна?
...
break;
case WM_USER_DRAW_PICTURE:
// из wParam извлекаем указатель на экземпляр и так далее
...
HDC hDC = BeginPaint(...);
...
}
private:
HWND _window; // дескриптор окна
unsigned char buffer[...]; // здесь лежит какой-нибудь рисунок (в формате RGB, не суть), добавленный сюда методом Draw(...)
int _w, _h;
};
[/codebox]
Может моя концепция вообще не верна? Или я туплю и не вижу очевидного решения? Черт... Заранее прошу извинить, если так -- голова не варит...