WinApi C++. Как передать текст с одного дочернего окна (первого пункта меню) во второе (из другого пункта меню)?

Задание такое. Используя Windows API создать окно. В меню добавить две кнопки (пункт) при нажатии на первой появляется модальное диалоговое окно с EditBox и кнопками "OK" и "Cancel". При нажатии на "OK" текст который был напечатан в Edit Box должен отобразиться в дочернем окне, при нажатии "Cancel" диалоговое окно просто закрывается. При нажатии на второй пункт меню тоже появляется модальное диалоговое окно с EditBox и кнопками "OK" и "Cancel". При нажатии на "OK" что был напечатан в дочернем окне должен отобразиться в главном окне при нажатии "Cancel" диалоговое окно просто закрывается.

#include "WindowsProject1_2попитка.h"
#include <Windows.h>
#include <string>
#include <algorithm>

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK DialogProcedure(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK DaughterProcedure(HWND, UINT, WPARAM, LPARAM);
void AddMenus(HWND);
void AddControls(HWND hWnd);
void registerDialogClass(HINSTANCE);
void registerDaughterClass(HINSTANCE);
void displayDialog(HWND);
void displayDialog2(HWND);
void DialogControls(HWND hWnd);
void DaughterControls(HWND hWnd);

#define IDM_FILE_NEW 1
#define IDM_FILE_OPEN 2
#define CHANGE_TEXT 3

HMENU hMenu;
HWND hEdit, hDaughter, hIn, hIn2, hMainWindow, hDlg, hLast;
wchar_t text[100];
wchar_t cpy[100];
int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR szCmdLine, int nCmdShow)
{
    MSG msg{};
    HWND hButton{}, hChildWnd{}, hChildEdit{};
    WNDCLASSEX wc{ sizeof(WNDCLASSEX) };
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);
    wc.hInstance = hInstance;

    wc.lpfnWndProc = [](HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)->LRESULT
    {

        switch (uMsg)
        {
            case WM_CREATE: 
                AddMenus(hWnd);
                AddControls(hWnd);
                break;

            case WM_COMMAND:
                switch (wParam)
                {
                    case 1:
                        displayDialog(hWnd);
                        break;

                    case 2:
                        displayDialog2(hWnd);
                        break;
                }
                break;

            case WM_DESTROY:
                PostQuitMessage(EXIT_SUCCESS);
                break;


            default:
                return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
    };
    wc.lpszClassName = L"MyAppClass";
    wc.style = CS_VREDRAW | CS_HREDRAW;

    if (!RegisterClassEx(&wc))
        return EXIT_FAILURE;

    registerDialogClass(hInstance);

    hMainWindow = CreateWindow(wc.lpszClassName, L"LABA", WS_OVERLAPPEDWINDOW, 0, 0, 600, 500, nullptr, nullptr, wc.hInstance, nullptr);

    if (hMainWindow == INVALID_HANDLE_VALUE)
        return EXIT_FAILURE;

    ShowWindow(hMainWindow, nCmdShow);
    UpdateWindow(hMainWindow);

    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return static_cast<int>(msg.wParam);

}


void AddMenus(HWND hwnd) {
    HMENU hMenubar;
    hMenubar = CreateMenu();
    hMenu = CreateMenu();
    HMENU hSubMenu = CreateMenu();

    AppendMenu(hMenubar, MF_STRING, 1, L"&First");
    AppendMenu(hMenubar, MF_STRING, 2, L"&Second");
    SetMenu(hwnd, hMenubar);
}

void AddControls(HWND hWnd)
{
    CreateWindowW(L"Static",L"Entering text: ",WS_VISIBLE | WS_CHILD | WS_BORDER,100,100,400,20,hWnd,NULL,NULL,NULL);
    hEdit = CreateWindowW(L"edit",L"",WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL,100,130,400,100,hWnd,NULL,NULL,NULL);
}

void displayDialog(HWND hWnd) {
    hDlg = CreateWindowW(L"DialogClass", L"Dialog1", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 200, 300, 300, hWnd, NULL, NULL, NULL);
    hDaughter = CreateWindowW(L"DialogClass", L"Dialog2", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 300, 300, hWnd, NULL, NULL, NULL);

    CreateWindowW(L"Button", L"OK", WS_VISIBLE | WS_CHILD, 20, 200, 80, 30, hDlg, (HMENU)CHANGE_TEXT, NULL, NULL);
    CreateWindowW(L"Button", L"Cancel", WS_VISIBLE | WS_CHILD, 180, 200, 80, 30, hDlg, (HMENU)2, NULL, NULL);

    //EnableWindow(hWnd, false);
}

void displayDialog2(HWND hWnd) {
    hDaughter = CreateWindowW(L"DialogClass", L"Dialog2", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 300, 300, hWnd, NULL, NULL, NULL);
    hLast = CreateWindowW(L"DialogClass", L"Dialog3", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 200, 300, 300, hWnd, NULL, NULL, NULL);

    CreateWindowW(L"Button", L"OK", WS_VISIBLE | WS_CHILD, 20, 200, 80, 30, hDaughter, (HMENU)CHANGE_TEXT, NULL, NULL);
    CreateWindowW(L"Button", L"Cancel", WS_VISIBLE | WS_CHILD, 180, 200, 80, 30, hDaughter, (HMENU)2, NULL, NULL);
}

LRESULT CALLBACK DialogProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg)
    {
    case WM_CREATE:
        DialogControls(hWnd);
        DaughterControls(hWnd);
        break;

    case WM_COMMAND:
        switch (wParam)
        {
            case CHANGE_TEXT:
                GetWindowTextW(hIn, text, 100);
                SetWindowTextW(hEdit, text);
                break;

            case 2:
                EnableWindow(hMainWindow, true);
                DestroyWindow(hWnd);
                break;
        }
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    default:
        return DefWindowProcW(hWnd,uMsg,wParam,lParam);
    }
    return 0;
}

LRESULT CALLBACK DaughterProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg)
    {
    case WM_CREATE:
        DaughterControls(hWnd);
        break;

    case WM_COMMAND:
        switch (wParam) {
        case CHANGE_TEXT:
            GetWindowTextW(hEdit, text, 100);
            SetWindowTextW(hIn, text);
            break;

        case 2:
            DestroyWindow(hWnd);
            break;
        }
        break;

            case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    default:
        return DefWindowProcW(hWnd, uMsg, wParam, lParam);
    }
}

void registerDialogClass(HINSTANCE hInstance)
{
    WNDCLASSW dialog = { 0 };
    dialog.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    dialog.hCursor = LoadCursor(nullptr, IDC_ARROW);
    dialog.hInstance = hInstance;
    dialog.lpfnWndProc = DialogProcedure;
    dialog.lpszClassName = L"DialogClass";
    RegisterClass(&dialog);
}

void registerDaughterClass(HINSTANCE hInstance)
{
    WNDCLASSW dialog = { 0 };
    dialog.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    dialog.hCursor = LoadCursor(nullptr, IDC_ARROW);
    dialog.hInstance = hInstance;
    dialog.lpfnWndProc = DaughterProcedure;
    dialog.lpszClassName = L"DialogClass2";
    RegisterClass(&dialog);
}

void DialogControls(HWND hWnd) {
    CreateWindowW(L"Static", L"Enter text: ", WS_VISIBLE | WS_CHILD | WS_BORDER, 20, 20, 240, 20, hWnd, NULL, NULL, NULL);
    hIn = CreateWindowW(L"edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL, 20, 50, 240, 130, hWnd, NULL, NULL, NULL);
}

void DaughterControls(HWND hWnd) {
    CreateWindowW(L"Static", L"Enter text: ", WS_VISIBLE | WS_CHILD | WS_BORDER, 20, 20, 240, 20, hWnd, NULL, NULL, NULL);
    hIn2 = CreateWindowW(L"edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL, 20, 50, 240, 130, hWnd, NULL, NULL, NULL);
}```

Ответы (0 шт):