ページ 1 / 1
MFCについて
Posted: 2009年3月12日(木) 16:33
by はね
現在、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、何か解決策をご存知の方いらっしゃれば教えて頂きたいです。
よろしくお願い致します。
Re:MFCについて
Posted: 2009年3月12日(木) 17:18
by バグ
残念ながらVS2005EEではMFCは使用できません。
MFCが使用するには有料版のVisualStudioを購入する必要があります。
Re:MFCについて
Posted: 2009年3月12日(木) 17:32
by はね
迅速な回答ありがとうございます。
やはり使えませんでしたか・・・。
仕方ないのでプリミティブで頑張ってみます。
ありがとうございました。
Re:MFCについて
Posted: 2009年3月12日(木) 17:38
by たかぎ
Platform SDKに付属のMFC(VC++6.0のものとほぼ同等)であれば使えるかもしれません。
環境構築は大変だと思いますし、AppWizardもなければClassWizardもありませんが、使えるはずです。
Standard Editionを購入する方が安くつく気はします。
出費を惜しむなら、体で払うしかないということですね。
Re:MFCについて
Posted: 2009年3月12日(木) 17:51
by バグ
そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)
クラスやメソッドの名前なんかはMFCと似てる部分も少なくありませんし…。どうしてもMFCでなければいけないというのであれば仕方ないですが(^_^;)
Re:MFCについて
Posted: 2009年3月12日(木) 18:14
by たかぎ
> そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)
.NETにすると、OpenGLとの親和性はどうなんですかね。
# .NET + OpenGLの経験はないので見当がつきません。
Re:MFCについて
Posted: 2009年3月12日(木) 18:26
by はね
MFCを使いたい理由と言うのがただ、ゲームを作る際に
プリミティブだと味気ないので3Dモデルを読み込みたいだけなんです。
勤務先がOpenGLを使用してまして入社までに少しでも慣れておきたいという程度で
勉強できれば何でも良かったりします。
たかぎ様とバグ様の話を拝見した感じですと、今回の目的とは割に合わなそうなのでプリミティブでいこうと思います。
Re:MFCについて
Posted: 2009年3月12日(木) 23:44
by tk-xleader
>.NETにすると、OpenGLとの親和性はどうなんですかね。
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;
}