ポリゴンと楕円の描画&WPF & DirectX

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

ポリゴンと楕円の描画&WPF & DirectX

#1

投稿記事 by 鈴木 » 10年前

Windows7.0の世界限定の話ですが、
WPF と DirectXとはどんな関係でしょうか。
非常に似ている機能を持っていて
紛らわしくてすぐ理解できません。

例えば、
線の色、太さ、及びいろんな線のタイプ(点線やシングル、ダブルなど)で
ポリゴンと楕円を描画したいですが、
何を使えば、簡単明快にできるのでしょうか。

宜しくお願い致します。

鈴木

Re: ポリゴンと楕円の描画&WPF & DirectX

#2

投稿記事 by 鈴木 » 10年前

追伸
言語はVC++に限り。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: ポリゴンと楕円の描画&WPF & DirectX

#3

投稿記事 by YuO » 10年前

そもそもC++/CLIでWPFを扱うことはあまりないと思いますが……。

WPFはWindowsのUI作成用の技術で,WInFormsを代替する物です。
内部的にはDirectXを使ってボタン等を描画していますが,あくまでUI作成用です。
# DirectXで直接描画しているために,ウィンドウとWindowsFormsHostコントロールを使っているようなコントロール以外はHWNDを持たない。

元々の目的が違うため,どちらを使用するかの基本的な指針は簡単に作れます。
通常のアプリケーションを作るのであればWPFを,ゲームを作るのであればDirectXを,それぞれ使うのが基本的な選択肢だと思います。
もちろん,CADのような特殊な例はありますが……。

sleep

Re: ポリゴンと楕円の描画&WPF & DirectX

#4

投稿記事 by sleep » 10年前

要は、C++でWPFを使ってみたい、ってことでしょうかね?
コードの書き方が分からないってことですよね。多分。

WPF使うならデザイナー使ってC#やXAML使った方が断然楽ですし、
YuOさんもおっしゃってますけど、C++/CLIでWPFを使うことってまず無いですからね。
そこをVC++に限定するってことはそういうことじゃないかと。

とりあえず、そんなに大したものでもないのでコードは載せときますね。
(ImageBrushの画像をネットから拾ってきてるので起動は重いですよ)

コード:

//「空のCLRプロジェクト」作成後、
// プロジェクトのプロパティページ
// 「共通プロパティ」→「参照」の「新しい参照の追加(N)」ボタンから
// 外部依存関係へ以下を追加。
// 
// PresentationCore.dll
// PresentationFramework.dll
// System.dll
// System.Xaml.dll
// WindowsBase.dll

using namespace System;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Shapes;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;

ref class MyWindow : public Window
{
public:
	MyWindow::MyWindow()
	{
		DoubleCollection ^dc = gcnew DoubleCollection();
		dc->Add(1);
		dc->Add(0.5);
		dc->Add(2);
		dc->Add(0.5);

		Ellipse ^ellipse = gcnew Ellipse();
		ellipse->Width = 300;
		ellipse->Height = 200;
		ellipse->Stroke = Brushes::Red;     //線の色
		ellipse->StrokeThickness = 10;      //線の太さ
		ellipse->StrokeDashArray = dc;      //点線の間隔
		ellipse->Fill = Brushes::DarkBlue;

		Polygon ^polygon = gcnew Polygon();
		polygon->RenderTransformOrigin = Point(0.5, 0.5);
		polygon->RenderTransform = transform;
		polygon->Stroke = Brushes::Black;   //線の色
		polygon->StrokeThickness = 5;       //線の太さ
		polygon->StrokeDashArray = dc;      //点線の間隔
		polygon->Fill = gcnew ImageBrush(gcnew BitmapImage(gcnew Uri("http://kabegami1.up.seesaa.net/image/wallpaper_345.jpg", UriKind::Absolute)));
		polygon->Points->Add(Point(0, 0));
		polygon->Points->Add(Point(100, 200));
		polygon->Points->Add(Point(200, 0));
		polygon->Points->Add(Point(300, 200));

		slider_horizontal->Value = 0;
		slider_horizontal->Minimum = -360;
		slider_horizontal->Maximum = 360;
		slider_horizontal->Width = 300;
		slider_horizontal->Orientation = Orientation::Horizontal;
		slider_horizontal->ValueChanged += gcnew System::Windows::RoutedPropertyChangedEventHandler<double>(this, &MyWindow::OnValueChanged);
		Canvas::SetTop(slider_horizontal, 220);

		label_horizontal->Content = slider_horizontal->Value;
		Canvas::SetLeft(label_horizontal, 140);
		Canvas::SetTop(label_horizontal, 250);

		Canvas ^canvas_polygon = gcnew Canvas();
		canvas_polygon->Children->Add(polygon);
		canvas_polygon->Children->Add(slider_horizontal);
		canvas_polygon->Children->Add(label_horizontal);
		Canvas::SetLeft(canvas_polygon, 400);
		Canvas::SetTop(canvas_polygon, 0);

		Canvas ^canvas = gcnew Canvas();
		canvas->Children->Add(ellipse);
		canvas->Children->Add(canvas_polygon);

		this->Width = 780;
		this->Height = 360;
		this->Content = canvas;
	}

	void OnValueChanged(System::Object ^sender, System::Windows::RoutedPropertyChangedEventArgs<double> ^e)
	{
		label_horizontal->Content = slider_horizontal->Value;
		transform->Angle = slider_horizontal->Value;
	}

private:
	RotateTransform ^transform = gcnew RotateTransform();
	Slider ^slider_horizontal = gcnew Slider();
	Label ^label_horizontal = gcnew Label();
};

[STAThreadAttribute]
int main()
{
	Application ^app = gcnew Application();
	return app->Run(gcnew MyWindow());
}
ただ、WPFはマネージコードのライブラリなので(それしかない)、C++のコードから直接ネイティブには使えてないです。
もしそれを期待していたとしたら残念ですが、プロセスにCLRがロードされてWPFはその上で実行されます。
なので、どう足掻いてもネイティブなC++オンリーなコードにはならないですね。

閉鎖

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