Floating Teapot 2

以前このBlogに書いたFloating Teapotを改造して、マウスで回転するトラックボール機能を追加します。トラックボールのコードは、Windows SDKのWPFサンプルのFlipperにあるTrackball.csを使います。このトラックボールは使い方は簡単なのですが、XAMLのデータ構造をこのコードに合わせなければなりません。 まず、Windows1.xaml.csに追加するのは、このTrackball用の名前空間(#using DemoDev)とコンストラクタへの次の初期化コードです。 _trackball = new Trackball();_trackball.Attach(this);_trackball.Servants.Add(myViewport3D);_trackball.Enabled = true; XAMLは次のように変更しています。     <Viewport3D Focusable=”True” Name=”myViewport3D” ClipToBounds=”True”  >      <!–カメラ–>      <Viewport3D.Camera>        <PerspectiveCamera                     Position=”-5,2,3″ NearPlaneDistance=”1″ FarPlaneDistance=”20″                     LookDirection=”5,-2,-3″ UpDirection=”0,1,0″ FieldOfView=”45″ />      </Viewport3D.Camera>            <Viewport3D.Children>            <ModelVisual3D>              <!–座標変換 トラックボール用–>            <ModelVisual3D.Transform>              <Transform3DGroup>                <Transform3DGroup.Children>                  <Transform3DCollection >                    <ScaleTransform3D ScaleX=”1″ ScaleY=”1″  ScaleZ=”1″ />                    <RotateTransform3D>                      <RotateTransform3D.Rotation>                        <AxisAngleRotation3D Axis=”0 1 0″ Angle=”0″ />                      </RotateTransform3D.Rotation>                   …

0

VisualBrush, Key input to 3D

Windows Presentation FoundationのBrushはかなり強力で、ほとんど何でも塗りつぶしに使えます。たとえば、画像ならImageBrush、ビデオならVideoBrush、ベクトル グラフィックスならDrawingBrushが使えますし、それ以外にもキー入力を別の矩形などに表示したいときなどは、そのFillプロパティにVisualBrushを使えば実現できます。 <TextBox Grid.Column=”0″ Grid.Row=”0″ x:Name=”myInput”  Text=”キー入力” />… <Rectangle Width=”300″ Height=”100″ >    <Rectangle.Fill>      <VisualBrush>        <VisualBrush.Visual>          <TextBlock Text=”{Binding ElementName=myInput, Path=Text}” Background=”Red” Width=”100″/>        </VisualBrush.Visual>     </VisualBrush>    </Rectangle.Fill></Rectangle> 実は、このVisualBrushはGeometryModel3Dのマテリアルとしても使えます。つまり、3Dオブジェクトにキー入力を表示させることができます。別にキー入力だけではなく、何らかのテキストデータを3Dオブジェクトに表示させる際にも同じ手法が使えます。   <GeometryModel3D.Material>  <DiffuseMaterial>      <DiffuseMaterial.Brush>        <VisualBrush>          <VisualBrush.Visual>            <TextBlock Text=”{Binding ElementName=myInput, Path=Text}” Background=”Red” Width=”100″ />          </VisualBrush.Visual>        </VisualBrush>      </DiffuseMaterial.Brush>     </DiffuseMaterial>  </GeometryModel3D.Material> 添付のXAMLファイルは3Dに入力テキストを表示させたlooseXAMLです。 VisualBrush.xaml

0

UAC Escalation Notification

Windows Vista でユーザー アカウントを超える操作 (例えばインストールや管理者として実行) を行おうとすると、デスクトップが暗くなって、UAC (User Account Control) エスカレーション ダイアログが表示されます。このダイアログが表示されることをアプリケーションから知りたいときは、次のように SetWinEventHook でイベントとコールバックを指定します。   SetWinEventHook(          EVENT_SYSTEM_DESKTOPSWITCH,           EVENT_SYSTEM_DESKTOPSWITCH,           NULL,           WinEventCallback,           0,           0,           WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNTHREAD); … VOID CALLBACK WinEventCallback(           HWINEVENTHOOK hWinEventHook,           DWORD event,           HWND hwnd,           LONG idObject,           LONG idChild,           DWORD dwEventThread,           DWORD dwmsEventTime){     switch( event )     {          case EVENT_SYSTEM_DESKTOPSWITCH:               MessageBox(hwnd, TEXT(“EVENT_SYSTEM_DESKTOPSWITCH”), NULL,…

1

Animation and Trigger, Loose XAML

先日、息子が通っている中学校の先生に、数学の二次関数の授業の導入用のデモアプリを作ってほしいと依頼されて、四角形の辺上を2点が移動するときの面積(とそのグラフ)を表示するアプリケーションをWPFで作ってみました。 お題は、次のようなものでした。「幅10cm高さ6cmの長方形があり、左下の点Aから点Pが2cm/秒で横に、点Qが1cm/秒で上に、四角形の辺上を移動します。そのときの三角形APQの面積をアニメーションで表示したい。その他の三角形の面積も塗りつぶし表示したい。できれば三角形APQの面積のグラフも(最後に)アニメーション表示したい。」2Dだし、アニメーションとトリガーなので、WPFを使えば簡単だなと思い、引き受けました。 レイアウトとしてグリッドで上下2分割しボタン類を下に配置しました。グラフや三角形の塗りつぶしの表示・非表示は次のように Style と Triggerで設定しました。 <!–三角形APQ–>           <Style x:Key=”MyFillStyleAPQ” TargetType=”{x:Type Path}”>        <Setter Property=”Fill”>          <Setter.Value>            <SolidColorBrush Color=”White” />          </Setter.Value>        </Setter>        <Setter Property=”Visibility” Value=”Hidden” />         <Style.Triggers>          <DataTrigger Binding=”{Binding ElementName=StrokeColor, Path=IsChecked}” Value=”True”>            <Setter Property=”Path.Visibility” Value=”Visible” />          </DataTrigger>          <DataTrigger Binding=”{Binding ElementName=APQfill, Path=IsChecked}” Value=”True”>            <Setter Property=”Path.Fill”>              <Setter.Value>                <SolidColorBrush Color=”Yellow” />              </Setter.Value>            </Setter>          </DataTrigger>        </Style.Triggers>      </Style> 三角形の形状の描画はPathを使いました。Bindingを使ってP,Qの位置座標を取得できたので、それほど複雑にならずに済みました。       <!–三角形APQ–>     …

0