- ベストアンサー
WindowsAPI(GetWindowLongA)について質問です。
- WindowsAPI(GetWindowLongA)に関して質問です。
- 以下のコードを実行すると、ウィンドウにスクロールバーが表示されてしまいます。フォームのサイズは明らかに小さいです。SetWindowLongAの引数指定が間違っているのでしょうか?また、スクロールバーを非表示にする方法はありますか?
- 質問です。WindowsAPI(GetWindowLongA)を使用していますが、ウィンドウのスクロールバーが表示されます。実行はVBAでAccessのフォームを呼び出しています。フォーム自体はディスプレイ幅よりも小さいです。SetWindowLongAの引数に誤りがあるのでしょうか?また、スクロールバーを非表示にする方法はありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
今行おうとしていることは、WindowsAPIというウィンドウズ側で用意したウィンドウズプログラムを作成するためのAPI(関数群)のライブラリから関数を呼び出す行為です。 元々WindowsAPIはC言語用に作られているため、他の言語から使用する場合は一工夫、例えば今回のVBAの場合はDeclareをする必要があるわけです。 というわけで、しっかりと学びたい場合はC言語で勉強するのが情報も多く楽です。 有名所では以下のところです。 http://homepage2.nifty.com/c_lang/index_sdk.html >&H80000や&HC00000みたいな表記の意味が理解できません。 この値自体にはたいした意味はありません。もともとこの数値はWindowsSDKの(C言語の)ヘッダで定数として定義されているものであり、この値を直に使うことはありません。 そのため、わざわざ Const WS_SYSMENU = &H80000 のように定数で定義し直しているわけです。 >閉じるボタンや最小最大化ボタンが表示されてしまいます。 >各種ボタンを消す為に上記を書いていた それなら SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngRetVal - WS_SYSMENU) は必要です。 詳細は省きますが、上記でやろうとしていることは、ウィンドウを作る際に指定されたスタイルから、ウィンドウシステムボックス(閉じるや最大化などのボタン)を取り除く作業です。 >Const SB_BOTH = 3& >lngRetVal = ShowScrollBar(hWndAccessApp, SB_BOTH, False) >としてもスクロールバーは消えませんでした。 そうですか…。 ですと、WS_VSCROLLとWS_HSCROLLで消す方が正しいのかな。 上の(WS_SYSTEM)とあわせて、 Const WS_VSCROLL = &H00200000 Const WS_HSCROLL = &H00100000 SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngRetVal - WS_SYSMENU - WS_VSCROLL - WS_HSCROLL) とするのが正攻法かと思います。 それと、一応確認ですが、ShowScrollBarのDeclareはしましたか? >lngNewStyle = lngRetVal And Not WS_CAPTION WS_CAPTIONでもスクロールバーが消えるのですね。 #WS_BORDERがないとスクロールバーは表示されないのかな…ちょっと試してみないと分からないですね ただ、この場合タイトルバーやウィンドウの枠線が表示されなくなるような気がしますが、どうでしょう。まぁ支障がなければ別にいいのですが。
その他の回答 (2)
- LOHA
- ベストアンサー率52% (203/388)
連続ですいません。 なんかMSDNのリンク部分でコピペをミスしたようなので訂正します。 SetWindowLongPtr http://msdn.microsoft.com/ja-jp/library/cc411204.aspx
- LOHA
- ベストアンサー率52% (203/388)
WS_SYSMENUは http://yokohama.cool.ne.jp/chokuto/urawaza/prm/window_style.html を参考にすると、ウィンドウシステムボックス(閉じるや最大化などのボタン?)を表示するかどうかのフラグなので、スクロールバーとかとは関係ないです。 WS_VSCROLL、WS_HSCROLLか、ShowScrollBar関数あたりを使うことになるのではないかと思います(多分)。 http://www.activebasic.com/help_center/Pages/API/Window/ScrollBar/ShowScrollBar.htm VBAでのWin32APIはよく分かりませんが、一応msdn(http://bekkoame.okwave.jp/kotaeru_reply.php3?q=5763384)を見る限り、SetWindowLongPtrで変更しても、SetWindowPosを呼び出すまではその変更が反映されないようなので、そっちも注意が必要かもしれません。 以上参考までに。
お礼
アドバイスありがとうございます。 lngRetVal = SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngRetVal - WS_SYSMENU) をコメントアウトして試した結果、スクロールバーは消えましたが、 閉じるボタンや最小最大化ボタンが表示されてしまいます。 各種ボタンを消す為に上記を書いていたのですが、第3引数の lngRetVal - WS_SYSMENU の設定がおかしいのでしょうか? ちなみに Const SB_BOTH = 3& lngRetVal = ShowScrollBar(hWndAccessApp, SB_BOTH, False) としてもスクロールバーは消えませんでした。 何か良い方法はないでしょうか?
補足
解決できました。しかし、他サイトのコードの為、理解できていません。(T T) Dim lngRetVal As Long Dim lngNewStyle As Long Const WS_SYSMENU = &H80000 Const WS_CAPTION = &HC00000 '開いているWindowsスタイルを取得します。 lngRetVal = GetClassLongPtr(hWndAccessApp, GWL_STYLE) lngNewStyle = lngRetVal And Not WS_CAPTION '全てのボタンを無効にします。 lngRetVal = SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngNewStyle) こうするとスクロールバーは表示されなくなりました。 しかし、上記 &H80000や&HC00000みたいな表記の意味が理解できません。 また、 lngNewStyle = lngRetVal And Not WS_CAPTION のlngNewStyle がなぜlong型なのかも解りません。 何分素人ですので、初心者レベルでのアドバイスよろしくお願いいたします。m(_ _)m 参考ページ等もありましたら、教えてください。
お礼
非常に丁寧な回答ありがとうございます。 リンク先ページを参考に勉強したいと思います。 >それと、一応確認ですが、ShowScrollBarのDeclareはしましたか? はしています。 >ただ、この場合タイトルバーやウィンドウの枠線が表示されなくなるような気がしますが、どうでしょう。 は消すつもりで調べた結果こうなりました。 画面が小さいノートでAccessDBに入力する最の画面領域を出来るだけ大きくしたいと言うのが当初の目的でした。 タイトルバーやウィンドウ枠線は消えたのに、スクロールバーが出ては領域があまり変わらなくって困っていました。 APIについてリンク先を参考にもっと学習いたします。 ありがとうございました。