「VC」でOCXを作っている者です。
皆さんに質問したいことは、OCXを作る際に、この様に書いた場合(↓)
// CMyxxxxxxCtrl::CMyxxxxxxCtrl - コンストラクタ
CMyxxxxxxCtrl::CMyxxxxxxCtrl()
{
InitializeIIDs(&IID_DMyxxxxxx, &IID_DMyxxxxxxxEvents);
// TODO: この位置にコントロールのインスタンス データの初期化処理を追加してください
::SetTimer(GetSafeHwnd(),ID_TIMER,1000,NULL);
}
このSetTimerはどのタイミングで動き出すのでしょうか?(VBで)
つづきは、この様になっています(↓)
void CMyxxxxxxxxCtrl::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
KillTimer(1);
::AfxMessageBox(_T(OK!));
SetTimer(1, 5000, NULL);
}else{
::AfxMessageBox(_T(NG!));
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を
呼び出してください
}
COleControl::OnTimer(nIDEvent);
}
そして、実行したところ、ノンリアクションでした。
私はまだ「VB」、「VC」を触り始めて一ヶ月も経っておりません。
ご教授お願い致します。
> ::SetTimer(GetSafeHwnd(),ID_TIMER,1000,NULL);
多分この段階でまだウィンドウが作られていないのでしょう。
SetTimerが成功しているか、戻り値を調べましたか?
また、戻り値がエラーだった場合は、GetLastError()でエラー
コードが得られますので、それを調べてください。
コンストラクタが呼ばれた時点ではGetSafeHwnd()はNULLを返します。
CWnd::SetTimer()を使ったらたぶんASSERTすると思います。
OnCreate()でSetTimer()すればいいかと思います。
dairygoodsさん、EIJIさん、はじめまして、doriburuです。
レス有難うございます。
申し訳ないです。言葉足らずでした。
「VB」でこの「VC」のOCXを使いたいのです。
「VB」側では、OCXを貼付け、「開始」するだけです。
それ以外は、「何もしない」です。
私のつまづいているところ:
「開始」されるとOCXが動き出す。その為には「VC」でどの様にSetTimerを記述すればよいの
か?です。
ご教授お願い致します。
答えはすでにEIJIさんが仰っています。
> OnCreate()でSetTimer()すればいいかと思います。
半分解決です。
というのも、
「VB」で貼り付けただけで、SetTimerが動き出します。
これは、避けたいです。
そして、「開始」でもSetTimerが動き出します。
これだけの動きにしたいのです。
ちなみに、ソースは・・・
int CMyxxxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: この位置に固有の作成用コードを追加してください
::SetTimer(GetSafeHwnd(),1,2000,NULL);
return 0;
}
void CMyxxxCtrl::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1){
::AfxMessageBox(Ok!);
}else{
::AfxMessageBox(NG!);
}
COleControl::OnTimer(nIDEvent);
}
void CMyxxxCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
//左のボタンがクリックされた時はストップ!!
::KillTimer(GetSafeHwnd(),1);
COleControl::OnLButtonDown(nFlags, point);
}
です。
助言を・・・・お願い致します。
OnCreate()でやると、VBでの編集中に貼り付けただけで
タイマーが動いてしまうってことですね。
そうじゃなくて実行開始時にタイマーを動かしたいと。
OCXにタイマーを起動するメソッドを追加して、VB側では
FormのInitializeとかLoadイベント内でOCXのメソッドを
呼び出せばよさそうです。
BOOL COleControl::AmbientUserMode()
ユーザーモード(実行中)かデザインモードかを取得する。
が、使えるかもしれません。
EIJIさん、レス有難うございます。
> OCXにタイマーを起動するメソッドを追加して、VB側では
> FormのInitializeとかLoadイベント内でOCXのメソッドを
> 呼び出せばよさそうです。
確かに、これで「実行開始時」だけタイマーは動き出します。
しかし、「VB」側では、飽くまでも、
-----「貼付け」「実行開始」だけをする。-----
です。
いろいろ探したり,試したりしているのですがうまくいきません。
トホホです。
また、何かあれば是非、アドバイスの方をお願い致します。
dairygoodsさん、レス有難うございます。
この様にしたら、できました!!!!
int CMyxxxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
BOOL juge;
juge = AmbientUserMode();
if(juge == 0){
::AfxMessageBox(x);
}else{
::SetTimer(GetSafeHwnd(),1,2000,NULL);
}
return 0;
}
EIJIさん、dairygoodsさん、本当に有難うございます。
お世話になりました。
解決です!!!!