PMG

Форумы по созданию игр
Текущее время: 26 июл 2026 07:25

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 09 апр 2007 19:50 
Не в сети
Новичок

Зарегистрирован: 08 апр 2007 18:57
Сообщения: 9
Помогите разобраться с функцие CreateWindowEx()

На её последнем аргументе вылетает ошибка типа
error C2664: 'CreateWindowExA' : cannot convert parameter 3 from 'LPCWSTR' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Понятно,что надо сделать явное преобразование с помощью reinterpret_cast ,но как именно,пытался,но ничего не получилось...
Код,где возникает ошибка я выделил коричневым цветом...
Подскажите...

#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

HGLRC hRC=NULL;
HDC hDC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;
bool keys[256];
bool active=true;
bool fullscreen=true;

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
GLvoid ReSizeGLScene( GLsizei width, GLsizei height )
{
if( height == 0 )
{
height = 1;
}
glViewport( 0, 0, width, height );
glMatrixMode(GL_PROJECTION);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
int InitGL( GLvoid )
{
glShadeModel( GL_SMOOTH );
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth( 1.0f );
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
return true;
}
int DrawGLScene( GLvoid )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
return true;
}
GLvoid KillGLWindow( GLvoid )
{
if( fullscreen )
{
ChangeDisplaySettings( NULL, 0 );
ShowCursor( true );
}
if( hRC )
{
if( !wglMakeCurrent( NULL, NULL ) )
{
MessageBox( NULL, (LPCWSTR)"Release Of DC And RC Failed.", (LPCWSTR)"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
}
if( !wglDeleteContext( hRC ) )
{
MessageBox( NULL, (LPCWSTR)"Release Rendering Context Failed.", (LPCWSTR)"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
}
hRC = NULL;
}
if( hDC && !ReleaseDC( hWnd, hDC ) )
{
MessageBox( NULL, (LPCWSTR)"Release Device Context Failed.", (LPCWSTR)"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
hDC=NULL;
}
if(hWnd && !DestroyWindow(hWnd))
{
MessageBox( NULL, (LPCWSTR)"Could Not Release hWnd.", (LPCWSTR)"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
hWnd = NULL;
}
if( !UnregisterClass( (LPCWSTR)"OpenGL", hInstance ) )
{
MessageBox( NULL, (LPCWSTR)"Could Not Unregister Class.", (LPCWSTR)"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
hInstance = NULL;
}
}

BOOL CreateGLWindow( LPCWSTR title, int width, int height, int bits, bool fullscreenflag )
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
fullscreen=fullscreenflag;
hInstance = GetModuleHandle(NULL);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCWSTR)"OpenGL";
if( !RegisterClass( &wc ) )
{
MessageBox( NULL, (LPCWSTR)"Failed To Register The Window Class.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
if( fullscreen )
{
DEVMODE dmScreenSettings;
memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) );
dmScreenSettings.dmSize=sizeof( dmScreenSettings );
dmScreenSettings.dmPelsWidth = width;
dmScreenSettings.dmPelsHeight = height;
dmScreenSettings.dmBitsPerPel = bits;
dmScreenSettings.dmFields= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
{
if( MessageBox( NULL, (LPCWSTR)"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",
(LPCWSTR)"NeHe GL", MB_YESNO | MB_ICONEXCLAMATION) == IDYES )
{
fullscreen = false;
}
else
{
MessageBox( NULL, (LPCWSTR)"Program Will Now Close.", (LPCWSTR)"ERROR", MB_OK | MB_ICONSTOP );
return false;
}
}
}
if(fullscreen)
{
dwExStyle = WS_EX_APPWINDOW;
dwStyle = WS_POPUP;
ShowCursor( false );
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx( &WindowRect, dwStyle, false, dwExStyle );
if( !( hWnd = CreateWindowEx( dwExStyle,
_T("OpenGL"),
title,
WS_CLIPSIBLINGS |
WS_CLIPCHILDREN |
dwStyle,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
NULL,
NULL,
hInstance,
NULL ) ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Window Creation Error.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
bits,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
if( !( hDC = GetDC( hWnd ) ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Can't Create A GL Device Context.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
if( !( PixelFormat = ChoosePixelFormat( hDC, &pfd ) ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Can't Find A Suitable PixelFormat.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
if( !SetPixelFormat( hDC, PixelFormat, &pfd ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Can't Set The PixelFormat.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
if( !( hRC = wglCreateContext( hDC ) ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Can't Create A GL Rendering Context.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION);
return false;
}
if( !wglMakeCurrent( hDC, hRC ) )
{
KillGLWindow();
MessageBox( NULL, (LPCWSTR)"Can't Activate The GL Rendering Context.", (LPCWSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
ShowWindow( hWnd, SW_SHOW );
SetForegroundWindow( hWnd );
SetFocus( hWnd );
ReSizeGLScene( width, height );
if( !InitGL() )
{
KillGLWindow();
MessageBox( NULL, _T("Initialization Failed."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION );
return false;
}
return true;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 09 апр 2007 19:57 
Не в сети
Новичок

Зарегистрирован: 08 апр 2007 18:57
Сообщения: 9
Приведённый код с коментариями хранится на сайте
http://pmg.org.ru/nehe/nehe01.htm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 апр 2007 11:53 
Не в сети
Постоянный

Зарегистрирован: 19 янв 2007 12:29
Сообщения: 82
Привет всем.

Ну, что здесь можно сказать?!.. Это уроки по OpenGL, а не по Wind!!!

Настоятель советую книги : Чарльз Петзольд "Программирование под Window" и Джефф Рихтер "Созданиме эффективных Win32-приложений с учетом специфики 64-разрядной версии Window" (ссылки нет) - они помогут решить большенство проблем по прогаммированию под Wind.
Цитата:
На её последнем аргументе вылетает ошибка типа
error C2664: 'CreateWindowExA' : cannot convert parameter 3 from 'LPCWSTR' to 'LPCSTR'

Ну не на последнем, конечно!!!!!!!!!!!!!!!!!!

Объясняю вкрадце:

Накой .... использовать 'LPCWSTR' - это тип строси в Unicode. В то время как функция 'CreateWindowExA' обрабатывае строки в ANSI - понятно, что она ругаеться!!!!
Что за маничка такая использовать 'LPCWSTR' - ипользуйте PSTR, и если неймется, подключайте #include <tchar.h> и пользуйтесь PTSTR или PCTSTR, или на худой конец char*... или TCHAR* ...

Краткая справка: в заголовочных файлах Wind определено
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif //UNICODE

Если вы уж действительно заботитесь что бы строси были в UNICODE (использование COM-технологии, я так понимаю), определите макрос: #define UNICODE

Даже если вы не определили макрос #define UNICODE, но маничка вас преследует, в голове звучит - "UNICODE!.. UNICODE!.. UNICODE!..." Вы главное не волнуйтесь - функция CreateWindowEx работает как буфер: она принимает строки в ANSI, преобразует из в строки UNICODE и вызывает функцию CreateWindowExW

_________________
С уважением, Дмитрий


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 апр 2007 16:50 
Не в сети
Новичок

Зарегистрирован: 08 апр 2007 18:57
Сообщения: 9
Как понял,советуешь подключить библиотеку #include <tchar.h> ,всё равно ругается...

error C2664: 'CreateWindowExA' : cannot convert parameter 3 from 'LPCWSTR' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

просит сделать преобразования с помощью reinterpret_cast...
Сделал это преобразование,написав reinterpret_cast<LPCSTR*>(NULL)
всё равно выдается тоже самое сообщение об ошибке...Обычное приведение (LPCSTR)NULL тоже не даёт никаких результатов(тоже самое сообщение об ошибке)...
Моё предположение,что это связано со средой разработки Visaul Studio 2005 ,особенностями компилятора...Но как исправить не знаю...
Подскажи,что можно ещё предпринять...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 апр 2007 02:07 
Не в сети
Новичок

Зарегистрирован: 15 мар 2007 02:58
Сообщения: 2
Используй CreateWindowExW вместо CreateWindowEx
Как-то по тупому сделано, везде asci сторки , а CreateWindow - unicode


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 апр 2007 09:44 
Не в сети
Постоянный

Зарегистрирован: 19 янв 2007 12:29
Сообщения: 82
Привет всем.

А все по тому, что в настройках поекта по умолчанию установлен UNICODE!
Project Settin'/C/C++/- дальше ищи поле Character Set

_________________
С уважением, Дмитрий


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 19 окт 2008 13:50 
Не в сети
Новичок

Зарегистрирован: 19 окт 2008 12:33
Сообщения: 5
Откуда: Тольятти
Сорри за некропост, просто решил не заводить тему по одной и той же функции.
CreateWindowEx()
Ошибка мне не известна, верней код, выведать я ее не смог. Суть проблемы я скопипастил код из первого урока, и в
Код:
if( !( hWnd = CreateWindowEx(  dwExStyle,
          _T("OpenGL"),
          title,
          WS_CLIPSIBLINGS |
          WS_CLIPCHILDREN |
          dwStyle,
          0, 0,
          WindowRect.right-WindowRect.left,
          WindowRect.bottom-WindowRect.top,
          NULL,
          NULL,
          hInstance,
          NULL )))
  {
   KillGLWindow();                // Восстановить экран
    MessageBox( NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
    return false;                // Вернуть false
  }

Выпадает сообщение "Window Creation Error". Т.е. "hWnd = NULL", что означает ошибку
GetLastError выдал мне "vice Context"... я не смог правильно отобразить значение ошибки... и скорее всего более правильный текст "что-то...Device Context"

Так вот, что может вызывать такую ошибку? И как нужно правильно вывести ошибку на экран, с помощью команды GetLastError...
OS Windows Vista/XP (не зависит от операционки)
Dev-C++ среда разработки


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 20 окт 2008 09:12 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Очень странно. У тебя есть какие-то работающие примеры с этой функцией?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 20 окт 2008 09:23 
Не в сети
Новичок

Зарегистрирован: 19 окт 2008 12:33
Сообщения: 5
Откуда: Тольятти
Да есть, везде эта функция работает кроме как здесь.
Хотя бы как правильно вывести значение GetLastError'а?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 20 окт 2008 16:04 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Замени ее на работающую.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с функцие CreateWindowEx()
СообщениеДобавлено: 21 окт 2008 20:23 
Не в сети
Новичок

Зарегистрирован: 19 окт 2008 12:33
Сообщения: 5
Откуда: Тольятти
Спасибо, я поробовал, получилось. Но вот хотелось бы и чтобы фуллскрин был(... ну это я как нибудь сам потом.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB