8.タイトルバーなしウィンドウの作成 |
1.タイトルバーなしウィンドウの作成 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定: 参照設定方法参照 使用 API:SetWindowPos / GetWindowLong / SetWindowLong / GetSystemMetrics その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :
|
1.タイトルバーなしウィンドウの作成 |
タスクバーにアイコンとキャプションを残したままタイトルバーを 外す方法 '下記サンプルの著作権は、ゆう(U)さんにあります。 Option Explicit 'SampleNo:061 2002.05.14 @ 2007.01.19 Private Declare Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, _ ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, _ ByVal cx As Long, ByVal cy As Long, _ ByVal wFlags As Long) As Long Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" _ (ByVal hWnd As Long, _ ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" _ (ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As Long Private Sub Command2_Click() 'タイトルバーを外す Call sTitleReleace2(Form1, True) End Sub Private Sub Command3_Click() 'タイトルバーを付ける Call sTitleReleace2(Form1, False) End Sub '========================================================== 'タイトルバーを付ける・外す sTitleReleace2 ゆう(U)さん投稿分 '========================================================== ' Call sTitleReleace2(myForm, [blnMenu]) ' 引数 myForm :フォーム ' blnMenu :表示されているメニュー ' 有 True ' 無 False '---------------------------------------------------------- 'MDI親フォームは対象外です '---------------------------------------------------------- '外したタイトルバーのスタイルにウィンドウサイズを合わせる 'フォームの内部作業領域が変わらない様にサイズ修正 'タイトルバーを表示していないフォームは無処理です '---------------------------------------------------------- Private Sub sTitleReleace2(ByRef myForm As Form, _ Optional ByVal blnMenu _ As Boolean = False) Const GWL_STYLE = (-16&) Const SWP_NOSIZE = &H1& Const SWP_NOMOVE = &H2& Const SWP_NOZORDER = &H4& Const SWP_FRAMECHANGED = &H20& Const SWP_DRAWFRAME = SWP_FRAMECHANGED Const WS_CAPTION = &HC00000 Const SM_CYCAPTION = 4& 'タイトル部の高さ Const SM_CYSMCAPTION = 51& '小さいタイトル部の高さ Const SM_CXBORDER = 5& '非立体表示の枠幅 Const SM_CYBORDER = 6& '非立体表示の枠高さ Const SM_CXDLGFRAME = 7& 'タイトル付き変更不可の枠幅 Const SM_CYDLGFRAME = 8& 'タイトル付き変更不可の枠高さ Const SM_CXFRAME = 32& 'サイズ変更可の枠幅 Const SM_CYFRAME = 33& 'サイズ変更可の枠高さ Dim intBorderStyle As Integer Dim lngWidth As Long Dim lngHeight As Long Dim lngTitleHeight As Long Dim lngFrame_X As Long Dim lngFrame_Y As Long Dim lngResult As Long With myForm intBorderStyle = .BorderStyle If intBorderStyle = vbBSNone Then If blnMenu Then intBorderStyle = vbFixedSingle Else Exit Sub '枠なし End If ElseIf (.ControlBox = False) And (Len(.Caption) = 0&) Then Exit Sub '枠なし End If lngWidth = .ScaleX(.Width, vbTwips, vbPixels) lngHeight = .ScaleX(.Height, vbTwips, vbPixels) lngResult = GetWindowLong(.hWnd, GWL_STYLE) lngResult = lngResult Xor WS_CAPTION '3D枠とフラット枠(この辺の枠幅算出は若干疑問(不安)が残る) Select Case intBorderStyle Case vbFixedDialog 'タイトルのみでOK 'フラットスタイルへ Case vbFixedSingle, vbFixedToolWindow '非立体表示の枠ではなく、枠なしが採用されている lngFrame_X = GetSystemMetrics(SM_CXDLGFRAME) lngFrame_Y = GetSystemMetrics(SM_CYDLGFRAME) If (lngResult And WS_CAPTION) = WS_CAPTION Then lngWidth = lngWidth + (lngFrame_X * 2&) lngHeight = lngHeight + (lngFrame_X * 2&) Else lngWidth = lngWidth - (lngFrame_X * 2&) lngHeight = lngHeight - (lngFrame_X * 2&) End If Case vbSizable, vbSizableToolWindow '3Dスタイルのまま 'タイトルをなくすとタイトル付き変更不可の '枠が採用されているようなので・・・ lngFrame_X = (GetSystemMetrics(SM_CXFRAME) _ - GetSystemMetrics(SM_CXDLGFRAME)) lngFrame_Y = (GetSystemMetrics(SM_CYFRAME) _ - GetSystemMetrics(SM_CYDLGFRAME)) If (lngResult And WS_CAPTION) = WS_CAPTION Then lngWidth = lngWidth + (lngFrame_X * 2&) lngHeight = lngHeight + (lngFrame_Y * 2&) Else lngWidth = lngWidth - (lngFrame_X * 2&) lngHeight = lngHeight - (lngFrame_Y * 2&) End If End Select 'タイトルバーの高さ調整 Select Case intBorderStyle Case vbFixedSingle, vbSizable, vbFixedDialog lngTitleHeight = GetSystemMetrics(SM_CYCAPTION) Case vbFixedToolWindow, vbSizableToolWindow lngTitleHeight = GetSystemMetrics(SM_CYSMCAPTION) End Select If (lngResult And WS_CAPTION) = WS_CAPTION Then lngHeight = lngHeight + lngTitleHeight Else lngHeight = lngHeight - lngTitleHeight End If lngResult = SetWindowLong(.hWnd, GWL_STYLE, lngResult) lngResult = SetWindowPos(.hWnd, 0&, 0&, 0&, _ lngWidth, lngHeight, _ SWP_DRAWFRAME Or _ SWP_NOZORDER Or _ SWP_NOMOVE) End With End Sub タイトルバーなしウィンドウの作成(簡易型) Private Sub Command1_Click() 'BorderStyle を vbBSNone - 0 にすれば同様にタイトルバーは '表示されませんがこの場合3Dでは表示されません。(モアベター) 'フォームの Controlbox プロパティを False にし、Caption を "" '(なにも入力しない)に設定するだけでできます。 Form2.Show End Sub |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
指定のシステムメニューを削除する システムメニューを元に戻す 最大化・最小化ボタンをプログラムから削除する 最大化・最小化ボタンをプログラムから元に戻す メニューバーを再描画する システムメニューのハンドルを取得 ウィンドウに関する属性を変更する ウィンドウに関するデータを取得する |