|
|
||||
Tips > |
|||||
ウィンドウのスクロールバー確認(GetWindowLong) |
更新 : 2010/12/31 |
||||
|
|
||
解説: ウィンドウにスクロールバーがある時とない時で、ウィンドウ内側のエリアが異なります。 エリアサイズに応じて処理を変えるには、スクロールバーの存在をチェックしなければなりません。 ウィンドウスタイルの情報を得るには、Win32API の GetWindowLong 関数を使います。 今回は、マウス下にあるウィンドウに横スクロールバーがあるかないかを調べてみます。 マウス下のウィンドウハンドルを取得する方法(WindowFromPoint)は Tips を参照してください。 ちょっと寄り道: GetWindowLong 関数は以下のように定義されています。 LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得する値のオフセット ); hWnd には、調べたいウィンドウのハンドルを指定。 nIndex には、取得したい情報を表す定数を指定。 使用例: アプリケーションを起動して、マウスを任意のウィンドウに移動してみてください。 Label1 の Caption にスクロールバーがあれば "横スクロールバーあり" なければ "なし" と表示されます。 準備として、Label、Timer をひとつずつ適当に配置してください。 OnTimer イベントハンドラで、マウス下にあるウィンドウハンドルを WindowFromPoint で取得します。 ハンドルからウィンドウスタイルの情報を得て、横スクロールバーの存在をチェックします。 結果をメッセージ表示します。 //------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Label1->Caption = ""; POINT pos; HWND hWnd; GetCursorPos(&pos); // マウス下にあるウィンドウハンドルを取得 hWnd = WindowFromPoint(pos); // ウィンドウスタイルの情報を取得 int style = GetWindowLong(hWnd, GWL_STYLE); // 横スクロールバーがあるかどうか if ((style & WS_HSCROLL) != 0) Label1->Caption = "横スクロールバーあり"; else Label1->Caption = "なし"; } //------------------------------------------------------------------- |