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

Создание окна. Дочернее окно

01.10.2015, 23:03. Показов 10640. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: создать окно с менюшкой, при нажатии на менюшку открывается дочернее окно, вроде все легко, но дочернее окно хоть убейте, но не создается, помогите найти ошибку, пожалуйста:
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
#include <windows.h>
#define ID_FIRSTCHILD   100
#define ID_SECONDCHILD  101
#define ID_THIRDCHILD   102
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
 
////////////////////////////////////////////////////////////////////////// 
// функция вхождений программы WinMain
int WINAPI WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpszCmdLine,
             int               nCmdShow)
{
  // имя будущего класса
 
  HINSTANCE hInst;
  LPCTSTR lpzClassName;
    WNDCLASS wc = {0};
  // адрес ф-ции обработки сообщений
  wc.lpfnWndProc = WndProc;
  // стиль окна
  wc.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wc.hInstance = hInst;
  // название класса
  wc.lpszClassName = lpzClassName;
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  // загрузка курсора
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW +2);
RegisterClass(&wc); // регистрация класса
 
 
 
HMENU hmenu1;
hmenu1 = CreateMenu();
  // создание диалогового окна
  HWND hWnd = CreateWindow(lpzClassName, TEXT("Главное окно"), 
    WS_OVERLAPPEDWINDOW, 100, 100, 300, 150, NULL, hmenu1, 
    hInst, NULL);
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
  // цикл сообщений приложения
  MSG msg;
    AppendMenu(hmenu1, MF_STRING, 1, "&Каталог");
    AppendMenu(hmenu1, MF_STRING, 2, "&Файлы");
    AppendMenu(hmenu1, MF_STRING, 3, "&Помощь");
    AppendMenu(hmenu1, MF_STRING, 4, "&Выход"); 
    SetMenu(hWnd, hmenu1);
  while(GetMessage(&msg, NULL, NULL, NULL)) // цикл сообщений
  {
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
  }
  return msg.wParam;
}
 
////////////////////////////////////////////////////////////////////////// 
// функция регистрации класса окон
 
 
 
 
 
////////////////////////////////////////////////////////////////////////// 
// функция обработки сообщений
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  // выборка и обработка сообщений
  switch (msg)
  {
   case WM_COMMAND:
   /* нажата наша кнопочка? */
   if (LOWORD(wParam)==1) 
   {
 
  HINSTANCE hInstc;
  LPCTSTR lpzClassNamec;
    WNDCLASS wcc = {0};
  // адрес ф-ции обработки сообщений
  wcc.lpfnWndProc = WndProc;
  // стиль окна
  wcc.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wcc.hInstance = hInstc;
  // название класса
  wcc.lpszClassName = lpzClassNamec;
  wcc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  // загрузка курсора
  wcc.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wcc.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
RegisterClass(&wcc); // регистрация класса
 
HWND child = CreateWindow(lpzClassNamec, TEXT("123"),
                                WS_CHILD | WS_VISIBLE,
                                100, 75, 180, 180, hWnd,NULL,
                                hInstc,
                                NULL);
            ShowWindow(child,SW_NORMAL);
            UpdateWindow(child);
   }
   return 0;
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
  default: 
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, msg, wParam, lParam);
  }
  return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.10.2015, 23:03
Ответы с готовыми решениями:

Дочернее окно дочернего окна в отдельном потоке
есть окно. создается функцией CreateDialog. у него есть дочернее окно, которое создается в отдельном потоке и все сообщения его...

В центре рабочей области окна отображено дочернее окно
Всем добрый. В центре рабочей области окна отображено дочернее окно с фоном цвета трехмерных элементов с вертикальной и горизонтальной...

Дочернее окно копируется в не дочернее(хотя не должно)
При нажатии кнопки появляется окно, но вместо того, что бы отрисоваться как надо, в него копируется дочернее окно главного окна. При...

8
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
01.10.2015, 23:42
Не надо регистрировать класс в WM_COMMAND. Вынесите в WinMain(). Кстати ничего что у них WndProc одинаковый?
Вы задали стиль WS_VISIBLE, значит вызывать ShowWindow не требуется после создания. UpdateWindow() вроде тоже там не надо.
Не понял чему у вас вообще равен ClassName?
0
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 32
01.10.2015, 23:51  [ТС]
Регистрирование класса перенес, это ничего страшного. WndProc не хочет меняться у дочернего, когда меняю жалуется на эту строчку: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ну и соответственно на сам изменненный WndProc. Show и Update уже ставил от безысходности. ClassName задаю каждому классу свой, что бы использовать в CreateWindow
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
01.10.2015, 23:58
Просто я не увидел где оно задаётся, вдруг забыли инициализировать.
C++
1
2
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
А ещё попробуйте главному окну добавить стили WS_CLIPCHILDREN | WS_CLIPSIBLINGS.

Добавлено через 1 минуту
C++
1
if (LOWORD(wParam)==1)
В него вообще заходит? Вдруг нет? Кстати:
Если функция CreateWindow() завершается успешно, возвращаемое значение - дескриптор созданного окна.
Если функция CreateWindow() завершилась ошибкой, возвращаемое значение - ПУСТО (NULL). Чтобы получить расширенную информацию об ошибке вызовите функцию GetLastError.
Что возвращает?
1
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 32
02.10.2015, 00:04  [ТС]
с функциями CALLBACK разобрался, задал разные имена, с этим все хорошо, стили добавил, изменений не последовало, в if (LOWORD(wParam)==1) входит, для проверки писал простой вывод сообщения при нажатии на 1 меню, все выводило, а вот с последним вопросом не совсем разобрался.. вроде как CreatWindow ничего не возвращает.. ну по крайней мере при создании главного окна он мне ни на что не жаловался)
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
02.10.2015, 15:05
Похоже дело вот в чём, окно у вас создаётся и отображается (внутри главного окна), просто оно без рамки и заголовка (только клиентская область), если вы закрасите своё дочернее окно, то увидите результат. По умолчанию у окна стиль WS_OVERLAPPED, и если окно верхнего уровня (нет стиля WS_CHILD), то рамка и заголовок будут рисоваться, если это дочернее окно, то нет. Как тут быть... если вам нужно окно внутри окна (MDI) то просто добавить нужные стили (WS_THICKFRAME | WS_CAPTION | WS_SYSMENU и т.д.), если нужно независимое окно, то не используйте стиль WS_CHILD (этот стиль означает что окно будет существовать только в пределах клиентской области родительского окна).
1
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 32
02.10.2015, 15:41  [ТС]
нет, дело в том, что дочернее окно создается, только если его перенести в winapi, а вот в функции callback не создается, в чем проблема, не могу понять.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
02.10.2015, 15:45
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
#include <Windows.h>
 
#define IDB_BUTTON1 100
 
INT WINAPI wWinMain(HINSTANCE hinst, HINSTANCE hPrev, LPWSTR lpszCmdLine, INT nCmdShow);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegisterWndClass(LPCWSTR lpszClassName, WNDPROC wndProc);
 
HINSTANCE g_hInst = NULL;
HWND g_ChildWnd = NULL;
 
INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR lpszCmdLine, INT nCmdShow)
{
    g_hInst = NULL;
 
    LPCWSTR lpszClassName = L"MainWndClass";
    LPCWSTR lpszWndText = L"Главное окно";
    if (!::RegisterWndClass(lpszClassName, WndProc)) {
        ::MessageBoxW(NULL, L"Ошибка регистрации класса главного окна!", L"Критическая ошибка", MB_OK | MB_ICONERROR);
        return 1;
    }
    HWND hWnd = ::CreateWindowExW(WS_EX_APPWINDOW, lpszClassName, lpszWndText, WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_hInst, NULL);
    if (!hWnd) {
        ::MessageBoxW(NULL, L"Ошибка создания главного окна!", L"Критическая ошибка", MB_OK | MB_ICONERROR);
        return 2;
    }
 
    ::ShowWindow(hWnd, nCmdShow);
    ::UpdateWindow(hWnd);
    MSG msg;
    while (GetMessageW(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
 
    return msg.wParam;
}
 
ATOM RegisterWndClass(LPCWSTR lpszClassName, WNDPROC wndProc)
{
    WNDCLASS wc = { 0 };
 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hInstance = g_hInst;
    wc.lpfnWndProc = wndProc;
    wc.hCursor = ::LoadCursorW(NULL, IDC_ARROW);
    wc.lpszClassName = lpszClassName;
    wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
 
    return ::RegisterClassW(&wc);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static BOOL childWndRegister = FALSE;
    static LPCWSTR lpszChildClassName = L"ChildWindow";
    static LPCWSTR lpszChildWndText = L"Дочернее окно";
    switch (msg) {
    case WM_CREATE:
        if (!::CreateWindowW(L"BUTTON", L"Открыть окно", WS_CHILD | WS_VISIBLE, 30, 25, 120, 30, hWnd, (HMENU)IDB_BUTTON1, g_hInst, NULL))
            ::MessageBoxW(hWnd, L"Ошибка создания кнопки", L"Ошибка", MB_OK | MB_ICONWARNING);
        break;
    case WM_COMMAND:
        if (IDB_BUTTON1 == LOWORD(wParam) && !g_ChildWnd) {
            if (!childWndRegister) {
                if (!::RegisterWndClass(lpszChildClassName, ChildWndProc)) {
                    ::MessageBoxW(hWnd, L"Ошибка регистрации класса дочернего окна", L"Ошибка", MB_OK | MB_ICONWARNING);
                    break;
                }
                childWndRegister = TRUE;
            }
            g_ChildWnd = ::CreateWindowW(lpszChildClassName, lpszChildWndText, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 400, 400, hWnd, NULL, g_hInst, NULL);
            if (!g_ChildWnd)
                ::MessageBoxW(hWnd, L"Ошибка создания дочернего окна", L"Ошибка", MB_OK | MB_ICONWARNING);
            else
                ::ShowWindow(g_ChildWnd, SW_SHOW);
        }
        break;
    case WM_DESTROY:
        ::PostQuitMessage(0);
        break;
    default:
        return ::DefWindowProcW(hWnd, msg, wParam, lParam);
    }
    return NULL;
}
 
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) {
    case WM_ERASEBKGND:
        RECT rect;
        ::GetClientRect(hWnd, &rect);
        ::FillRect((HDC)wParam, &rect, ::GetSysColorBrush(COLOR_HIGHLIGHT));
        break;
    case WM_DESTROY:
        g_ChildWnd = NULL;
    default:
        return ::DefWindowProcW(hWnd, msg, wParam, lParam);
    }
    return NULL;
}
1
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 32
02.10.2015, 15:52  [ТС]
ответ не по заданию, но спасибо, проблема решилась с помощью бубна, наколдовал каким то образом программу, все начало работать, всем спасибо. Тема закрыта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2015, 15:52
Помогаю со студенческими работами здесь

Дочернее окно
Задание: дочернее окно должно убегать от курсора мыши в пределах рабочей области родительского окна. Вот код: #include...

Дочернее окно
Доброго времени суток. Продолжаю писать свою программу, возникла проблема. Я пытался сделать, чтобы дочернее окно открывалось так: скрин....

Дочернее окно
Создаю дочернее окно - оно создается но перетаскивать его за пределы окна родителя нельзя, а мне нужно чтобы можно было, эксперементировал...

Дочернее окно
Не могу создать дочернее окно. Выдает ошибку. Заранее спасибо за любую помощь: LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM...

Дочернее окно
Есть код, в нём создал главное окно, и дочернее. Но как сделать так, что бы по щелчку на дочернее окно, для него появлялось ещё одно...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru