ページ 1 / 1
include\api_msg.sbpについて
Posted: 2005年7月15日(金) 14:36
by BingoMan
include\api_msg.sbpに以下の定数宣言をしていただけないでしょうか。
コード: 全て選択
Const VK_A =&H41
Const VK_B =&H42
Const VK_C =&H43
Const VK_D =&H44
Const VK_E =&H45
Const VK_F =&H46
Const VK_G =&H47
Const VK_H =&H48
Const VK_I =&H49
Const VK_J =&H4A
Const VK_K =&H4B
Const VK_L =&H4C
Const VK_M =&H4D
Const VK_N =&H4E
Const VK_O =&H4F
Const VK_P =&H50
Const VK_Q =&H51
Const VK_R =&H52
Const VK_S =&H53
Const VK_T =&H54
Const VK_U =&H55
Const VK_V =&H56
Const VK_W =&H57
Const VK_X =&H58
Const VK_Y =&H59
Const VK_Z =&H5A
Const VK_0 =&H30
Const VK_1 =&H31
Const VK_2 =&H32
Const VK_3 =&H33
Const VK_4 =&H34
Const VK_5 =&H35
Const VK_6 =&H36
Const VK_7 =&H37
Const VK_8 =&H38
Const VK_9 =&H39
Re: include\api_msg.sbpについて
Posted: 2005年7月15日(金) 16:54
by NoWest
> include\api_msg.sbpに以下の定数宣言をしていただけないでしょうか。
>
実はこれらの定数はC++でも定義されていません。
それはどうしてかといいますと
仮想キーコードのA~9まではいわゆるアスキーコードと対応しているからです。
ですからC++では''を使って文字コードを直接数値として与えることができるのでVK_***は必要ないんです。
これはActiveBasicにも当てはまります。
ABではAsc()関数ってのありまして、これで文字コードを取得できます。
たとえばこんな感じです。
コード: 全て選択
Sub MainWnd_KeyDown(KeyCode As Long, flags As Long)
Select Case KeyCode
Case Asc("A")
PostMessage(hMainWnd,WM_CLOSE,0,0)
End Select
End Sub
しかし、文字キーの仮想キーコードを定数としたい場合は話は別です。
たとえば
コード: 全て選択
Const HOGE = VK_A<<8
こんな時にAsc関数しかないのは不便です。
山本(管理人)様も気付いているかもしれませんがmmsystem.hのMAKEFORCC()
もABに移植するのが大変なマクロの1つです。
これはチャンクを作成するマクロですが内部で文字コードをビットシフトしています。
仕方ないのでFunctionで代用という状況ですが、、、
Posted: 2005年7月15日(金) 22:21
by Sinryow
これでよいのではないのでしょうか?
コード: 全て選択
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
↓
コード: 全て選択
Const MAKEFOURCC(ch0, ch1, ch2, ch3) = _
((ch0) And &HFF) Or ((ch1) And &HFF)<<8 Or ((ch2) And &HFF)<<16 Or ((ch3) And &HFF)<<24
あと,Asc関数自体を
コード: 全て選択
Const Asc(a) = a[0]
としてもいいかもしれないですが,それだと文字列定数が代入できない・・・。
Posted: 2005年7月15日(金) 23:46
by イグトランス
いっそのこと構文を拡張してc"A"とするとAの文字コードの数値にするなどとしてみたらどうかと思ったりします。
Posted: 2005年7月16日(土) 13:16
by Sinryow
> いっそのこと構文を拡張してc"A"とするとAの文字コードの数値にするなどとしてみたらどうかと思ったりします。
それなら,むしろCのように "ActiveBasic"(3)(結果は「i」の文字コード)とか,文字列リテラルにも配列のかっこを付けられるようにしたほうがよいかと思います。
Posted: 2005年7月16日(土) 13:24
by NoWest
> これでよいのではないのでしょうか?
>
コード: 全て選択
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
> ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
> ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
> ↓
>
コード: 全て選択
Const MAKEFOURCC(ch0, ch1, ch2, ch3) = _
> ((ch0) And &HFF) Or ((ch1) And &HFF)<<8 Or ((ch2) And &HFF)<<16 Or ((ch3) And &HFF)<<24
ここまではいいんですよ。
次の
コード: 全て選択
Const HOGE = MAKEFORCC("H","O","G","E")
が面倒なんです。
Cでは#defineよるマクロなので簡単にできるのですが
ABではConstに関数を含めることができないので
生の数値を打ち込むしかないんですね。
> あと,Asc関数自体を
>
コード: 全て選択
Const Asc(a) = a[0]
> としてもいいかもしれないですが,それだと文字列定数が代入できない・・・。
なるほどこういう手もありますね。
Posted: 2005年7月16日(土) 13:33
by Sinryow
> 次の
>
> Const HOGE = MAKEFORCC("H","O","G","E")
>
> が面倒なんです。
> Cでは#defineよるマクロなので簡単にできるのですが
> ABではConstに関数を含めることができないので
> 生の数値を打ち込むしかないんですね。
あ,そういうことでしたか(^^;)
前に私が「ABのConstを,Cの#defineと同じ仕様にしてほしい」と言いましたが,(あの時は言い忘れていたのですが)Const値の宣言時に関数を含めることが出来るようにしてほしい,という意味もあったんです。
Posted: 2005年7月17日(日) 00:19
by BingoMan
いろいろな情報ありがとうございます。大変勉強になりました。
ちなみに、VBでは最初に書いたような定義がされているようです。