ソフトウェア開発 Win32プログラミング

ウィンドウ表示に特殊効果を適用する

戻る


説明するまでもなく、この業界は過当競争が激しい。 ちょっとしたことでも他企業に先を越されないように差別化しなければいけない。

ウィンドウの表示にちょっとした特殊効果を付けて、 印象を向上させるというのも、一つのテクである。 AnimateWindow APIがそれに応えてくれる。

以下のソースを見てほしい。

#define WINVER 0x0500
#include <windows.h>

static const TCHAR g_szCaption[] = TEXT("Win32 Template");
static const TCHAR g_szClassName[] = TEXT("Win32 Template");
 
#define ANIMATE_WAIT 1000

HINSTANCE g_hInstance;
HWND g_hMainWnd;
 
void OnPaint(HWND hWnd, HDC hdc)
{
    RECT rc, rc2;
    SIZE siz;
    HBRUSH hbr;
 
    GetClientRect(hWnd, &rc);
    siz.cx = rc.right - rc.left;
    siz.cy = rc.bottom - rc.top;
 
    hbr = CreateSolidBrush(RGB(255, 0, 0));
    SetRect(&rc2, rc.left + 0 * siz.cx / 3, rc.top, rc.left + 1 * siz.cx / 3, rc.bottom);
    FillRect(hdc, &rc2, hbr);
    DeleteObject(hbr);
 
    hbr = CreateSolidBrush(RGB(255, 255, 255));
    SetRect(&rc2, rc.left + 1 * siz.cx / 3, rc.top, rc.left + 2 * siz.cx / 3, rc.bottom);
    FillRect(hdc, &rc2, hbr);
    DeleteObject(hbr);
 
    hbr = CreateSolidBrush(RGB(0, 0, 255));
    SetRect(&rc2, rc.left + 2 * siz.cx / 3, rc.top, rc.left + 3 * siz.cx / 3, rc.bottom);
    FillRect(hdc, &rc2, hbr);
    DeleteObject(hbr);
}
 
LRESULT CALLBACK
WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
 
    switch(uMsg)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        if (hdc != NULL)
        {
            OnPaint(hWnd, hdc);
            EndPaint(hWnd, &ps);
        }
        break;
 
    case WM_PRINTCLIENT:
        OnPaint(hWnd, (HDC)wParam);
        break;
 
    case WM_CLOSE:
        AnimateWindow(hWnd, ANIMATE_WAIT, AW_HIDE | AW_SLIDE | AW_VER_POSITIVE);
        DestroyWindow(hWnd);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
 
 
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    WNDCLASSEX wcx;
    MSG msg;
    BOOL f;
 
    g_hInstance = hInstance;
    wcx.cbSize          = sizeof(WNDCLASSEX);
    wcx.style           = 0;
    wcx.lpfnWndProc     = WindowProc;
    wcx.cbClsExtra      = 0;
    wcx.cbWndExtra      = 0;
    wcx.hInstance       = hInstance;
    wcx.hIcon           = LoadIcon(NULL, IDI_APPLICATION);
    wcx.hCursor         = LoadCursor(NULL, IDC_ARROW);
    wcx.hbrBackground   = (HBRUSH)(COLOR_3DFACE + 1);
    wcx.lpszMenuName    = NULL;
    wcx.lpszClassName   = g_szClassName;
    wcx.hIconSm         = (HICON)LoadImage(NULL, IDI_APPLICATION,
        IMAGE_ICON, 
        GetSystemMetrics(SM_CXSMICON), 
        GetSystemMetrics(SM_CYSMICON), 0);
    if (!RegisterClassEx(&wcx))
        return 1;
    
    g_hMainWnd = CreateWindow(g_szClassName, g_szCaption, 
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 300, 200,
        NULL, NULL, hInstance, NULL);
    if (g_hMainWnd == NULL)
        return 2;

    AnimateWindow(g_hMainWnd, ANIMATE_WAIT, AW_ACTIVATE | AW_SLIDE | AW_VER_NEGATIVE);
    //AnimateWindow(g_hMainWnd, ANIMATE_WAIT, AW_ACTIVATE | AW_BLEND);
    //AnimateWindow(g_hMainWnd, ANIMATE_WAIT, AW_ACTIVATE | AW_CENTER);
    ShowWindow(g_hMainWnd, nCmdShow);
    UpdateWindow(g_hMainWnd);
 
    while((f = GetMessage(&msg, NULL, 0, 0)) != FALSE)
    {
        if (f == -1)
            return -1;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (INT)msg.wParam;
}

OnPaint関数は、フランス国旗のようなものを表示している。 ShowWindowとDestroyWindowの直前のAnimateWindowの呼び出しが、特殊効果を起こす。 つまり、これは、ウィンドウを表示するときと、ウィンドウを閉じるときに特殊効果を起こすコードである。 実際にどんな効果になるのか、試してみるといい。

2つの注意点がある。AnimateWindowを使う場合、必要ならばWM_PRINTCLIENTメッセージでクライアント領域の描画を行う必要がある。 AnimateWindowはWindows 98以降でしか動作しない。つまりWinNT4と95では動かない。

ソース: animate.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system