ActiveXコントロールについて – プログラミング – Home

ActiveXコントロールについて
 
通知
すべてクリア

[解決済] ActiveXコントロールについて


はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

CStaticクラスを継承したビットマップデータ表示用のActiveX
コントロールをVC++で実装しているのですが、下記の問題があり
困っています。誰か分かる方がいらっしゃれば教えて頂けませんか?

1.VBで実装された画面との間で、コントロールのメソッ
  ドでバイナリのバイト配列の受け渡しを行うにはどの
  ようにすればよいのでしょうか?

  具体的には、ClassWizardのオートメーションタブで
  コントロールのメソッドを追加するとき、メソッドの
  パラメータの型として、文字列へのポインタや、
  short型、long型へのポインタは選択可能なのすが、
  char型やBYTE型へのポインタがなく、どの型を選択す
  ればよいのかよくわからない状況です。よろしくお願
  いします。

2.コントロールがマウスでクリックされたとき、クリック
  されたポイントがコントロールのクライアント領域の中心
  に来るようにスクロールすることを考えております。

  具体的には、ClassWizardのメッセージマップタブで、
  WM_LBUTTONDOWNに対応したLButtonDown()を追加して、
  LButtonDown()の中でスクロール処理を行うように実
  装しております。

  ActiveXコントロールテストコンテナで動作確認をす
  る場合には、コントロールをクリックしたときには
  LButtonDown()が呼ばれて期待通りに動作していると
  思うのですが、コントロールをVBのフォームに挿入
  した状態では、コントロールをクリックしても
  LButtonDown()が呼ばれません。

  ここで質問ですが、コントロールをActiveXコント
  ロールテストコンテナに挿入した状態と、VBの
  フォームに挿入した状態では、何が違うのでしょう
  か?


引用未解決
トピックタグ
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
 

情報提供です。

>...バイナリのバイト配列の受け渡しを行うにはどの
>ようにすればよいのでしょうか?

翔泳社 ATL COM プログラミング
初版では p217 に
...
...別のプロセスにバイナリーデータを渡す場合は、
VT_UT1というタイプのSAFEARRAYで渡すことになります。
...
と記載されています。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

アドバイスありがとうございます。
さっそく調べて試してみます。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

2の質問に関してですが、解決しました。
MFC ActiveX ControlWizard を使用しStaticのActiveXを作成していたのですが、
noneで作成すればLButtonDownイベントが取得できるようになりました。
何故、Staticで作成した場合に、イベントが取得できないのかは分かりません。


返信引用
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
 

//本をかたてにコードを作ってみました。
//ただし本では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); //メソッドを呼び出す。
*/
}


返信引用
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
 

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


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

テンさんありがとうございます。
バイト型の配列をVBから渡すことができました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました