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ってのはどうもねぇ・・・
ま、まだ、テスト段階だし、これでよしとしよう。
コンポーネントにする場合はまた別の回避策があるかもしれないしね。