2003/12/14 (日)

(/_;) だいれくとえっくす

DirectDraw でフルスクリーンにでもしてみようと、こんな関数作ってみた。

void DirectDraw::ToFullScreen(const HWND hWnd,
                              const unsigned int width,
                              const unsigned int height,
                              const unsigned int colordepth) throw (e_directdraw)
{
    HRESULT ddrval = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    if(ddrval != DD_OK)
        THROW(e_directdraw);

    ddrval = lpDD->SetDisplayMode(width, height, colordepth);
    if(ddrval != DD_OK)
        THROW(e_directdraw);
}

なお、e_directdraw は例外用のクラス。本当は std::runtime_error を継承させるのが望ましいんだけど、今は継承してません。定義は、

class e_base {
};

#define EXCEPTION(e)  \
        class e : public e_base \
        { \
            private: \
                char *m_what; \
                int  m_code; \
            public: \
                e(const char *what, const int code) { \
                    m_code = code; \
                    m_what = (char *)what; \
                } \
                ~e() { \
                } \
                const char *what() const \
                { \
                    return m_what; \
                } \
                const int code() const \
                { \
                    return m_code; \
                } \
        };

EXCEPTION(e_directdraw)

こんな感じ。ダメな設計なのでよい子は真似しないように。THROW マクロは、

#define THROW(e) throw e(__FILE__, __LINE__)

こんなの。

だいぶずれた気がするけど、これって、自動でウィンドウモードに戻してくれるのね。タイミングは hWnd が破棄された瞬間かな?それとも lpDD が破棄された瞬間かな?(前者っぽい気がするなぁ。確かめる気もないけど。

ちなみに、HRESULT result = ::DirectDrawCreate(NULL, &lpDD, NULL); というコードが DirectDraw クラスのコンストラクタにいて、lpDD はメンバ変数なのです。

どうでもいいけど、こんな日記を書くと、中身が   とかだらけになるという罠。自動変換しないと耐えられない…

ただ、VB みたいな言語ならいいんだけど、VC++ 6.0 でこのインターフェースはちょっと気持ち悪いかも。

(/_;) まじめにコード書いたあとは、

こういうふざけたコードを書きたくなる…。

#include <windows.h>
#include "debug.h" // プロトタイプ宣言を詰めてあるだけ

#define for if(0);else for

void DebugOut(const char *format, ...)
{
#ifdef _DEBUG
    va_list arg;
    va_start(arg, format);
    
    for(size_t i = (size_t)1 ; i < (size_t)100 ; i++)
    {
        char *buf = new char[i * 1024 + 2];
        if(_vsnprintf(buf, i * 1024, format, arg) > 0)
        {
#ifdef DEBUG_OUT_CONSOLE
            strcat(buf, "\n");
            ::OutputDebugString(buf);
#endif // DEBUG_OUT_CONSOLE
#ifdef DEBUG_OUT_MSGBOX
            ::MessageBox(NULL, buf, "Debug Message", MB_OK);
#endif // DEBUG_OUT_MSGBOX
            delete [] buf;
            break;
        }
        delete [] buf;
    }
    va_end(arg);
#endif // _DEBUG
}

あると便利に間違いはないんだが、これ、欠点アリ。

コードに埋め込んだ

DebugOut("変数 i の値は %d だよぉ〜 ヽ(´ー`)ノ", i);

とかいうのは、リリース版でも削除(あぼーん)されずにバイナリ中に残ってしまうんだな…。inline 関数にしても一緒だろうな…っていうか、複雑すぎて inline にはしてくれないだろうな…_DEBUG が define されているときは簡単すぎる…^^;;書いてるときに気づけよな>自分、きっと。可変個の引数を持つからマクロにもできないし…。むぅ。やっぱり原始的な #ifdef _DEBUG#endif でコードを囲うしかないんだろうか。

(/_;) 昨日の痴漢置換

よく見たら「堪忍」って、不利な立場や困難な状況を堪え忍ぶことっていう意味もあるのね…。観念の(2)あきらめること。覚悟すること。「もうだめだと―した」の方が妥当な気がしなくもないんだけど、どうなんだろー。考えるの面倒だからやめ。(ぉぃ

(/_;) お買い物

久しぶり(1ヶ月ぶり?)に日本橋に行ってきた。本当は HDD とプリンタ買いにいったんだけど、HDD は目ぼしいものがなく、プリンタは見るのを忘れていたという。

その代わり、キーボード購入。Owlteck 製の 112Key キーボード

メカニカルのカチャカチャ具合がいい感じ♪

今感じてる欠点は2つ。

  • ENTER-Delete 間、BS-Insert 間が無い
  • 音がすごいから仕事サボってるのがバレる

ま、どっちも運用でカバーできるかなぁ。(後者は無理か)

(/_;) 破壊

WindowsXP 吹っ飛んだ〜♪

仕方ないので再インストール

ついでに、Windows 2000 用のパーティション(10GB)を削除して、XP 用のパーティション(10GB)とくっつけて 20GB のシステムパーティションを確保しようかと思ったら、くっつけられなかった…。

KNOPPIX あたり使ったらどうにかならないかなぁ。明日会社から KNOPPIX の CD 持って帰ってやってみるか。

[]