9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
1

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

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

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, что я сделала не так? Запускается и вылетает.
А должно создаваться два окна:основное и дочернее.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2012, 21:15
Ответы с готовыми решениями:

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

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

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

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

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,428
Записей в блоге: 8
27.09.2012, 21:38 2
Попытка зарегистрировать два класса с одинаковым именем, в результате имеешь ошибку 1410, ERROR_CLASS_ALREADY_EXISTS, и, естественно, вылетаешь из программы.
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 21:41  [ТС] 3
Цитата Сообщение от UI Посмотреть сообщение
Попытка зарегистрировать два класса с одинаковым именем, в результате имеешь ошибку 1410, ERROR_CLASS_ALREADY_EXISTS, и, естественно, вылетаешь из программы.
но ошибку никакую не выдаёт, просто компилируется и ничего не происходит.
имена поменяла - не помогло
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.09.2012, 21:47 4
переведи на какой-нибудь язык "запускается и вылетает".
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
27.09.2012, 21:51  [ТС] 5
Цитата Сообщение от novi4ok Посмотреть сообщение
переведи на какой-нибудь язык "запускается и вылетает".
тыкаю f5, зелёненькая кнопочка "play" в Visual Studio становится серой, идёт компиляция. Потом прекращается кнопочка опять становится зелёной, ничего не произошло, можно запускать снова. Вылетает примерно на месте return (RegisterClass(&wc)!=0);
это в самом низу, или при переходе на следующую строку
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,428
Записей в блоге: 8
27.09.2012, 21:58 6
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
странно, почему-то у меня по прежнему ничего не запускается..
блин( да как так то

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

Перенеси создание дочернего окна в 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  [ТС] 16
Цитата Сообщение от 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
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,428
Записей в блоге: 8
28.09.2012, 00:54 17
Стандартный WinAPI-шный тип RECT, используем для того, чтобы получить размеры клиентской области окна. А если надо менять размеры одного при изменении размеров другого - есть сообщения WM_SIZE/WM_SIZING, обрабатывай их для родительского окна, и выставляй дочернему новые размеры/позицию через SetWindowPos
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
28.09.2012, 01:30  [ТС] 18
Цитата Сообщение от UI Посмотреть сообщение
Стандартный WinAPI-шный тип RECT, используем для того, чтобы получить размеры клиентской области окна. А если надо менять размеры одного при изменении размеров другого - есть сообщения WM_SIZE/WM_SIZING, обрабатывай их для родительского окна, и выставляй дочернему новые размеры/позицию через SetWindowPos
Код
case WM_SIZE :  
			SetWindowPos(childw,hWnd,0,0,LOWORD(lParam)/2,HIWORD(lParam)/2,SWP_NOMOVE);
break;
так почему-то не прокатывает

Добавлено через 10 минут
всё,получилось:
SetWindowPos(childw,(HWND)NULL,0,0,LOWORD(lParam)/2,HIWORD(lParam)/2,SWP_NOMOVE);
0
28.09.2012, 01:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2012, 01:30
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru