Windows7.0の世界限定の話ですが、
WPF と DirectXとはどんな関係でしょうか。
非常に似ている機能を持っていて
紛らわしくてすぐ理解できません。
例えば、
線の色、太さ、及びいろんな線のタイプ(点線やシングル、ダブルなど)で
ポリゴンと楕円を描画したいですが、
何を使えば、簡単明快にできるのでしょうか。
宜しくお願い致します。
ポリゴンと楕円の描画&WPF & DirectX
Re: ポリゴンと楕円の描画&WPF & DirectX
そもそもC++/CLIでWPFを扱うことはあまりないと思いますが……。
WPFはWindowsのUI作成用の技術で,WInFormsを代替する物です。
内部的にはDirectXを使ってボタン等を描画していますが,あくまでUI作成用です。
# DirectXで直接描画しているために,ウィンドウとWindowsFormsHostコントロールを使っているようなコントロール以外はHWNDを持たない。
元々の目的が違うため,どちらを使用するかの基本的な指針は簡単に作れます。
通常のアプリケーションを作るのであればWPFを,ゲームを作るのであればDirectXを,それぞれ使うのが基本的な選択肢だと思います。
もちろん,CADのような特殊な例はありますが……。
WPFはWindowsのUI作成用の技術で,WInFormsを代替する物です。
内部的にはDirectXを使ってボタン等を描画していますが,あくまでUI作成用です。
# DirectXで直接描画しているために,ウィンドウとWindowsFormsHostコントロールを使っているようなコントロール以外はHWNDを持たない。
元々の目的が違うため,どちらを使用するかの基本的な指針は簡単に作れます。
通常のアプリケーションを作るのであればWPFを,ゲームを作るのであればDirectXを,それぞれ使うのが基本的な選択肢だと思います。
もちろん,CADのような特殊な例はありますが……。
Re: ポリゴンと楕円の描画&WPF & DirectX
要は、C++でWPFを使ってみたい、ってことでしょうかね?
コードの書き方が分からないってことですよね。多分。
WPF使うならデザイナー使ってC#やXAML使った方が断然楽ですし、
YuOさんもおっしゃってますけど、C++/CLIでWPFを使うことってまず無いですからね。
そこをVC++に限定するってことはそういうことじゃないかと。
とりあえず、そんなに大したものでもないのでコードは載せときますね。
(ImageBrushの画像をネットから拾ってきてるので起動は重いですよ)
ただ、WPFはマネージコードのライブラリなので(それしかない)、C++のコードから直接ネイティブには使えてないです。
もしそれを期待していたとしたら残念ですが、プロセスにCLRがロードされてWPFはその上で実行されます。
なので、どう足掻いてもネイティブなC++オンリーなコードにはならないですね。
コードの書き方が分からないってことですよね。多分。
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());
}
もしそれを期待していたとしたら残念ですが、プロセスにCLRがロードされてWPFはその上で実行されます。
なので、どう足掻いてもネイティブなC++オンリーなコードにはならないですね。