Hatena::ブログ(Diary)

コンクリートアスパラガス

えのきの個人的な技術メモ。青魚スカイハイの活動に限らず適当に。
サイトはこちら→養殖所

2012-08-14(Tue)

newの再定義とboostのインクルード

boostライブラリをインクルードする時、
newを再定義していたりすると*1コンパイルで落ちることがある。

上手くinclude順を調整すれば回避できるようだが、
一筋縄でいかない事もあるので注意。

二次元vectorの初期化

stl::vector初期化
多次元の場合、この書き方だと楽に初期化できる(知らなかった)。

vector<vector<int>> v;

...

v = vector<vector<int>>(100, vector<int>(100, 0));

きっと3次元以上でも同じ要領で出来るのかな?

*1メモリリークの検知などで行番号を埋め込むときとか

2012-05-26(Sat)

勝手に動かないで

WPFのデザインモードかどうかをチェックする方法。
デザインモードではカレントディレクトリなど、色々実行時と異なる要素がある
ので、それで例外投げて落ちられると、デザイナが機能しなくなる。

DesignerProperties.GetIsInDesignMode(this)
//thisはUIエレメント。返り値はbool値。

デザインモードの場合は、サンプル的なデータを食わせて、
キレイに初期化しておくのが吉。

しかし例外投げたら、最低限のUIレイアウトだけ表示するとか、
もう少し気の利いた造りには出来なかったんですかね。。。
デザイナに振り回されるコードを書くのは正直気が進みませんなあ。

WPFでのUIアンチエイリアス封じ込め

WPFでのアンチエイリアス封じ込めのために。
Root要素で以下の指定をしておけば大体全部?アンチエイリアスを無効にできる。

RenderOptions.BitmapScalingMode="NearestNeighbor"
RenderOptions.EdgeMode="Aliased"

http://blogs.msdn.com/b/hiroyuk/archive/2009/02/16/9425120.aspx
参考。

UseLayoutRoundingプロパティやSnapsToDevicePixelsプロパティも試してみた
が、今ひとつ動作に信用が置けなかったので、他の方法を探していた所発見した
次第。
マップエディタとか、2Dピクセル系のものを作る時に、
アンチエイリアスは邪魔なだけなので、この方が確実。

画像つき背景とか

ちょっと凝った背景*1をコントロールの背景に設定し
たい時、Templateを使えば上手くいくかと思ったら中々行かなかった。

仕方ないので何もしないGridのみのUserControlを使って代用。
これで背景などのスタイルも一元管理できるけど、
いささか大掛かりすぎる気がする。

その内もっと良い手が見つかるかもしれないが、とりあえずこれで。

*1:画像背景+透過PNGなど

2012-05-25(Fri)

最近の開発事情

最近はWPFを久々にゴリゴリ書きつつ、
リソース管理用のツールを大々的に作ってる状態。

「モノクロ」時代からの反省を生かしつつ、
今度はできる限りデータ抽象をきっちり作って、
コンテンツは全部ツールの方で弄ろうという魂胆。。。

ついでにエフェクトエディタとかイベントスクリプト用のエディタとか、
色々作ってしまおうという狙いもあるけども。
MarbleTownsに限らず、今後色々使えそうだし。

ということで少し先のことも考えつつ、
UI要素とか、細かい部分からじっくり作ってる状況。
その「先」がどの程度あるのかってのは、
あまりアテにならない読みに基づくので信用できませんがね!
しかし本当に時間食いな趣味だよ。

UserControlの継承めも

自前のUserControlを継承して、
派生のUserControlを作りたい時に。
基底クラスのコードをoverrideして独自処理にしたりとか。

基本的なやり方は、
http://d.hatena.ne.jp/kent013/20091129/1259482727
http://d.hatena.ne.jp/okazuki/20091025/1256472760
http://csfun.blog49.fc2.com/blog-entry-42.html
この辺りのページが参考になる。

基本的には、新しくUserControlを追加して、
XAML側のルート要素を

<local:MyUserControl
    x:Class="ProjectName.FolderName.ClassName"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:MyNameSpace"
    mc:Ignorable="d"
    >
</local:MyUserControl>

みたいな感じで、local:MyUserControlに変更。
その上で、xaml.csファイルのクラス定義で、基底クラスを
自分で作ったUserControlのクラスに置き換える。

ただしこのままコンパイルしても怒られる*1
なので、xamlファイルのプロパティにある、
ビルドアクション」を"Page"から"Resource"に変更する。
これでg.csファイルが自動生成されなくなる様子。
自分の環境の場合、これでコンパイルが通った。
今のところ弊害は出ていない模様。

http://csfun.blog49.fc2.com/blog-entry-42.html
にあるような、InitializeComponent()の修正はしていない。((こちらの環境が
VS2010で、元記事から大分時間が立っているから?))

(このあと問題が起きなければ)これでUserControlの派生、量産が大分やりや
すくなる。
これとWPFのTemplate機能を組み合わせれば、更に柔軟性・拡張性が上がる気が
する*2
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_02.html
Templateの中にイベントハンドラを埋め込む方法については、
http://pro.art55.jp/?eid=1046821
この辺が参考になりそう。後で試してみる。上手く行ったら後で纏める。

*1:自動生成のpartialクラス(g.csファイル)の方で齟齬が発生するらしい。

*2:派生コントロールにUIを付け加える場合とか

2012-05-19(Sat)

WPF:ResourceDictionary

WPFのResourceDictionary、外部からのロードの例。

<UserControl.Resources>
    <ResourceDictionary Source="/CommonResource.xaml"/>
</UserControl.Resources>

VS2010以降?は頭に"/"入れないとプロジェクトを正しく参照しないっぽい。
古い記事とかだと"/"無しが見られるので注意。

2012-05-15(Tue)

画像フォーマットのコンバータ

実行ファイルが置いてあるディレクトリ内のBMPファイルを
全てPNGファイルにコピーするPythonスクリプト
Python書くのは久しぶりなので、色々と雑なのは悪しからず。
ディレクトリの、日本語パスには対応していないっぽい(駄目だった)。

Python2.4使用。
それと The Python Imaging Library (PIL)を使用。
http://www.pythonware.com/products/pil/

# -*- coding: shift_jis -*-
import os, sys
import Image
import glob

extentionIn = "bmp"
extentionOut = "png"

def main():
     print ">>>",extentionIn,"形式のファイルを列挙."
     curdir = os.getcwd() # カレントディレクトリ名を取得
     files = glob.glob(unicode(curdir+ "/*." + extentionIn))

     #ファイルを列挙
     for file in files:
         print file
     print ">>>",extentionIn,"から",extentionOut,"へコンバート開始..."

     #ファイルをコンバート
     for file in files:
         im = Image.open(file)
         outfile = file.split('.')[0] + "." + extentionOut
         print outfile
         try:
             im.save(outfile)
         except IOError:
             print file + ":" "保存失敗"
     print ">>> コンバート終了."

main()
print "終了するにはEnterキーを押して下さいな."
raw_input()
Connection: close