MFCについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はね

MFCについて

#1

投稿記事 by はね » 16年前

現在、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について

#2

投稿記事 by バグ » 16年前

残念ながらVS2005EEではMFCは使用できません。
MFCが使用するには有料版のVisualStudioを購入する必要があります。

はね

Re:MFCについて

#3

投稿記事 by はね » 16年前

迅速な回答ありがとうございます。

やはり使えませんでしたか・・・。
仕方ないのでプリミティブで頑張ってみます。
ありがとうございました。

たかぎ

Re:MFCについて

#4

投稿記事 by たかぎ » 16年前

Platform SDKに付属のMFC(VC++6.0のものとほぼ同等)であれば使えるかもしれません。
環境構築は大変だと思いますし、AppWizardもなければClassWizardもありませんが、使えるはずです。

Standard Editionを購入する方が安くつく気はします。
出費を惜しむなら、体で払うしかないということですね。

バグ

Re:MFCについて

#5

投稿記事 by バグ » 16年前

そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)
クラスやメソッドの名前なんかはMFCと似てる部分も少なくありませんし…。どうしてもMFCでなければいけないというのであれば仕方ないですが(^_^;)

たかぎ

Re:MFCについて

#6

投稿記事 by たかぎ » 16年前

> そこまでするなら、.NETを利用する方が良さそうな気もしますね…(苦笑)

.NETにすると、OpenGLとの親和性はどうなんですかね。
# .NET + OpenGLの経験はないので見当がつきません。

はね

Re:MFCについて

#7

投稿記事 by はね » 16年前

MFCを使いたい理由と言うのがただ、ゲームを作る際に
プリミティブだと味気ないので3Dモデルを読み込みたいだけなんです。
勤務先がOpenGLを使用してまして入社までに少しでも慣れておきたいという程度で
勉強できれば何でも良かったりします。

たかぎ様とバグ様の話を拝見した感じですと、今回の目的とは割に合わなそうなのでプリミティブでいこうと思います。

tk-xleader

Re:MFCについて

#8

投稿記事 by tk-xleader » 16年前

>.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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る