独学プログラミング言語のページ > Windows サンプル ソース > ボタンコントロールにアイコンを表示する

ボタンコントロールにアイコンを表示する

GetDlgItem(hWnd, IDC_SDK_TEST)でボタンのハンドルを取得して、SendMessage関数を使ってアイコンを表示します。

サンプルです。

#include <windows.h>
#define  IDC_SDK_TEST      201                  /* ボタンのID */

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL InitInstance(HINSTANCE, int);

char szClassName[]    = "template";     /* ウィンドウクラス */
char szWindowsTitle[] = "BM_SETIMAGE";  /* ウィンドウ名 */

HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                                   LPSTR lpsCmdLine, int nCmdShow)
{
        MSG msg;
        BOOL bResult;
        WNDCLASSEX wc;

        hInst = hCurInst;
        /* ウィンドウ・クラスの登録 */
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WndProc;       /* プロシージャ名 */
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hCurInst;        /* インスタンス */
        wc.hIcon = (HICON)LoadImage(NULL,
                MAKEINTRESOURCE(IDI_APPLICATION),
                IMAGE_ICON,
                0,
                0,
                LR_DEFAULTSIZE | LR_SHARED);
        wc.hCursor = (HCURSOR)LoadImage(NULL,
        MAKEINTRESOURCE(IDC_ARROW),
        IMAGE_CURSOR,
                0,
                0,
                LR_DEFAULTSIZE | LR_SHARED);
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName = NULL; /* メニュー名 */

        wc.lpszClassName = (LPCSTR)szClassName;
        /* hIconSmは16x16の小さいアイコンを指定します。 */
        wc.hIconSm = (HICON)LoadImage(NULL,
                MAKEINTRESOURCE(IDI_APPLICATION),       /* MAKEINTRESOURCE マクロ */
                IMAGE_ICON,
                0,
                0,
                LR_DEFAULTSIZE | LR_SHARED);
        /* ウィンドウ・クラスの登録に失敗したら終了する */
        if (!RegisterClassEx(&wc))
                return FALSE;
        
        /* ウィンドウの生成に失敗したら終了する */
        if (!InitInstance(hCurInst, nCmdShow)) 
                return FALSE;
        
        /* メッセージループ */
        while ((bResult = GetMessage(&msg, NULL, 0, 0)) != 0) {
                if (bResult == -1) {
                        break;
                } else {
                        TranslateMessage(&msg); /* 仮想キーメッセージを文字メッセージへ変換する。 */
                        DispatchMessage(&msg);  /* ウィンドウプロシージャへメッセージをディスパッチ(送出)する。 */
                }
        }
        return (int)msg.wParam;
}

/* ウィンドウの生成 */
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
        HWND hWnd;

        hWnd = CreateWindow(szClassName,        /* 登録されているクラス名 */
                szWindowsTitle,                                 /* ウィンドウ名(タイトルバーに表示されます) */
                WS_OVERLAPPEDWINDOW,                            /* ウィンドウの種類 */
                CW_USEDEFAULT,                                          /* ウィンドウの横方向の位置 */
                CW_USEDEFAULT,                                          /* ウィンドウの縦方向の位置 */
                CW_USEDEFAULT,                                          /* ウィンドウの幅 */
                CW_USEDEFAULT,                                          /* ウィンドウの高さ */
                NULL,                                                                   /* 親ウィンドウのハンドル */
                NULL,                                                                   /* メニューハンドル */
                hInst,                                                          /* アプリケーションインスタンスハンドル */
                NULL);
        if (!hWnd)
                return FALSE;
        ShowWindow(hWnd, nCmdShow);             /* ウィンドウを表示する。 */
        UpdateWindow(hWnd);                                     /* 更新リージョンが空ではない場合ウィンドウのクライアント領域を更新する */
        return TRUE;
}

/* ウィンドウプロシージャ */  
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        HICON hIcon;
        switch (msg) {

        case WM_CREATE:
                /* ボタンを配置する(BS_ICONも忘れずに) */
                CreateWindow("BUTTON", "てすと", WS_CHILD | WS_VISIBLE | BS_ICON,
                        0, 0, 70, 70, hWnd, (HMENU)IDC_SDK_TEST, hInst, NULL);

                /*
                IDI_APPLICATION
                IDI_HAND
                IDI_QUESTION
                IDI_EXCLAMATION
                IDI_ASTERISK
                IDI_WINLOGO
                */
                hIcon =  (HICON)LoadImage(NULL,
                MAKEINTRESOURCE(IDI_EXCLAMATION),
                IMAGE_ICON,
                0,
                0,
                LR_DEFAULTSIZE | LR_SHARED);
                SendMessage(GetDlgItem(hWnd, IDC_SDK_TEST), BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);

                break;
        case WM_COMMAND:
                switch (LOWORD(wParam)){
                case IDC_SDK_TEST:
                        break;
                }
                break;
        case WM_CLOSE:                                  /* 終了メッセージ */
                DestroyWindow(hWnd);
                break;
        case WM_DESTROY:                                /* ウインドウが破棄されているとき、送られます。 */
                PostQuitMessage(0);     /* 自らの終了を要求したことをシステムに伝えます。 */
                break;
        default:        /* アプリケーションが処理しないウィンドウメッセージに対して、既定の処理を提供します。 */
                return (DefWindowProc(hWnd, msg, wParam, lParam));/* デフォルトの処理 */
        }
        return 0;
}

トップページ