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);
}```