トップページ⇒tech
1001コメント212KB

Win32API質問箱 Build91

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/11/08(月) 02:01:42
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんや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:11
TerminateThreadを無視するとはけしからん
0653デフォルトの名無しさん2010/12/03(金) 18:59:23
TerminateThread( hKusoThread );
06546402010/12/03(金) 19:32:52
AddFontMemResourceExで出来ました。
0655デフォルトの名無しさん2010/12/04(土) 10:37:23
650=652
0656デフォルトの名無しさん2010/12/04(土) 11:33:24
656==656
0657デフォルトの名無しさん2010/12/04(土) 11:35:30
657===657
0658デフォルトの名無しさん2010/12/04(土) 12:07:19
定期あげ
0659デフォルトの名無しさん2010/12/04(土) 19:45:24
CopyRectあげ
0660デフォルトの名無しさん2010/12/04(土) 20:16:18
そのAPIはない!
0661デフォルトの名無しさん2010/12/04(土) 20:17:21
互換性のためにうんぬんかんぬん…
0662デフォルトの名無しさん2010/12/05(日) 01:01:14
誰かRaymond ChenにCopyRectの歴史を訊いてくれ
0663デフォルトの名無しさん2010/12/05(日) 01:17:38
GetWindowには、ループ中で使うと相手のウィンドウが途中で消えたりZ座標が変わったりした場合に問題が起きますが、
FindWindowExにはそのような問題はないのでしょうか?
最初にhwndChildAfter=NULLで呼び出したときにウィンドウツリーのスナップショットを持っていてくれればよいのですが、
EnumChildWindowsの場合と違って、スナップショットのメモリを解放すべき時期がWin32には分からないように思えます。
0664デフォルトの名無しさん2010/12/05(日) 02:22:06
スナップショット持っててもウィンドウがなくなってたらどうしようもないな
0665デフォルトの名無しさん2010/12/05(日) 04:42:27
Win64API本って買っといた方がいいの?
ヤフオクとかで安く出てるけど。
0666デフォルトの名無しさん2010/12/05(日) 04:43:37
ゴミだから手放すんだろ
0667デフォルトの名無しさん2010/12/05(日) 09:07:26
API自体はほとんど Win32 API とおなじで
一部 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:05
http://ja.wikipedia.org/wiki/64%E3%83%93%E3%83%83%E3%83%88
0669デフォルトの名無しさん2010/12/05(日) 19:48:55
定期あげ
0670デフォルトの名無しさん2010/12/05(日) 21:06:47
教えてください。

例えばコントロールAのクライアント内でマウスをクリックする度に
画像を切り替えていく処理を作っていてBitBltで実現しているのですが、
描画する度に前回の描画状態が残ってしまいます。

InvalidateRect( NULL, NULL, TRUE );でやると前回の描画状態も
消えてくれるのですが、画面全体がちらついてしまうので
やはり対象のコントロールAのクライアント領域に対してのみ
前回描画状態のリフレッシュをやったあと描画をやりたいのですが
どういうやり方でやればいいのでしょうか?


色々試したのですがどうしてもできません。
よろしくお願いします。
0671デフォルトの名無しさん2010/12/05(日) 21:07:41
ダブルバッファでggrks
0672デフォルトの名無しさん2010/12/05(日) 21:12:25
WPF使えばいいのに・・・
0673デフォルトの名無しさん2010/12/05(日) 21:30:59
>>670
せめて、第一引数にウインドウハンドル入れるんだ。改善しないと思うけど。
第二引数はGetCliantRectでとったものを入れるのが望ましく、
第三引数はFALSEにしておいて、ウインドウ全体をかきかえるのが望ましいかな。

ダーティレクトは捨てるんだ。
0674デフォルトの名無しさん2010/12/05(日) 21:31:59
覚えること多いから手間考えるとお勧めはできない
0675デフォルトの名無しさん2010/12/05(日) 22:21:58
>描画する度に前回の描画状態が残ってしまいます。

>前回描画状態のリフレッシュをやったあと描画をやりたいのですが

消したいのか残したいのかどっちなんだ?
06766702010/12/05(日) 22:54:07
>>675
コントロール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:36
ちゃんとクリッピングしないからだ
0678デフォルトの名無しさん2010/12/05(日) 23:28:25
サブクラス化してるんだったら
継承元のDefaultWindowProc呼び忘れてるんだろうな
0679デフォルトの名無しさん2010/12/06(月) 00:58:51
>>676
何でサブクラス化したりBitBltしたり面倒なことをしているのか?
SS_BITMAPを使うならSTM_SETIMAGEやSTN_CLICKEDを調べたらどうか?
0680デフォルトの名無しさん2010/12/06(月) 01:06:56
いいからAPI出せや
0681デフォルトの名無しさん2010/12/06(月) 01:10:34
Twitter API
0682デフォルトの名無しさん2010/12/06(月) 01:33:59
あたいのポケットには1円しか入ってない
06836702010/12/06(月) 01:45:35
>>679
BitBltやっているのは画像の一部分(背景色)を透明化している為です。

>>STN_CLIKEDを調べたらどうか?
マジありがとうございます!
そいつの存在を忘れていました。


結局この時間帯まで頑張ってできなかった・・。
ソース一式晒したほうがいいでしょうか?
0684デフォルトの名無しさん2010/12/06(月) 02:24:27
>>683
晒せ
0685デフォルトの名無しさん2010/12/06(月) 02:27:27
俺の人生を最高にするAPI教えてくれ!!
0686デフォルトの名無しさん2010/12/06(月) 02:27:48
GetClientRect+MapWindowPointsで
親ウィンドウに自ウィンドウ矩形範囲のInvalidateRectをかけてやると
うまく動作するのは確認した。
CS_PARENTDCの付いたウィンドウは、
ウィンドウ矩形位しか管理していないと考えて扱うべきなのかなあ。
06876702010/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処理は今までそんなに触ってこなかったので
他にも色々指摘してくれると助かります。
※ツールの内容は勉強を含めて自己満の世界なので触れないでやってください・・


では、時間がほんとにやばいので寝ます。
06886702010/12/06(月) 03:31:47
あと言い忘れてましたがPIF.exeを起動した後に表示される
左したあたりの画像をクリックしてもらえるとなんとなく自分が
やりたいことがわかると思います。

クリック場所はクライアント座標の「600, 460」あたりです。
座標の設定ファイルはPIF.posファイルなので適当に眺めてみてください。

よろしくお願いします
0689デフォルトの名無しさん2010/12/06(月) 19:25:47
定期あげ
0690デフォルトの名無しさん2010/12/06(月) 19:42:59
ビットブリット屁が出た
0691デフォルトの名無しさん2010/12/06(月) 20:05:48
>>687
改造してみた。
適当にデバッグしてドヤ顔しようとおもったらドップリはまったわ。
しかし、そこはかとなくバグってるから、適当に使える部分だけマージしてくれ。

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
俺691だけど。
普段コントロールなんかまったく使わんから勉強になったよ。
しかも直接生成するのはもっと無いな。

普段あんまりでかいコード書かないのもあるけどね。
06946702010/12/06(月) 20:32:21
いま仕事から戻りました。

>>691
ぐおおおおおおおお!!
解決のヒントぐらいだと思っていたのですが、改造までしてくれるとは・・・・。
しかも、posファイルの座標調整までしてくれるなんてお礼の言葉もありません。

さっそく差分見てどこが原因だったのか調べてみます。
いい勉強材料になりそうです。ありがとうございました。
0695デフォルトの名無しさん2010/12/06(月) 20:44:32
>>694
追加したハンドル開放してないとか色々不具合あるからきをつけてね。
コードのこぴぺは絶対やめるんだ。とだけいっとくか。
0696デフォルトの名無しさん2010/12/06(月) 22:24:26
まーた懐かしいゲームだなおい
年齢は俺と同じぐらいかw
0697デフォルトの名無しさん2010/12/07(火) 18:53:14
定期あげ
0698デフォルトの名無しさん2010/12/07(火) 18:54:32
スニッピングが効いてるならありだと思う。
ウィンドウズでごみ箱がgで移動すれば便利だけど、日本人は損してる。
0699デフォルトの名無しさん2010/12/08(水) 08:06:13
gomibakoにでも名前を変更すればいいだけだろ
0700デフォルトの名無しさん2010/12/08(水) 09:16:44
定期あげ
0701デフォルトの名無しさん2010/12/08(水) 13:42:20
うちはよく使うアイコンはみんな「gごみ箱」「cマイコンピュータ」とかに変えて一発で飛べるようにしてる
0702デフォルトの名無しさん2010/12/08(水) 13:46:39
ご マ で移動するけど?
0703デフォルトの名無しさん2010/12/08(水) 15:34:04
ここで質問していいか微妙ですが、
一瞬しか表示されないウィンドウがありまして、そいつをキャプションかなにかで監視して、表示したままにできるツール知ってる方いますか?
spy++ならできるっぽいですが、フリーのものを探してます。
0704デフォルトの名無しさん2010/12/08(水) 16:00:30
>>703
VCなら、デバッガでブレークポイント打つとか。
0705デフォルトの名無しさん2010/12/08(水) 16:20:22
>>704
ありがとうございます。
ですが、そのウィンドウ(ダイヤログ?)を表示してるのは、自分で作ったものじゃないんです。
痛し痒しです。
0706デフォルトの名無しさん2010/12/08(水) 17:17:51
エッチなまうまう?
0707デフォルトの名無しさん2010/12/08(水) 17:47:41
エッチしてるなう
0708デフォルトの名無しさん2010/12/08(水) 17:57:49
タブコントロールで、タブの位置を左右にした場合に
タブを縦じゃなくて、上下に表示したときと同じように
横向きで表示する方法ある?
0709デフォルトの名無しさん2010/12/08(水) 18:26:57
>>705
いや
それでもデバッガでとめられるんだよ
0710デフォルトの名無しさん2010/12/08(水) 18:53:59
定期あげ
0711デフォルトの名無しさん2010/12/08(水) 20:20:40
>>709
なるほど…そういったことができそうなデバッガを探してみます。ありがとうございました。フリーでありますかね…
0712デフォルトの名無しさん2010/12/08(水) 20:21:58
初心者で申し訳ありませんが、
指定ファイルが削除可能かどうかのチェックをしたいのですがどのようにすればよいでしょうか?

2個セットのファイルがあり、両方を確実に削除できることを確認後に削除を行います。
ファイルの削除自体はDeleteFile関数で削除します。
0713デフォルトの名無しさん2010/12/08(水) 20:24:53
>>712
消してみてからエラー内容で判定すればいい
07147122010/12/08(水) 20:28:30
>>713
いえ、仮にAとBのファイルが存在して、
Aは削除可能、Bは削除不可の場合、 AとBの削除が可能な場合を確認して両方を削除します。
Aが削除成功後にBで失敗というケースがあるので、その方法は無理です(^^;


0715デフォルトの名無しさん2010/12/08(水) 20:34:09
Aをどこかにコピーしておいて戻せばいいじゃん
0716デフォルトの名無しさん2010/12/08(水) 20:35:26
DeleteFileTransacted
0717デフォルトの名無しさん2010/12/08(水) 20:37:17
FILE_SHARE_DELETEで開け
0718デフォルトの名無しさん2010/12/09(木) 09:37:27
定期あげ
0719デフォルトの名無しさん2010/12/09(木) 15:47:01
BItBltで描画してんだけど、ウィンドウを移動させて画面の端を突き抜けて
また戻してくると、そのはみでた部分だけ背景色になっちゃいます。
なのでそのときに再描画させたいんですが、
なんかちょうどいいウィンドウメッセージないですか?

タイマー以外の方法でよろしくお願いします。
0720デフォルトの名無しさん2010/12/09(木) 16:00:10
WM_PAINT
0721デフォルトの名無しさん2010/12/09(木) 16:02:28
そうじゃなくて、Wm_Paintをその描画タイミングで発生させたいんです
つまりInvalidateRect関数を実行するんですが、それを発生させる
タイミングとしてちょうどいいメッセージはないのかを聞いてます。
0722デフォルトの名無しさん2010/12/09(木) 16:11:17
windowsによって勝手に無効領域に設定されるから何もする必要はない
0723デフォルトの名無しさん2010/12/09(木) 16:52:54
画面をはみ出したら自動的に無効領域として設定されるので、
自動的にwm_paintが発生するということですか?

描画の処理を、WM_paintのメッセージが発生したときに動作する場所に
書いてるはずなのに、描画されないんですが。
0724デフォルトの名無しさん2010/12/09(木) 16:57:24
>>723
WM_PAINTの処理書いてるところにブレークポイント張ってみればいい
0725デフォルトの名無しさん2010/12/09(木) 18:57:44
MoveWindow関数で、ウィンドウを動かさずにサイズだけ変更したい時は、どうすればいいですか?
0726デフォルトの名無しさん2010/12/09(木) 18:59:41
WindowRectとって左上がウインドウのポジションだからそれを指定すればいい。
大きさはご自由に。
0727デフォルトの名無しさん2010/12/09(木) 19:03:33
SetWindowPosも忘れないであげて……
0728デフォルトの名無しさん2010/12/09(木) 19:13:46
CopyRectも忘れないであげて……
0729デフォルトの名無しさん2010/12/09(木) 19:37:40
>>725-728
SetWindowPosを使う事にしました。
いろいろありがとうございました。
0730デフォルトの名無しさん2010/12/09(木) 23:05:02
CopyRectは忘れてやれよ。
0731デフォルトの名無しさん2010/12/09(木) 23:55:04
お礼されてCopyRectマジ歓喜
0732デフォルトの名無しさん2010/12/10(金) 01:27:25
でも実際、CopyRectは昔は必要だったんだよね?
CopyRectがなかったらMFCとか.NETとかWindowsとか生まれてないじゃん
0733デフォルトの名無しさん2010/12/10(金) 01:53:16
水平スクロールバーの付いたウインドウの下に、
ステータスバーをくっつけるのって、どうやればいいのでしょうか?

現在は、CreatwWindowEx で水平スクロールバー付きの親ウインドウを作成して、
WM_CRATEメッセージで、CreateStatusWindow にてステータスバーの子ウインドウを
作成したのですが、ステータスバーの下にスクロールバーが付いた状態になってます。
0734デフォルトの名無しさん2010/12/10(金) 03:32:55
>>733
親ウィンドウにスクロールバーをつけるのではなく、クライアント領域を覆う子ウィンドウ(MFC的にいうならビュー)を作ってそれにスクロールバーをつけることでしょうな。
つまりビューとステイタスバーを兄弟にするのです。
0735デフォルトの名無しさん2010/12/10(金) 12:55:08
CopyRectがなければWindowsもなかったんですよね?
0736デフォルトの名無しさん2010/12/10(金) 14:32:52
じゃあお前らCopyRectなしで構造体コピーしてみろや
0737デフォルトの名無しさん2010/12/10(金) 16:52:26
winプログラミング歴16年ほどだけど、CopyRectって知らんかも
0738デフォルトの名無しさん2010/12/10(金) 18:00:57
rect1 = rect2;
0739デフォルトの名無しさん2010/12/10(金) 20:28:25
エディットボックスの背景に画像を描画することは無理ですよね?
0740デフォルトの名無しさん2010/12/10(金) 20:30:06
そんなことはない
なせばなる
0741デフォルトの名無しさん2010/12/10(金) 20:37:47
ざっくりでいいんで簡単に教えてください。
0742デフォルトの名無しさん2010/12/10(金) 20:39:30
サブクラス化してWM_イレイズバックグラウンドを処理すりゃいい
0743デフォルトの名無しさん2010/12/10(金) 20:42:56
>>742
そんなメッセージあったのか。ありがとうございます。
0744デフォルトの名無しさん2010/12/10(金) 21:07:19
WM_ERASEBKGNDなんてものがあったのか
0745デフォルトの名無しさん2010/12/10(金) 21:22:06
ttp://codezine.jp/article/detail/3663
このサイトの内容を参考に、プログラムを組んでみた所
映像は正しく描画されたのですが、終了しようとすると

MediaPlayer.exe の 0x641d3a76 で初回の例外が発生しました: 0xC0000005: Access violation
MediaPlayer.exe の 0x641d3a76 でハンドルされていない例外が発生しました: 0xC0000005: Access violation

このようなエラーが出てきてしまいます。
エラーメッセージで調べてみたりはしたのですが、解決法が分かりませんでした。
どなたか解決法をご存じないでしょうか?
0746デフォルトの名無しさん2010/12/10(金) 21:23:19
破棄する順番じゃねーの
0747デフォルトの名無しさん2010/12/10(金) 21:28:10
>>746
なんと、その通りでした。
お早い回答ありがとうございました。
0748デフォルトの名無しさん2010/12/11(土) 10:21:37
>>742
スーパークラスの方がいいな
0749デフォルトの名無しさん2010/12/11(土) 12:26:53
定期あげ
0750デフォルトの名無しさん2010/12/11(土) 12:47:29
定期CopyRect
0751デフォルトの名無しさん2010/12/11(土) 12:57:43
CopyRectはVBをやるのに必要と聞いたけどホント?
■ このスレッドは過去ログ倉庫に格納されています