困っています。

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
ぼん

困っています。

#1 投稿記事 by ぼん »

はじめまして。Activebasicでプログラミングでデジタル時計を作りたいです。
初心者なのでどうしたらいいのか全くわかりません。教えてください。
できればプログラムを見せていただけるといいです。
使っているのは最新のABです。OSは2000です。
ご教示よろしくお願いします。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市

#2 投稿記事 by konisi »

#ソースを打ち込んでコンパイルし、実行するくらいは出来るという前提で話を進めます。
#これが分からない場合はその事を明記して、もう一度質問してくださいな。

どんなデジタル時計が作りたいんですか?

簡単な描画なら#N88BASICと1行目に書けば、Line、Circle、Print、Cls、PSet等で行えます。

コード: 全て選択

#N88BASIC
Do                'DoからLoopの間に書かれた事は何度でも繰り返し実行されます。
    Sleep(10)     '少しの時間が経過する間待つ。単位は0.001秒(1ミリ秒)。つまり10だと0.01秒。
    Locate 0,0    '書き出す位置を調整
    Print Time$() '現在時刻を表示
Loop
Lineでは線や四角形、Circleでは円や扇形、PSetでは点が書けます。
そしてClsでは画面の消去が出来ます。
ヘルプを見つつやってみてください。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ぼん

#3 投稿記事 by ぼん »

konisiさん、ありがとうございます。
ええと僕がつくりたいのはそういうんじゃなくタイトルバー(?)が無くて
数字は0~10の画像を貼りたいんです。
右クリックで時間になったらアラームとかの設定ができたりするのがいいです。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市

#4 投稿記事 by konisi »

ノーマルウインドウベースのプロジェクトを作成し、スタイルを枠なしにする事で
タイトルバーはなくなります。

画像の読み込みと描画はLoadImage関数、GetDC関数、BitBlt関数等を使うことで行えます。ヘルプと過去ログを読んできてください。

右クリック時にメニューを出すには、右クリックされたことを検出して、TrackPopupMenu関数を使ってポップアップメニューを表示するという手法が使えるようです。

#画像が11枚ある件について突っ込むべきか・・・
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ぼん

#5 投稿記事 by ぼん »

スタイルを枠なしにしたのですが、タイトルb-が出てきます。
しかも右上のばってんとかが消えてしまい閉じれないウインドウになってしまします。
いったい何がいけないいのでしょうか。

画像の11枚は:を打つためです。

プログラム書いたので添削して下さい。

コード: 全て選択

'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const BMPSIZE=32

'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	digiclk_DestroyObjects()
	PostQuitMessage(0)
End Sub

Sub MainWnd_LButtonDblClick(flags As Long, x As Integer, y As Integer)
	End
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	SetTimer(hMainWnd,0,200,NULL)
	SetWindowPos(hMainWnd,NULL,0,0,BMPSIZE*8,BMPSIZE,SWP_NOMOVE)
End Sub

Sub MainWnd_Paint(hDC As HDC)
	Dim bmp1 As HBITMAP,dc1 As HDC
	Dim ti[100] As Byte,i As Long
	lstrcpy(ti,Time$())
	bmp1=LoadImage(GetWindowLong(hMainWnd,GWL_HINSTANCE),IDB_BITMAP1,IMAGE_BITMAP,BMPSIZE*11,BMPSIZE,LR_DEFAULTCOLOR)
	dc1=CreateCompatibleDC(hDC)
	SelectObject(dc1,bmp1)
	Do
	ti-=Asc("0")
	If ti>9 Then ti=10
	BitBlt(hDC,i*BMPSIZE,0,BMPSIZE,BMPSIZE,dc1,ti*BMPSIZE,0,SRCCOPY)
	i++
	Loop While ti
	DeleteDC(dc1):DeleteObject(bmp1)
End Sub

Sub MainWnd_Timer(TimerID As DWord)
	InvalidateRgn(hMainWnd,NULL,TRUE)
End Sub
名無し

#6 投稿記事 by 名無し »

>スタイルを枠なしにしたのですが、タイトルb-が出てきます。
>しかも右上のばってんとかが消えてしまい閉じれないウインドウになってしまします。

なんか矛盾を感じてならないのですが、
もしかして下のスタートバーに出てくる文字をタイトルバーと呼んでいるのでしょうか…
タイトルバーと言われると、ウインドウの上部を思い浮かべるのですが…

ウインドウ上部を消し去りたいのにばってんなしの半端な状態で残ってしまうんです、という状況だったらすみません。

スタートバーに出てくる文字列を出ないようにするためにだとすれば、自分はウインドウの拡張スタイルで「ツールウインドウ」とやらを設定したことがあります。
ただしこれだと、枠ありの場合は枠の形が変わってしまいますが…。

あと、konisiさんの書かれている、「右クリック時にメニューを出す」というのが枠なしの場合に終了させる方法でよくあるものですので頭の片隅にでもどうぞ。

しかしプログラムを作ってみた場合、最新のABっていうのがver4の最新かver5βの最新かでも違ってくるんでしょうかね…?
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市

#7 投稿記事 by konisi »

まず、

コード: 全て選択

lstrcpy(ti,Time$())
は上手く動く保証が無いので

コード: 全て選択

Dim time$ As String
time$=Time$()
lstrcpy(ti,StrPtr(time$))
にするべきです。
#実際にはAB4ではStringが指す先は少なくとも8バイト以上の構造体になっていて(よく調べてない)、先頭4バイトが文字列を指すポインタになっているので上手く動いてしまうんですが。
この場合だと、次の方が適切かもしれません。

コード: 全て選択

Dim ti As *Byte
Dim time$ As String
time$=Time$()
ti=StrPtr(time$)
#×ボタンが無くてもAlt+F4で閉じれますよ。

添削してみた。

コード: 全て選択

'-----------------------------------------------------------------------------
'イベントプロシージャ
'-----------------------------------------------------------------------------
'このファイルには、ウィンドウ[MainWnd]に関するイベントをコーディングします。
'ウィンドウハンドル:hMainWnd

'TODO:この位置にグローバルな変数、構造体、定数、関数を定義します。
Const BMPSIZE=32

'-----------------------------------------------------------------------------
'ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND,dwMsg As DWord,wParam As WPARAM,lParam As LPARAM) As DWord
	'TODO:この位置にウィンドウメッセージを処理するためのコードを記述します。

	'イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
'ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	digiclk_DestroyObjects()
	PostQuitMessage(0)
End Sub

Sub MainWnd_LButtonDblClick(flags As Long,x As Integer,y As Integer)
	End
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	SetTimer(hMainWnd,0,1000,NULL)
	Dim l As Long
	l=GetWindowLong(hMainWnd,GWL_STYLE)
	SetWindowLong(hMainWnd,GWL_STYLE,l Xor WS_CAPTION)
	SetWindowPos(hMainWnd,NULL,0,0,BMPSIZE*8,BMPSIZE,SWP_NOMOVE)
End Sub

Sub MainWnd_Paint(hDC_ As HDC)
	Dim hDC As HDC
	hDC=GetDC(hMainWnd)
	Dim bmp1 As HBITMAP,dc1 As HDC
	Dim ti[100] As Byte,i As Long
	Dim time$ As String
	time$=Time$()
	lstrcpy(ti,StrPtr(time$))
	bmp1=LoadImage(GetWindowLong(hMainWnd,GWL_HINSTANCE),IDB_BITMAP1,IMAGE_BITMAP,BMPSIZE*11,BMPSIZE,LR_DEFAULTCOLOR)
	dc1=CreateCompatibleDC(hDC)
	SelectObject(dc1,bmp1)
	Do
		ti-=Asc("0")
		If ti>9 Then ti=10
		BitBlt(hDC,i*BMPSIZE,0,BMPSIZE,BMPSIZE,dc1,ti*BMPSIZE,0,SRCCOPY)
		i++
	Loop While ti
	DeleteDC(dc1)
	DeleteObject(bmp1)
	ReleaseDC(hMainWnd,hDC)
End Sub

Sub MainWnd_Timer(TimerID As DWord)
	Select Case TimerID
		Case 0
			InvalidateRgn(hMainWnd,NULL,TRUE)
	End Select
End Sub

名無し さんが書きました:もしかして下のスタートバーに出てくる文字をタイトルバーと呼んでいるのでしょうか…
"スタートバー"は一般にはタスクバーと呼ぶかと。

AB4とAB5ではString型の扱いがかなり変化したので、その周りで多少コードへの変更が必要かもしれません。

通る筈が無いと思って書いたコードのコンパイルが通った。感動。

コード: 全て選択

Dim A$ As String
A$="abc"+"efg"
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ぼん

#8 投稿記事 by ぼん »

名無しさんkonisiさんありがとうございます。
konisiさんのだとタイマーのインターバルが1秒になってますよね。
実行のタイミングによっては1秒程度ズレますが…
難しいところですね。
ありがとうございました。