Создание окна CreateWindow возвращает 0
От:
titeha
Дата: 12.05.10 07:50
Оценка:
Доброго дня, уважаемые!
До сих пор кодил в Delphi и asm. Тут возникла потребность написать программу на VC++, создаю для начала пустое
приложение (пустой проект Win32), на которое после буду добавлять функциональность. Итак, для начала нужно создать
окошко. Вспомнив, как это делал в ASM, и просмотрев некоторые книги/учебники, статьи в сети, а также код,
генерируемый волшебником от студии, написал строк 50 кода, который должен был мне просто показать пустое окно
приложения. Но не тут-то было! Функция CreateWindowEx возвращает 0, вызов функции GetLastError возвращает 1407
(Cannot find window class).
собственно сам код:
#include "MyProject.h"
HINSTANCE hInst;
HWND MyProjectWnd;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ATOM MyProjectWndClass;
WNDCLASSEX wc;
MSG msg;
hInst = hInstance;
wc.cbSize = sizeof (WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY_ICON));
wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
wc.hbrBackground = (HBRUSH)1;
wc.lpszMenuName = NULL;
wc.lpszClassName = static_cast <LPCWSTR> (_TEXT("MyProjectWndClass" ));
wc.hIconSm = wc.hIcon;
if (!(MyProjectWndClass = RegisterClassEx(&wc)))
MessageBox(NULL, static_cast <LPCWSTR> (_TEXT("Ошибка запуска программы!" )),
static_cast <LPCWSTR> (_TEXT("Ошибка" )), MB_OK | MB_ICONERROR);
MyProjectWnd = CreateWindowEx(0, (LPCWSTR)MAKELONG(MyProjectWndClass, 0),
static_cast <LPCWSTR> (_TEXT("Этот проект" )),
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (!MyProjectWnd)// return EXIT_FAILURE;
{
DWORD T = GetLastError();
return EXIT_FAILURE;
}
ShowWindow(MyProjectWnd, SW_SHOWNORMAL);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
{
DestroyWindow(hWnd);
break ;
}
case WM_DESTROY:
{
PostQuitMessage(EXIT_SUCCESS);
break ;
}
/*default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;*/
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
Что я делал, чтобы попытаться устранить эту проблему:
1) Все static_cast менчл на преобразования типов в стиле С.
2) При вызове CreateWindowEx менял второй параметр с ATOM на строку имени класса окна.
3) Пробовал использовать функции без префиксов Ex в разных комбинациях.
Пока ничего не помогло. Скажите пожалуйста, где может быть проблема?
Спасибо заранее.
Re: Создание окна CreateWindow возвращает 0
Здравствуйте, titeha, Вы писали:
T> wc.lpszClassName = static_cast<LPCWSTR> (_TEXT("MyProjectWndClass"));
Тихий ужас
wc.lpszClassName = _TEXT("MyProjectWndClass");
А вообще создай мастером Win32 приложение и не создавай себе проблемы.
With best regards
Pavel Dvorkin
Re: Создание окна CreateWindow возвращает 0
Здравствуйте, titeha, Вы писали:
T> MyProjectWnd = CreateWindowEx(0, _TEXT("MyProjectWndClass"),
T> _TEXT("Этот проект"),
With best regards
Pavel Dvorkin
T>> MyProjectWnd = CreateWindowEx(_TEXT("MyProjectWndClass"),
T>> _TEXT("Этот проект"),
With best regards
Pavel Dvorkin
Re[2]: Создание окна CreateWindow возвращает 0
От:
titeha
Дата: 12.05.10 09:05
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, titeha, Вы писали:
T>> wc.lpszClassName = static_cast<LPCWSTR> (_TEXT("MyProjectWndClass"));
PD>Тихий ужас
PD>wc.lpszClassName = _TEXT("MyProjectWndClass");
PD>А вообще создай мастером Win32 приложение и не создавай себе проблемы.
Мастером создавал, и пихал тот код, что представленв место создаваемого мастером (собственно все то же самое создает мастер), и вы знаете, все прекрасно работает, а при создании пустого проекта с этим кодом — не работает. Почему так?
По поводу приведения типов: так затребовал компилятор, я сначала пробовал написать, как Вы предложили, но компилятор начал дико ругаться на несоответствие типов, про нереальность приведения типов tchar к const tchar* и т.д. Пришлось курить MSDN, искать решение в сети и пришел таки к такому решению. Изначально приведение проводилось так:
wc.lpszClassName = (LPCWSTR)_TEXT("MyProjectWndClass");
С уважением, Аретмий Соболев
Re[3]: Создание окна CreateWindow возвращает 0
Здравствуйте, titeha, Вы писали:
Исправленный код. Обрати внимание на выделенное жирным. В проекте должны быть установлены макросы UNICODE и _UNICODE
#include "windows.h"
#include "tchar.h"
#include "resource.h"
HINSTANCE hInst;
HWND MyProjectWnd;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ATOM MyProjectWndClass;
WNDCLASSEX wc;
MSG msg;
hInst = hInstance;
wc.cbSize = sizeof (WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
wc.hbrBackground = (HBRUSH)1;
wc.lpszMenuName = NULL;
wc.lpszClassName = _TEXT("MyProjectWndClass" );
wc.hIconSm = wc.hIcon;
wc.hInstance = hInstance; // это я добавил
if (!(MyProjectWndClass = RegisterClassEx(&wc)))
MessageBox(NULL, (_TEXT("Ошибка запуска программы!" )),
(_TEXT("Ошибка" )), MB_OK | MB_ICONERROR);
MyProjectWnd = CreateWindowEx(0, (LPCWSTR)MAKELONG(MyProjectWndClass, 0),
(_TEXT("Этот проект" )),
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (!MyProjectWnd)// return EXIT_FAILURE;
{
DWORD T = GetLastError();
return EXIT_FAILURE;
}
ShowWindow(MyProjectWnd, SW_SHOWNORMAL);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
{
DestroyWindow(hWnd);
break ;
}
case WM_DESTROY:
{
PostQuitMessage(EXIT_SUCCESS);
break ;
}
/*default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;*/
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
With best regards
Pavel Dvorkin
Re[4]: Создание окна CreateWindow возвращает 0
От:
Аноним
Дата: 12.05.10 10:53
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, titeha, Вы писали:
PD>Исправленный код. Обрати внимание на выделенное жирным. В проекте должны быть установлены макросы UNICODE и _UNICODE
<< Далее по тексту >>
Большое Вам спасибо, тему можно считать закрытой. Себе урок "быть более внимательным". Все получилось, и работает. И еще, спасибо за терпение.
С уважением, Артемий Соболев.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить