トップページ > 過去ログ > 記事閲覧
SetUserWindow()がうまくいかない
名前:埴輪 日時: 2010/12/24 08:32

DXライブラリを用いてスクリーンセーバーを作ろうとしているのですが、 プレビュー表示用ウインドウハンドルを使ってプレビュー画面に描画するのが うまくいきません。 まら、//ココの部分にMessageBox()をかませてみるとメッセージボックスは表示されませんでした。 どうすればいいのでしょうか。 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { if(lpCmdLine[1]=='p') { SetUserWindow((HWND)atoi(&lpCmdLine[3]))); //ココ SetUserWindowMessageProcessDXLibFlag(true); if(DxLib_Init()==-1)return -1; SetDrawScreen(DX_SCREEN_BACK); for(int c=0;ProcessMessage()!=-1;c++) { DrawBox(0,0,100,100,GetColor(255,0,0),true); ScreenFlip(); ClearDrawScreen(); } DxLib_End(); } ・・・後略

Page: 1 |

Re: SetUserWindow()がうまくいかない ( No.1 )
名前:Will 日時:2010/12/24 13:26

このexeを起動するときにどういうふうに引数(ウィンドウハンドル)を渡していますか? atoi(&lpCmdLine[3])の値が正しいウィンドウハンドル値であることは確認できていますか?
Re: SetUserWindow()がうまくいかない ( No.2 )
名前:Will 日時:2010/12/24 13:40

lpCmdLineの使い方ですがmain関数のargvと勘違いしていませんか? 例えば hoge.exe 1000 2000 3000 で実行した場合 lpCmdLine = "1000 2000 3000" です。 よって &lpCmdLine[3] = "0 2000 3000" です。 argvのように三番目の引数(上記でいえば3000)にはなりません。
Re: SetUserWindow()がうまくいかない ( No.3 )
名前:いっち 日時:2010/12/24 18:41

以前の質問ではプレビュー用のウィンドウハンドルに直接描画するのではなく、 子ウィンドウを作成して描画しているようでした。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1556
Re: SetUserWindow()がうまくいかない ( No.4 )
名前:埴輪 日時:2010/12/24 23:36

パラメータは /p HWND値 ですのでargvであれば argv[0]:EXE(SCR)ファイル名 argv[1]:/p argv[2]:HWND値 のはずですが・・・。 >子ウィンドウを作成して描画 というのがいまいちよくわかりません。 とにかく、渡されるHWND値(Windowsが先に用意したウインドウの制御ハンドルと理解しています。) でもってそれが示すウインドウには描画できないのでしょうか・・・。
Re: SetUserWindow()がうまくいかない ( No.5 )
名前:Will 日時:2010/12/25 13:00

No.2に書きましたがlpCmdLineはargvと同じ動きはしません。 WinMainの引数にはargcに相当するものがないでしょ。 argvを使いたいなら SetUserWindow((HWND)atoi(__argv[3]))); です。
Re: SetUserWindow()がうまくいかない ( No.6 )
名前:埴輪 日時:2010/12/25 15:53

そもそも__argvなんてものも定義しておりませんしLPSTRのlpCmdLineは"/p HWND値"ですから lpCmdLineの3文字目が文字列の先頭になるように&をつけて再びポインタに戻しています。
Re: SetUserWindow()がうまくいかない ( No.7 )
名前:Will 日時:2010/12/25 17:02

すいません、そういう事であれば引数はそれで問題ありません。 なお、__argv,__argcはウィンドウアプリケーションでは自動的に定義される変数なのでユーザが定義するものではありません。 ttp://win32lab.com/tips/tips3.html
Re: SetUserWindow()がうまくいかない ( No.8 )
名前:いっち 日時:2010/12/26 17:12

管理人さん> 以前作ったソース(ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1556)がスクリーンセーバーのプレビューで うまく動かなかったので調べてみたところ 3.04b 以降のDXライブラリでは DxLib_Init で失敗しているようでした。 (SetUseDirectInputFlag を FALSE にしなかったときと事象が似ています) お手数ですが調査をお願いします。 それと SetUserWindow を使うと Log.txt が出力されなくなるのは仕様でしょうか? (SetUserWindow が原因かどうか確証はありませんがそれぐらいしかしていません) 埴輪さん> > >子ウィンドウを作成して描画 > というのがいまいちよくわかりません。 > とにかく、渡されるHWND値(Windowsが先に用意したウインドウの制御ハンドルと理解しています。) > でもってそれが示すウインドウには描画できないのでしょうか・・・。 一般的なスクリーンセーバーの作り方だと思います。(おそらくMS公式の作り方だと思うのですがソースはわからないです) 私の知っている範囲では、このような作りをする理由は以下のようなものです。 コマンドラインから渡されるプレビューウィンドウのハンドルでは終了メッセージをうまく拾えません。 終了メッセージを受け取るためにはその子ウィンドウを作成して監視する必要があります。 (おそらく、リストボックスの内容が切り替わったらプレビューのウィンドウからその子ウィンドウにのみ 終了メッセージが送られるといったルールがあるのだと思います。) 「どうせ子ウィンドウを作るのだから描画もそこに行おう、もともとプレビューのウィンドウは自分専用のウィンドウじゃないし」 というのが理由だと思っています。 非表示の子ウィンドウを作ってメッセージの監視さえしておけば、プレビューのウィンドウを描画対象にしても動作はするようですが、 このような作りのスクリーンセーバーを見たことが無いので、もしかすると何らかの問題が起こるのかもしれません。
Re: SetUserWindow()がうまくいかない ( No.9 )
名前:管理人 日時:2010/12/26 19:21

> いっちさん 調べて頂きありがとうございます DxLib_Init に失敗する原因を修正しました m(_ _)m ( 凡ミスで SetUseDirectInputFlag の設定が無効になってしまっていました orz ) > それと SetUserWindow を使うと Log.txt が出力されなくなるのは仕様でしょうか? はい、そうです ただなんで Log.txt を出力しないようにするのか自分で組んでおきながらよく分かりません・・・ というわけで、SetUserWindow を使用しても Log.txt が出力されるようにしました (・・; > 埴輪さん よろしければバグを修正したこちらのライブラリをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: SetUserWindow()がうまくいかない ( No.10 )
名前:いっち 日時:2010/12/27 23:01

管理人さん> 修正確認しました。対応ありがとうございます。

Page: 1 |