テキストをスクロールする方法

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

テキストをスクロールする方法

#1 投稿記事 by Mario2 »

こんにちは、Mario2です。

件名の通り、Static Textに表示させた文字列をスクロールする方法は、あるのでしょうか?
なるべく、綺麗にスクロールしてくれれば嬉しいのですが・・・、不可能なのでしょうか?(例を挙げてみると、Winampと言うソフトの黒色部分に表示されているあれです。)

あと、今思い出したのですが、「CTRL」+「K」等の「CTRL」を使ったキーの取得方法はどうすればいいのでしょうか?Ctrlのキーを取得してからKのキーを取得すればいいのでしょうか??それとも、CTRL+Kで1つのキーとして何かメッセージがあるのでしょうか??(件名と関係ない質問ですいません)

よろしくおねがいします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

Re: テキストをスクロールする方法

#2 投稿記事 by hira »

まず前者について。
私がぱっと思いついた方法としては、別にデバイスコンテキスト&ビットマップを作成し、そこに表示したいテキストを描画します。そして、それをBitBltでコピーするのですが、コピー元の左端X座標を変えていくことでスクロールしているように見せるということです。
例えば、テキストが100ピクセルあるのであれば、DCを作りそれに200ピクセルのビットマップを作成して関連付けます。テキストを(X,Y)=(0,0)・(X,Y)=(100,0)を基準に2度描画し、実際のスクロールはBitBltのコピーで元の左端X座標(第7引数)を時間ごとに1ずつ増やすとスクロールになります。100になったら0に戻します(テキストを2回描画するのは、テキストが1周したときに初めのテキストがちゃんと右から出てくれるようにするためです)。

後者について。
例えばWM_KEYDOWNで「K」が押されたことを取得したとします。このときGetKeyState関数を使えば、「Ctrl」が押されているかどうかがわかりますので、押されているならば処理をすればいいことになります。
※もっとスマートな方法があるかもしれませんが
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: テキストをスクロールする方法

#3 投稿記事 by 淡幻星 »

Static Textに表示させた文字列をスクロールは、
少なくともWinamp(Ver2.x)では、hiraさんが言われている方法で
おこわなれていたと思います(全部がその方法ではないかもしれません)。

複数キーの同時取得に関しては、
GetKeyboardState()を使う方法の方が楽かもしれません。
せっかくなので、私が使っている「CTRL」を使ったキーの取得用の関数を
参考までに載せておきます。
Ver2.xのものですが、APIを呼んでいるだけなので
Ver4.xでも問題なく動作すると思います。

コード: 全て選択

'押されているキーボードの取得
'2つのキーまで同時取得。1つのときは、二番目の引数ににNULLを指定。
'指定した2つのキーが押されていれば、TRUEを返す。でなければFALSE。
'※1番目がアスキー、2番目が仮想キー(CtrlやShiftとか)を仮定してますが、実際はどっちでもかまいません。
Function WsIsCombAscVK( ByVal nKeyAsc As Long, ByVal nKeyVK As Long ) As Long
	Dim bKeyBuf( 256 ) As Byte
	Dim i As Long

	GetKeyboardState( bKeyBuf(0) )

	WsIsCombAscVK = FALSE

	If( nKeyVK=0 )Then
		If( bKeyBuf( nKeyAsc ) And &H80 )Then
			WsIsCombAscVK = TRUE
		EndIf
		If( (96<nKeyAsc)and(nKeyAsc<123) )Then
			If( bKeyBuf( nKeyAsc-32 ) And &H80 )Then
				WsIsCombAscVK = TRUE
			EndIf
		EndIf
	Else
		If( bKeyBuf( nKeyVK ) And &H80 )Then
			If( bKeyBuf( nKeyAsc ) And &H80 )Then
				WsIsCombAscVK = TRUE
			EndIf
			If( (96<nKeyAsc)and(nKeyAsc<123) )Then
				If( bKeyBuf( nKeyAsc-32 ) And &H80 )Then
					WsIsCombAscVK = TRUE
				EndIf
			EndIf
		EndIf
	EndIf

	'キーボード状態の初期化
	If( WsIsCombAscVK = TRUE )Then
		For i=0 To 255
			bKeyBuf( i ) = NULL
		Next
		SetKeyboardState( bKeyBuf(0) )
	EndIf

EndFunction

ちなみに、CTRLキーのアスキーコードは
 Const VK_CONTROL = &H11
で定義済みです。
この関数だと、ウィンドウにフォーカスが無いときでも
キーに反応してしまう?みたいなので、
 GetForegroundWindow()
でフォーカスが当たっているかどうかを判別してから
キーを取得するようにします。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#4 投稿記事 by Mario2 »

hiraさん、淡幻星さん、お答えいただき、ありがとうございます。
早速、試してみます。
返信する