PMG http://forum.pmg.org.ru/ |
|
DevC++ vs VC++ http://forum.pmg.org.ru/viewtopic.php?f=4&t=524 |
Страница 2 из 2 |
Автор: | NetLib [ 27 июн 2006 14:11 ] |
Заголовок сообщения: | |
Ну и где в этой программе функция WinMain??? То, что вы показали это заголовочный файл .h (Header file) а к нему нужен еще и файл с кодом программы .cpp. В проекте к 1 главе книги 3 файла D3Utility.h #ifndef __d3dUtilityH__ #define __d3dUtilityH__ #include <d3dx9.h> #include <string> namespace d3d { bool InitD3D( HINSTANCE hInstance, // [in] Application instance. int width, int height, // [in] Backbuffer dimensions. bool windowed, // [in] Windowed (true)or full screen (false). D3DDEVTYPE deviceType, // [in] HAL or REF IDirect3DDevice9** device);// [out]The created device. int EnterMsgLoop( bool (*ptr_display)(float timeDelta)); LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); template<class T> void Release(T t) { if( t ) { t->Release(); t = 0; } } template<class T> void Delete(T t) { if( t ) { delete t; t = 0; } } } #endif // __d3dUtilityH__ ======================================= d3utility.cpp #include "d3dUtility.h" bool d3d::InitD3D( HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9** device) { // // Create the main application window. // WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)d3d::WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(0, IDI_APPLICATION); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = "Direct3D9App"; if( !RegisterClass(&wc) ) { ::MessageBox(0, "RegisterClass() - FAILED", 0, 0); return false; } HWND hwnd = 0; hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App", WS_EX_TOPMOST, 0, 0, width, height, 0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/); if( !hwnd ) { ::MessageBox(0, "CreateWindow() - FAILED", 0, 0); return false; } ::ShowWindow(hwnd, SW_SHOW); ::UpdateWindow(hwnd); // // Init D3D: // HRESULT hr = 0; // Step 1: Create the IDirect3D9 object. IDirect3D9* d3d9 = 0; d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if( !d3d9 ) { ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0); return false; } // Step 2: Check for hardware vp. D3DCAPS9 caps; d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); int vp = 0; if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // Step 3: Fill out the D3DPRESENT_PARAMETERS structure. D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = width; d3dpp.BackBufferHeight = height; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = windowed; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Step 4: Create the device. hr = d3d9->CreateDevice( D3DADAPTER_DEFAULT, // primary adapter deviceType, // device type hwnd, // window associated with device vp, // vertex processing &d3dpp, // present parameters device); // return created device if( FAILED(hr) ) { // try again using a 16-bit depth buffer d3dpp.AutoDepthStencilFormat = D3DFMT_D16; hr = d3d9->CreateDevice( D3DADAPTER_DEFAULT, deviceType, hwnd, vp, &d3dpp, device); if( FAILED(hr) ) { d3d9->Release(); // done with d3d9 object ::MessageBox(0, "CreateDevice() - FAILED", 0, 0); return false; } } d3d9->Release(); // done with d3d9 object return true; } int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) { MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); static float lastTime = (float)timeGetTime(); while(msg.message != WM_QUIT) { if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else { float currTime = (float)timeGetTime(); float timeDelta = (currTime - lastTime)*0.001f; ptr_display(timeDelta); lastTime = currTime; } } return msg.wParam; } =========================================== D3DInit.cpp #include "d3dUtility.h" // // Globals // IDirect3DDevice9* Device = 0; // // Framework Functions // bool Setup() { // Nothing to setup in this sample. return true; } void Cleanup() { // Nothing to cleanup in this sample. } bool Display(float timeDelta) { if( Device ) // Only use Device methods if we have a valid device. { // Instruct the device to set each pixel on the back buffer black - // D3DCLEAR_TARGET: 0x00000000 (black) - and to set each pixel on // the depth buffer to a value of 1.0 - D3DCLEAR_ZBUFFER: 1.0f. Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); // Swap the back and front buffers. Device->Present(0, 0, 0, 0); } return true; } // // WndProc // LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_DESTROY: ::PostQuitMessage(0); break; case WM_KEYDOWN: if( wParam == VK_ESCAPE ) ::DestroyWindow(hwnd); break; } return ::DefWindowProc(hwnd, msg, wParam, lParam); } // // WinMain // int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd) { if(!d3d::InitD3D(hinstance, 640, 480, true, D3DDEVTYPE_HAL, &Device)) { ::MessageBox(0, "InitD3D() - FAILED", 0, 0); return 0; } if(!Setup()) { ::MessageBox(0, "Setup() - FAILED", 0, 0); return 0; } d3d::EnterMsgLoop( Display ); Cleanup(); Device->Release(); return 0; } Если пытаться скомпилировать кусок программы, выдранный из ее середины, то ничего удивительного, если он компилироваться не будет. |
Автор: | Assassin [ 27 июн 2006 17:40 ] |
Заголовок сообщения: | |
А ну вобщем нето компилил. |
Автор: | Assassin [ 27 июн 2006 18:30 ] |
Заголовок сообщения: | |
Короче я нехрена с этим ДХ неразберусь буду писать под ОГЛ.Заново под VC++ буду свой двиг переписывать.Одно утишает в этой книги полезная инфа о математике. |
Автор: | NetLib [ 27 июн 2006 18:41 ] |
Заголовок сообщения: | |
Вы думаете что для OpenGL функция WinMain и цикл обработки сообщений необязательны???? |
Автор: | Assassin [ 28 июн 2006 00:52 ] |
Заголовок сообщения: | |
Цитата: Вы думаете что для OpenGL функция WinMain и цикл обработки сообщений необязательны????
Нет я решил остатся в превычной для себя среде(ОГЛ) ДХ для меня полный лес. |
Автор: | Assassin [ 30 июн 2006 20:21 ] |
Заголовок сообщения: | |
Visual C++ отказуется компилить этот участок кода Код: Gluint texture[2];
AUX_RGBImageRec* text[2]; GLvoid IV_BMPLoad() { text[0] = auxDIBImageLoad("Data/box.bmp"); glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, text[0]->sizeX, text[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, text[0]->data); } Errors c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : error C2146: syntax error : missing ';' before identifier 'texture' c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : error C2501: 'Gluint' : missing storage-class or type specifiers c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(8) : fatal error C1004: unexpected end of file found Error executing cl.exe. inno.exe - 3 error(s), 0 warning(s) Памагите |
Автор: | NetLib [ 30 июн 2006 20:43 ] |
Заголовок сообщения: | |
Сразу видна одна ошибка - надо писать GLuint. Обратите внимание на регистр символов (какие буквы строчные, а какие заглавные) и учтите, что С++ чувствителен к регистру. |
Автор: | Assassin [ 01 июл 2006 11:12 ] |
Заголовок сообщения: | |
Исправил и получил. c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(23) : error C2373: 'text' : redefinition; different type modifiers c:\program files\microsoft visual studio\vc98\include\fstream.h(161) : see declaration of 'text' c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(26) : error C2109: subscript requires array or pointer type c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(26) : error C2440: '=' : cannot convert from 'struct _AUX_RGBImageRec *' to 'class ios &(__cdecl *)(class ios &)' There is no context in which this conversion is possible c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2109: subscript requires array or pointer type c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2227: left of '->sizeX' must point to class/struct/union c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2109: subscript requires array or pointer type c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(31) : error C2227: left of '->sizeY' must point to class/struct/union c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(32) : error C2109: subscript requires array or pointer type c:\program files\microsoft visual studio\vc98\include\i3d\itexture.h(32) : error C2227: left of '->data' must point to class/struct/union c:\program files\microsoft visual studio\vc98\include\i3d\igl.h(19) : warning C4305: 'argument' : truncation from 'const double' to 'float' Error executing cl.exe. inno.exe - 9 error(s), 1 warning(s) |
Автор: | NetLib [ 01 июл 2006 22:10 ] |
Заголовок сообщения: | |
У вас два раза определена глобальная переменная text. Проверьте код /(поиск по слову text) |
Автор: | Gremoh [ 02 мар 2007 04:46 ] |
Заголовок сообщения: | |
Всем Привет!!! Assassin, скажите, чем вызван ваш переход с Dev на VC? я недавно начал изучать С++ и хотелось бы узнать мнения об этих средах разработок, в чём их плюсы и минусы? |
Автор: | Assassin [ 25 мар 2007 22:15 ] |
Заголовок сообщения: | |
Gremoh, Go to Тема Више! |
Автор: | OVoronov [ 01 янв 2008 18:03 ] |
Заголовок сообщения: | инструкции |
Разговор ушел куда-то в сторону, но позвольте привести выдержки из моих инструкций. Как создать новый проект под VC++, имея *.H, *.CPP, *.RC файлы ============================================================== Обычно лучше создать новый проект, чем переделывать старый. При описанной методике создастся один каталог (как в примерах из SDK), в нем все файлы-исходники и служебные файлы MS VC. Нам понадобятся файлы *.CPP, *.H (включая RESOURCE.H), *.RC из нашего проекта. 1. New | Workspace. Задать каталог (E:\PROJECTS) без подкаталога- имени проекта! Ввести workspace name. Сохранить все и выйти. 2. Оно создает каталог, он совпадает с именем workspace. Перенести из него все файлы в нужный каталог (например, из E:\PROJECTS\BrickFire в E:\PROJECTS\3BrickFire). 3. Открыть *.DSW, New | Project. Выбрать Win32 Application. Ввести project name. Выбрать радиокнопку "Add to current workspace". Далее обязательно выбрать "An empty project" (чтобы не завелось лишних *.CPP). Сохранить и выйти. 4. Перенести *.DSP файл из создавшегося подкаталога с именем проекта в корневой. Открыть *.DSW. Выбрать *.DSP из нового места. 5. Добавить файлы *.CPP, *.H, *.RC из каталога (обычно это все файлы, других в списке нет): R-click на "Source files" в дереве - Add files to folder. 6. Alt-F7, General | Microsoft Foundation Classes: Not Using MFC. (на всякий случай). 7. Alt-F7, Link | Object/library modules: в конец добавить строку winmm.lib ddraw.lib dsound.lib (для мультимедиа-таймеров, функций DDraw и DSound). Если нужно, добавить dplayx.lib dinput.lib (для DirectPlay и DirectInput). |
Автор: | OVoronov [ 01 янв 2008 18:09 ] |
Заголовок сообщения: | |
А вот уже про DevCPP: ------------------------------------------------------------------- *.GZ разархивируются gzip-ом (прилагается), а *.TAR - WINZip-ом. Для компиляции DirectX проекта необходимо: 1. Установить DevCPP - файл devcpp-4.9.9.2_nomingw_setup.exe Не надо создавать кэши и прочее ненужное. Перезагрузиться. Убрать иконку DevCPP из меню быстрого запуска. 2. Инсталлировать mingw (MinGW-3.1.0-1.exe) в ТУ ЖЕ ДИРЕКТОРИЮ ! Т.е. указать тот же путь для установки, что и для DevCPP. Например, E:\DEVCPP\ 3. Прописать каталог BIN этой директории в PATH (например, E:\DEVCPP\BIN) 4. Перезагрузиться. Запустить DevCPP. Щелкнуть Yes (на вопрос о Make). 5. Установить пак API Win32 (w32api-3.2.tar.gz). Но лучше взять архив rar3: w32api-3.2.rar . Для этого просто разархивировать его, файлы из каталогов INCLUDE и LIB просто скопировать поверх имеющихся в соответствующих каталогах (например, E:\DEVCPP\include\ и E:\DEVCPP\lib\). 6. Установить пак DirectX9. Для этого запустить IDE (DevCPP), меню Tools ("Сервис") | Package Manager, кнопка Install. Выбрать файл DirectX9[1].DevPak . Перезагрузиться. 7. Исправить некорректную библиотеку libdsound.a Проще всего взять ее из данного дистрибутива из архива libdsound.rar Или можно поступить так: отредактировать dsound.def из каталога E:\DEVCPP\lib\Definitions (убрать вручную символы подчеркивания из начала строк), запустить: dlltool --input-def dsound.def --kill-at --output-lib libdsound.a (утилита dlltool находится в каталоге \BIN, который мы прописали в PATH), при этом в текущем каталоге должны находиться файлы dsound.def и libdsound.a, в него же будет помещена исправленная версия файла libdsound.a . Ее надо переместить в каталог \lib 8. Для создания проекта рекомендуется создать поддиректорию внутри главного каталога, например, E:\DEVCPP\PROJECT . Поместить в нее файл проекта *.DEV (если есть), файлы для создания ресурсов, если нужно (*.BMP, *.WAV и прочие), файлы *.RC, *.C (*.CPP), *.H (*.HPP) Если есть корректный проект (*.DEV), то открыть его и компилировать. Есть возможность импортировать проект из проекта MS VC++. Для этого выбрать "File | Import | Import MS Visual C++ project" ("Файл | Импорт | Импорт проекта MS Visual C++"), выбрать конфигурацию (обычно это Release) и имя сохраняемого проекта DevCpp. 9. Если проект собирается "с нуля", следует создать проект. Запустив DevCPP, выбрать File | New | Project... (Файл | Создать | Проект...) Выбрать Windows application. Войти в созданную директорию (\PROJECT) и ввести имя файла проекта. Щелкнуть слева в дереве на имени проекта правой кнопкой, выбрать "Add to Project" ("Добавить к проекту"), войти в директорию \PROJECT, выбрать все файлы. Нажать кнопку "Сохранить все" (две дискеты слева вверху). Убрать файл main.cpp (оставшийся после создания) из проекта (правой кнопкой на нем - "Remove File" / "Удалить файл"). Удалить его с диска. Войти в Project | Project Options , закладка "General" (Проект | Параметры проекта , закладка "Общие") и ввести имя проекта. Затем надо войти в Project | Project Options , закладка "Parameters" (Проект | Параметры проекта , закладка "Параме...") и выставить нужные библиотеки (правый список, "Linker") ("Компоновщик") Можно редактировать строки руками, а можно нажать кнопку под ними и выбрать из диалога. Потребуются следующие библиотеки: - libwinmm.a (для функций мультимедиа-таймера, например, timeGetTime) - libddraw.a (для DirectDraw) - libole32.a (для CoInitialize и CoUninitialize) - libdsound.a (для DirectSound) Если исходники и проект лежат в поддиректории главной директории, например, E:\DEVCPP\PROJECT, строки будут иметь вид: ../lib/libwinmm.a ../lib/libddraw.a ../lib/libdsound.a ../lib/libole32.a Откомпилировать проект и запустить. Воронов Олег Владимирович, 25.03.2005 г. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |