ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 01:45

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月12日(土) 10:57 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
こんにちは、Mario2です。

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

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

よろしくおねがいします。


通報する
ページトップ
投稿記事Posted: 2005年11月12日(土) 11:47 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
まず前者について。
私がぱっと思いついた方法としては、別にデバイスコンテキスト&ビットマップを作成し、そこに表示したいテキストを描画します。そして、それを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」が押されているかどうかがわかりますので、押されているならば処理をすればいいことになります。
※もっとスマートな方法があるかもしれませんが

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
投稿記事Posted: 2005年11月12日(土) 12:18 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
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()
でフォーカスが当たっているかどうかを判別してから
キーを取得するようにします。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月12日(土) 12:53 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
hiraさん、淡幻星さん、お答えいただき、ありがとうございます。
早速、試してみます。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Baidu [Spider], Bing [Bot], Semrush [Bot] & ゲスト[18人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean