2009年11月27日金曜日

VC++2005EEで謎の強制終了


CONFIG_WIN DIALOG 30, 30, 200, 170
CAPTION TEXT("設定")
{
}


 VC++2005EEにはリソースエディタが付いてないので自分で書くことになるんだけど、上記のようなコードを書いてコンパイルしようとすると強制終了する。エラーも出さずに落ちるもんだから最初まったくわけが分からなかったが、どうも「設定」て字がいかんらしい。文字コード問題?
 「設」「定」だけでも問題ないが「設定」はダメっぽい。ファイルはSJISで保存されている。再現性の確認はしてない。文字セットは「UNICODE」でも「設定なし」どちらであっても強制終了する。
 とりあえずWM_INITDIALOGでSetWindowTextすれば問題を回避可能か。

2009年11月17日火曜日

しし座流星群

しし座流星群2009:しし座流星群の観察Q&A:国立天文台
http://naojcamp.mtk.nao.ac.jp/phenomena/20091118/observe.html


 18日午前4時から5時ぐらい。方向は気にせず全体を見ること。
だけど今日はあいにくの雨で期待できないできない。オリオン座のときも見には行ったんだけど結局1つも見られなくて残念だったし、星には縁がないのかもしれん。

/** 追記 22時ごろ */
 昼過ぎには雨もやんで、夜現在では雲が30%ぐらいの晴れ具合、夜明けごろどうなるか分からないがこの調子でいけば楽しい天体観測が可能かもしれないね。


/** 追記 午前5時ごろ */
 4時前後は割とひょいひょい飛んでってた印象で、4時半ぐらいになるとぜんぜん見かけなくなった。5~6個ぐらい見られたような気がするので満足。とりあえず寒くてたまらん。

2009年11月13日金曜日

物体と背景について



 ゲームをプレイしてて自機が背景にまぎれてしまい見失うということがときどきある。未然に防ぐにはどうすればいいか適当に思いついた案でテストして差をみてみた。

左列は何の変哲もない背景&文字。
右列は文字に発光エフェクトをかけたも。最近のケイブがちょいちょい使ってる感じ。
上から普通、背景モノクロ、背景暗め、背景荒め、背景の陰影薄め、背景ぼかし、となっている。

 工夫次第で見易さが変わるのはご覧のとおりだが、おもったより差が出にくかったのはテスト画像が悪いのか。それにしても発光エフェクトが万能で手間の割りに効果が大きのがいいね、オブジェクトが軽く見えるのは弱点だが。


 背景ぼかしは最近の3Dゲーや、ジオラマ風な写真なんかでちょいちょい見るのだけど、同人2Dでは見ない気がする。試したことがないが他のオブジェクトにあわせにくかったりするのかな、見た目面白くなりそうだけど。

2009年11月11日水曜日

C言語で拡張子判別

 だが、記述はC++だという


#include <cstring>
#include <cstdio>


bool CheckExtention( const char* filename, const char* ext )
{
  if ( filename && ext )
  {
    return 0 == std::strcmp(std::strrchr(filename, '.'), ext);
  }

  return false;
}


int main()
{
  const char* ext1 = ".png";
  const char* ext2 = ".jpg";
  const char* filename = "filename.png";
  std::printf("%s\n", CheckExtention(filename, ext1) ? "true" : "false");
  std::printf("%s\n", CheckExtention(filename, ext2) ? "true" : "false");

  return 0;
}


 実行結果


true!
false!



 おおよそこんな感じか。strcmpでは大文字小文字を区別してしまうので良くないんだけど、C言語標準にはstricmpがないので適当に自作しなければならない。strlenしてtolowerしながら比較すればいいのかな?
 WINAPIならPathFindExtensionってのがあるのでそれとlstrmpiあたり。
tchar.hをつかうならば_tcsrchrと_tcsicmpあたりか。

 拡張子チェックするだけなのに意外に手間取った。文字列操作はちょっとした鬼門だ。


int stricmp( const char* s1, const char* s2 )
{
  while ( (*s1) && std::tolower(*s1) == std::tolower(*s2) )
  {
    s1++;
    s2++;
  }
  return std::tolower(*s1) - std::tolower(*s2);
}


 stricmpを調べてみたら大体このようなことをするらしい。

2009年11月9日月曜日

WM_MOUSEWHEELとWM_MBUTTONDOWNで

 マウスのホイールをそのまま回すのは日常よく使用すると思うが、押し下げたまま回すことも可能なようだ。押し込んだまま回すという動作で何か出来ないかな?

 マウスホイール周りの処理をテストしていたのだけど、マウスのホイールを押したままホイール回すと、ホイールを離したってフラグが立つのかな? と実験してみたら、そのまま押し下げた状態をちゃんと維持する。
 ブラウザ上でホイールをクリックすると▲▼マーカーがでてきてスクロールが可能になるが、その状態でホイールを回すと通常の状態に戻るから、てっきり両立不可能だと思っていたが別にそんなことはなかった。どちらもスクロール関係だからキャンセルされるんだろう。

 プログラム上ではホイールの処理は別々になってて
・ホイール(正確にはマウスの真ん中ボタン)押し込みにはWM_MBUTTONDOWN
・ホイール押し込みからの解放つまり離しにはWM_MBUTTONUP
・ホイール回転にはWM_MOUSEWHEEL
のウィンドウメッセージが飛んでくるので、対応した処理を書くだけ。ホイールがおされているかどうかは変数を巧みに使うかGetKeyState的な関数をしようすれば判別も可能かな。ひょっとしたらマウスによっては動作そのものが不可能かもしれないが、ホイールついてないやつもあるし気にしなくてもいいか。

 ちなみに自分が使っているノートPCについてるタッチパッドには真ん中ボタンがあるが、どこをどう押そうがWM_MOUSEWHEELは飛んでこない。ドライバの問題かと思われるが。



 適当なアプリケーションで試してみた。
・ペイント - そもそもホイールにも対応してない
・Excel 2003 - 押し込んだ状態では回転は無視される
・PictBearSE - 押し込みに非対応
・explorer - 押し込みに非対応
・MetasequoiaLE R2.4 - 押し込んだ状態では回転は無視される

2009年11月3日火曜日

日記ちゃん

 早くもしもやけが出来て、もう笑うしかない。この部屋寒すぎるよ!

しもやけ - Wikipedia
http://ja.wikipedia.org/wiki/%E3%81%97%E3%82%82%E3%82%84%E3%81%91

 いわく、
治療法には、40℃位のお湯と5℃位の冷水に患部を交互に付ける(必ず、水よりお湯につける時間は長くし、お湯から始めてお湯で終わるように)

とあるが、今まで生きてきて何度かこの方法を実行したことがあるが直ったためしがない。