Win32API質問箱 Build91
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/11/08(月) 02:01:42やさしいお兄さんやHなお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!
■過去スレ
Win32API質問箱 Build90
http://hibari.2ch.net/test/read.cgi/tech/1287205063/
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage
過去スレはwikiから探してください。
0652デフォルトの名無しさん
2010/12/03(金) 18:40:110653デフォルトの名無しさん
2010/12/03(金) 18:59:230654640
2010/12/03(金) 19:32:520655デフォルトの名無しさん
2010/12/04(土) 10:37:230656デフォルトの名無しさん
2010/12/04(土) 11:33:240657デフォルトの名無しさん
2010/12/04(土) 11:35:300658デフォルトの名無しさん
2010/12/04(土) 12:07:190659デフォルトの名無しさん
2010/12/04(土) 19:45:240660デフォルトの名無しさん
2010/12/04(土) 20:16:180661デフォルトの名無しさん
2010/12/04(土) 20:17:210662デフォルトの名無しさん
2010/12/05(日) 01:01:140663デフォルトの名無しさん
2010/12/05(日) 01:17:38FindWindowExにはそのような問題はないのでしょうか?
最初にhwndChildAfter=NULLで呼び出したときにウィンドウツリーのスナップショットを持っていてくれればよいのですが、
EnumChildWindowsの場合と違って、スナップショットのメモリを解放すべき時期がWin32には分からないように思えます。
0664デフォルトの名無しさん
2010/12/05(日) 02:22:060665デフォルトの名無しさん
2010/12/05(日) 04:42:27ヤフオクとかで安く出てるけど。
0666デフォルトの名無しさん
2010/12/05(日) 04:43:370667デフォルトの名無しさん
2010/12/05(日) 09:07:26一部 64bit専用の API が追加されてることと
データ型のサイズに気をつけることと
あとまぁちょっとぐらいなにかあったかもしれない。
本はちゃんと読んでないからわからないけど
最初の方で Win64 でのプログラミングに関して
注意する点だけ書いて
あとは Win32本と基本的に同じなんじゃないかな。
一応 MSDN に情報はある。
64 ビット Windows プログラミング ガイド
http://msdn.microsoft.com/ja-jp/library/bb427430(v=VS.85).aspx
0668デフォルトの名無しさん
2010/12/05(日) 10:14:050669デフォルトの名無しさん
2010/12/05(日) 19:48:550670デフォルトの名無しさん
2010/12/05(日) 21:06:47例えばコントロールAのクライアント内でマウスをクリックする度に
画像を切り替えていく処理を作っていてBitBltで実現しているのですが、
描画する度に前回の描画状態が残ってしまいます。
InvalidateRect( NULL, NULL, TRUE );でやると前回の描画状態も
消えてくれるのですが、画面全体がちらついてしまうので
やはり対象のコントロールAのクライアント領域に対してのみ
前回描画状態のリフレッシュをやったあと描画をやりたいのですが
どういうやり方でやればいいのでしょうか?
色々試したのですがどうしてもできません。
よろしくお願いします。
0671デフォルトの名無しさん
2010/12/05(日) 21:07:410672デフォルトの名無しさん
2010/12/05(日) 21:12:250673デフォルトの名無しさん
2010/12/05(日) 21:30:59せめて、第一引数にウインドウハンドル入れるんだ。改善しないと思うけど。
第二引数はGetCliantRectでとったものを入れるのが望ましく、
第三引数はFALSEにしておいて、ウインドウ全体をかきかえるのが望ましいかな。
ダーティレクトは捨てるんだ。
0674デフォルトの名無しさん
2010/12/05(日) 21:31:590675デフォルトの名無しさん
2010/12/05(日) 22:21:58>前回描画状態のリフレッシュをやったあと描画をやりたいのですが
消したいのか残したいのかどっちなんだ?
0676670
2010/12/05(日) 22:54:07コントロールAの領域がクリックされる
↓
画像1をBitBltでコントロールAのクライアント領域に描画
↓
コントロールAの領域がクリックされる
↓
画像2をBitBltでコントロールAのクライアント領域に描画
↓
コントロールAの領域がクリックされる
↓
コントロールAの領域に描画されている状態をクリア(消す)
これがやりたいのです。
コントロールAはCreateWindowExで生成しており、
WC_STATICWとWS_CHILD | WS_VISIBLE | SS_BITMAPを指定しています。
上記のハンドルをサブクラス化して「WM_NCHITTEST」のタイミングで
そのコントロールに対してBitBltを行った後、InvalidateRect()を呼び出して
画像を描画しているのですが、画像1と2の切り替えは都度描画されるので
上手くいき、最後の画像を消すという処理がうまくいってない状態にあります。
画像を消す処理は単純にInvalidateRect( hWnd, NULL, TRUE );を行い
WM_PAINTでBeginPaint()を呼べば描画状態が初期化されると思っていたのですが
そうでもないみたいで、手詰まりの状態です・・。
正直こういう描画関連の処理はいままでそれほどやってきたことがないので、
単純に知識不足なのでしょうが、自分が思い浮かんだ解決策として
画像をもう一つ用意してその画像の背景色を透明化(スプライト)させて
BitBltで描画という手法があるにはあるのですが、可能であればそういう事をせずに
解決できればと思っています。何かいい案があれば教えてください。
>>671
教えていただいてありがとうございます。それも一つの案として他にも何かないかもう少し探してみます。
0677デフォルトの名無しさん
2010/12/05(日) 23:08:360678デフォルトの名無しさん
2010/12/05(日) 23:28:25継承元のDefaultWindowProc呼び忘れてるんだろうな
0679デフォルトの名無しさん
2010/12/06(月) 00:58:51何でサブクラス化したりBitBltしたり面倒なことをしているのか?
SS_BITMAPを使うならSTM_SETIMAGEやSTN_CLICKEDを調べたらどうか?
0680デフォルトの名無しさん
2010/12/06(月) 01:06:560681デフォルトの名無しさん
2010/12/06(月) 01:10:340682デフォルトの名無しさん
2010/12/06(月) 01:33:590683670
2010/12/06(月) 01:45:35BitBltやっているのは画像の一部分(背景色)を透明化している為です。
>>STN_CLIKEDを調べたらどうか?
マジありがとうございます!
そいつの存在を忘れていました。
結局この時間帯まで頑張ってできなかった・・。
ソース一式晒したほうがいいでしょうか?
0684デフォルトの名無しさん
2010/12/06(月) 02:24:27晒せ
0685デフォルトの名無しさん
2010/12/06(月) 02:27:270686デフォルトの名無しさん
2010/12/06(月) 02:27:48親ウィンドウに自ウィンドウ矩形範囲のInvalidateRectをかけてやると
うまく動作するのは確認した。
CS_PARENTDCの付いたウィンドウは、
ウィンドウ矩形位しか管理していないと考えて扱うべきなのかなあ。
0687670
2010/12/06(月) 03:26:56解決できないとなかなか寝る気になれないですね。
でも、でも流石にもう限界なので寝ます
>>684
ソースは下記にうpしました。
http://uproda.2ch-library.com/lib320763.zip.shtml
パスは「win32api」
環境はVisual Studio 2008 Proです。
問題個所は「PIFSubClassProc.c」の154行目(InvalidateRect)
あたりというか「WM_NCHITTEST」と「WM_PAINT」全体だと思います。
WM_PAINT処理は今までそんなに触ってこなかったので
他にも色々指摘してくれると助かります。
※ツールの内容は勉強を含めて自己満の世界なので触れないでやってください・・
では、時間がほんとにやばいので寝ます。
0688670
2010/12/06(月) 03:31:47左したあたりの画像をクリックしてもらえるとなんとなく自分が
やりたいことがわかると思います。
クリック場所はクライアント座標の「600, 460」あたりです。
座標の設定ファイルはPIF.posファイルなので適当に眺めてみてください。
よろしくお願いします
0689デフォルトの名無しさん
2010/12/06(月) 19:25:470690デフォルトの名無しさん
2010/12/06(月) 19:42:590691デフォルトの名無しさん
2010/12/06(月) 20:05:48改造してみた。
適当にデバッグしてドヤ顔しようとおもったらドップリはまったわ。
しかし、そこはかとなくバグってるから、適当に使える部分だけマージしてくれ。
ttp://www1.axfc.net/uploader/File/so/55241.zip&key=dl
0692デフォルトの名無しさん
2010/12/06(月) 20:16:09直接描画で対応してしまった方が手っ取り早い気がするな。
0693デフォルトの名無しさん
2010/12/06(月) 20:28:45普段コントロールなんかまったく使わんから勉強になったよ。
しかも直接生成するのはもっと無いな。
普段あんまりでかいコード書かないのもあるけどね。
0694670
2010/12/06(月) 20:32:21>>691
ぐおおおおおおおお!!
解決のヒントぐらいだと思っていたのですが、改造までしてくれるとは・・・・。
しかも、posファイルの座標調整までしてくれるなんてお礼の言葉もありません。
さっそく差分見てどこが原因だったのか調べてみます。
いい勉強材料になりそうです。ありがとうございました。
0695デフォルトの名無しさん
2010/12/06(月) 20:44:32追加したハンドル開放してないとか色々不具合あるからきをつけてね。
コードのこぴぺは絶対やめるんだ。とだけいっとくか。
0696デフォルトの名無しさん
2010/12/06(月) 22:24:26年齢は俺と同じぐらいかw
0697デフォルトの名無しさん
2010/12/07(火) 18:53:140698デフォルトの名無しさん
2010/12/07(火) 18:54:32ウィンドウズでごみ箱がgで移動すれば便利だけど、日本人は損してる。
0699デフォルトの名無しさん
2010/12/08(水) 08:06:130700デフォルトの名無しさん
2010/12/08(水) 09:16:440701デフォルトの名無しさん
2010/12/08(水) 13:42:200702デフォルトの名無しさん
2010/12/08(水) 13:46:390703デフォルトの名無しさん
2010/12/08(水) 15:34:04一瞬しか表示されないウィンドウがありまして、そいつをキャプションかなにかで監視して、表示したままにできるツール知ってる方いますか?
spy++ならできるっぽいですが、フリーのものを探してます。
0704デフォルトの名無しさん
2010/12/08(水) 16:00:30VCなら、デバッガでブレークポイント打つとか。
0705デフォルトの名無しさん
2010/12/08(水) 16:20:22ありがとうございます。
ですが、そのウィンドウ(ダイヤログ?)を表示してるのは、自分で作ったものじゃないんです。
痛し痒しです。
0706デフォルトの名無しさん
2010/12/08(水) 17:17:510707デフォルトの名無しさん
2010/12/08(水) 17:47:410708デフォルトの名無しさん
2010/12/08(水) 17:57:49タブを縦じゃなくて、上下に表示したときと同じように
横向きで表示する方法ある?
0709デフォルトの名無しさん
2010/12/08(水) 18:26:57いや
それでもデバッガでとめられるんだよ
0710デフォルトの名無しさん
2010/12/08(水) 18:53:590711デフォルトの名無しさん
2010/12/08(水) 20:20:40なるほど…そういったことができそうなデバッガを探してみます。ありがとうございました。フリーでありますかね…
0712デフォルトの名無しさん
2010/12/08(水) 20:21:58指定ファイルが削除可能かどうかのチェックをしたいのですがどのようにすればよいでしょうか?
2個セットのファイルがあり、両方を確実に削除できることを確認後に削除を行います。
ファイルの削除自体はDeleteFile関数で削除します。
0713デフォルトの名無しさん
2010/12/08(水) 20:24:53消してみてからエラー内容で判定すればいい
0714712
2010/12/08(水) 20:28:30いえ、仮にAとBのファイルが存在して、
Aは削除可能、Bは削除不可の場合、 AとBの削除が可能な場合を確認して両方を削除します。
Aが削除成功後にBで失敗というケースがあるので、その方法は無理です(^^;
0715デフォルトの名無しさん
2010/12/08(水) 20:34:090716デフォルトの名無しさん
2010/12/08(水) 20:35:260717デフォルトの名無しさん
2010/12/08(水) 20:37:170718デフォルトの名無しさん
2010/12/09(木) 09:37:270719デフォルトの名無しさん
2010/12/09(木) 15:47:01また戻してくると、そのはみでた部分だけ背景色になっちゃいます。
なのでそのときに再描画させたいんですが、
なんかちょうどいいウィンドウメッセージないですか?
タイマー以外の方法でよろしくお願いします。
0720デフォルトの名無しさん
2010/12/09(木) 16:00:100721デフォルトの名無しさん
2010/12/09(木) 16:02:28つまりInvalidateRect関数を実行するんですが、それを発生させる
タイミングとしてちょうどいいメッセージはないのかを聞いてます。
0722デフォルトの名無しさん
2010/12/09(木) 16:11:170723デフォルトの名無しさん
2010/12/09(木) 16:52:54自動的にwm_paintが発生するということですか?
描画の処理を、WM_paintのメッセージが発生したときに動作する場所に
書いてるはずなのに、描画されないんですが。
0724デフォルトの名無しさん
2010/12/09(木) 16:57:24WM_PAINTの処理書いてるところにブレークポイント張ってみればいい
0725デフォルトの名無しさん
2010/12/09(木) 18:57:440726デフォルトの名無しさん
2010/12/09(木) 18:59:41大きさはご自由に。
0727デフォルトの名無しさん
2010/12/09(木) 19:03:330728デフォルトの名無しさん
2010/12/09(木) 19:13:460729デフォルトの名無しさん
2010/12/09(木) 19:37:40SetWindowPosを使う事にしました。
いろいろありがとうございました。
0730デフォルトの名無しさん
2010/12/09(木) 23:05:020731デフォルトの名無しさん
2010/12/09(木) 23:55:040732デフォルトの名無しさん
2010/12/10(金) 01:27:25CopyRectがなかったらMFCとか.NETとかWindowsとか生まれてないじゃん
0733デフォルトの名無しさん
2010/12/10(金) 01:53:16ステータスバーをくっつけるのって、どうやればいいのでしょうか?
現在は、CreatwWindowEx で水平スクロールバー付きの親ウインドウを作成して、
WM_CRATEメッセージで、CreateStatusWindow にてステータスバーの子ウインドウを
作成したのですが、ステータスバーの下にスクロールバーが付いた状態になってます。
0734デフォルトの名無しさん
2010/12/10(金) 03:32:55親ウィンドウにスクロールバーをつけるのではなく、クライアント領域を覆う子ウィンドウ(MFC的にいうならビュー)を作ってそれにスクロールバーをつけることでしょうな。
つまりビューとステイタスバーを兄弟にするのです。
0735デフォルトの名無しさん
2010/12/10(金) 12:55:080736デフォルトの名無しさん
2010/12/10(金) 14:32:520737デフォルトの名無しさん
2010/12/10(金) 16:52:260738デフォルトの名無しさん
2010/12/10(金) 18:00:570739デフォルトの名無しさん
2010/12/10(金) 20:28:250740デフォルトの名無しさん
2010/12/10(金) 20:30:06なせばなる
0741デフォルトの名無しさん
2010/12/10(金) 20:37:470742デフォルトの名無しさん
2010/12/10(金) 20:39:300743デフォルトの名無しさん
2010/12/10(金) 20:42:56そんなメッセージあったのか。ありがとうございます。
0744デフォルトの名無しさん
2010/12/10(金) 21:07:190745デフォルトの名無しさん
2010/12/10(金) 21:22:06このサイトの内容を参考に、プログラムを組んでみた所
映像は正しく描画されたのですが、終了しようとすると
MediaPlayer.exe の 0x641d3a76 で初回の例外が発生しました: 0xC0000005: Access violation
MediaPlayer.exe の 0x641d3a76 でハンドルされていない例外が発生しました: 0xC0000005: Access violation
このようなエラーが出てきてしまいます。
エラーメッセージで調べてみたりはしたのですが、解決法が分かりませんでした。
どなたか解決法をご存じないでしょうか?
0746デフォルトの名無しさん
2010/12/10(金) 21:23:190747デフォルトの名無しさん
2010/12/10(金) 21:28:10なんと、その通りでした。
お早い回答ありがとうございました。
0748デフォルトの名無しさん
2010/12/11(土) 10:21:37スーパークラスの方がいいな
0749デフォルトの名無しさん
2010/12/11(土) 12:26:530750デフォルトの名無しさん
2010/12/11(土) 12:47:290751デフォルトの名無しさん
2010/12/11(土) 12:57:43■ このスレッドは過去ログ倉庫に格納されています