Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2019, 19:42   #1
Syslic
Новичок
Джуниор
 
Регистрация: 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.
Syslic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пользовательские функции с++ Лидия_13_1666 Фриланс 4 28.04.2018 20:20
пользовательские контролы ts-alan ASP.NET 3 30.03.2015 16:18
пользовательские формы Kression Microsoft Office Excel 5 01.05.2013 02:43
пользовательские флаги TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 06.01.2012 15:50
Пользовательские окна. HWork Общие вопросы C/C++ 0 27.10.2009 11:29