開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 空の CLR プロジェクト
プロジェクト名 ClrD3D

参考

ClrD3D_7.cpp
/*
プロジェクトへの参照の追加(参照タブ)
C:\WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0
Microsoft.DirectX.dll
Microsoft.DirectX.Direct3D.dll
*/
#pragma comment(linker, "/subsystem:windows /entry:main")
 
// アセンブリ
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
 
// 名前空間
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace Microsoft::DirectX;
using namespace Microsoft::DirectX::Direct3D;
 
#define RGB(r,g,b) (((r)<<16) | ((g)<<8) | (b))
 
ref class MainForm : Form
{
private:
	Device^ dev;
	VertexBuffer^ vb;
public:
	MainForm()
	{
		MinimumSize = Drawing::Size(160, 120);
		MaximizeBox = false;
		ClientSize = Drawing::Size(640, 480);
		Text = "ClrD3D";
	}
 
	bool DXInitialize()
	{
		try {
			PresentParameters^ pp = gcnew PresentParameters;
			pp->Windowed = true;
			pp->SwapEffect = SwapEffect::Discard;
			dev = gcnew Device(0, DeviceType::Hardware, this,
				CreateFlags::HardwareVertexProcessing, pp);
			CreateVertex();
			return true;
		}
		catch (Exception^) {
			return false;
		}
	}
 
	void Render()
	{
		if (dev == nullptr) return;
		dev->Clear(ClearFlags::Target, Color::Black, 1.0f, 0);
		dev->BeginScene();
 
		dev->SetStreamSource(0, vb, 0);
		dev->VertexFormat = CustomVertex::TransformedColored::Format;
		dev->DrawPrimitives(PrimitiveType::TriangleFan, 0, 360);
 
		dev->EndScene();
		dev->Present();
	}
private:
	void CreateVertex()
	{
		vb = gcnew VertexBuffer(CustomVertex::TransformedColored::typeid, 362, dev,
			(Usage)0, CustomVertex::TransformedColored::Format, Pool::Managed);
		GraphicsStream^ gs = vb->Lock(0, 0, (LockFlags)0);
 
		// 頂点データ
		array<CustomVertex::TransformedColored>^ v =
			gcnew array<CustomVertex::TransformedColored>(362);
		v[0].X = 250; v[0].Y = 250; v[0].Z = 0.5f; v[0].Rhw = 1;
		v[0].Color = Color::White.ToArgb();
		for (int n = 0; n <= 360; ) {
			double d = n * Math::PI / 180;
			double dX = 250 + 200 * Math::Sin(d);
			double dY = 250 - 200 * Math::Cos(d);
			int nColor;
			int nInc = 0xff * (n % 60) / 60;
			int nDec = 0xff - nInc;
			switch ((n/60) % 6) {
			case 0:	// 0-59,360 緑→水
				nColor = RGB(0, 0xff, nInc);
				break;
			case 1:	// 60-119 水→青
				nColor = RGB(0, nDec, 0xff);
				break;
			case 2:	// 120-179 青→紫
				nColor = RGB(nInc, 0, 0xff);
				break;
			case 3:	// 180-239 紫→赤
				nColor = RGB(0xff, 0, nDec);
				break;
			case 4:	// 240-299 赤→黄
				nColor = RGB(0xff, nInc, 0);
				break;
			case 5:	// 300-359 黄→緑
				nColor = RGB(nDec, 0xff, 0);
				break;
			}
			n++;
			v[n].X = (float)dX; v[n].Y = (float)dY; v[n].Z = 0.5f; v[n].Rhw = 1;
			v[n].Color = nColor;
		}
		gs->Write(v);
		vb->Unlock();
	}
};
 
int main()
{
	MainForm^ form = gcnew MainForm;
	if (!form->DXInitialize()) {
		MessageBox::Show("Direct3Dの初期化に失敗しました。", "ClrD3D");
		return 0;
	}
	form->Show();
	while (form->Created) {
		form->Render();
		Application::DoEvents();
	}
	return 0;
}
 
最終更新:2012年11月03日 08:57