<Previous> <Next> <SDK Top> <Top>
4章.1節.コンボボックスを作ってみよう
コンボボックスをツールバー上に作ってみましょう.
コンボボックスってのは,右端に▼がついてて,下にグイーンってウィンドウが伸びるやつですね.
まず,そのコンボボックスのIDを決めてやりましょう.
(IDの作り方を知らない方は,「別章.2節.ストリングテーブルを編集してみよう」を先に読んでください.)
| ID | キャプション |
| IDC_COMBO | コンボボックス |
今回のポイントは,
@コンボボックスをツールバー上にどうやって作るか?
Aコンボボックスにどうやって文字列を挿入するか?
Bコンボボックスの初期表示状態をどうやって決めるか?
というところです.
では,プログラムを見ましょう.
#include "stdafx.h"
#include <commctrl.h>
#include "resource.h"
#pragma comment(lib, "comctl32.lib")
#define MAX_LOADSTRING 100
#define TOOL_HEIGHT (30)
// グローバル変数:
HINSTANCE hInst; // 現在のインスタンス
TCHAR szTitle[MAX_LOADSTRING]; // タイトル バー テキスト
TCHAR szWindowClass[MAX_LOADSTRING]; // タイトル バー テキスト
// このコード モジュールに含まれる関数の前宣言:
ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HWND ToolBarCreate(HWND hWnd);
HWND ComboBoxCreate(int id, HWND hParent, int nX, int nY, int nWidth, int nHeight);
void ComboBoxAddString(char *pszBuf);
void ComboBoxSetTopString(char *pszBuf);
HWND hToolBar;
HWND hCombo;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
MSG msg;
HACCEL hAccelTable;
// グローバル ストリングを初期化します
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_SAMPLE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass( hInstance );
// アプリケーションの初期化を行います:
if( !InitInstance( hInstance, nCmdShow ) )
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SAMPLE);
// メイン メッセージ ループ:
while( GetMessage(&msg, NULL, 0, 0) )
{
if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return msg.wParam;
}
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SAMPLE);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_SAMPLE;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx( &wcex );
}
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd;
hInst = hInstance; // グローバル変数にインスタンス ハンドルを保存します
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if( !hWnd )
{
return FALSE;
}
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
static char szBuf[256]="";
switch( message )
{
case WM_CREATE:
// ツールバーを作る
hToolBar = ToolBarCreate( hWnd );
// コンボボックスを作る
hCombo = ComboBoxCreate(IDC_COMBO, hToolBar, 0, 0, 100, 200);
// コンボボックスに文字列を追加する
ComboBoxAddString("test1");
ComboBoxAddString("test2");
ComboBoxAddString("test3");
// コンボボックスの初期表示文字列を決める
ComboBoxSetTopString("test2");
break;
case WM_SIZE:
MoveWindow(hToolBar, 0, 0, LOWORD(lParam), TOOL_HEIGHT, TRUE);
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
HWND ToolBarCreate(HWND hWnd)
{
HWND hTool;
InitCommonControls();
hTool = CreateWindowEx(
WS_EX_TOOLWINDOW,
TOOLBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE |
CCS_ADJUSTABLE | CCS_NORESIZE,//| TBSTYLE_FLAT*/,
0,0,0,0,
hWnd,
NULL,
hInst,
NULL);
SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
return hTool;
}
HWND ComboBoxCreate(int id, HWND hParent, int nX, int nY, int nWidth, int nHeight)
{
hCombo = CreateWindow(
"COMBOBOX", "",
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL| WS_CLIPSIBLINGS | WS_VSCROLL,
nX, nY, nWidth, nHeight, hParent, (HMENU)id, (HINSTANCE)hInst, NULL);
return hCombo;
}
void ComboBoxAddString(char *pszBuf)
{
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)pszBuf);
}
void ComboBoxSetTopString(char *pszBuf)
{
WPARAM index;
index = SendMessage(hCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)pszBuf);
SendMessage(hCombo, CB_SETCURSEL, index, 0);
}
☆プログラムの解説☆
@コンボボックスをツールバー上にどうやって作るか?
// コンボボックスを作る
hCombo = ComboBoxCreate(IDC_COMBO, hToolBar, 0, 0, 100, 200);
ComboBoxCreate関数を自作しました.この関数の引数には
コンボボックスのID(IDC_COMBO),
親(ツールバー)のハンドル(hToolBar),
コンボボックスを配置する左上の座標(0,0),
コンボボックスの幅と高さ(100, 200),(←高さは▼を押したときの長さ)
を指定しています.
その関数の中を見ると,
HWND ComboBoxCreate(int id, HWND hParent, int nX, int nY, int nWidth, int nHeight)
{
hCombo = CreateWindow(
"COMBOBOX", "",
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL| WS_CLIPSIBLINGS | WS_VSCROLL,
nX, nY, nWidth, nHeight, hParent, (HMENU)id, (HINSTANCE)hInst, NULL);
return hCombo;
}
と,CreateWindow(API)を呼んでいます.
引数の細かいところは,説明し出すと切りがないのでしません..
スタイル(CBS_??っていうの)は他にどんなものがあるかなど調べてみても良いですね.
これで,コンボボックスがツールバーにできあがりました.
コンボボックスは,CreateWindowの引数にツールバーのハンドルを与えるだけで作れるんですね!!
Aコンボボックスにどうやって文字列を挿入するか?
// コンボボックスに文字列を追加する
ComboBoxAddString("test1");
ComboBoxAddString("test2");
ComboBoxAddString("test3");
ComboBoxAddString関数を作って,コンボボックスに文字列を追加していきました.
void ComboBoxAddString(char *pszBuf)
{
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)pszBuf);
}
中では,SendMessage(API)を呼んでいるだけですね.
でも,こんな風に名前をわかりやすくしてやった方が自分のために良いですね.
SendMessageの第2引数にCB_ADDSTRINGと指定してやれば,コンボボックスに追加できることがわかりました.
Bコンボボックスの初期表示状態をどうやって決めるか?
// コンボボックスの初期表示文字列を決める
ComboBoxSetTopString("test2");
ComboBoxSetTopString関数を作って,test2という文字列をコンボボックスの先頭にくるようにしました.
その関数の中身はというと..
void ComboBoxSetTopString(char *pszBuf)
{
WPARAM index;
index = SendMessage(hCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)pszBuf);
SendMessage(hCombo, CB_SETCURSEL, index, 0);
}
この関数もまた中でSendMessageを呼んでいるようですね.
1つ目のSendMessageでは,指定した文字列のインデクスというものを取得し,
2つ目で,そのインデクスによって先頭に表示する文字列を指定しています.
このインデクスがないと,先頭に表示する文字列は決めれないみたいですね.
Menu/Top.png)
------------------------------------------------------------------------------------------------
当ページの一部または全部を転載、複写、複製することを禁じます。
また,当サイトを利用した結果に関するトラブル等は、一切関与いたしませんのでご容赦下さい。
Update 04/03/11 By 松本義弘
------------------------------------------------------------------------------------------------