8/28(金)


せきちゃんから返事が来た。
下のがそのメールの一部。

そのウィンドウのハンドルを渡すだけです。
うーん、Form->HandleとApplication->Handleの違いが分かればねぇ。

後、エラーの場合はそのエラー値も書いてくれるとありがたいです。
その方がどんな現象が起こっているか分かりやすい。

せきちゃん

うーん、特に決まりはないのか・・・
何でだろうねぇ?

しかし、エラー値ってのは確かに重要だな。
これを、調べればなにかつかめるかも・・・

実は、このメールは昨日来た。
昨日は、ちょっとふてくされてたので、プログラムはやってなかったのだが・・・


今日、DDDDの作者SANDMANさんからメールが来た。
で、下のがそのメールの一部。

 C++BuilderにしろDelphiにしろ、TFormによってアプリケーションのウィンドウが
すっぽりカプセル化されているところが悩みの種ですよね。BorderStyleとかを変え
るとウィンドウのハンドルが変わるので、DirectXとの連絡がうまく取れなくなる
し…

 問題が解決されていたら失礼とは思いますが、「どのハンドルを指定したら良いの
問題」(勝手に命名 ^^;)について。

 指定するのはForm1.Handleで良いです、但しDelphi3,Builder3ではフルスクリーン
でDirectDrawを初期化する場合、FormはShowされてないとダメですので、DirectDraw
を初期化する前にForm.Showしてください。

 Delphi2だとOKだったのですが、細かい部分で実装が変わっているようでm(__ 僕も
理不尽な思いをしました。

なんと!!
Showされていないとダメ!!

それでかぁ・・・
えむっちはForm1->OnCreateでDirectDrawの初期化をしていたので、
その段階では当然Form1はShowされていない。

いやー、助かりましたよぉ。感謝感謝です。>SANDMANさん


で、早速やってみた。

Showされた後でって条件なので、とりあえずボタンをButton1->OnClickで初期化することにして実行。

お、やった。ちゃんとディスプレイの解像度が変わったままになったよ。つまり、初期化成功だ。
スペースキーを押して、フリップさせてみる。

ありゃ、フリップしない・・・?
ん、スペースキーを押したら、Button1がクリックされてるみたいだぞ・・・
なるほど、ボタンを作ってやったので、OnKeyDownのスペースキーのイベントがボタンにインターセプトされてしまったのか。

うーん、PopupMenuで初期化させてみよう。

よし、こっちでもちゃんと解像度が変わったままだ。つまり初期化は成功した。
スペースキーを押してみる。

やった、ちゃんとフリップしたよ。
やっと、解決したよ。

しかし、初期化のタイミングと言う新たな問題が発生したなぁ・・・
Form1->OnCreateじゃだめだもんなぁ・・・
OnShowでいいのか?しかし、それだと、最小化して、元の大きさに戻したときにも発生するんじゃ・・・

OnShowのタイミングを調べてみる必要があるね。
Form1->OnShowにShowMessageを書いて確かめてみることにした。

結果、最小化して元の大きさに戻したときには発生しない。
しかし、実行したときにFormが表示されるより先に発生している。

つまり、表示が完了してからOnShowイベントが発生するのではなく、表示を開始する前に発生しているようだ。
どっちにしても、OnShowではダメだ。

表示が完了したら発生するイベントはないのか?
うーん、それらしいのは無いなぁ・・・

じゃ、Application->OnIdleでisfirstとか使ってでやるのか・・・?
うーん、どうだろ?試しにやってみるか・・・

うん、いい感じだ。
しかし、isfirstってのはどうもねぇ・・・
ま、まだ、テスト段階だし、これでよしとしよう。
コンポーネントにする場合はまた別の回避策があるかもしれないしね。


戻る