MIKO Lab.
Program
乱数
0~1.0の値をランダムに発生
#include <stdlib.h>
/**
*0~1.0の値を返す関数. (0は含むが,1.0は含まれない)
*@return 0~1.0の値
*/
double MyRand()
{
return ((double)rand() / (RAND_MAX + 1.0));
}
RAND_MAXはstdlib.hの中で定義されている.
標準ライブラリのrand()は良い乱数でないためメルセンヌ・ツイスタの利用を推奨.
メルセンヌ・ツイスタのライブラリに0~1.0の値を返す関数があったと思う.
指数分布に従った乱数
#include <math.h>
/**
*指数分布 (exponential distribution)
*@param lambda : 平均値
*@return 指数分布に従った乱数
*/
double exponential(double lambda)
{
return (-lambda * log(1.0 - MyRand()));
}
透明なスクリーンセイバー
ウインドウの透明化
ScreenSaverProc関数内のWM_CREATEメッセージを処理する部分で,ウインドウの透明化処理を行う.
透明化部分の処理サンプル:
LONG exStyle = GetWindowLong(hWnd,GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, RGB(0,0,0), 0, LWA_COLORKEY);
ウインドウ属性にWS_EX_LAYEREDを設定することで透明化が可能.
GetWindowLong関数で現在のウインドウ情報(属性)を取得
SetWindowLong関数で現在の属性にWS_EX_LAYEREDを追加,
SetLayeredWindowAttributes関数で透明情報の設定を行う.
スクリーンセイバーサンプルコード
サンプルコードは一定時間ごとに,文字列「テストスクリーンセイバー」をランダムカラーでランダム位置に描画するサンプル.