ツールっぽいものを作る

ずいぶん久々になってしまいましたがまだまだ頑張ります。

しばらくは、サウンドプログラムの勉強も兼ねて、サウンド再生アプリ兼ツールを作成してみる。
※ちょっと関連ある記事(d:id:p-tal:20091020)


ということでまずは雛型作り。

簡単にウィンドウを出してEscキーで終了するところまで制作した。


その他メモ

1.アイコン設定

Windowsのアイコンを使用するのであれば、WNDCLASSEXのhIcon/hIconSmにLoadIconの戻り値を入れればOK。
アプリの左上のアイコンに関してはhIconSmが優先されるみたい。(ちなみにhIconSmをNULLにするとhIconのアイコンになる。)

WNDCLASSEX wndclass;

...

wndclass.hIcon = ::LoadIcon(NULL, IDI_QUESTION);
wndclass.hIconSm = ::LoadIcon(NULL, IDI_HAND);


2.サイズ変更可能のウィンドウ

今までゲームしか作ってこなかったので、意外と盲点だった。
でもウィンドウスタイルでWS_THICKFRAMEを加えるだけなので超絶簡単。

// ウィンドウスタイル
unsigned int style = WS_POPUP | WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME;

HWND hWnd = ::CreateWindowEx(0, wndclass.lpszClassName,	caption, style, x, y,w, h, NULL, NULL, wndclass.hInstance, NULL);


これだけでウィンドウの枠をドラッグで広げたり縮めたりできるようになると。

プリコンパイル済みヘッダーを使う

前回の記事(d:id:p-tal:20091111)に関連して。


共通で使用するマクロやtypedef、includeファイルなどはプリコンパイル済みヘッダーとして中間ファイルにしておくと、それらを参照しているcppのコンパイル速度が劇的に速くなる。


使い方は簡単で、

(1)まとめておきたいものをヘッダファイルに記述する。

// common.h

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

typedef unsigned int u_int;

...


(2)そのヘッダをインクルードしただけのcppを作る。

(3)cppファイルのプロパティで[プリコンパイル済みヘッダーを作成する]に指定。「ファイルを使用してPCHを作成/使用」の欄には、cppからの相対パスでヘッダを記述する。


(4)作成に使用したヘッダファイルを全ファイルに対してincludeしておく

これをしないとエラーが出るみたい。(d:id:p-tal:20091111)で書いた方法が便利。



実際に自分のプロジェクトでやってみたら2倍くらいの速さになってびっくりした。

今まで使ってなかったのがちょっと勿体ない。
今後はもっと活用しよう。

とにかくincludeする

どんなプロジェクトでも使用するtypedefやマクロなどは、全ファイルにincludeしても構わないのでは・・・という点から、それを便利に行う方法を模索。

『プロパティ > 構成プロパティ > C/C++ > 詳細 > 必ずインクルード』の部分にファイル名を入れておけばOK。


この時、ここで入力したものはincludeする側からの相対パスとなるので、プロジェクトのソースをフォルダ分けして管理してるとエラーが多発する。

この場合、一つ専用のフォルダなんかを作って『追加のインクルードディレクトリ』に入れておくと便利。


(↑commonSrcフォルダにcommon.hがあるとする)

この作業で全ファイルにincludeされてるっぽいけど、includeさせたファイルを書き換えると恐ろしいことになりそうなので注意が必要そう。

Androidについての書籍を購入

http://gigazine.net/index.php?/news/comments/20091027_sony_rachael/

ソニエリAndroid携帯がついに来る・・・らしい。

良い機会なので発売されたらdocomo契約しようかと模索中です。


これに関連して、気が早いけどAndroidプロぐグラミングのための書籍を買ってきた。

Android 1.5プログラミングバイブル

Android 1.5プログラミングバイブル

ひとまずAndroidSDKとjavaEclipseのインストール完了。

なかなか時間が取れないけど、少しずつ進めてみよう。

#ifと#ifdefの違い

#if (x)	   … x が true なら実行される
#ifdef (x) … x が #defineで定義されていれば実行される


実際にプログラム上で使用する機会はデバッグ表示の有無なんかがほとんど。
なお、Visual Studioの場合はDebugモード時に自動的に 「#define _DEBUG 1」 が定義されている。

// 使用例
#ifdef _DEBUG
  dispFPS();  //< FPS表示
#endif

#if _DEBUG
  dispFPS();  //< #ifでも出る
#endif

Releaseモード時のみ表示したいときなんかは #ifndef _DEBUG で。
「_RELEASE」的なものは無いみたい。


どっちを選ぶべきかは分からないけど、Debug/Releaseの切り替えについては #ifdef で統一しておこう。

#if は 「#if 0」で大きくコメントアウトする際なんかに使う方針で。

APIからの音声再生

今まではDirectSoundを使用したwavファイル再生を行っていたけど、少しは自分で管理してみようということでサウンドAPIについて勉強してみる。

方法としては、
PlaySound関数、waveOut***系API、MCI(media control interface) の三つが主ということらしい。

まずは一番簡単なPlaySound関数から。

  PlaySound("test.wav", NULL, SND_ASYNC /*| SND_LOOP*/); // SND_LOOPでループ再生

ファイルパス(相対パスでOK)を入れてフラグ設定するだけで再生。なんて楽さ。

ファイルパスにNULLを入れることで停止。一時停止ではないとのこと。

  // 停止
  PlaySound(NULL, NULL, 0);

非常に便利だけど、細かい作業ができないので実装には不向き。

次はwaveOut系、MCIについても勉強してみよう。

namespaceの定義

namespaceを定義する際には、最後の「}」の後のセミコロンは不要。

namespace Test
{
  class TestClass
  {
  public:
    TestClass();
    ~TestClass();
  };
}

今までセミコロンを付けてたけど、今後は外しておこう。

でも実際のところ付けててもコンパイラが無視してコンパイルすることになるのだろうけど。