Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292

Вылет программы при попытке создания главного и дочернего окна

27.09.2012, 21:15. Показов 1916. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, что я сделала не так? Запускается и вылетает.
А должно создаваться два окна:основное и дочернее.
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
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR Window[] = _T("win32app");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
HINSTANCE hInst;
BOOL RC(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//функция оконной процедуры
LRESULT CALLBACK Wndchild(HWND, UINT, WPARAM, LPARAM);
static short left, top, cx,cy;
static HWND childw;
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)  ///главная функция
{
    hInst=hInstance;
    if(!RC(WndProc,szWindowClass,COLOR_WINDOW)) return FALSE;
    if(!RC(Wndchild,Window,COLOR_BTNFACE)) return FALSE;  
       //создаём окно
 
 
HWND hWnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 100,
    NULL,
    NULL,
    hInstance,
    NULL
);
 
childw = CreateWindow(
    Window,
    Window,
   WS_CHILD,
        left,top,cx,cy,
        hWnd, 0, hInst, NULL
);
 
if (!hWnd)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
if (!childw)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
//отображаем окно
 
ShowWindow(hWnd,
    nCmdShow);
UpdateWindow(hWnd);
 
//цикл обработки сообщений отправляемых ОС
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
 
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)//добавляем функциональные возможности
{
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Zaharova Anna");
 
    switch (message)
    {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
 
                TextOut(hdc,
                    5, 5,
                    greeting, _tcslen(greeting));
 
            EndPaint(hWnd, &ps);
        break;
 
        case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
        default:return DefWindowProc(hWnd, message, wParam, lParam);break;
    }
    
return 0;
}
 
LRESULT CALLBACK Wndchild(HWND hwnd, UINT msg, 
                        WPARAM wParam, LPARAM lParam)
{ 
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
BOOL RC(WNDPROC WndProc, LPCTSTR Name, UINT brBackground)
{
    
WNDCLASS wc; 
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
 
    wc.lpfnWndProc=WndProc; //указывает на функцию окна
    wc.hInstance=hInst; //указывает на дескриптор текущего приложения
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); //иконка
    wc.hCursor=LoadCursor(NULL, IDC_ARROW); //курсор
    wc.hbrBackground=(HBRUSH)( brBackground +1); //  задает дескриптор кисти закрашивания фона окна
    wc.lpszMenuName=NULL; // имя 
    wc.lpszClassName=Name; //имя класса окон
return (RegisterClass(&wc)!=0);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2012, 21:15
Ответы с готовыми решениями:

Вылет программы при попытке открыть файл
Добрый день. Столкнулся с такой ситуёвиной. При попытке открыть файл функцией CreateFile если в &quot;как действовать&quot; установлено...

Позиционирование дочернего окна относительно элемента главного окна
Всем привет. Подскажите пожалуйста, как можно сделать. У меня есть главное окно, на котором условно говоря расположен textbox, также у меня...

Вылет любой программы при попытке сохраниться на рабочий стол
День добрый. Захожу в паинт, сохраняю работу. По дэфолту открывается сохранение на рабочий стол. И так в любой программе. С Ворда...

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
27.09.2012, 21:38
Попытка зарегистрировать два класса с одинаковым именем, в результате имеешь ошибку 1410, ERROR_CLASS_ALREADY_EXISTS, и, естественно, вылетаешь из программы.
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 21:41  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Попытка зарегистрировать два класса с одинаковым именем, в результате имеешь ошибку 1410, ERROR_CLASS_ALREADY_EXISTS, и, естественно, вылетаешь из программы.
но ошибку никакую не выдаёт, просто компилируется и ничего не происходит.
имена поменяла - не помогло
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.09.2012, 21:47
переведи на какой-нибудь язык "запускается и вылетает".
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 21:51  [ТС]
Цитата Сообщение от novi4ok Посмотреть сообщение
переведи на какой-нибудь язык "запускается и вылетает".
тыкаю f5, зелёненькая кнопочка "play" в Visual Studio становится серой, идёт компиляция. Потом прекращается кнопочка опять становится зелёной, ничего не произошло, можно запускать снова. Вылетает примерно на месте return (RegisterClass(&wc)!=0);
это в самом низу, или при переходе на следующую строку
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
27.09.2012, 21:58
PinkPink, неправда. Главное окно запускается. А чтобы появлялось и дочернее:
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
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR Window[] = _T("win32childapp");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
HINSTANCE hInst;
BOOL RC(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//функция оконной процедуры
LRESULT CALLBACK Wndchild(HWND, UINT, WPARAM, LPARAM);
static short left = 0, top = 0, cx = 100,cy = 100; // <--- устанавливаешь ненулевые значения cx, cy
static HWND childw;
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)  ///главная функция
{
    hInst=hInstance;
    if(!RC(WndProc,szWindowClass,COLOR_WINDOW)) return FALSE;
    if(!RC(Wndchild,Window,COLOR_BTNFACE)) return FALSE;
 
       //создаём окно
 
 
HWND hWnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 100,
    NULL,
    NULL,
    hInstance,
    NULL
);
 
childw = CreateWindow(
    Window,
    Window,
   WS_CHILD|WS_CAPTION|WS_VISIBLE, // <--- Добавляешь ему заголовок и видимость
        left,top,cx,cy,
        hWnd, 0, hInst, NULL
);
 
if (!hWnd)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
if (!childw)
{
    MessageBox(NULL,
        _T("Call to CreateWindow failed!"),
        _T("Win32 Guided Tour"),
        NULL);
 
    return FALSE;
}
//отображаем окно
 
ShowWindow(hWnd,
    nCmdShow);
UpdateWindow(hWnd);
 
//цикл обработки сообщений отправляемых ОС
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
 
}
, тогда и дочернее отображается:
Миниатюры
Вылет программы при попытке создания главного и дочернего окна  
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 22:10  [ТС]
странно, почему-то у меня по прежнему ничего не запускается..
блин( да как так то

Добавлено через 7 минут
может что-то ещё нужно изменить?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
27.09.2012, 22:17
UI, у меня тоже ноль по фазе, может отладчиком пройтись? Или м.б. дело в XP?
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 22:59  [ТС]
ну что?? есть какие-то варианты, а то я тыкаюсь тыкаюсь и ничего
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
27.09.2012, 23:43
А вот так , что то происходит ?
Вложения
Тип файла: rar Окно+доч.окно.rar (9.2 Кб, 9 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
27.09.2012, 23:45
При чем тут XP/не XP? Должно работать везде. Если не работает - проверяйте дебаггером, где именно сбой. Может, MSVC по-другому как-то обрабатывает исходники? У меня GCC. Могу приаттачить полностью проект. С exe-шником. Надо?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
27.09.2012, 23:58
UI, спасибо не надо, этого достаточно, проблема почти решена.
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
28.09.2012, 00:07  [ТС]
разобралась, дело было в том что не все параметры WNDCLASS wc
были проинициализированы.
вопрос, как расположить дочернее окно по центру? нужно как то получить координаты родительского окна? или это как то лучше делается?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
28.09.2012, 00:29
PinkPink, да, WNDCLASS wc = {0};, ну как обычно короче.
С расположением окна уже другая тема.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.09.2012, 00:37
Нет ничего другого не придумали

Перенеси создание дочернего окна в WM_CREATE основного:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        case WM_CREATE:
        {
            RECT r;
            GetClientRect(hWnd, &r);
            childw = CreateWindow(Window, Window,
                                  WS_CHILD|WS_CAPTION|WS_VISIBLE,
                                  (r.right-cx)/2, (r.bottom-cy)/2,cx,cy, hWnd, 0, hInst, NULL);
            if (!childw)
            {
                MessageBox(NULL, _T("Call to CreateWindow failed!"),
                           _T("Win32 Guided Tour"), NULL);
            }
        }
        break;
, будет оно отцентрировано. Только размеры основного (высоту в особенности) побольше задай
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
28.09.2012, 00:48  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Нет ничего другого не придумали

Перенеси создание дочернего окна в WM_CREATE основного:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        case WM_CREATE:
        {
            RECT r;
            GetClientRect(hWnd, &r);
            childw = CreateWindow(Window, Window,
                                  WS_CHILD|WS_CAPTION|WS_VISIBLE,
                                  (r.right-cx)/2, (r.bottom-cy)/2,cx,cy, hWnd, 0, hInst, NULL);
            if (!childw)
            {
                MessageBox(NULL, _T("Call to CreateWindow failed!"),
                           _T("Win32 Guided Tour"), NULL);
            }
        }
        break;
, будет оно отцентрировано. Только размеры основного (высоту в особенности) побольше задай
спасибо! вот это отличный совет.
а RECT в этом случае что за тип данных? и для чего мы его используем
и кроме того, если например при изменении размера окна родительского я хочу менять и размеры дочернего окна, как я могу дочернему передавать параметры?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.09.2012, 00:54
Стандартный WinAPI-шный тип RECT, используем для того, чтобы получить размеры клиентской области окна. А если надо менять размеры одного при изменении размеров другого - есть сообщения WM_SIZE/WM_SIZING, обрабатывай их для родительского окна, и выставляй дочернему новые размеры/позицию через SetWindowPos
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
28.09.2012, 01:30  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Стандартный WinAPI-шный тип RECT, используем для того, чтобы получить размеры клиентской области окна. А если надо менять размеры одного при изменении размеров другого - есть сообщения WM_SIZE/WM_SIZING, обрабатывай их для родительского окна, и выставляй дочернему новые размеры/позицию через SetWindowPos
Code
1
2
3
case WM_SIZE :  
            SetWindowPos(childw,hWnd,0,0,LOWORD(lParam)/2,HIWORD(lParam)/2,SWP_NOMOVE);
break;
так почему-то не прокатывает

Добавлено через 10 минут
всё,получилось:
SetWindowPos(childw,(HWND)NULL,0,0,LOWOR D(lParam)/2,HIWORD(lParam)/2,SWP_NOMOVE);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2012, 01:30
Помогаю со студенческими работами здесь

Прекращение работы (вылет) программы при попытке вывести в поток значения динамического массива
Доброго всем времени суток. Подскажите пожалуйста, почему возникает следующая проблема. Есть некий файл, я его считывают и заношу...

Изменения текста на элементе главного окна из дочернего
Приветствую всех. Не могу найти способ решения моей задачи. У меня есть какое-то окно с Controller1 и в нем есть элемент Button с надписью...

Отображение скрытого в трее окна программы при попытке запуска ее копий
Имеется код: HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, &quot;MyApp&quot;); if(!hMutex) hMutex = CreateMutex(0, 0, &quot;MyApp&quot;); else ...

Вылет при попытке очистки консоли
В программе много раз вызывается функция, которая очищает окно консоли с помощью команды system(&quot;cls&quot;); и...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru