< December 2005 | January 2006 | February 2006 >

January 26, 2006

対数あれこれ

苦手な対数のお勉強だ。

x = n p

のとき、pn を底とする x の対数と呼び、以下のように表記する。

p = log n x

プログラミング言語では、定数 e を底とする自然対数を返す log (number) 関数が定義されていることが多い。任意の数 n を底とした対数が得たければ、以下のようにする。

log n x = log (x) / log (n)
続きを読む...

January 23, 2006

error C2275 : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。

こんな警告が出た。


コンパイルしています...
main.cpp
c:\foo\main.cpp(25) : error C2275: 'MyLt' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
        c:\foo\main.cpp(7) : 'MyLt' の宣言を確認してください。

ビルドログは "file://c:\foo\Debug\BuildLog.htm" に保存されました。
foo - エラー 1、警告 0

コンパイルしたのはこれ。

#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>

struct MyLt
{
    bool operator () (const int lhs, const int rhs) const
    {
        return lhs < rhs;
    }
};

void main (int argc, char **argv)
{
    std::vector <int> IntVector;
    for (int i = 0; 10 > i; i++)
        IntVector.push_back (std::rand ());

    std::cout << "before sort" << std::endl;
    for (int i = 0; IntVector.size () > i; i++)
        std::cout << IntVector [i] << ", ";
    std::cout << std::endl;

    std::sort (IntVector.begin (), IntVector.end (), MyLt);     // error C2275

    std::cout << "after sort" << std::endl;
    for (int i = 0; IntVector.size () > i; i++)
        std::cout << IntVector [i] << ", ";
    std::cout << std::endl;
    return;
}

ハァ? typedef ? メンバアクセス演算子? どちらも使ってないよ。はっきり言ってこのエラーメッセージは意味不明。

続きを読む...

January 21, 2006

アイコンの不透明部分のリージョンを作成する

アイコン型のウインドウを作成したかったのです。それには、アイコンのマスク部分を取得して、マスクの不透明部分の形のウインドウリージョンを作って設定します。

リージョン作成部分は続きの方にかいときますが、ウインドウプロシージャはこんな感じ。

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_PAINT:
        PAINTSTRUCT PaintStruct;
        HDC hDC = BeginPaint (hWnd, &PaintStruct);
        DrawIcon (hDC, 0, 0, m_hIcon);
        EndPaint (hWnd, &PaintStruct);
        break;
    case WM_MOVE:
        SetWindowRgn (hWnd, m_hRgn, TRUE);
        break;
    default:
        break;
    }
    return DefWindowProc (hWnd, uMsg, wParam, lParam);
}

説明が前後しますが、ウインドウ作成時にウインドウに描画するアイコンを m_hIcon 仁読み込んであります。同時に、そのアイコンハンドルを渡して後述の CreateRgnFromIcon (HICON) を呼びだし、m_hRgn にアイコンのマスク部分の形のリージョンを得てあります。では、その CreateRgnFromIcon 関数です。

続きを読む...

タイトルバーのないウインドウのドラッグ

タイトルバーのないウインドウを、ウインドウ内の任意の位置をドラッグして移動できるようにする方法です。

以下のように、WM_LBUTTONDOWN メッセージをすり替えて、タイトルバー上でマウスボタンが押下されたようにだましてしまうとうまくいきます。

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
        ReleaseCapture ();
        SendMessage (hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
        return 0;
    default:
        break;
    }
    return DefWindowProc (hWnd, uMsg, wParam, lParam);
}

続きを読む...

January 17, 2006

Word で、図形やワードアートの塗りつぶしの色が表示されない

親戚よりヘルプコール。「ワードアートにいくら塗りつぶしの色を設定しても透明のまま」とのこと。???と思って行ってみると、ワードアートだけでなく、Word のすべての図形で塗りつぶしの色が表示されない。それらしい設定項目を探してもない。

結論を言うと、コントロールパネルの「ユーザー補助のオプション」→「画面」タブ→「ハイコントラストを使う」にチェックが入っていた。そんなの入れた覚えがないって言うけど、まあとにかく、そのチェックをはずせば元通りになりました。
でも、そんなとこの設定が Word の表示に関係あるなんて思わないよねぇ。