<   2006年 08月 ( 10 )   > この月の画像一覧

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

テンプレートのサンプルと簡単なRaw画像操作クラス

#include <assert.h>

// テンプレートクラス定義
template<class T>
class CBinaryImageImp
{
public:
    // このクラスの実際の型
    typedef T type;

    // 定数値をコンパイル時に決定する
    enum { max_val = (1 << (sizeof(T) * 8)) -1 };

    CBinaryImageImp(T* d, int w, int h) 
        : _d(d), _w(w), _h(h) {}

    // ピクセル値の取得と設定
    T Get(int x, int y);
    void Set(int x, int y, T v);
protected:
    T* _d;
    int _w;
    int _h;
};

// テンプレートクラスメソッド
template<class T>
T CBinaryImageImp<T>::Get(int x, int y)

    return _d[_w * y + x]; 
}

template<class T>
void CBinaryImageImp<T>::Set(int x, int y, T v)

    _d[_w * y + x] = v; 
}

// 型定義
typedef CBinaryImageImp<unsigned char>    CBinaryImage8;
typedef CBinaryImageImp<unsigned short>    CBinaryImage16;

// テストコード
void test_CTypedImage8() 
{
    int w = 100;
    int h = 100;
    int size = sizeof(CBinaryImage8::type);
    assert(size == 1);
    int max = CBinaryImage8::max_val;
    // テンプレートクラスの実際の型と定数値を利用可能
    CBinaryImage8::type* data = new CBinaryImage8::type[w*h];
    memset(data, 0, w*h);
    CBinaryImage8 image(data, w, h);
    for(int y=0; y<h; y++)
    {
        for(int x=0; x<w; x++)
        {
            int v = x * y;
            image.Set(x, y, v);
            assert(image.Get(x, y) == (v & max));
        }
    }
    delete [] data;
}

void test_CTypedImage16() 
{
    int w = 1000;
    int h = 1000;
    int size = sizeof(CBinaryImage16::type);
    assert(size == 2);
    int max = CBinaryImage16::max_val;
    // テンプレートクラスの実際の型と定数値を利用可能
    CBinaryImage16::type* data = new CBinaryImage16::type[w*h];
    memset(data, 0, w*h);
    CBinaryImage16 image(data, w, h);
    for(int y=0; y<h; y++)
    {
        for(int x=0; x<w; x++)
        {
            int v = x * y;
            image.Set(x, y, v);
            assert(image.Get(x, y) == (v & max));
        }
    }    
    delete [] data;
}

[PR]
by isoq | 2006-08-25 11:55 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

ミステリーサークル

a0002261_21353794.jpg

今年もミステリーサークルができました。

これで今年も芝生がだめになりそうです。
[PR]
by isoq | 2006-08-21 21:35 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

単純入力ミスによるバグ

    // 画像処理
    DWORD width = image.GetWidth();
    DWORD height = image.GetHeight();

    DWORD* px = new DWORD[width];
    DWORD* py = new DWORD[height];

    memset(py, 0, sizeof(DWORD)*width);
    memset(px, 0, sizeof(DWORD)*height);


画像の特性を取得するためのテストコードの一部です。

結果が、画像の高さが幅と同じくらいから全くおかしいデータが取得されました。
また、メッセージ処理中に突然異常終了してしまったりしました。
しかし、原因が不明でした。

よくよくコードを見てみると、 px と py を間違って初期化してしまっていました。
ちょっとしたミスでした。
こんな入力ミスは、コンパイラもデバッガも注意してくれませんから、プログラマが注意する必要があります。
[PR]
by isoq | 2006-08-21 15:31 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

ダイエットタイピングゲーム

ダイエットタイピングゲームは、ダイエット成功後のメリットがひたすら出てくるタイピングゲームです。

やっている間に、なんだか綺麗になった気分を味わえます(笑)

そして、全問クリアすると、踊る「ダンシング総理アイコン」↓がもらえます!

a0002261_1071270.gif


Let's dancing together!
[PR]
by isoq | 2006-08-21 10:13 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

MAMEGAME - まめ蔵の忍者修行 タイピングギダンの術

オンラインゲームっていろいろありますが、オンラインゲームでおもしろいのは、いろいろな人とランキングを争う事が出来る事だと思います。

まめ蔵の忍者修行 タイピングギダンの術は、MAMEGAME.tvが提供するタイピングゲームです。

ちょくちょくかみさんとはまっていて、現在かみさんはランキング3位(mika)。
私は、ランキング13位(masa)にランクされています。

お子様向けのゲームサイト(だと思う)なので、それほどレベルが高くないのかもしれませんが、かなり上位にランクインされています。

あなたの挑戦を待っています。

Let's Play Typing!
[PR]
by isoq | 2006-08-21 09:36 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

シングルクリックとダブルクリックの切り分け:タイマを使用(MFC)

ダブルクリックをしたときは、同時にシングルクリックもしています。
2回連続的にシングルクリックしたときに、2回目のクリックがある一定時間以内に発生したときに、Windowsはダブルクリックを認識します。

つまり、Windowsは、アプリケーションに次の順番でメッセージを送ってきます。

WM_LBUTTONDOWN → WM_LBUTTONUP → WM_LBUTTONDBLCLK → WM_LBUTTONUP

ダブルクリックとなる2回目のクリックまでのある一定の時間は、Win32SDKの GetDoubleClickTime() 関数によってミリ秒で取得できます。
これを利用して、タイマを起動し、ダブルクリックが起こらなければ、シングルクリックだとアプリケーションが認識するようにします。

const static int IDT_LCLICK = 1000;

(中略)

// ボタンアップハンドラ
void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
    m_ptClickPoint = point;    // 必要があれば位置を記録
    // クリックタイマ起動
    SetTimer(IDT_LCLICK, GetDoubleClickTime(), NULL);
    CScrollView::OnLButtonUp(nFlags, point);
}

// ダブルクリックハンドラ
void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    // クリックタイマ停止
    KillTimer(IDT_LCLICK);
    // ダブルクリック時の処理
    OnLButtonDoubleClick();
}

// タイマハンドラ
void CMyWnd::OnTimer(UINT nIDEvent) 
{
    // クリック時の処理
    if(nIDEvent == IDT_LCLICK)
    {
        KillTimer(IDT_LCLICK);
        OnLButtonClick();
    }
    CParentClass::OnTimer(nIDEvent);
}

(後略)


でも、これを実装しても、クリックの動作が遅すぎて、使い物になりません(;_;)
しかも、ダブルクリック待ち中に移動してクリックすると、それは別のクリックですが、タイマを起動するだけなので、クリックの漏れが発生します。

これは、OnLButtonDown() の最初で、以前のクリック位置と異なるかどうかを判定して、クリック位置がずれていて、さらにタイマ処理がまだだったら、タイマ処理を強制実行(OnTimer(IDT_LCLICK) をコール)してから、新しいタイマを起動するようにすると解決できそうです。

ダブルクリックは、2回目のクリックが一定時間以内に発生するかどうかをチェックしなければいけませんので、もし、本当にきちんと対処しようと思うと、どうしても待ち時間が発生してしまいます。

そこで、解決策を考えてみました。

①最初のWM_LBUTTONDOWNでクリック処理を実行してしまいますが、ダブルクリックの場合はキャンセル(アンドゥ)します。(かなり用途は限定されますが)

②あきらめて、小細工しない。WindowsのExplorerなどは、諦めたのか、体感速度を優先したのか、この辺の小細工はしていません。しかも逆にその方が自然な感じで実装できます。

Explorerでは、最初の WM_LBUTTONDOWN でファイル選択し、次の WM_LBUTTONDBLCLK でファイルをオープンします。

Ctrl+クリックで複数選択する場合は、選択済みのファイルの上でダブルクリックすると、最初のクリックで選択が解除されてしまう実装になっています。
気にしないか、ダブルクリックの代替えとなるキーボード操作やボタンなどで対処する方が楽そうです。(Explorerでは Enter キーにあたりますね)


結論

ダブルクリックの前のシングルクリックを受け入れようという事になりました(^^;)
[PR]
by isoq | 2006-08-18 11:43 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

小メダカ

8月の始め頃、小メダカが誕生しました。
a0002261_14183575.jpg

100円ショップの材料で作った、自作の稚魚飼育ケース(買った方が安かった)に卵を入れて、2週間ほどで孵りました。

8匹くらい生まれたのですが、4匹が順調に成長し、この度、体長8mm~10mmくらいに成長しましたので、稚魚ケースから水槽の中に放しました。

まだまだ小さいですが、他の大人のメダカに追い回されることなく、元気に泳いでいます。
[PR]
by isoq | 2006-08-17 14:25 | 観察日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

なつだから、夏のスキンにしてみました

去年のお古だけど、夏っぽいスキンに変更しました。
なんだか懐かしいね。

このスキン、もう夏が終わってだいぶ経ってから、時期じゃないよな~
と思いながら、やめたのでした。

なつかしいな。
[PR]
by isoq | 2006-08-10 19:54 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

テスト

携帯からテスト
文字色・背景色
絵文字・・羡・

携帯からの投稿機能は、それほど進化していないみたい。。。
[PR]
by isoq | 2006-08-10 09:06 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

デスクトップのスクリーンキャプチャを撮る

CImage* CaptureDesktop(CRect area, int bpp = 24)
{
    CImage* image = new CImage();
    if(image->Create(area.Width(), area.Height(), bpp)) {
        HDC hDC = ::GetDC(NULL);
        HDC hImageDC = image->GetDC();
        ::BitBlt(hImageDC, 0, 0, area.Width(), area.Height()
            , hDC, area.left, area.top, SRCCOPY);
        image->ReleaseDC();
        ::ReleaseDC(NULL, hDC);
    }
     else {
        delete image;
        image = NULL;
    }
    return image;    
}

[PR]
by isoq | 2006-08-03 23:33 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇