include\api_msg.sbpについて

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

include\api_msg.sbpについて

#1 投稿記事 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
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: include\api_msg.sbpについて

#2 投稿記事 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で代用という状況ですが、、、
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#3 投稿記事 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]
としてもいいかもしれないですが,それだと文字列定数が代入できない・・・。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

いっそのこと構文を拡張してc"A"とするとAの文字コードの数値にするなどとしてみたらどうかと思ったりします。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#5 投稿記事 by Sinryow »

> いっそのこと構文を拡張してc"A"とするとAの文字コードの数値にするなどとしてみたらどうかと思ったりします。

それなら,むしろCのように "ActiveBasic"(3)(結果は「i」の文字コード)とか,文字列リテラルにも配列のかっこを付けられるようにしたほうがよいかと思います。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#6 投稿記事 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]
> としてもいいかもしれないですが,それだと文字列定数が代入できない・・・。

なるほどこういう手もありますね。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#7 投稿記事 by Sinryow »

> 次の
>
> Const HOGE = MAKEFORCC("H","O","G","E")
>
> が面倒なんです。
> Cでは#defineよるマクロなので簡単にできるのですが
> ABではConstに関数を含めることができないので
> 生の数値を打ち込むしかないんですね。

あ,そういうことでしたか(^^;)

前に私が「ABのConstを,Cの#defineと同じ仕様にしてほしい」と言いましたが,(あの時は言い忘れていたのですが)Const値の宣言時に関数を含めることが出来るようにしてほしい,という意味もあったんです。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
BingoMan

#8 投稿記事 by BingoMan »

いろいろな情報ありがとうございます。大変勉強になりました。

ちなみに、VBでは最初に書いたような定義がされているようです。
返信する