カレンダーを作成しているのですが...

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
エイチ
記事: 8
登録日時: 2005年10月16日(日) 22:57
お住まい: 神奈川県厚木市

すごい恥ずかしいのですが

#16 投稿記事 by エイチ »

毎日すみません。どうしても期待どうりに動かないのでソースを見ていただけないでしょうか?多分、基本的なところで間違っているんだと思います。

Type MWP 'ウィンドウを作るための構造体宣言
dwExStyle As DWord
lpClassName As BytePtr
lpWindowName As BytePtr
dwStyle As DWord
x As Long
y As Long
nWidth As Long
nHeight As Long
hMenu As HMENU
hInstance As HINSTANCE
lpParm As VoidPtr
End Type

'変数宣言
Dim year As integer
year = 2005
Make_Window()
end

/*-------------------------------------------------------------------------------------------------*/
/*------------------------------------------以下、ウィンドウの作成---------------------------------*/
/*-------------------------------------------------------------------------------------------------*/
Function Make_Window()
Declare Function SetDlgItemInt Lib "User32" (
hDlg As HWND,
nIDDlgItem As long,
uValue As DWord,
bSigned As Long) As Long

Dim lpWcx As WNDCLASSEX
Dim hBrush As HBRUSH

Dim calender As HWND 'カレンダー表示のメインウィンドウ
Dim w_num[50] As HWND 'カレンダー表示のチャイルドウィンドウ
Dim mwp[50] As MWP 'カレンダー表示のための引数構造体

'作成ウィンドウのサイズ定数
Const CalenderWindow_Width = 440 'カレンダー表示ウィンドウの横幅
Const CalenderWindow_Height = 390 'カレンダー表示ウィンドウの高さ

Const Height = 20 '高さ
Const Yohaku = 20 '余白
Const ButtonLength = 75 'ボタンの長さ
Const EditBoxLength = 50 'エディットボックスの長さ

Const FirstRetsu_X = Yohaku '1列目のウィンドウのX座標

Const FirstGyo_Y = 20 '1行目のウィンドウのY座標

/*-------------------------------------------------------------------*/
/*------カレンダー表示のための引数構造体に代入-----------------------*/
/*-------------------------------------------------------------------*/
mwp[0].dwExStyle = NULL '以下、一月前表示ボタン作成のための引数データです
mwp[0].lpClassName = "BUTTON"
mwp[0].lpWindowName = "<"
mwp[0].dwStyle = WS_CHILD or WS_VISIBLE
mwp[0].x = FirstRetsu_X
mwp[0].y = FirstGyo_Y
mwp[0].nWidth = ButtonLength
mwp[0].nHeight = Height
mwp[0].hMenu = 0
mwp[0].hInstance = GetModuleHandle(0)
mwp[0].lpParm = NULL

mwp[1].dwExStyle = NULL '以下、年の表示エディットボックス作成のための引数データです
mwp[1].lpClassName = "EDIT"
mwp[1].lpWindowName = SetDlgItemInt(w_num[1],mwp[1].lpWindowName,2005,TRUE)
mwp[1].dwStyle = WS_CHILD or WS_VISIBLE or SS_CENTER
mwp[1].x = FirstRetsu_X + ButtonLength + Yohaku
mwp[1].y = FirstGyo_Y
mwp[1].nWidth = EditBoxLength
mwp[1].nHeight = Height
mwp[1].hMenu = NULL
mwp[1].hInstance = GetModuleHandle(0)
mwp[1].lpParm = NULL

Dim lpMsg As MSG

Dim i As Integer 'カウンター変数

' ブラシの作成
hBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE))

' 変数lpWcxの初期化
FillMemory(VarPtr(lpWcx), Len(lpWcx), 0)

' クラスデータの設定
With lpWcx
.lpszClassName = "NORMAL"
.lpfnWndProc = AddressOf(MainWndProc)

.hIcon = LoadIcon(NULL,IDI_APPLICATION)
.hIconSm = LoadIcon(NULL,IDI_WINLOGO)
.hCursor = LoadCursor(NULL,IDC_ARROW)

.cbSize = SizeOf(WNDCLASSEX)
.style = CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW
.hInstance = GetModuleHandle(0)
.hbrBackground = hBrush
End With

' ウィンドウクラスの登録
RegisterClassEx(lpWcx)

' メインウィンドウの作成
calender =_
CreateWindowEx(
NULL, '以下、メインウィンドウの作成のための引数データです
"NORMAL",
"ToDo" ,
WS_OVERLAPPEDWINDOW or WS_VISIBLE ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CalenderWindow_Width ,
CalenderWindow_Height ,
NULL ,
NULL ,
GetModuleHandle(0),
NULL
)

'チャイルドウィンドウの作成
for i = 0 to 1
w_num =_
CreateWindowEx(
mwp.dwExStyle ,
mwp.lpClassName ,
mwp.lpWindowName ,
mwp.dwStyle ,
mwp.x ,
mwp.y ,
mwp.nWidth ,
mwp.nHeight ,
calender,
mwp.hMenu ,
mwp[i].hInstance ,
mwp[i].lpParm
)
Next

' メッセージループ
While GetMessage(lpMsg, 0, 0, 0) > 0
TranslateMessage(lpMsg)
DispatchMessage(lpMsg)
Wend

' 終了
DeleteObject(hBrush)
End Function

' コールバック関数
Function MainWndProc(hWnd As HWND, wMsg As DWord, wParam As DWord, lParam As DWord) As Long
Select Case wMsg
Case WM_CLOSE
DestroyWindow(hWnd)
Case WM_DESTROY
PostQuitMessage(0)
Case Else
MainWndProc = DefWindowProc(hWnd, wMsg, wParam, lParam)
Exit Function
End Select
MainWndProc = 0
End Function
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#17 投稿記事 by イグトランス »

SetDlgItemIntはウィンドウが作成された後でないと使えません。
その他HWNDを引数にとる関数は全てそうです。

また子ウィンドウを作るときにはHMENU引数には子ウィンドウを識別するためのID(整数値)を指定します。
このIDこそSetDlgItemInt/Textなどの第2引数に渡します。

あと、MWP構造体を作らずとも、多少メンバ名は違いますがCREATESTRUCT構造体が使えると思います。
ヘルプにはありませんのでメンバ補完で見てください。
全てCreateWindowExの引数と対応しています。
エイチ
記事: 8
登録日時: 2005年10月16日(日) 22:57
お住まい: 神奈川県厚木市

#18 投稿記事 by エイチ »

 イグトランス様、ありがとうございます。
 ずうずうしいですが、重ねてお聞きします。もしこのソースを生かすとして、mwp[1].lpWindowName には、どのように代入すればいいのでしょうか?先日来この掲示板にて質問させていただいていたのはまさにここなのですが。あと、mwp[1].hMenu には、w_num[1]を代入すればいいのですか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#19 投稿記事 by イグトランス »

後でSetDlgItemIntを使って設定するので,mwp[1].lpWindowName = ""としておけばいいです。
IDを入れるmwp[1].hMenuはHWNDとは関係なく適当な値を使えばいいのです。
(Constを使って名前を付けておけばいいです)

ところでSetDlgItemIntの最初の引数は親となるcalenderです。
エイチ
記事: 8
登録日時: 2005年10月16日(日) 22:57
お住まい: 神奈川県厚木市

返信遅くなり申し訳ありませんでした。

#20 投稿記事 by エイチ »

なるほど。どうもありがとうございました。早速やってみたいと思います。
返信する