VC++の使い方

VC++の使い方 > リファレンス > GUIリファレンス > スタティックコントロール
このページの内容
スタティックコントロールとは
作成方法
ウインドウスタイル
使い方 - 文字列編 -
使い方 - アイコン・ビットマップ編 -
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

スタティックコントロールとは

スタティックコントロールは、次のような用途に使います。

作成方法

CreateWindow で作成する方法

CreateWindow( 
    "static",                           // スタティックコントロールのクラス名
    "text is here.",                    // 表示する文字列
    SS_SIMPLE | WS_CHILD | WS_VISIBLE,  // 詳細はあとで。
    x, y,                               // 左上の座標
    iWidth, iHeight,                    // 幅と高さ
    hParent,                            // 親ウインドウのウインドウハンドル
    NULL,                               // メニューハンドル。NULLでよい。
    hInstance,                          // アプリケーションのインスタンスハンドル。
    NULL                                // ウインドウ作成データ。NULLでよい
) ;

ダイアログエディタで作成する場合には、丸をつけている 『ピクチャー』 と 『スタティックテキスト』 がスタティックコントロールにあたります。

staticコントロールはこれ
staticコントロールはこれ

コントロールバーが表示されていない場合は、VC++ のメニューの上で右クリックして、『コントロール』 をチェックすれば出てきます。

ウインドウハンドルを取得するには、hwnd = GetDlgItem( hDlg, IDC_STATIC) ;といった感じできます。

ウインドウスタイル

スタイル 意味
SS_LEFT テキストを左揃えで表示する。リソースエディタでは、スタイルタブのテキストの配置。
SS_CENTER テキストを中央に表示する。行末を超える場合は自動的に折り返す。リソースエディタでは、スタイルタブのテキストの配置。
SS_RIGHT テキストを右揃えで表示する。行末を超える場合は自動的に折り返す。リソースエディタでは、スタイルタブのテキストの配置。SS_LEFTNOWORDWRAP指定されると、左揃えの自動折り返しがなしのテキストになる。タブは展開される。リソースエディタでは、スタイルタブのワードラップなし。

詳細は、『MSDNのプラットフォームSDK → Platform SDK → User Interface Services → Controls → Static Controls → Static Control Reference → Static Control Styles』 にあります。

.NET版 MSDNでは、『ユーザーインターフェースデザインおよび開発 → User Interface Design and Development → Windows User Interface → SDK Documentation → Windows User Interface → Controls → Static Controls → Static Control Reference → Static Control Styles』 です。

見つからない場合は、検索で 『SS_CENTER』 などをキーワードに調べてみてください。

使い方 - 文字列編 -

文字列を変更する // 戻り値は成功したかどうか。

BOOL SetWindowText( HWND hwnd, LPCSTR lpString) ;

// コントロールがダイアログ内にあって、いちいち
// ウインドウハンドルを取得するのが面倒な場合は、次の関数が便利
// nIDDlgItem には コントロールID を指定。
BOOL SetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString) ;

文字列の長さを取得する

// ウインドウハンドルが分かっていないと、文字列の長さは取得できない。
// 戻り値が長さを表わす。
int GetWindowTextLength( HWND hwnd) ;

文字列を取得する

// nMaxCount でバッファに格納できる最大文字数を指定
BOOL GetWindowText( HWND hwnd, LPSTR lpString, int nMaxCount) ;

// コントロールがダイアログ内にあって、いちいち
// ウインドウハンドルを取得するのが面倒な場合は、次の関数が便利
// nIDDlgItem には コントロールID を指定。
BOOL GetDlgItemText( HWND hDlg, int nIDDlgItem, LPCTSTR lpString, int nMaxCount) ;

クリックされたのを通知して欲しい

ウインドウスタイルに SS_NOTIFY を加えてください。リソースエディタの場合は、スタイルタブの 『通知』 をチェックしてください。これで、親ウインドウのプロシージャに、WM_COMMAND が通知されます。コントロールIDは LOWORD(wParam) で、通知コードの種類は HIWORD(wParam) に取得できます。種類は、STN_CLICKED と STN_DBLCLK の2つしかありません。

WM_COMMAND メッセージで親ウインドウに通知がきます。WM_COMMAND の wParam, lParam の値は、次の通りである。

パラメータ 説明
HIWORD(wParam) 通知コード
LOWORD(wParam) コントロールID
lParam 子ウインドウのハンドル

通知コードには以下のようなものがある。

STN_CLICKED クリックされた
STN_DBLCLK ダブルクリックされた
STN_ENABLE 有効になったとき
STN_DISABLE 無効になったとき

通知コード説明STN_CLICKEDクリックされたSTN_DBLCLKダブルクリックされた 次のようにして使うとよいでしょう。

case WM_COMMAND:
	if(LOWORD(wParam) == IDC_STATIC1)
	{
		switch(HIWORD(wParam))
		{
			case STN_CLICKED:
				// クリックされたときの処理
				break ;

			case STN_DBLCLK:
				// ダブルクリックされたときの処理
				break ;
		}
	}
	else if(LOWORD(wParam) == IDC_STATIC2)
	// ...

文字の色や背景色を変更したい

親ウインドウのプロシージャで、WM_CTLCOLORSTATICを処理すればいいでしょう。詳しくはstatic1.lzhをダウンロードしてご覧下さい。

色を変更した例
色を変更した例

case WM_CTLCOLORSTATIC:
{
	HDC hdc = (HDC)wParam ;
	if( GetDlgItem( hDlg, IDC_STATIC1) == (HWND)lParam)
	{
		// 赤色
		SetTextColor( hdc, RGB( 255, 128, 128)) ;
		SetBkColor( hdc, RGB( 128, 0, 0)) ;
		return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ;
	}
	else if( GetDlgItem( hDlg, IDC_STATIC2) == (HWND)lParam)
	{
		// 青色
		SetTextColor( hdc, RGB( 128, 128, 255)) ;
		SetBkColor( hdc, RGB( 0, 0, 128)) ;
		return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ;
	}

	return FALSE ;
}

ウインドウ全体の背景色を変更する場合は

hBrush = CreateSolidBrush(hdc, RGB(128, 128, 255));
return (BOOL)hBrush;

などとすればよいでしょう。ただし、ブラシは自動的に削除されないので、注意してください。

使い方 - アイコン・ビットマップ編 -

アイコンを表示

STM_SETICON メッセージをスタティックコントロールに投げればよいです。次のサンプルは、プログラムで動的にスタティックコントロールを作成し、アイコンを表示する方法です。

static HICON hicon ;
switch( uiMsg)
{
case WM_INITDIALOG:
	hicon = LoadIcon( NULL, IDI_EXCLAMATION) ;
	if( hicon)
	{
		HWND hwndIcon = CreateWindow( 
			"static", "hogehoge", SS_ICON | WS_CHILD | WS_VISIBLE, 
			0, 0, 16, 16, hDlg, NULL, ghInst, NULL) ;
		if( hwndIcon)
		{
			SendMessage( hwndIcon, STM_SETICON, (WPARAM)hicon, NULL) ;
		}
	}
	return TRUE ;

case WM_COMMAND:
	EndDialog( hDlg, TRUE) ;
	DestroyIcon( hicon) ;
	return TRUE ;

default:
	return FALSE ;
}

アイコンを取得

次のようにして、アイコンのハンドルを取得できる。失敗したときは、NULL が返ってくる。

HICON hicon = (HICON)SendMessage( hwndIcon, STM_GETICON, 0, 0) ;

ビットマップを設定

外部ファイルを読み取るには次のようにすればよい。

HBITMAP hBitmap = (HBITMAP)LoadImage(0, pszPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(hBitmap == NULL)
{
	return FALSE;
}

SendMessage(hwndStatic, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);

ただし、LoadBitmap で利用したビットマップを使わなくなった場合は、DeleteObject 関数で廃棄する必要がある。表示している最中に DeleteObject してしまうと、Bitmap が表示されなくなってしまうので、親ウインドウを閉じる直前に DeleteObject しなければならない。

なお、ビットマップのサイズを取得するには次のようにすればよい。

BITMAP bmp ;
if(GetObject(hBitmap, sizeof(bmp), &bmp) == 0)
{
	return FALSE;
}

BITMAP 構造体の要素は次のようになっている。

typedef struct tagBITMAP {
  LONG   bmType; 
  LONG   bmWidth; 
  LONG   bmHeight; 
  LONG   bmWidthBytes; 
  WORD   bmPlanes; 
  WORD   bmBitsPixel; 
  LPVOID bmBits; 
} BITMAP, *PBITMAP;