CStaticクラスを継承したビットマップデータ表示用のActiveX
コントロールをVC++で実装しているのですが、下記の問題があり
困っています。誰か分かる方がいらっしゃれば教えて頂けませんか?
1.VBで実装された画面との間で、コントロールのメソッ
ドでバイナリのバイト配列の受け渡しを行うにはどの
ようにすればよいのでしょうか?
具体的には、ClassWizardのオートメーションタブで
コントロールのメソッドを追加するとき、メソッドの
パラメータの型として、文字列へのポインタや、
short型、long型へのポインタは選択可能なのすが、
char型やBYTE型へのポインタがなく、どの型を選択す
ればよいのかよくわからない状況です。よろしくお願
いします。
2.コントロールがマウスでクリックされたとき、クリック
されたポイントがコントロールのクライアント領域の中心
に来るようにスクロールすることを考えております。
具体的には、ClassWizardのメッセージマップタブで、
WM_LBUTTONDOWNに対応したLButtonDown()を追加して、
LButtonDown()の中でスクロール処理を行うように実
装しております。
ActiveXコントロールテストコンテナで動作確認をす
る場合には、コントロールをクリックしたときには
LButtonDown()が呼ばれて期待通りに動作していると
思うのですが、コントロールをVBのフォームに挿入
した状態では、コントロールをクリックしても
LButtonDown()が呼ばれません。
ここで質問ですが、コントロールをActiveXコント
ロールテストコンテナに挿入した状態と、VBの
フォームに挿入した状態では、何が違うのでしょう
か?
情報提供です。
>...バイナリのバイト配列の受け渡しを行うにはどの
>ようにすればよいのでしょうか?
翔泳社 ATL COM プログラミング
初版では p217 に
...
...別のプロセスにバイナリーデータを渡す場合は、
VT_UT1というタイプのSAFEARRAYで渡すことになります。
...
と記載されています。
アドバイスありがとうございます。
さっそく調べて試してみます。
2の質問に関してですが、解決しました。
MFC ActiveX ControlWizard を使用しStaticのActiveXを作成していたのですが、
noneで作成すればLButtonDownイベントが取得できるようになりました。
何故、Staticで作成した場合に、イベントが取得できないのかは分かりません。
//本をかたてにコードを作ってみました。
//ただし本ではlong型の配列をBYTE型にかえたので不具合があるかも?
//ご参考までに。
//
/////////////////////////////////////////////////////////////////////////////
// CSACtrl メッセージ ハンドラ
SCODE CSACtrl::SABYTE(const VARIANT FAR& VR)
{
// TODO: ここにディスパッチ ハンドラ コードを追加してください。
if (!(VR.vt & VT_UI1)) //BYTE型
return DISP_E_TYPEMISMATCH;
if (!(VR.vt & VT_ARRAY))
return DISP_E_TYPEMISMATCH;
SAFEARRAY* psa;
if (!(VR.vt & VT_BYREF)) //参照型
psa = *(VR.pparray);
else
psa = VR.parray;
long lLBound; //最下位委配列インデックス
long lUBound; //最上位委配列インデックス
SafeArrayGetLBound(psa, 1, &lLBound);
SafeArrayGetUBound(psa, 1, &lUBound);
//言語によって配列が 0 で始まったり 1 で始まったりする。
//ほかにもあるかも?
long l, n;
BYTE* pBW;
pBW = new BYTE[lUBound - lLBound + 1];
for (n = 0, l = lLBound ; l <= lUBound ; n++, l++)
{
BYTE b;
SafeArrayGetElement(psa, &l, &b); //配列から指定された要素をとりだす。
pBW[n] = b;
}
delete[] pBW;
return S_OK;
/*
//メソッドを呼び出しの例
SAFEARRAY *psaAr = 0;
SAFEARRAYBOUND saBo[1];
saBo[0].lLbound = 0;
saBo[0].cElements = 10;
psaAr = SafeArrayCreate(VT_UI1, 1, saBo);
BYTE BA[] = {1,2,3,4,5,6,7,8,9,0};
for (int i = 0 ; i < 10 ; i++)
{
SafeArrayPutElement(psaAr, (long*)&BA[i], &i); //指定された要素に代入する。
}
VARIANT VARI;
VariantInit(&VARI);
V_VT(&VARI) = VT_ARRAY | VT_UI1;
V_ARRAY(&VARI) = psaAr;
pSACtrl->SABYTE(VARI); //メソッドを呼び出す。
*/
}
if (!(VR.vt & VT_BYREF)) //参照型
は
if (VR.vt & VT_BYREF) //参照型
の
BYTE BA[] = {1,2,3,4,5,6,7,8,9,0};
for (int i = 0 ; i < 10 ; i++)
は
BYTE BA[] = {1,2,3,4,5,6,7,8,9,0,0,0};
for (int i = 0 ; i <= 10 ; i++)
のまちがいです。すみません m(_ _)m
テンさんありがとうございます。
バイト型の配列をVBから渡すことができました!