Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 44

У дочернего окна не доступен Edit

29.04.2015, 17:34. Показов 786. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,нужна помощь. Вообщем недавно мне тут помогли с созданием дочернего окна.Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <windows.h>
#include <stdlib.h>
#include <Windowsx.h>
#include <tchar.h>
#include <Strsafe.h>
 
 
HWND hwnd1;
HMENU hmenu1;
HINSTANCE HINST;
LRESULT WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT WINAPI WndProc1(HWND, UINT, WPARAM, LPARAM);
void CreateEdit (HWND parent, HMENU hMenu,  int x, int y, int width, int height);
void CreateLabel(HWND parent, HMENU hMenu,  int x, int y, int width, int height,LPCTSTR str);
const int K1=201,LAB1=301,ED1=401;
 
 
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine,  int nShowCmd)                   
{
    HINST=hInst;
    WNDCLASSEX wcx = {0};
    wcx.cbSize = sizeof(WNDCLASSEX); 
    wcx.style = CS_HREDRAW | CS_VREDRAW  ;
    wcx.lpfnWndProc = WndProc;
    wcx.hInstance = hInst;  
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW +2); 
    wcx.lpszClassName = TEXT("MainWindow");
    if ( !RegisterClassEx(&wcx) ) //регистрируем класс для главного окна
        return 0;
 
 
    WNDCLASSEX wcx1 = {0};
    wcx1.cbSize = sizeof(WNDCLASSEX); 
    wcx1.style = CS_HREDRAW | CS_VREDRAW;
    wcx1.lpfnWndProc = WndProc1;
    wcx1.hInstance = hInst; 
    wcx1.hbrBackground = (HBRUSH)(COLOR_WINDOW +2);
    wcx1.lpszClassName = TEXT("ChildWindow");
    if ( !RegisterClassEx(&wcx1) ) //регистрируем класс для дочернего окна
        return 0;
 
    
    hmenu1 = CreateMenu();
    HMENU wp=CreatePopupMenu();
 
    AppendMenu(hmenu1, MF_STRING | MF_POPUP,  (UINT)wp, L"Файл"); 
    AppendMenu(wp, MF_STRING, K1, L"Дочернее окно"); 
    
    
    HWND hWnd = CreateWindow( //главное окно
        TEXT("MainWindow"),
        TEXT("Лабораторная работа №3"),
        WS_OVERLAPPEDWINDOW,
        0,0,
        800,600,
        0, 
        hmenu1,
        hInst,
        0);
 
    if (!hWnd)    
        return 2;
 
    SetMenu(hWnd, hmenu1);
    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);
    
    MSG msg = {0};
    while( GetMessage(&msg,0,0,0))
    {           
        TranslateMessage(&msg); 
        DispatchMessage(&msg);  
    }
    return( (int)msg.wParam );  
}
 
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
if (LOWORD(wParam)==K1){
    hwnd1 = CreateWindow( //дочернее окно
        TEXT("ChildWindow"),
        TEXT("Лабораторная работа №3"),
        WS_OVERLAPPEDWINDOW |WS_CHILD|WS_DLGFRAME|WS_VISIBLE, 
        0,0,
        600,400,
        hWnd, 
        0,
        HINST,
        0);
    if (!hwnd1)    
        return 0;
    CreateLabel(hwnd1,(HMENU)LAB1,10,10,210,20,L"Дочернее окно");
    CreateEdit(hwnd1,(HMENU)ED1,10,50,150,20);
    ShowWindow(hwnd1, SW_SHOWNORMAL);
    UpdateWindow(hwnd1);
    EnableMenuItem(hmenu1,0, MF_DISABLED|MF_GRAYED|MF_BYPOSITION);
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
 
 
LRESULT CALLBACK WndProc1(HWND hwnd1, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
DestroyWindow(hwnd1);
EnableMenuItem(hmenu1,0, MF_ENABLED|MF_BYPOSITION);
break;
case WM_COMMAND:
//обработка событий дочернего окна
default:
return DefWindowProc(hwnd1, message, wParam, lParam);
}
return 0;
}
 
void CreateLabel(HWND parent, HMENU hMenu,  int x, int y, int width, int height,LPCTSTR str){ //Для создания label
    HWND label=CreateWindow(L"static", str, WS_CHILD | WS_VISIBLE,
        x, y, width, height, parent, hMenu, HINST, NULL);
}
 
void CreateEdit (HWND parent, HMENU hMenu,  int x, int y, int width, int height){
HWND res=CreateWindow(L"edit", L"", WS_CHILD | WS_VISIBLE,
        x, y, width, height, parent, hMenu, HINST, NULL);
}
Я решил добавить edit в дочернее окно, но он почему-то становится неактивным. Не получается установить на него фокус,чтобы писать текст. Как это исправить,подскажите,пожалуйста?

Добавлено через 58 минут
Помогите,пожалуйста?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2015, 17:34
Ответы с готовыми решениями:

Процедура обработки дочернего окна (ListView и Edit)
Для начала в кратце опишу что есть в моём проэкте. 1.Обработчик &quot;главного окна&quot;: LRESULT EditProc(HWND hwnd, UINT uMsg, WPARAM...

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое &quot;убегает&quot; от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

Закрытие дочернего окна приводит к закрытию основного окна
Суть задания &quot;После нажатия левой кнопки мышки в области окна в левом углу окна создать временное окно размером в чверть основного окна....

3
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
29.04.2015, 18:33
продолжим опыты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <windows.h>
#include <stdlib.h>
#include <Windowsx.h>
#include <tchar.h>
#include <Strsafe.h>
 
 
HWND hwnd1;
HMENU hmenu1;
HINSTANCE HINST;
LRESULT WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT WINAPI WndProc1(HWND, UINT, WPARAM, LPARAM);
void CreateEdit (HWND parent, HMENU hMenu,  int x, int y, int width, int height);
void CreateLabel(HWND parent, HMENU hMenu,  int x, int y, int width, int height,LPCTSTR str);
const int K1=201,LAB1=301,ED1=401;
 
 
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine,  int nShowCmd)                   
{
    HINST=hInst;
    WNDCLASSEX wcx = {0};
    wcx.cbSize = sizeof(WNDCLASSEX); 
    wcx.style = CS_HREDRAW | CS_VREDRAW  ;
    wcx.lpfnWndProc = WndProc;
    wcx.hInstance = hInst;  
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW +2); 
    wcx.lpszClassName = TEXT("MainWindow");
    if ( !RegisterClassEx(&wcx) ) //регистрируем класс для главного окна
        return 0;
 
 
    WNDCLASSEX wcx1 = {0};
    wcx1.cbSize = sizeof(WNDCLASSEX); 
    wcx1.style = CS_HREDRAW | CS_VREDRAW;
    wcx1.lpfnWndProc = WndProc1;
    wcx1.hInstance = hInst; 
    wcx1.hbrBackground = (HBRUSH)(COLOR_WINDOW +2);
    wcx1.lpszClassName = TEXT("ChildWindow");
    if ( !RegisterClassEx(&wcx1) ) //регистрируем класс для дочернего окна
        return 0;
 
    
    hmenu1 = CreateMenu();
    HMENU wp=CreatePopupMenu();
 
    AppendMenu(hmenu1, MF_STRING | MF_POPUP,  (UINT)wp, L"Файл"); 
    AppendMenu(wp, MF_STRING, K1, L"Дочернее окно"); 
    
    
    HWND hWnd = CreateWindow( //главное окно
        TEXT("MainWindow"),
        TEXT("Лабораторная работа №3"),
        WS_OVERLAPPEDWINDOW,
        0,0,
        800,600,
        0, 
        hmenu1,
        hInst,
        0);
 
    if (!hWnd)    
        return 2;
 
    SetMenu(hWnd, hmenu1);
    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);
    
    MSG msg = {0};
    while( GetMessage(&msg,0,0,0))
    {           
        TranslateMessage(&msg); 
        DispatchMessage(&msg);  
    }
    return( (int)msg.wParam );  
}
 
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
if (LOWORD(wParam)==K1){
    hwnd1 = CreateWindow( //дочернее окно
        TEXT("ChildWindow"),
        TEXT("Лабораторная работа №3"),
        WS_OVERLAPPEDWINDOW |WS_CHILD|WS_DLGFRAME|WS_VISIBLE, 
        0,0,
        600,400,
        hWnd, 
        0,
        HINST,
        0);
    if (!hwnd1)    
        return 0;
    CreateLabel(hwnd1,(HMENU)LAB1,10,10,210,20,L"Дочернее окно");
   // CreateEdit(hwnd1,(HMENU)ED1,10,50,150,20);
    ShowWindow(hwnd1, SW_SHOWNORMAL);
    UpdateWindow(hwnd1);
    EnableMenuItem(hmenu1,0, MF_DISABLED|MF_GRAYED|MF_BYPOSITION);
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
 
 
LRESULT CALLBACK WndProc1(HWND hwnd1, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HWND Edit1;
switch(message)
{
case WM_CREATE:
    {
 Edit1=CreateWindow(L"edit", L"",  ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE,
                        10, 40, 270, 25,hwnd1, NULL, HINST, NULL );
 SetFocus(Edit1);
 
    }
break;
case WM_CLOSE:
DestroyWindow(hwnd1);
EnableMenuItem(hmenu1,0, MF_ENABLED|MF_BYPOSITION);
break;
case WM_COMMAND:
//обработка событий дочернего окна
default:
return DefWindowProc(hwnd1, message, wParam, lParam);
}
return 0;
}
 
void CreateLabel(HWND parent, HMENU hMenu,  int x, int y, int width, int height,LPCTSTR str){ //Для создания label
    HWND label=CreateWindow(L"static", str, WS_CHILD | WS_VISIBLE,
        x, y, width, height, parent, hMenu, HINST, NULL);
}
/* 
void CreateEdit (HWND parent, HMENU hMenu,  int x, int y, int width, int height){
HWND res=CreateWindow(L"edit", L"", WS_CHILD | WS_VISIBLE,
        x, y, width, height, parent, hMenu, HINST, NULL);
}
*/
0
1 / 1 / 0
Регистрация: 09.12.2013
Сообщений: 44
29.04.2015, 20:16  [ТС]
Так у меня не получится.Если нажать на кнопку какую-нибудь,то фокус пропадет и больше не устанавливается.В данном случае можно было бы и после нажатия кнопки снова устанавливать фокус,но в этой программе я просто пытаюсь сделать,чтобы все нормально работало для примера и перенести в основную программу. У меня в основной программе нужно найти определитель матрицы,элементы матрицы записаны в edit'ы,то есть у меня есть матрицы 5x5 из 25 edit'ов, на которые нужно будет щелкнуть и вводить элементы. Вот если вот убрать стиль у родительского окна WS_OVERLAPPEDWINDOW ,тогда edit нормально работает,но уже дочернее окно как-то выглядит не очень. Что еще можно сделать?)
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
01.05.2015, 22:19
вот что нашел: Приложение не должно создавать модальное диалоговое окно, имеющее стиль WS_CHILD. Модальный блок диалога с этим стилем отключает сам себя, не допуская какого-либо последующего ввода данных из связанной с ним прикладной программы.
получается надо в 93 строке кода выше надо убрать WS_CHILD
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2015, 22:19
Помогаю со студенческими работами здесь

Отображение дочернего окна
При нажатии лкм должно создаваться дочернее окно, но открывается только главное окно и не реагирует на клики. #include...

Не видно дочернего окна
LRESULT CALLBACK WindowProcedureWindowMain (HWND Window , ...

Закрытие дочернего окна
Есть главное окно, а в нем дочернее. Подскажите пожалуйста как сделать, чтобы главное окно не закрывалось при закрытии дочернего. Заранее...

Меню у дочернего окна
Всем привет.Помогите пожалуйста,у меня есть два окна:родительское и дочернее. При создании родительского окна я также создаю для него меню....

Открытие дочернего окна
Здрасьте. Подскажите что я не так делаю. Хочу открыть окно по нажатию кнопки. Я открывал, просто создавая его по нажатию. А как его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru