現在、OpenGLの勉強をしています。
GLUTを使い、一通り基礎的なところは勉強終えたので、慣れる為にも3Dゲームを作ろうかと思っていました。
で、http://www.geocities.jp/gamerabbits/opengl1_6.htm
こちらのページを参考にしようと思ったのですが、
"afxdtctl.h"を開けないエラーが出ます。
上記のサイトに書いてあるようにMFCを導入すればいいらしいのですが、dllファイルをプロジェクトに入れても上手く動きません。
(MFC自体初めて聞いたので、導入がdllをプロジェクトに入れるだけでいいのかも怪しいです)
解決の為色々と調べたところVC++2005Express Edition(←現在使用中)はMFCが使えないらしいのですが、これは諦めるしかないのでしょうか?
質問をまとめると
1、MFCの導入はdllファイルをプロジェクトに入れるだけでいいのか。
2、VC++2005EEでMFCは使えず、現在の環境で開発は無理なのか。
3、何か解決策をご存知の方いらっしゃれば教えて頂きたいです。
よろしくお願い致します。
MFCについて
Re:MFCについて
Platform SDKに付属のMFC(VC++6.0のものとほぼ同等)であれば使えるかもしれません。
環境構築は大変だと思いますし、AppWizardもなければClassWizardもありませんが、使えるはずです。
Standard Editionを購入する方が安くつく気はします。
出費を惜しむなら、体で払うしかないということですね。
環境構築は大変だと思いますし、AppWizardもなければClassWizardもありませんが、使えるはずです。
Standard Editionを購入する方が安くつく気はします。
出費を惜しむなら、体で払うしかないということですね。
Re:MFCについて
そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)
クラスやメソッドの名前なんかはMFCと似てる部分も少なくありませんし…。どうしてもMFCでなければいけないというのであれば仕方ないですが(^_^;)
クラスやメソッドの名前なんかはMFCと似てる部分も少なくありませんし…。どうしてもMFCでなければいけないというのであれば仕方ないですが(^_^;)
Re:MFCについて
> そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)
.NETにすると、OpenGLとの親和性はどうなんですかね。
# .NET + OpenGLの経験はないので見当がつきません。
.NETにすると、OpenGLとの親和性はどうなんですかね。
# .NET + OpenGLの経験はないので見当がつきません。
Re:MFCについて
MFCを使いたい理由と言うのがただ、ゲームを作る際に
プリミティブだと味気ないので3Dモデルを読み込みたいだけなんです。
勤務先がOpenGLを使用してまして入社までに少しでも慣れておきたいという程度で
勉強できれば何でも良かったりします。
たかぎ様とバグ様の話を拝見した感じですと、今回の目的とは割に合わなそうなのでプリミティブでいこうと思います。
プリミティブだと味気ないので3Dモデルを読み込みたいだけなんです。
勤務先がOpenGLを使用してまして入社までに少しでも慣れておきたいという程度で
勉強できれば何でも良かったりします。
たかぎ様とバグ様の話を拝見した感じですと、今回の目的とは割に合わなそうなのでプリミティブでいこうと思います。
Re:MFCについて
>.NETにすると、OpenGLとの親和性はどうなんですかね。
C++/CLIであれば、全く不可能というわけではなさそうです。
C++/CLIであれば、全く不可能というわけではなさそうです。
#include<windows.h> #include<GL\gl.h> #include<string> using namespace std; #using "System.dll" #using "System.Windows.Forms.dll" #using "System.Drawing.dll" using namespace System; using namespace System::Windows; using namespace System::Windows::Forms; using namespace System::Drawing; using namespace System::Timers; const int ClientWidth=640; const int ClientHeight=480; class GlCurrent{ HDC m_formDC; HGLRC formRC; public: GlCurrent(HDC formDC){ //OpenGLのコマンドの出力先に関連付ける。 formRC=wglCreateContext(formDC); wglMakeCurrent(formDC,formRC); m_formDC=formDC; } ~GlCurrent(){ ::wglMakeCurrent(m_formDC,NULL); ::wglDeleteContext(formRC); } }; ref class GlForm:Form{ HDC formDC; //初期化メソッド void SetNoReSize(){ Drawing::Size csize; csize.Width=::ClientWidth; csize.Height=::ClientHeight; Form::FormBorderStyle =Forms::FormBorderStyle::FixedSingle; Form::MaximizeBox=false; Form::ClientSize=csize; } void SetGlDrawArea(){ //ピクセルフォーマットの構造体の初期化。 ::PIXELFORMATDESCRIPTOR pxfmt={0}; pxfmt.nSize=sizeof(pxfmt); pxfmt.dwFlags=PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pxfmt.nVersion=1; pxfmt.iPixelType=PFD_TYPE_RGBA; pxfmt.dwLayerMask=PFD_MAIN_PLANE; pxfmt.cColorBits=32; pxfmt.cDepthBits=16; //ウィンドウのDCを得て、(互換DCを生成する。*現行では直接描画) int handle; handle=Form::Handle.ToInt32(); formDC=::GetDC(reinterpret_cast<HWND>(handle)); //ピクセルフォーマットを設定する。 int v_pxfmt; v_pxfmt=ChoosePixelFormat(formDC,&pxfmt); SetPixelFormat(formDC,v_pxfmt,&pxfmt); } ~GlForm(){ ::ReleaseDC(reinterpret_cast<HWND>(Form::Handle.ToInt32()),formDC); } !GlForm(){ ::ReleaseDC(reinterpret_cast<HWND>(Form::Handle.ToInt32()),formDC); } public: GlForm(String^WText){ //フォームのタイトルをセットする。 Form::Text=WText; //フォームの大きさを固定する。 SetNoReSize(); //フォームをOpenGLの描画領域に結びつける。 SetGlDrawArea(); //フォームのバックカラーを黒にする。 Form::BackColor=Color::Black; } virtual void OnPaint(PaintEventArgs^e)override{ GlCurrent gc(formDC); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(0.0f,0.0f); glVertex2f(0.5f,0.5f); glEnd(); //バックバッファを転送する。 SwapBuffers(formDC); } void TimeProc(Object^sender,System::Timers::ElapsedEventArgs^e){ GlCurrent gc(formDC); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex3f(0.0f,0.0f,0.5f); glVertex3f(0.5f,0.5f,-0.1f); glEnd(); //バックバッファを転送する。 SwapBuffers(formDC); } }; int main() { GlForm^gf=gcnew GlForm("GlForm"); System::Timers::Timer^loops=gcnew System::Timers::Timer; loops->Elapsed+=gcnew System::Timers::ElapsedEventHandler(gf,&GlForm::TimeProc); loops->Interval=1000/33; loops->Enabled=true; Application::Run(gf); return 0; }