Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2010, 10:00   #1
Merowing
 
Регистрация: 09.04.2010
Сообщений: 4
По умолчанию Кнопка убивает приложение

Я начинающий программист. Изучаю С++, и вот решил занять программированием 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.
Листинг в следующем окне.
Merowing вне форума Ответить с цитированием
Старый 09.04.2010, 10:09   #2
Merowing
 
Регистрация: 09.04.2010
Сообщений: 4
По умолчанию

// 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)
{ далее без изменений (лимит, весь листинг не влезает)}
Merowing вне форума Ответить с цитированием
Старый 09.04.2010, 13:57   #3
Merowing
 
Регистрация: 09.04.2010
Сообщений: 4
По умолчанию

Спосибо!!! Нашел ошибку.
Я в первом случае взял класс из книги "BUTTON", но в остальных случиях я писал, что угодно только не "BUTTON" (в данном случае BTNCHESSDROME).
Merowing вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ALT убивает кнопки и т.д. garyanikin Общие вопросы Delphi 5 19.01.2010 17:38
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05
Настраиваемая кнопка FARTING Microsoft Office Excel 17 17.08.2009 16:37
Вогнутая кнопка John_chek Общие вопросы Delphi 5 20.11.2007 14:21