Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Отмена командной строки в консольком приложении


Автор: KaraKum 11.3.2008, 20:44
Доброе время суток.
Создал консольное приложение через Visual C++ 7 на основе GLUT OpenGL и, соответственно, помимо окна OpenGl открывается командная строка.
Посоветуйте, пожалуйста, как можно отключить командную строку?

Автор: Solomon 11.3.2008, 21:01
Ну дык.. тыже консольное приложение создаеш...
создай Win32 приложение. и небудет консоли...

Автор: Rickert 12.3.2008, 05:31
Solomon, +тыща smile 

Автор: KaraKum 12.3.2008, 07:55
Пробовал.
Вот функция main() для OpenGL приложения:
Код

void main(int argc, char **argv){    
glutInit(&argc, argv);    
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    
glutInitWindowSize(500, 500);    
glutInitWindowPosition(0, 0);    
glutCreateWindow("Simple OpenGL example!");    
glutDisplayFunc(display);    
myinit();    
glutMainLoop();    
}

В функции WinMain() нет параметров, что нужны для glutInit().
Я знаю как создавать Windows-приложения без использования библиотеки GLUT, то есть с помощью функций CreateWindow(), WndProc() и так далее, но хотелось бы с вышеописанным кодом - коротко и удобно, да и во всех обучающих книгах программы создаются именно таким способом, к тому же такой код будет значительно легче перевести на другие платформы.
Если есть какой-нибудь способ отменить консоль или заставить код работать через Windows-приложение - скажите, плиз.

Автор: just_geek 12.3.2008, 11:56
создать Win32 приложение, а argc & argv можно получить так

Код

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int __cdecl main()
{
   LPWSTR *szArglist;
   int nArgs;
   int i;

   szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
   if( NULL == szArglist )
   {
      wprintf(L"CommandLineToArgvW failed\n");
      return 0;
   }
   else for( i=0; i<nArgs; i++) printf("%d: %ws\n", i, szArglist[i]);

// Free memory allocated for CommandLineToArgvW arguments.

   LocalFree(szArglist);

   return(1);
}
где szArgList = argv, nArgs = argc... правда надо будет еще конвертануть szArglist в обычный LPSTR функцией WideCharToMultiByte :)

Автор: KaraKum 12.3.2008, 12:12
Изменил функцию main() на WinMain() и вот что изменилось в коде:

Код

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    glutInit(&nCmdShow, &lpCmdLine);
...

Программа компилируется и компонуется, но при старте обнаруживается ошибка, однако в отладочном режиме прога нормально работает.
Скажите, что не так?

Автор: just_geek 12.3.2008, 12:15
nCmdShow НЕ кол-во параметров это 
Цитата

Specifies how the window is to be shown. This parameter can be one of the following values


  • SW_HIDE Hides the window and activates another window.

  • SW_MAXIMIZE Maximizes the specified window.



и т.д.


т.е. это должно выглядеть примерно так:
1. конвертируем lpCmdLine в LPWSTR
2. вызываем LPWSTR cmdline = CommandLineToArgvW(..., &argc), получаем то что нужно
3. конвертируем cmdline в LPSTR
4. glutInit(&argc, &cmdline)

Автор: KaraKum 12.3.2008, 12:54
Пока предыдущее сообщение писал - ты уже успел ответить.
Отредактировал код и в итоге отличительная часть вышла такой:
Код

...
char* argv = "Window";
WideCharToMultiByte( CP_ACP, NULL, *szArglist, -1, argv, 0, NULL, NULL);
/////

glutInit(&argc, &argv);

Если argv не определить как "Window", то выходила ошибка при запуске проги: ...argv was used without being instulled.
Вобщем всё работает, спасибо за помощь.

И ещё такой вопрос: как с помощью библиотеки GLUT сделать так, чтобы окно открывась как WS_POPUP, то есть на весь экран и, соответственно, без заголовка и элементов проводника?

Автор: just_geek 12.3.2008, 13:23
Вообще то если argv = NULL, то первое выполнение WideCharToMultiByte вернет размер буфера, под который надо выделить память, затем выделяешь память, и вызываешь повторно WideCharToMultiByte.

а чем glutFullScreen не устраивает?

Автор: KaraKum 12.3.2008, 13:42
Не мог нигде найти описания функций GLUT - только что нашёл на сайте OpenGL.org и всё встало на свои места.
Вобщем, большое спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)