by イグトランス » 2005年7月30日(土) 17:04
なんとか表示させるところまでは漕ぎつけたましたが、それを終了させたらなぜかアプリケーション自体が終了してしまう……。
ダイアログアプリケーションならそれでも気になりませんが。
(ウィンドウMainWndにボタンを1つ置き、それを押すとダイアログDlgをDialogBoxIndirectParamで作成するという具合。ダイアログボックスにウィンドウクラスを指定したのがまずかったのかと考えてみたり)
コード: 全て選択
'dlg.sbp
Const DLGCLASS = "DlgTest"
Function InitDialog(hInstance As HINSTANCE, pszClassName As BytePtr) As Long
Dim wcx As WNDCLASSEX
With wcx
.cbSize = Len(wcx)
.style = CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
.lpfnWndProc = AddressOf(DlgProc)
.cbWndExtra = DLGWINDOWEXTRA
.hInstance = hInstance
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hbrBackground = h3DFaceBrush
.lpszClassName = pszClassName
End With
RegisterClassEx(wcx)
End Function
Function DialogBoxEx(hInstance As HINSTANCE, pszClassName As BytePtr) As Long
Dim cchClassNameA As Long, cchClassNameW As Long
cchClassNameA = lstrlen(pszClassName)
cchClassNameW = MultiByteToWideChar(CP_ACP, 0, pszClassName, cchClassNameA, NULL, 0)
Dim pDialog As *DLGTEMPLATEEX
pDialog = calloc(SizeOf(DLGTEMPLATEEX) + SizeOf(WCHAR) * (2 + cchClassNameW))
With pDialog[0]
.dlgVer = 1
.signature = &hffff
.helpID = 0
.exStyle = WS_EX_DLGMODALFRAME Or WS_EX_WINDOWEDGE Or WS_EX_CONTROLPARENT
.style = WS_POPUPWINDOW Or WS_VISIBLE Or WS_CLIPSIBLINGS Or DS_MODALFRAME Or WS_CAPTION
.x = 20
.y = 20
.cx = 180
.cy = 120
End With
Dim pDlgClassName As *WCHAR
pDlgClassName = VarPtr(pDialog[1]) + SizeOf (WCHAR)
MultiByteToWideChar(CP_ACP, 0, pszClassName, cchClassNameA, pDlgClassName, cchClassNameW)
DialogBoxIndirectParamEx(hInstance, pDialog, NULL, NULL, 0)'AddressOf(DlgProc), 0)
free(pDialog)
End Function
Const DLGWINDOWEXTRA = 30
TypeDef WPARAM = DWord
TypeDef LPARAM = Long
TypeDef LRESULT = LPARAM
TypeDef INT_PTR = Long
TypeDef DLGPROC = VoidPtr
Declare Function DialogBoxIndirectParamEx Lib "user32" Alias "DialogBoxIndirectParamA" (
ByVal hInstance As HINSTANCE,
ByVal DialogTemplate As *DLGTEMPLATEEX,
ByVal hwndParent As HWND,
ByVal pDialogFunc As DLGPROC,
ByVal InitParam As LPARAM) As Long
Declare Function EndDialogAPI Lib "user32" Alias "EndDialog" (hwndDlg As HWND, nRet As Long) As Long
Type DLGTEMPLATEEX
dlgVer As Word
signature As Word
helpID As DWord
exStyle As DWord
style As DWord
cDlgItems As Word
x As Integer
y As Integer
cx As Integer
cy As Integer
End Type
Function DlgProc(hwnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
If dwMsg = WM_CREATE Then
SetWindowText(hwnd, "タイトル")
SendMessage(hwnd, WM_INITDIALOG, 0, 0)
DlgProc = 0
Else
' イベントプロシージャの呼び出しを行います。
DlgProc = EventCall_Dlg(hwnd, dwMsg, wParam, lParam)
End If
End Function
Sub Dlg_QueryClose(ByRef cancel As Integer)
EndDialogAPI(hwndDlg, 0)
End Sub
コード: 全て選択
'MainWnd.sbp
Sub MainWnd_CommandButton1_Click()
DialogBoxEx(GetWindowLong(hMainWnd, GWL_HINSTANCE), DLGCLASS)
End Sub
Sub MainWnd_Create(ByRef cs As CREATESTRUCT)
InitDialog(cs.hInstance, DLGCLASS)
End Sub
なんとか表示させるところまでは漕ぎつけたましたが、それを終了させたらなぜかアプリケーション自体が終了してしまう……。
ダイアログアプリケーションならそれでも気になりませんが。
(ウィンドウMainWndにボタンを1つ置き、それを押すとダイアログDlgをDialogBoxIndirectParamで作成するという具合。ダイアログボックスにウィンドウクラスを指定したのがまずかったのかと考えてみたり)
[code]'dlg.sbp
Const DLGCLASS = "DlgTest"
Function InitDialog(hInstance As HINSTANCE, pszClassName As BytePtr) As Long
Dim wcx As WNDCLASSEX
With wcx
.cbSize = Len(wcx)
.style = CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
.lpfnWndProc = AddressOf(DlgProc)
.cbWndExtra = DLGWINDOWEXTRA
.hInstance = hInstance
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hbrBackground = h3DFaceBrush
.lpszClassName = pszClassName
End With
RegisterClassEx(wcx)
End Function
Function DialogBoxEx(hInstance As HINSTANCE, pszClassName As BytePtr) As Long
Dim cchClassNameA As Long, cchClassNameW As Long
cchClassNameA = lstrlen(pszClassName)
cchClassNameW = MultiByteToWideChar(CP_ACP, 0, pszClassName, cchClassNameA, NULL, 0)
Dim pDialog As *DLGTEMPLATEEX
pDialog = calloc(SizeOf(DLGTEMPLATEEX) + SizeOf(WCHAR) * (2 + cchClassNameW))
With pDialog[0]
.dlgVer = 1
.signature = &hffff
.helpID = 0
.exStyle = WS_EX_DLGMODALFRAME Or WS_EX_WINDOWEDGE Or WS_EX_CONTROLPARENT
.style = WS_POPUPWINDOW Or WS_VISIBLE Or WS_CLIPSIBLINGS Or DS_MODALFRAME Or WS_CAPTION
.x = 20
.y = 20
.cx = 180
.cy = 120
End With
Dim pDlgClassName As *WCHAR
pDlgClassName = VarPtr(pDialog[1]) + SizeOf (WCHAR)
MultiByteToWideChar(CP_ACP, 0, pszClassName, cchClassNameA, pDlgClassName, cchClassNameW)
DialogBoxIndirectParamEx(hInstance, pDialog, NULL, NULL, 0)'AddressOf(DlgProc), 0)
free(pDialog)
End Function
Const DLGWINDOWEXTRA = 30
TypeDef WPARAM = DWord
TypeDef LPARAM = Long
TypeDef LRESULT = LPARAM
TypeDef INT_PTR = Long
TypeDef DLGPROC = VoidPtr
Declare Function DialogBoxIndirectParamEx Lib "user32" Alias "DialogBoxIndirectParamA" (
ByVal hInstance As HINSTANCE,
ByVal DialogTemplate As *DLGTEMPLATEEX,
ByVal hwndParent As HWND,
ByVal pDialogFunc As DLGPROC,
ByVal InitParam As LPARAM) As Long
Declare Function EndDialogAPI Lib "user32" Alias "EndDialog" (hwndDlg As HWND, nRet As Long) As Long
Type DLGTEMPLATEEX
dlgVer As Word
signature As Word
helpID As DWord
exStyle As DWord
style As DWord
cDlgItems As Word
x As Integer
y As Integer
cx As Integer
cy As Integer
End Type
Function DlgProc(hwnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
If dwMsg = WM_CREATE Then
SetWindowText(hwnd, "タイトル")
SendMessage(hwnd, WM_INITDIALOG, 0, 0)
DlgProc = 0
Else
' イベントプロシージャの呼び出しを行います。
DlgProc = EventCall_Dlg(hwnd, dwMsg, wParam, lParam)
End If
End Function
Sub Dlg_QueryClose(ByRef cancel As Integer)
EndDialogAPI(hwndDlg, 0)
End Sub[/code]
[code]'MainWnd.sbp
Sub MainWnd_CommandButton1_Click()
DialogBoxEx(GetWindowLong(hMainWnd, GWL_HINSTANCE), DLGCLASS)
End Sub
Sub MainWnd_Create(ByRef cs As CREATESTRUCT)
InitDialog(cs.hInstance, DLGCLASS)
End Sub[/code]