このページの内容 |
---|
スタティックコントロールとは |
作成方法 |
ウインドウスタイル |
使い方 - 文字列編 - |
使い方 - アイコン・ビットマップ編 - |
ありがたいスポンサー様 |
---|
スタティックコントロールは、次のような用途に使います。
CreateWindow( "static", // スタティックコントロールのクラス名 "text is here.", // 表示する文字列 SS_SIMPLE | WS_CHILD | WS_VISIBLE, // 詳細はあとで。 x, y, // 左上の座標 iWidth, iHeight, // 幅と高さ hParent, // 親ウインドウのウインドウハンドル NULL, // メニューハンドル。NULLでよい。 hInstance, // アプリケーションのインスタンスハンドル。 NULL // ウインドウ作成データ。NULLでよい ) ;
ダイアログエディタで作成する場合には、丸をつけている 『ピクチャー』 と 『スタティックテキスト』 がスタティックコントロールにあたります。
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;