« 2008年7月 | トップページ | 2009年2月 »

[P20] WPF下における印刷プレビュー画面作成の容易化

  WPF下においては、印刷に際しての厳密な意味での従来型印刷プレビューでは
なく、印刷段階に入る前に、(・・・・ということは、編集段階などで事前に、)容易に
実質的な印刷プレビュー(Preview)がみられるようなプログラミングが簡単にできる
ようです。

 [注] 厳密な意味での従来型印刷プレビューに関しては、以下を参照
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2611504&SiteID=7
   ここの、上から10番目の記事(現時点では、最下段の記事)
    ・ ・ ・これは、私の投稿に対する (稍丼 / yayadon)さんの解説です。


私が実際に試みた例で説明するのがわかりやすいと思います。
年賀状の宛名印刷プログラムでは、実際に入力した1行の『長い』住所表示が
はがきに収まっているか、はみ出していないか、気になる場合があります。
いろいろな対策があるにせよ、実際に印刷プレビューを見て確認できれば、それに越したことはありません。
ところが、WPF下においては、印刷段階に至らない、単なる住所・氏名の入力・編集段階で、事前に簡単に印刷プレビューを確認できるプログラムが手間をかけずに、しかも簡単にできてしまいます。

これは、WPF下での印刷の概略が一通りわかれば、あとは実に簡単な話です。

WPF下での印刷過程(通常の複数ページ印刷)では、各ページ(一枚の年賀はがき)ごとに、一つの 印刷用 Canvas を用意することになり、
その Canvas 上に配置した描画コントロール(Label, TextBlock など)内に、すべて表示データ(住所・氏名等)をセットした上で、
その Canvas 情報をプリンターに送ることになります。

    [注]  この点に関しては、このブログのカテゴリー『パソコンの窓』内にある
          [P14] WPF: プリンター印刷(XPS)の記事を参照。

  http://hokkai53.cocolog-nifty.com/blog/2008/01/p14wpf_xps_9e5d.html

そこで、この印刷用の Canvas 作成、表示データ(住所・氏名等)読み込みのコード部分をそのまま使用して、
1ページ(年賀はがき1枚)あたりのデータをセットした Canvas を用意することは簡単にできますし、手間もかかりません。
そのための工夫、ないしコードを印刷用の本コードに少し加えておけば足ります。

他方、プレビュー用のサブ・ウインドウ(Window クラス)を用意します。
そして、上記の、データをセットした Canvas を、このウインドウの子要素として繋ぐだけで、印刷のプレビュー画面が表示されます。ただ、それだけです。

厳密な意味での、印刷段階に入ってからの印刷プレビューよりも、編集段階でプレビューできてしまうということが、たいへん便利で実用的です。

以上

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

| | コメント (0)

[P22] WPF: Grid の ShowGridLines の非実用性を補う方法

Grid.ShowGridLines プロパティを true にしても、表の行列を仕切る線は、
単にコーディング上のレイアウトを補助する程度にしか役立ちません。
実用的な意味での GridLine の表示は、Grid クラスの仕組みからはでてきません。
しかし、・・・[P21] WPF: Canvas の非排他性特性と同一表示空間での重複記載・・・
を利用すれば、一定程度の解決方法にはなると思われます。

すなわち、[P21] の理解の上に話を進めますと、
まず先に Canvas を用意します(重要・・・先に Grid ではダメ)。
そして、その Canvas の子要素として Grid を作成し、
かつ、 Width, Height を Canvas のそれと同じにして、両者が全くピッタリと重なり合うように配置します。

ここで重要なことは、手前(上)に配置した Grid の Background を

    grid.Background = Brushes.Transparent; //C#

とすることが重要であるだけでなく、
この grid のセル内に配置する、あらゆるコントロールの Background を Brushes.Transparent;としておかなければなりません。

こうしておくことによって、Grid と Canvas が透過的に表示されるようになります。

そこで、Rectangle, Line クラスを用いて線を引くのですが、これは canvas の子要素とします。
Rectangle, Line には、 Background プロパティはありません。
自身の線の色を line(rect).Stroke = Brushes.Black; というように指定します
(ここでは, Brushes.Transparent;にしてはいけません。線が見えなくなってしまいます。)

私は、個人的には自分のライブラリを用いて簡単に Grid を作り上げられるようになっているのですが、
一般的に Grid のコード例は簡単には示せないので、コードは省略致します。
ここでの説明と、[P21] のコード例の要領を見ていただければ、わかると思いますので、ご容赦下さい。
http://hokkai53.cocolog-nifty.com/blog/2008/09/canvas-2421.html

以上

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

| | コメント (0)

[P21] WPF: Canvas の非排他性特性と同一表示空間での重複記載

Canvas の非排他性特性とは、『その(Canvas という)コンテナ内の表示空間を
占拠する内容物(Label, TextBlock 等)の、表示空間の占拠の仕方が
相互に非排他的であって、重複的に存在できる(重ねて表示できる)という特性』です。

    [注] Microsoft による正式概念ではなく、私が勝手に作り出した用語です。
            
           なお、この特性は、GDI時代の描画機構ではあたりまえだったことであり、
     WPF下ではCanvas上に限られることになったために、このように仰々しく位置
     づけているに過ぎません。


  他の一般的コンテナと異なり、唯一 Canvas だけには、この特性が与えられているということを意識しておくことは、何らかの役に立つことになると思われます。

すなわち、StackPanel のような、Canvas 以外の一般的コンテナの場合には、
その内部を占拠する内容物(Label, TextBlock 等)とコンテナ自身(StackPanel)とは、
コンテナ(StackPanel)が下(後)で、内容物(Label, TextBlock 等)が上(手前)
という形で、同一表示空間において重なるけれども、
コンテナ(StackPanel)内の内容物どうし(label_1 とlabel_2, あるいは label と textblock)は、コンテナ(StackPanel)の Alignment 特性に応じて必ず、Horizontal か Vertical かに排他的に並べて表示されることになり、同一表示空間においては決して重なることはない(=重ねることはできない)。

ところが、Canvas 内においてのみ、その内容物どうし(label_1 とlabel_2, あるいは label と textblock)は、同一表示空間において重なる(=重ねることができる=非排他的)のである。

[C#]
       Canvas canvas = new Canvas();
       canvas.Background = Brushes.AliceBlue;
      // canvas が、上位の何の子要素であるかは省略
 
       //同一サイズのラベル二つを作り、canvas の中に入れる(子要素とする)。      
        Label[] lbl = new Label[2];

        for (int i=0;i<lbl.Length;i++)
        {
            lbl[i] = new Label();
            canvas.Children.Add(lbl[i]);
            lbl[i].Width=100;
            lbl[i].Height=30;
            lbl[i].Background = Brushes.Transparent;//これが重要
        }
    
        // 二つのラベルを同一位置に配置する
        lbl[0].Content = "abc"; Canvas.SetLeft(lbl[0], 60); Canvas.SetTop(lbl[0], 50);
        lbl[1].Content = "xyz"; Canvas.SetLeft(lbl[1], 60); Canvas.SetTop(lbl[1], 50);

    // このコードを実行すると、同位置に abc と xyz が重なって表示される。

同サイズ・同表示空間に重ねて表示した lbl[0] と lbl[1] は、相互に排除し合わず併存するので、
両者の Background を Brushes.Transparent にして、視界を遮らないようにさえすれば、透過的に重ねて表示される(重ねて表示できる)。

実際に重なってしまうと、何が表示されているかわからないが、
表示位置を相互にづらして判別できるように配置すれば、
このような扱い方が意味を持ってくる局面がいろいろあると考えられます。

次の、・  ・ [P22] WPF: Grid の ShowGridLines の非実用性を補う方法 ・ ・ は、
ここから発見した方法です。
http://hokkai53.cocolog-nifty.com/blog/2008/09/grid-showgridli.html

以上

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

| | コメント (0)

[P19] WPF:コンテント・コントロール(Button)にイメージ(Bitmap)を表示する

WPF下では、ボタン(Button)・ラベル(Label)などの、
プロパティーにContent を含み、テキスト以外のイメージも表示できる
コントロールのことを、コンテント・コントロール(ContentControl)と呼びます。

コンテント・コントロール(ContentControl)にテキストを表示するのは、簡単です。
[以下、C#]

    Button btn = new Button();
  parent.Children.Add(btn); //parent = 例えば、 StackPanel とでもして
    btn.Content = "あいうえお";

ビットマップ(Bitmap)のイメージを表示させたい場合には、次のようになるそうです。

ボタン(インスタンス名 = btn)に、
MyTest.bmp(パス  D:\\MyResources\\Bitmap\\MyTest.bmp)を表示する例。

  using System.Windows.Media.Imaging;
         //BitmapImage クラスを使うのに必要

       
       string pathOfBitmap = "D:\\MyResources\\Bitmap\\MyTest.bmp";

        Image myImage = new Image();
        myImage.Width =  (double)100;
        myImage.Height = (double)30;

        BitmapImage targetBitmap = new BitmapImage();
        targetBitmap.BeginInit();
        targetBitmap.UriSource = new Uri(@pathOfBitmap);
        targetBitmap.EndInit();

        myImage.Source = targetBitmap;
        btn.Content = myImage;

ちなみに、最初は、ボタンに表示するより、Content をプロパティに持つ Window に
デカデカと表示してみることをお勧め。


詳しくは、MSDN ライブラリーの以下を参照。


ContentControl コンテンツ モデルの概要
http://msdn.microsoft.com/ja-jp/library/ms742554(VS.80).aspx

イメージングの概要
http://msdn.microsoft.com/ja-jp/library/ms748873(VS.80).aspx


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
目次に戻る ・・・・ 左欄のカテゴリー 【パソコンの窓】 をクリック
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    

| | コメント (0)

« 2008年7月 | トップページ | 2009年2月 »