List Box に名前一覧を表示する

空のプロジェクトを作成して、プログラム全体を自前で作成します。
ListBox を Window 全体に貼り付けて名前一覧を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. このプログラムは、空の新規プロジェクト(Listbox)から作成して下さい。
    テンプレートを使って「ListBox」のプロジェクト名で作成すると ListBox が正常に表示されない場合があります。
  2. Listbox.cpp をフォルダーに格納して[プロジェクト][既存項目の追加]からプロジェクトに追加します。
    Listbox.cpp のソースコードは、このページの後に掲載しています。
  3. ビルドに続いて実行を行います。
    ページ先頭の Window が表示されたら完成です。 <(`^´)>
    全データが ListBox に表示できなくなると、自動的に Scrool Bar が設定されます。
  4. List Box のハンドルとインスタンスと ListBox に表示するデータです。
        HWND        hList;              //ListBox のハンドル
        HINSTANCE   g_hInst;
        LPCTSTR     ListStr[]=
        { "愛知  真唯子",   "青森  孝雄",   "秋田  景子",   "石川  雅夫",   "神戸  真美",
          "名古屋  美幸",   "愛媛  和子",   "和歌山  絢子", "大阪  恵",     "岡山  英子",
          "沖縄  妙子",     "香川  祐子",   "鹿児島  浩司", "神奈川  真路", "岐阜  真実",
          "京都  智史",     "熊本  志保",   "滋賀  佳奈子", "静岡  志依",   "千葉  泉",
          "東京  拓生",     "長崎  英明",   "長野  政則",   "奈良  憲彦",   "兵庫  美佐子",
          "広島  まい",     "福井  真実",   "福岡  大樹",   "北海道  静",   "三重  由香理",
        };
        
  5. グローバル領域(g_hInst)にインスタンスを格納します。
        int PASCAL  WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                            LPSTR lpCmdLine,int nCmdShow)
        {      :
               :
            g_hInst= hInstance;
        
  6. WM_CREATE: で ListBox を Window のサイズに合わせて貼り付けます。
    GetClientRect() で Windows のサイズを取得します。
    SetInitialData() で List Box にデータを登録します。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
        {   RECT    rc;
                    :
            case WM_CREATE:
                GetClientRect(hWnd, &rc);
                hList = CreateWindow("LISTBOX", NULL,
                        WS_CHILD | WS_VISIBLE | WS_VSCROLL,
                        0, 0, rc.right, rc.bottom,
                        hWnd, NULL, g_hInst, NULL);
                SetInitialData(hList);
                break;
        
  7. Window のサイズが変更されたとき、それに合わせて ListBox のサイズも変更します。
            case WM_SIZE:
                GetClientRect(hWnd, &rc);
                MoveWindow(hList,rc.left,rc.top,rc.right,rc.bottom,TRUE);
                break;
        
  8. List Box にデータを登録する SetInitialData() 関数です。
    SendMessage(hlist, LB_INSERTSTRING, ...) で一件ずつデータを登録します。
    SendMessage(hlist, LB_SETCURSEL, ...) で最後に追加したデータにカーソルの位置を設定します。
        int SetInitialData(HWND hlist)
        {   int     i;
    
            for(i=0; i<30; i++)
                SendMessage(hlist,LB_INSERTSTRING,(WPARAM)i,(LPARAM)ListStr[i]);
            SendMessage(hlist,LB_SETCURSEL,i-1,0L);
            return i;
        }
        

【注意】

テンプレートを使ってプロジェクト名を 「ListBox」 で作成すると何故か ListBox が正常に表示されません。
テンプレートを使うときは、プロジェクト名を変えて下さい。
またテンプレートでは hInst が自動的に定義されているので、これを使うことも出来ます。

全ソースコード

超初心者の方のために全ソースコードを掲載します。 (^_^;)

/************************************************/
/*★ List Box に名前一覧を表示する    前田 稔 ★*/
/************************************************/
#include    <windows.h>
#define     NAME    "List Box"

HWND        hList;              //ListBox のハンドル
HINSTANCE   g_hInst;
LPCTSTR     ListStr[]=
{ "愛知  真唯子",   "青森  孝雄",   "秋田  景子",   "石川  雅夫",   "神戸  真美",
  "名古屋  美幸",   "愛媛  和子",   "和歌山  絢子", "大阪  恵",     "岡山  英子",
  "沖縄  妙子",     "香川  祐子",   "鹿児島  浩司", "神奈川  真路", "岐阜  真実",
  "京都  智史",     "熊本  志保",   "滋賀  佳奈子", "静岡  志依",   "千葉  泉",
  "東京  拓生",     "長崎  英明",   "長野  政則",   "奈良  憲彦",   "兵庫  美佐子",
  "広島  まい",     "福井  真実",   "福岡  大樹",   "北海道  静",   "三重  由香理",
};

int     PASCAL      WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
int                 SetInitialData(HWND hlist);

//★ Windows Main 関数
int PASCAL  WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,int nCmdShow)
{   HWND        hWnd;
    MSG         msg;

    // Set up and register window class
    WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInstance,
                    NULL, NULL, (HBRUSH)GetStockObject(WHITE_BRUSH),
                    NULL, NAME };

    if (RegisterClass(&wc)==0)    return FALSE;
    // Create a window
    hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
            NULL,NULL,hInstance,NULL);
    if (!hWnd)  return FALSE;

    g_hInst= hInstance;
    ShowWindow(hWnd,nCmdShow);      //Window を表示
    UpdateWindow(hWnd);             //表示を初期化
    SetFocus(hWnd);                 //フォーカスを設定
    while (GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

//★ Call Back Procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{   RECT    rc;

    switch(msg)
    {   case WM_CREATE:
            GetClientRect(hWnd, &rc);
            hList = CreateWindow("LISTBOX", NULL,
                    WS_CHILD | WS_VISIBLE | WS_VSCROLL,
                    0, 0, rc.right, rc.bottom,
                    hWnd, NULL, g_hInst, NULL);
            SetInitialData(hList);
            break;
        case WM_SIZE:
            GetClientRect(hWnd, &rc);
            MoveWindow(hList,rc.left,rc.top,rc.right,rc.bottom,TRUE);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return(DefWindowProc(hWnd,msg,wp,lp));
    }
    return 0L;
}

//★ List Box を初期化する
int SetInitialData(HWND hlist)
{   int     i;

    for(i=0; i<30; i++)
        SendMessage(hlist,LB_INSERTSTRING,(WPARAM)i,(LPARAM)ListStr[i]);
    SendMessage(hlist,LB_SETCURSEL,i-1,0L);
    return i;
}

超初心者のプログラム入門(Win32API C++)