Новичок
Джуниор
Регистрация: 04.04.2019
Сообщений: 1
|
[C++] Пользовательские данные
Добрый вечер.
Хотел узнать, как можно передать некоторые данные из главного окна, определённому дочернему окну через WndProc, в данном случае структура ui_new.
Также, как можно обмениваться некоторыми данными между дочерними окнами через ChildProc, например, сравнить, или что-то поменять
в структуре ui_new, которая конкретно закреплена за каждым окном окном (у каждого окна свой набор ui_new).
Пока есть проблема, данные почему-то все оказываются как в последнем
дочернем окне (даже основное окно содержит данные оттуда в своей структуре, вместо своих), а при обновлении данных в главном окне,
сбиваются данные и в дочерних (данные, имею в виду, значения переменных в структурах).
Вот код. Заранее спасибо за любой совет или мысль.
Код:
#include <Windows.h>
#include <string>
typedef struct doc_new
{
int size = 0;
}ui_new;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
VOID Create_Win(HWND, RECT);
#define Id_Child_Window 1
#define width 1300
#define height 668
using namespace std;
static HWND hWndParent;
static HINSTANCE hinst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HINSTANCE hinst;
HWND hwnd;
MSG msg;
WNDCLASS w;
hinst = hInstance;
memset(&w, 0, sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.lpszClassName = TEXT("C Windows");
w.hCursor = LoadCursor(NULL, IDC_ARROW);
w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
RegisterClass(&w);
ui_new ui;
hWndParent = CreateWindowEx(NULL,
TEXT("C Windows"),
TEXT("TEST"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
100, 50,
width, height,
NULL, NULL, hInstance, &ui);
ShowWindow(hWndParent, nCmdShow);
UpdateWindow(hWndParent);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) // сама функция, для сообщений
{
ui_new *ptr;
RECT rt;
switch (uMsg)
{
case WM_NCCREATE:
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT*)lParam)->lpCreateParams);
break;
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
ptr = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
hdc = BeginPaint(hwnd, &ps);
SetTextColor(hdc, RGB(0, 0, 255));
string ss = to_string(ptr->size);
TextOutA(hdc, 200, 20, ss.c_str(), ss.length());
EndPaint(hwnd, &ps);
}
break;
case WM_CREATE:
{
ptr = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
GetClientRect(hwnd, &rt);
ptr->size = 2000;
Create_Win(hwnd, rt);
}
break;
case WM_CLOSE:
PostQuitMessage(0); // ExitProcess(0);
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK ChildProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ui_new *ptr;
switch (uMsg)
{
case WM_VSCROLL:
{
ptr = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
int id = GetWindowLong(hwnd, GWL_ID);
if (id == 1)
{
ptr->size = 1000;
}
else
{
ptr->size = 3000;
}
InvalidateRect(hwnd, NULL, TRUE); //FALSE
UpdateWindow(hwnd);
}
break;
case WM_NCCREATE:
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT*)lParam)->lpCreateParams);
break;
case WM_CREATE:
{
ptr = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
int id = GetWindowLong(hwnd, GWL_ID); значение в окне
if (id == 1)
{
TextOutA(hdc, 100, 100, ss.c_str(), ss.length());
}
else
{
TextOutA(hdc, 200, 200, ss.c_str(), ss.length());
}
}
break;
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
ptr = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
int id = GetWindowLong(hwnd, GWL_ID);
hdc = BeginPaint(hwnd, &ps);
SetTextColor(hdc, RGB(0, 0, 255));
string ss = to_string(wndptr->size);
if (id == 1)
{
TextOutA(hdc, 100, 100, ss.c_str(), ss.length());
}
else
{
TextOutA(hdc, 200, 200, ss.c_str(), ss.length());
}
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
VOID Create_Win(HWND hwnd, RECT rt)
{
HWND child;
WNDCLASS w;
ui_new *pui = (ui_new*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
memset(&w, 0, sizeof(WNDCLASS));
w.lpfnWndProc = ChildProc;
w.lpszClassName = TEXT("ChildWClass");
w.hInstance = hinst;
w.hCursor = LoadCursor(NULL, IDC_CROSS);
RegisterClass(&w);
for (int i = 0; i < 3; i++)
{
child = CreateWindowEx(0, TEXT("ChildWClass"), (LPCTSTR)NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL,
(rt.right / 3)*i, 200, rt.right / 3, rt.bottom - 200,
hwnd, (HMENU)(int)(Id_Child_Window + i), hinst, pui);
ShowWindow(child, SW_NORMAL);
}
}
Пожалуйста, оформляйте Ваш код согласно правилам.
Последний раз редактировалось Вадим Мошев; 04.04.2019 в 22:57.
|