「VC」のOCXの作り方について。 – プログラミング – Home

「VC」のOCXの作り方について。
 
通知
すべてクリア

[解決済] 「VC」のOCXの作り方について。


doriburu
 doriburu
(@doriburu)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

「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」を触り始めて一ヶ月も経っておりません。
ご教授お願い致します。


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

> ::SetTimer(GetSafeHwnd(),ID_TIMER,1000,NULL);

多分この段階でまだウィンドウが作られていないのでしょう。

SetTimerが成功しているか、戻り値を調べましたか?
また、戻り値がエラーだった場合は、GetLastError()でエラー
コードが得られますので、それを調べてください。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 25年前
投稿: 76
 

コンストラクタが呼ばれた時点ではGetSafeHwnd()はNULLを返します。
CWnd::SetTimer()を使ったらたぶんASSERTすると思います。
OnCreate()でSetTimer()すればいいかと思います。


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

dairygoodsさん、EIJIさん、はじめまして、doriburuです。
レス有難うございます。
申し訳ないです。言葉足らずでした。
「VB」でこの「VC」のOCXを使いたいのです。
「VB」側では、OCXを貼付け、「開始」するだけです。
それ以外は、「何もしない」です。

私のつまづいているところ:

「開始」されるとOCXが動き出す。その為には「VC」でどの様にSetTimerを記述すればよいの
か?です。

ご教授お願い致します。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

答えはすでにEIJIさんが仰っています。
> OnCreate()でSetTimer()すればいいかと思います。


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

半分解決です。
というのも、
「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);
}

です。
助言を・・・・お願い致します。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 25年前
投稿: 76
 

OnCreate()でやると、VBでの編集中に貼り付けただけで
タイマーが動いてしまうってことですね。
そうじゃなくて実行開始時にタイマーを動かしたいと。

OCXにタイマーを起動するメソッドを追加して、VB側では
FormのInitializeとかLoadイベント内でOCXのメソッドを
呼び出せばよさそうです。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

BOOL COleControl::AmbientUserMode()
ユーザーモード(実行中)かデザインモードかを取得する。

が、使えるかもしれません。


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

EIJIさん、レス有難うございます。

> OCXにタイマーを起動するメソッドを追加して、VB側では
> FormのInitializeとかLoadイベント内でOCXのメソッドを
> 呼び出せばよさそうです。

確かに、これで「実行開始時」だけタイマーは動き出します。
しかし、「VB」側では、飽くまでも、

-----「貼付け」「実行開始」だけをする。-----

です。

いろいろ探したり,試したりしているのですがうまくいきません。
トホホです。

また、何かあれば是非、アドバイスの方をお願い致します。


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

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さん、本当に有難うございます。
お世話になりました。
解決です!!!!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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