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

Win32API質問箱 Build20

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
ただし、最新スレくらいは質問する前に検索してくれ。というかしろ。

過去スレなどのリンクはたぶん>>2-5くらい。
0153150NGNG
>>152
thx
やっぱ自前描画が必要なのですね…
0154150NGNG
「カラムヘッダ」と「DC」でググったらよさげな情報みつかりました。
http://search.acty-net.ne.jp/mfc_search/archive/2000-2/msg02144.html
これを参考にしてみます。

「カラムヘッダ」「API」「ソートアイコン」とかでググってたので見落としてたようです。(;´Д`)
0155デフォルトの名無しさんNGNG
ExitThread について質問です。Thread の薄いラッパクラスを作成中なんですが、
SDK のドキュメントでは LPTHREAD_START_ROUTINE のリターン後、暗黙的に ExitThread が呼ばれるとありますが
何らかの処理中にメインスレッドから ExitThread を呼んだ場合、適切な後始末が行われないのでしょうか。
0156デフォルトの名無しさんNGNG
CreateThreadで作ったスレッドの場合は問題ない
0157デフォルトの名無しさんNGNG
>>156
なるほど問題ないのですか。サンクスです。
因みに CreateThread で作成したスレッドに対してでした。抜けてましたね。すいませんん。

ところで ExitThread て明示的に呼び出す必要があるときってどんな時なんでしょう?
何らかの処理中に ExitThread を呼んだところで直ちにスレッドが終了するわけでは無いし(当たり前ですが)
イマイチ使いどころがわからんのですが…。
0158デフォルトの名無しさんNGNG
C++の場合、デストラクタが呼ばれないような気がするけど
大丈夫ッスか?
0159デフォルトの名無しさんNGNG
>>158
ダメです。
なので、ExitThread()は(余程注意しないと)使えません。
0160デフォルトの名無しさんNGNG
スタティックDLL だってさ(プ
0161デフォルトの名無しさんNGNG
不特定多数のウィンドウを作る際、
各ウィンドウに対する処理はどのようにして行うものなんでしょうか。
以前は

1 for文をまわしウィンドウを作成する。
 その際、外部で宣言したHWND型配列に各ハンドルを代入させる
2 プロシージャで引数として渡されるハンドルと、
 ウィンドウ作成時に用意しておいた各HWND配列から内容の同じものを
 探して見つける事で多数作られる中のどのウィンドウなのかを判別し
 それに応じて異なる処理をする。

この「どのウィンドウを現在扱っているか」をプロシージャ内で判別する方法が
ややこしいし、なんだかきたないので、
スマートな方法があったら教えてください
根本的に間違っていたら正してやってください
おねがいします
0162デフォルトの名無しさんNGNG
ぶらくらはいくない。
0163デフォルトの名無しさんNGNG
>>161
SetProp APIを使ってウィンドウハンドルに対して付加情報をむすびつけておくってのはどうよ?
0164デフォルトの名無しさんNGNG
ある文字の種別は GetStringTypeEx API をつかえば取れますが、
UNICODE で規定されているスクリプトタイプを調べる API はありますか?
0165デフォルトの名無しさんNGNG
>>161
for 分で Create しつつ登録する仕組みだと、WM_CREATE あたりのメッセージが
発生するときにはまだ登録されていなくて不便です。

なので、WM_NCCREATE を受けた段階で、CREATESTRUCT 経由で渡されたウィンドウを
識別する情報 (CreateWindow時に作っておく) と hWnd のマッピングを生成すると良いでしょう。
163 の言うように SetProp で登録しても良いし、std::map に入れたりしておいても良い。


「この「どのウィンドウを現在扱っているか」をプロシージャ内で判別する方法」は
GetProp とか std::map::operator [] 一発だから、別にややこしくはないと思う。
0166デフォルトの名無しさんNGNG
ふつー、ウィンドウ毎の情報はC++なりのクラスのメンバに格納して、そのオブジェクトへのポインタを
SetPropなりSetWindowLongなりThunkなりでウィンドウに関連付けて終わり。
0167デフォルトの名無しさんNGNG
>>163 >>165 >>166

ありがとうございます
今さらで申し訳ないのですがC++は自分は使えなくて
C言語でやっています
SetProp関数など今まで調べていたのですが
基本的な用語すらちゃんと理解できていないみたいで
具体的にどうすればいいかわかりませんでした
hWndのマッピング という言葉もよくわからないのです
ずうずうしいとは思いますが
相当なアホでもわかるように教えてもらえないでしょうか
0168デフォルトの名無しさんNGNG
C++を使えないってのがオブジェクト指向を理解できない知らないって意味なら悪いことは言わんからオブジェクト指向について勉強しろ。そのほうが後々楽になる。
0169デフォルトの名無しさんNGNG
ウインドウハンドルと関連データと対応付けてメッセージループ上で使用するのは、C++使う使わないに限らず、
オブジェクト指向とは関係ない、ただのロジック。
何故C++を使うだけでオブジェクト指向と言いたがるのか、さっぱり理解できない。
0170デフォルトの名無しさんNGNG
>>167
マッピングっていうのは、「hWnd から必要な情報への対応表」を作成するということ。
そうして、>>165 の前半でいっているのは、

for (int window_id = 0; window_id < 100; window_id++)
{
 my_data_table[window_id].data = hogehoge();
 my_data_table[window_id].hWnd = CreateWindow(...);
}
のようにしてしまうと、WM_CREATE の時にはまだ my_data_table[].hWnd が設定されていなくて
不便だから、CREATESTRUCT 経由で(この例だと) window_id を渡して、WM_NCCREATE で
my_data_table[window_id].hWnd = hWnd を実行すると良いよ、っていう話。
0171デフォルトの名無しさんNGNG
>>167
自分で調べてどうにかしようって気が無いんだったら、
グローバル変数に入れてって既存の方法使えば?
0172デフォルトの名無しさんNGNG
>>169
苦労したんだよ。察してあげな。
0173デフォルトの名無しさんNGNG
BMPを表示させる方法はテンプレサイトをみて分かったのですが、
JPGを表示させる方法が分かりません・・・
簡単にJPGを扱う方法はありませんか?
0174デフォルトの名無しさんNGNG
gdiplus系をぐぐれ
0175108NGNG
レストンクス
>>148を修正したら動きました
λ<アリガトー
0176デフォルトの名無しさんNGNG
>>173
あとはOleLoadPictureとかLoadImageとか。
ただしいずれもOSバージョンに制限あり。確認汁。
0177デフォルトの名無しさんNGNG
>>174
サンクスです
0178デフォルトの名無しさんNGNG
依存するのはOSのバージョンではなくIEのバージョン。
0179デフォルトの名無しさんNGNG
釣られませんよ( ̄ー ̄)ニヤリッ
0180デフォルトの名無しさんNGNG
OleLoadPictureは組み込まれているモジュールによって、出来ることが決まる。
JPEG用のモジュールが入っているのがIEなんだが、けっこう知らない人がいるのか。
その他、標準コントロールの拡張機能もIEのバージョンに依存する部分が多い。
0181デフォルトの名無しさんNGNG
Win32API質問箱 Build19
http://pc5.2ch.net/test/read.cgi/tech/1084697545/

>949 名前:デフォルトの名無しさん[sage] 投稿日:04/06/24 19:06
>今までDLLからウインドウを作ろうなんて考えもしなかったんだけど、
>DLLからCreateWindowをするとき、HINSTANCEにはDLLのインスタンスハンドルを指定するのですか?
>それともWinMainのHINSTANCEを指定すればいいのですか?
>NT系だと無視されるようなので、どちらが正しいかってのがちょっと分からないのですが。

催促ですみません、これわかる人いませんか?
0182167NGNG
>>170

わかりました!
ありがとうございます
これで外部変数は使わないで済みます。
SetPropの使い方については自分で勉強しながら確認していこうと思います。

>>168

オブジェクト指向ですか。
もうわからない事だらけでやらなきゃいけないこと
山のようにあるっぽいですが、色々調べて勉強してみます

>>171

一応結構長い時間調べたり、にらめっこしたりしてみたのですが
でもわかりませんでした。精進します

みなさんありがとうございました
助かりました。
0183デフォルトの名無しさんNGNG
(´∀`)ノシがんばってねー
0184デフォルトの名無しさんNGNG
>>181
試したわけじゃないけど、
作ろうとしてるウィンドウがどこにあるリソース(メニューとか)を使うかによるんじゃない?
普通はDLLに使うリソース入れるだろうから、DLLのHINSTANCEだと思うけど。
0185デフォルトの名無しさんNGNG
>>181
ウィンドウプロシージャの入っているモジュールの hInstance。
0186デフォルトの名無しさんNGNG
184 の方が正解っぽいぽ
0187デフォルトの名無しさんNGNG
>>184-186
レスありがとうございます。
ウインドクラスの場合は>>184で正しいと思うのですが、
CreateWindowの場合、メニューはリソースのIDではなく
メニューハンドルで指定しますよね?
リソースは影響しない気もするのですが、、、。
0188デフォルトの名無しさんNGNG
とりあえずやってみれば?
0189デフォルトの名無しさんNGNG
>>188
現状触れる範囲ではNT環境しかないもので、試せないのです。
0190デフォルトの名無しさんNGNG
そんなときこそVirtualPC(or VMware)ですよ
0191デフォルトの名無しさんNGNG
結局VirtualPCに9x系のOSインスコしないと動かんぞ。
0192デフォルトの名無しさんNGNG
>>181
プログラミングWindowsでは「どっちでも構わんが私はDLLを呼び出した側のインスタンスハンドルを使うことをすすめる」と書いてある。
0193デフォルトの名無しさんNGNG
>>192
ありがとうございました
0194デフォルトの名無しさんNGNG
ウィンアプリで長方形の範囲を塗りつぶすAPIはあるのでしょうか。
今はSetPixelVで点をいっぱい表示したり、
CreateFontで文字サイズを変えたのを1文字を表示する、
方法でやっているのですが、あるなら教えてください。
0195デフォルトの名無しさんNGNG
FillRect
0196194NGNG
>>195
ありがとうございます。やってみます。
0197デフォルトの名無しさんNGNG
ExtTextOutのほうが楽だけどな
0198194NGNG
>>197
ありがとうございます。こちらもやってみます。
0199デフォルトの名無しさんNGNG
デバイスコンテキストに描画領域を設定する方法ってありませんでしたっけ?
具体的にはWM_ERASEBKGNDである一部分だけ、再描画を停止したいのですが。
0200デフォルトの名無しさんNGNG
IntersectClipRect()みたいなやつか?
0201デフォルトの名無しさんNGNG
ListViewに数万アイテムを登録するとすごく時間がかかるのですが、
何とかこれを高速化する方法ないでしょうか?
ファイラーとかだとSysListView32のコントロールでも一瞬で表示されてるので、
やりようはあると思うのですが。
0202デフォルトの名無しさんNGNG
仮想リストビュー
0203デフォルトの名無しさんNGNG
親をHWND_DESKTOPにしてボタン作ったらスタイルにBS_PUSHBUTTONが含まれなくなりました
あとからSetWindowLongPtrとかやってもだめでした
いまのところ描写とかはうまくいってるのですがボタンであるのにBS_PUSHBUTTONでないと
問題が起きるとこってありますか?
0204デフォルトの名無しさんNGNG
>203
C:\bcc55\Include>grep BS_PUSHBUTTON winuser.h
File winuser.h:
#define BS_PUSHBUTTON 0x00000000L
0205デフォルトの名無しさんNGNG
>>204
あ... どうりでふくまれないはずですね
でも電卓とかのボタンをspy++で調べるとBS_PUSHBUTTONがあるのですが
今回作ったプログラムのボタンは、みかけは電卓とかのと一緒なのにふくまれません
なんでだろう...
0206デフォルトの名無しさんNGNG
文書管理用のツールを作ってみたいんだけど、勉強がてらグリッドやツリービュー、
画像のサムネールや拡大・縮小、なども自作してみたいです。
でもグリッド一つとってもどう実装していいのかさっぱり分かりません。

参考になる本はないですか?
または参考になるソースを入手するにはどうすればいいですか?
0207デフォルトの名無しさんNGNG
イベントとメッセージって何がどうちがうんですか?
02084 ◆MwGQyQRf/o NGNG
とりあえず、海外着いた
0209203.208.86.147NGNG
空港からだけど、アドレスはどうなんだろ?
0210デフォルトの名無しさんNGNG
>>209
オーストラリア乙
0211デフォルトの名無しさんNGNG
>>209
……楽しんでこいよ。
0212デフォルトの名無しさんNGNG
>>207
イベントはキーを押したり、マウスを動かしたり、タイマーの時間が経ったり、
起こった事で、メッセージはそれをOSがプログラムに伝えてくるものかな。
0213デフォルトの名無しさんNGNG
>>212
Windowsについてまだ勉強始めたばかりなのですが、
イベント=スレッド間の同期通信
メッセージ=スレッド間の非同期通信
という理解でとりあえずはいいんでしょうか?
0214デフォルトの名無しさんNGNG
>>213
全く違う。
イベントってのは、英語の event そのもの。メッセージも message そのもの。
一般名詞であって、そんなに狭い意味を持って使われてるわけじゃない。

Windows の中では、イベントというと
・イベントドリブン型プログラム、という文脈でのイベント。
 Windowメッセージのうち、ユーザやシステムから非同期的に発生するもの
 WM_LBUTTONDOWN とか。WM_SETFONT などは普通「イベント」とは言わない。
・CreateEvent で作られた同期・排他・待ち合わせ用オブジェクト
・COM オブジェクトからの event sink インターフェイスへの呼び出し。
など諸々。

メッセージは、
・GetMessage や PeekMessage で得られる、ウィンドウメッセージ
・MAPI で転送されるメッセージ

など。
0215デフォルトの名無しさんNGNG
♪これっくらいのっ
 イベント箱にっ
 おにぎり おにぎり
 チョイと詰めて
 あがり コーヒー ゆず さくらっ
0216デフォルトの名無しさんNGNG
>>201
今MSDN開けない環境なんでうろおぼえだけど、
リストの更新(追加)時に更新描画をさせないようにするメッセージかなんかがあったはず。
それで描画をOFFにしておけばそこそこ速度が稼げた気がする。
0217デフォルトの名無しさんNGNG
>>216

SendMessage(hListView, WM_SETREDRAW, 0, 0);

ここで項目追加

SendMessage(hListView, WM_SETREDRAW, 1, 0);
0218デフォルトの名無しさんNGNG
すっげー初歩的な質問かもしれないけどさ

WIN32APIって何?
0219デフォルトの名無しさんNGNG
>>218
32ビット版Windowsが用意している関数群。
Cのライブラリ関数には必要ないけど、Windows用プログラム製作には必要なものが揃っている。
0220デフォルトの名無しさんNGNG
>>218
>>3
0221デフォルトの名無しさんNGNG
>>216-217
201じゃないが、いい事を教えてもらった。Thx
0222デフォルトの名無しさんNGNG
>>219
必要なくはないだろ。
0223デフォルトの名無しさんNGNG
MSVCRTの扱いは微妙なとこだが・・・
0224デフォルトの名無しさんNGNG
>>215
名古屋出身かよ!
0225デフォルトの名無しさんNGNG
WinMain関数について質問なんですが、MSDNに

戻り値
関数が WM_QUIT メッセージを受け取って正常に終了する場合は、メッセージの wParam パラメータに格納されている終了コードを返してください。関数がメッセージループに入る前に終了する場合は、0 を返してください。

と書いてあります

しかし、DirectX9のマイクロソフトのサンプルコードには、

// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );

// Enter the message loop
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}

と0を返しています
これでもいいのでしょうか?
0226デフォルトの名無しさんNGNG
WinInetで接続時のタイムアウトを設定する方法はありますか?
INTERNET_OPTION_CONTROL_CONNECT_TIMEOUTとか
設定してみたけど反映されてないっぽいのですよ・・

・・どなたかご存知ないでしょうか?
0227デフォルトの名無しさんNGNG
IE5.5だかあたりの時代のWinInetはタイムアウトがまともに動かないんで非同期API使って自力でタイムアウトしろとか言われてた気がするが。
0228デフォルトの名無しさんNGNG
>>225
WM_DESTROYでPostQuitMessage(0);なんて決め打ちしていたら別に同じ。
それにWinMain(main)の戻り値はWindowsが使うんじゃなくて、ユーザが使うものなんだけど、
ウィンドウズではまず間違いなく使われていない(それに使う手段がないに等しい)から別にいい。
0229デフォルトの名無しさんNGNG
>>228
そうなんですか
プログラム終了時に、0が返ってくるとなにかxpとかがカチンと来るのかなと思っていたのですが、
大丈夫なようですね
0230デフォルトの名無しさんNGNG
>>227
あーやっぱりだめですか・・。

非同期APIつーのはこの辺ですかね?
http://support.microsoft.com/default.aspx?scid=kb;EN-US;275046
ちょっと、やってみます。

0231デフォルトの名無しさんNGNG
>>228
スタートアップルーチンが使ってるってことはない?
0232デフォルトの名無しさんNGNG
>>231
少なくとも俺の経験上は、無い。
0233デフォルトの名無しさんNGNG
gdi+でjpg画像から、ビットマップのGetPixelのように
1ピクセルの画素値を抜き出すのってどのようにすれば可能でしょうか?
よろしくお願いいたします。
0234WindowsマンセーNGNG
>>214
レスありがとうございます。
Advanced Windows 3rdを古本屋で手に入れました。
カーネルオブジェクトという観点から綺麗に書かれていて
これ、とても解り易くて良い本です。
よく読んでから出なおしてきます。
0235デフォルトの名無しさんNGNG
ListCtrlに数値を表示する際にカンマ区切りで表示したいわけですが
何かオプションでも有りませんでしょうか。
そういうの良く見かけますけど全部自分で区切って登録してるのかな?
0236デフォルトの名無しさんNGNG
>>235
カンマ区切りって、桁区切り表示のこと?
なら自分で実装するしかない。
0237デフォルトの名無しさんNGNG
まあ、自分で実装しても難しくも何ともないから、おとなしく作っとけ。
0238235NGNG
無い様なのでそうすることにします。
桁区切りならGetNumberFormatで出来ますし。
0239デフォルトの名無しさんNGNG
>>238
ライブラリ化しとくと便利かも

ところで、9xでWNetAddConnection2使ってネットワークドライブに割り当てた
Server2003の共有フォルダ(NTFS)を、
9x側がFATって誤認識することがあったんだが、なんか情報持ってる香具師いないか?

9x系全般で再現、同一セグメントで発生した上クライアントPCの環境には特に縛られてない模様で、
再現手順もトリガもまったくわからん状態で困ってるんだが

ローカルディスクならブートレコード読み損なったときにFATと読み違えることも
あるらしい(見たこと無い)が…?

0240デフォルトの名無しさんNGNG
別に作ったテキストファイルを読み込ませて、
画面に表示する方法を教えて下さい。
0241デフォルトの名無しさんNGNG
1) CreateFile()でファイルを開きます
2) ファイルの中身を読み出します(バッファ確保注意)
3) テキストウィンドウを作って2)で読んだ中身を放り込みます
0242デフォルトの名無しさんNGNG
>>241
すばやいお答えありがとうございます
0243デフォルトの名無しさんNGNG
>>239
ネットワークドライブの実際のフォーマットを知ってどうしようっての?
何か意味があるとは思えないが
0244デフォルトの名無しさんNGNG
ファイル名の制約(8.3かどうか,大文字小文字を区別するか,長さ制限)を、
単にNTFSかFATかで区別しているとヤバいかもしれんね。
ちゃんとAPI叩いてればいいんだろうけど・・・
0245デフォルトの名無しさんNGNG
mmapfileにCの文字列処理関数使った場合ファイルの末尾で'\0'でちゃんと止まってくれるの?
0246デフォルトの名無しさんNGNG
意味が分からん
mapした領域オーバーしたらメモリ保護エラーだろ
0247デフォルトの名無しさんNGNG
>>244
>単にNTFSかFATかで区別しているとヤバいかもしれんね。

そりゃ論外すぎる…
0248デフォルトの名無しさんNGNG
「ひまわり」とか「TTS」でWIN32APIって使えるのか?
0249デフォルトの名無しさんNGNG
>>244
>>247
FATと誤認識されたドライブを開いて[新規作成]→[テキストファイル]
…orz
まあ、9xが論外というならそれには激しく同意だが
0250デフォルトの名無しさんNGNG
>>249
なにか問題が?

まさか、書込みできないFATを想像してないわけじゃないよね?
0251デフォルトの名無しさんNGNG
>>248
ひまわりは使える。TTSはしらん。
0252デフォルトの名無しさんNGNG
>>249
再現できれば画面さらしてもいいんだが
「"・テキスト"が作成できません。指定されたファイルが見つかりません」とエラーになる。
要は、FATと認識しているにもかかわらず、8.3形式無視した名前付けようとして
勝手にエラーを吐くっぽい

ネットワークドライブ割り当てまでがお仕事で、後は好きに使ってねっつーアプリなんで
こっちとしてはFATだどうだは気にしたくもないわけですが
↑みたいに勘違いしたエラー吐きやがるので
このままではお話になりませんよ、と
■ このスレッドは過去ログ倉庫に格納されています