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

Кнопка убивает приложение

09.04.2010, 09:56. Показов 733. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я начинающий программист. Изучаю С++, и вот решил занять программированием Windows-приложений на С++. Купил умную книжку, раздобыл компилятор MS Visual, (даже два, 2003 и 2005) ну и взялся за изучение.
Так вот дошел я до кнопок. Сделал все как описано было в книге, ну и получил в результате нормально функционирующую кнопку. Проблемы начались потом.
При попытке создания кнопки в другом приложении я натолкнулся на неприятности. Приложение компилируется без ошибок и сообщений. Все отлично. Но при попытке открыть приложение, оно открывалось и тут же закрывалось.
Стоило только удалить функцию CreateWindow для кнопки, как приложение снова нормально функционировало (но ясно кнопки не было). Также при удалении проверочного If после CreateWindow, тоже все снова функционировало нормально (но снова без кнопки). То есть следовательно по кокой-то причине CreateWindow возвращает False. Но в чем причина не пойму, почему он первый раз вернул True и создал нормальную кнопку, а потом забастовал, и не в какую. У же приложений десять на писал. Пытался использовать срр файл первого удачного приложения, менял компилятор 2005 на 2003, и все равно результат равнялся нулю.
Что бы вы смогли лучше проанализировать мою проблему, внизу прикладываю листинг срр файла созданного стандартным проектом Win32 Application (Windows Application). В него я добавил необходимый минимум для создания кнопки (все, кроме обработки в оконной процедуре сообщений посылаемых самой кнопкой, все равно на конечный результат это не влияет). В остальные файлы изменений не вносил, разве что добавил два строковых ресурса: IDS_BTNCHESSDROME со значением BTNCHESSDROME и IDS_NEWGAME_TITLE созначением New Game.

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// Chessdrome_Beta01.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include "Chessdrome_Beta01.h"
#define MAX_LOADSTRING 100
#define BTN1 1                                              //Добавлено
 
// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
TCHAR szBtnClass[MAX_LOADSTRING];                 //Добавлено
TCHAR szNewGameTitle[MAX_LOADSTRING];          //Добавлено
HWND hWnd;                                                   // Перенесено из InitInstance
HWND hWnd1;                                                  //Добавлено
 
// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;
 
    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_CHESSDROME_BETA01, szWindowClass, MAX_LOADSTRING);
    LoadString(hInstance, IDS_BTNCHESSDROME, szBtnClass, MAX_LOADSTRING);            //Добавлено
    LoadString(hInstance, IDS_NEWGAME_TITLE, szNewGameTitle, MAX_LOADSTRING);     //Добавлено
    MyRegisterClass(hInstance);
 
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CHESSDROME_BETA01);
 
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX); 
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_CHESSDROME_BETA01);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = (LPCTSTR)IDC_CHESSDROME_BETA01;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
 
    return RegisterClassEx(&wcex);
}
 
//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   hWnd1 = CreateWindow(szBtnClass, szNewGameTitle, WS_VISIBLE | WS_CHILD,     //Добавлено
      210, 20, 80, 20, hWnd, reinterpret_cast<HMENU>(BTN1), hInstance, NULL);
 
   if (!hWnd1)                                                                                                 //Добавлено
   {
      return FALSE;
   }
 
   return TRUE;
}
 
//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message) 
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2010, 09:56
Ответы с готовыми решениями:

ActionBar убивает приложение
import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import...

Простое приложение: кнопка и два окна
Помогите, пожалуйста, начинающему - не собирается код package com.prof_ege.myapplication2; import...

Создайте новое приложение, в котором на форме расположены Поле ввода, Метка и Кнопка
Создайте новое приложение, в котором на форме расположены Поле ввода, Метка и Кнопка. Пользователь вводит в Поле ввода целое число N. После...

2
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
09.04.2010, 11:22
ну, раз окно на создается, значит параметры не верны.

1)что за класс окна-кнопки? что загружается в szBtnClass?
2)что за фигня reinterpret_cast<HMENU>(BTN1)?
смотрим MSDN
reinterpret_cast Operator

Allows any pointer to be converted into any other pointer type.
перевожу: приводит любой УКАЗАТЕЛЬ к УКАЗАТЕЛЮ на любой другой тип.
подумай, что делаешь...
0
0 / 0 / 0
Регистрация: 09.04.2010
Сообщений: 8
09.04.2010, 13:03  [ТС]
Спосибо!!! Нашел ошибку.
Я в первом случае взял класс из книги "BUTTON", но в остальных случиях я писал, что угодно только не "BUTTON" (в данном случае BTNCHESSDROME). Теперь, конечно я понял причину ошибки, а так три дня ее искал ( и четыре дня еще потом бы искал, если бы вы не подсказали).
На счет represent_cast тут вроде бы все правильно.
Если верить Герберту Шилдту, он предназначен, чтобы приводить динамические типы к статическим (фундаментальные преобразования), а для преобразования есть dynamic_cast.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2010, 13:03
Помогаю со студенческими работами здесь

Кнопка, при нажатии которой приложение закроется и откроется браузер с нужным сайтом
Как сделать так что бы при нажатии приложение закрывалось и открывался браузер с нужным сайтом?

EI убивает
Во всём остальном открывается нормально! Help! Такой код: &lt;html&gt; &lt;head&gt; &lt;title&gt;Социальная сеть&lt;/title&gt; &lt;style&gt; BODY...

Убивает Касперского
Я с флэшки занёс себе &quot;Новая папка.exe&quot; касперского-сожрал,диспетчер задач-0отключил!!!!!!!11 Что делать ?ПОМОГИТЕ

Математика убивает креативность
Это в свое время ляпнул, ЕМНИП, минобразования, над ним большинство посмеивались. А зря. Может и не стоило это произносить с высоких...

NSTableView меня убивает
Доброе время суток... вопрос как пользоваться этой штукой... и еще с помощью NSArrayController есть ли какие-то ссылки на полезные...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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