こんにちは、Mario2です。
件名の通り、Static Textに表示させた文字列をスクロールする方法は、あるのでしょうか?
なるべく、綺麗にスクロールしてくれれば嬉しいのですが・・・、不可能なのでしょうか?(例を挙げてみると、Winampと言うソフトの黒色部分に表示されているあれです。)
あと、今思い出したのですが、「CTRL」+「K」等の「CTRL」を使ったキーの取得方法はどうすればいいのでしょうか?Ctrlのキーを取得してからKのキーを取得すればいいのでしょうか??それとも、CTRL+Kで1つのキーとして何かメッセージがあるのでしょうか??(件名と関係ない質問ですいません)
よろしくおねがいします。
テキストをスクロールする方法
Re: テキストをスクロールする方法
まず前者について。
私がぱっと思いついた方法としては、別にデバイスコンテキスト&ビットマップを作成し、そこに表示したいテキストを描画します。そして、それを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」が押されているかどうかがわかりますので、押されているならば処理をすればいいことになります。
※もっとスマートな方法があるかもしれませんが
私がぱっと思いついた方法としては、別にデバイスコンテキスト&ビットマップを作成し、そこに表示したいテキストを描画します。そして、それを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/
http://hira.hopto.org/
Re: テキストをスクロールする方法
Static Textに表示させた文字列をスクロールは、
少なくともWinamp(Ver2.x)では、hiraさんが言われている方法で
おこわなれていたと思います(全部がその方法ではないかもしれません)。
複数キーの同時取得に関しては、
GetKeyboardState()を使う方法の方が楽かもしれません。
せっかくなので、私が使っている「CTRL」を使ったキーの取得用の関数を
参考までに載せておきます。
Ver2.xのものですが、APIを呼んでいるだけなので
Ver4.xでも問題なく動作すると思います。
ちなみに、CTRLキーのアスキーコードは
Const VK_CONTROL = &H11
で定義済みです。
この関数だと、ウィンドウにフォーカスが無いときでも
キーに反応してしまう?みたいなので、
GetForegroundWindow()
でフォーカスが当たっているかどうかを判別してから
キーを取得するようにします。
少なくとも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()
でフォーカスが当たっているかどうかを判別してから
キーを取得するようにします。