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

Win32API 質問箱 Build6

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

過去スレ
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0446デフォルトの名無しさんNGNG
ATLなら1日で作れるけどね
0447デフォルトの名無しさんNGNG
445です。

追加しますと、Delphi では API レベルの細かなカスタマイズも簡単ですし、
たとえば MDI にもプロパティーをひとつ変更することです容易に対応できます
し、タブコントロールなどのコンポーネントも豊富にありますし、Delphi 自体で
コンポネントを作成して拡張できますし、ActiveX の取り込みもできます。
0448デフォルトの名無しさんNGNG
コンポーネント化といっても程度によりけりですよね。

部品を他のプログラムからも利用したい
→VB、ATL、MFC、etc…汎用を目指す
 →ActiveX
→Borland開発環境に限定してOK
 →VCLコンポーネント
→C#、VB.NET、etc…マネージド言語から使えればいい
 →.NETコンポーネント
→静的リンクできればそれでいい
 →単にC++のクラスとして作る

えとせとら
0449デフォルトの名無しさんNGNG
質問させていただきます。
検索はかけましたが相応しくないかもしれません。その際はご容赦ください。

最近フルカラー640*480で、D3DもDirectDrawも使わないのに高速半透明をするゲームが増えてきました
半透明というとDIBで1ドットずつ計算くらいしか思いつかないのですが、
こんな方法ではろくなスピードがでません(実際作りました)

あのゲームたちはどのような方法を使っているのでしょうか
VRAMを直接いじる方法は存在しなかったと思いますが…。
0450デフォルトの名無しさんNGNG
DiBSectionは試した?
0451デフォルトの名無しさんNGNG
>>450
ええ、もちろんです
CreateDIBSectionで関連づけて

ついでに透明度を256段階と決めて、1バイトでの混ぜ合わせテーブルをつくりました
120と64を、透明度128でまぜあわせたら92 などのテーブルです
3バイトの混ぜ合わせテーブルはつくるの不可能ですから…。

それを使ってforループでまわして書き換え
でもこれではそんなにスピードでないんですよ…
0452デフォルトの名無しさんNGNG
>>449

GDI+ ライブラリをつかってアルファブレンドしてるとか
0453442NGNG
レスありがとうございます。
>>445
>>447
Delphiに関してはまったく知識がないのですが、
どちらかというとコンポーネントを
「使う」のではなく「作る(再利用可能&汎用性あり)」方が主な目的です。
Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?

>>448
>→VB、ATL、MFC、etc…汎用を目指す
目的としては汎用的なコンポーネントを目指したいなと考えています。
ActiveXが有力候補でしょうか?
ActiveXはやはりATLで作成するのが普通なのでしょうか?

>Borland開発環境に限定してOK
出来ればVC等MS系開発環境でも使用できる方がいいと考えています。

>→C#、VB.NET、etc…マネージド言語から使えればいい
現状マネージド言語(すいませんまだあまり理解していません)を使用している人が
自分の周りにいないので、普及度とかがよくわからないのですが・・・・
今後はその方向にむかっていくのでしょうか・・・

>→静的リンクできればそれでいい
一応動的なものを考えています。

0454デフォルトの名無しさんNGNG
>>Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?

それはできません。ActiveX にすると良いのかも知れませんが面倒です。
Delphi のなかで使うのならラクチンですけど。

>> 出来ればVC等MS系開発環境でも使用できる方がいいと考えています。

こういう場合は、Delphi をおすすめいたしません。

しかし、言語や開発環境は道具です。良いものをなるべく容易に迅速に
つくれるのなら、道具にこだわるべきではないとも思うんですが。
0455デフォルトの名無しさんNGNG
>>453
> 今後はその方向にむかっていくのでしょうか・・・

これはいまのところ誰にもわからないのではないでしょうか。
もし、否定/肯定いずれでも断言する方がいたとしても
現状では信じない方が無難です。
0456デフォルトの名無しさんNGNG
>Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?
一応DelphiでもActiveXは作れるので、その機能を用いて
ラッパーを一枚噛ませればできますけどね。
でも、素直にATLの方がいいかも(って僕はATL知りませんけれど)

作ったコンポーネントを、どういう風に活用するつもりですか?
それがわかれば絞れるかも。
0457デフォルトの名無しさんNGNG
>>451
単にお前がヘボなだけ
0458名無し@沢村NGNG
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!

0459デフォルトの名無しさんNGNG
>>449
ゲームは画像ファイルにアルファデータくっついてることが多いので
>>449が言ってるゲームもアルファ合成じゃないかと思います。

んで、以前アルファデータについて検索かけたとき
intelのパフォーマンスライブラリ(Image Processing Library)が引っかかりました。
http://www.intel.co.jp/jp/developer/software/products/perflib/ipl/index.htm
intelがMMX以降のPentium系CPUの実力を発揮させるために作ったライブラリのようです。
これ使ってみてはどうでしょう?

現在、本家英語サイトはIPPβ3.0に吸収されたようでIPLのページがありませんでした。
0460デフォルトの名無しさんNGNG
>>457
へぼいのでこの程度の方法しか思いつかないのです。
よろしかったらご教授をお願いいたします。
ループ部分をアセンブラで書くことによって、1.5倍程度の処理速度UPはできましたが、
それでもゲームでリアルタイムに使うのはきつかったです。

>>459
αデータつきの画像というと、DDSなどのD3D用画像が思いつきます。
でもとりあえずWin32APIにはαブレンディング合成の関数は存在しませんよね。

おもしろいライブラリを教えていただきありがとうございます。
Intel系PCのみの動作となっていますが、研究する価値はありそうですね。
近くまとまった休みがとれたら使用して報告させていただきます。

<->
自前で高速αブレンディング合成を作成された方、アルゴリズムをご存知の方、解説サイトを
ご存知の方がいらっしゃいましたらご一報くださると幸いです。
0461デフォルトの名無しさんNGNG
>>452さんのおかげで気付かせていただきました

大変申し訳ありません。
GDIにAlphaBlend()という関数が存在するのですね。
Win98以降のみサポートだそうです。

抜き色転送もめんどうなBitBltくらいしかないので、そんなものはあるはずないと
決め付けておりました。

近く実験を行い報告させていただくことでおわびとさせていただこうと思います
スレ汚し失礼いたしました
0462デフォルトの名無しさんNGNG
使ったことないから知らんけどAlphaBlend()つっても
結局内部ではCPUでシコシコやってんじゃないの?

俺もDIBで32ビット処理とか一応やってるけどMMX使うくらいしか思いつかないな。
アセンブラで組んでるとこにMMXまだ使ってないのなら適用してみれ。

実験するんなら事後報告よろしく>>461
0463デフォルトの名無しさんNGNG
マルチスレッドで
メインスレッドからPostThreadMessageして
ワーカースレッドでGetMessageする場合
ワーカースレッドをコールバック関数にしたりする必要ありますか?

あとワーカースレッドにメッセージキューを実装しなければならない
というようなことがMSDNに書かれていたのですが
具体的にどういう事なんでしょうか?
0464デフォルトの名無しさんNGNG
>VCLとか言ってる話題
Delphi氏ランなら
BorlandC++Builder使ったら?
言語がC++だから
簡単に入れると思うよ。

>DIBで重い言ってる
バックバッファとしてDIB作って
普通にCでソフトウエアレンダリングして
それをBitBltしてるだけでも、結構な速度が出ますよ。
そりゃSIMD使うともっと速くなるけど。
普通に640x480 8bit で、
画面全体を塗りつぶすだけ
for(i=0;i<(640*480);i++)p[i]=255; // わざと遅く書いた。
で
余裕で60fps切るようだったら、DIB生成かBitBltあたりに何か問題があると思う。

0465デフォルトの名無しさんNGNG
>>464
8bitならかなり速いです。
あらかじめ合成用のテーブル持てるし。
問題は16や32なわけでして

早く家に帰ってためしたいです。はい…
0466デフォルトの名無しさんNGNG
>>462
> 使ったことないから知らんけどAlphaBlend()つっても
> 結局内部ではCPUでシコシコやってんじゃないの?

アクセラレーションが有効ならドライバが直に実行するんでない?
0467名無し@沢村NGNG
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!
0468デフォルトの名無しさんNGNG
>>467
音源はなに?
0469デフォルトの名無しさんNGNG
つーか板違い
0470名無し@沢村NGNG
>>469
板違い ではありませんぞ。
素で音色をならすときは、WinAPIのMidiOutShortMessageを使ってますし、
ファイルに書き込むときは、同じくWinAPIのWrightFileを使ってますから…。
>>468
それが私は音源にうとく、音源が何かはわからないのですよ…。
ただファイルが壊れることと、音源とはあまり関係なさそうに思うのですが…。
0471デフォルトの名無しさんNGNG
MIDIに詳しくないのにMIDIシーケンサ作るの?
0472デフォルトの名無しさんNGNG
微妙にスレ違いかもしれませんがご容赦を。
CDの自動再生機能でhtmlを表示したいのですが、
「標準のブラウザ」で開くにはどうすればいいのでしょうか?
open=IEXPLORE.EXE ***
ではネスケ等に対応できません。

ShellExecute()させるだけの実行ファイルを作るといのが考えられますが。
ヨロシコ
0473デフォルトの名無しさんNGNG
>>466
試してみたいけど過去スレに実質WinMe/2000以降限定とか書いてあるから
俺の環境じゃ試せねー。
まあ実際問題としてOS限定するなら使いづらいAPIだな。少なくとも俺は使いたくない。
0474名無し@沢村NGNG
>>471
そう、わかった部分だけでとりあえずつくって、新しいことがわかるたびに機能をつけたす。
0475デフォルトの名無しさんNGNG
>>473
俺は必要になったら使うだろうなあ。
家のPC、2000とXPだし。
0476デフォルトの名無しさんNGNG
>>472
open=rundll32.exe url.dll,FileProtocolHandler index.html
0477472NGNG
>>476
即レスありがとうございます。
0478名無し@沢村NGNG
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!
0479デフォルトの名無しさんNGNG
>>478
> 皆様方、これは一体どういうことなのでしょうか?

ファイルが壊れているのなら、MIDIうんぬんではなく
ファイル(またはメモリ)操作にバグがあるということでしょ。
0480デフォルトの名無しさんNGNG
MIDIの知識を身につけるまで書き込むな馬鹿
0481デフォルトの名無しさんNGNG
>>465
素直にやねうらお氏のWebページか書籍を読むべし。
0482デフォルトの名無しさんNGNG
>>478
いいかげんにコピペやめれ
0483デフォルトの名無しさんNGNG
ディスクドライブのデバイス名を取得する方法はありませんか?
HDD,CD-ROM、リムーバブルなどです。
ボリューム名の取得ならわかるのですが。。。
0484デフォルトの名無しさんNGNG
デバイスタイプしか分からないんじゃない?
0485デフォルトの名無しさんNGNG
プログラム上からモニタの自動電源オフ機能を無効にするにはどうすれば
いいのでしょうか?
長時間何も入力がなくても画像を提示し続けるプログラムを作りたいのですが。

SystemParametersInfo() の SPI_SETPOWEROFFACTIVE を試してみたら
正常終了したという返事が返ってくるにも拘わらず電源は切れてしまいます。
これはうちのマシンだけの現象なのでしょうか?

どなたか教えてください。環境はWindows98および2000です。
0486デフォルトの名無しさんNGNG
SetThreadExecutionStateでどうよ
0487デフォルトの名無しさんNGNG
>>483
Win98ならレジストリのHKEY_LOCAL_MACHINE\Enum辺りに記録してある。
あとSCSIならInquiryコマンド使うとか。
0488デフォルトの名無しさんNGNG
>>483
エクスプローラで表示されてるものと同じものが得たいならSHGetFileInfo()
0489デフォルトの名無しさんNGNG
Microsoft WindowsのインクルードヘッダはC++で使いにくくて仕方がありません。
例えば、winuser.hの以下の部分。

WINUSERAPI HWND WINAPI CreateWindowExA(…);
WINUSERAPI HWND WINAPI CreateWindowExW(…);
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE

なぜ、#defineでやってしまうのでしょうか?こうすると

MyClass::CreateWindowEx(…);

などがまともにコンパイルされないではありませんか!
これをせめて

WINUSERAPI HWND WINAPI CreateWindowEx(…)
{
#ifdef UNICODE
 return CreateWindowExW(…);
#else
 return CreateWindowExA(…);
#endif // !UNICODE
}

等とやってくれればまだ使い物になると思うのですが、どうでしょう?
このようなヘッダがどこかに存在するということはないでしょうか?
0490デフォルトの名無しさんNGNG
>489
とりあえず引数も正確に書いてみろや。
0491デフォルトの名無しさんNGNG
>>490
ハア?
0492デフォルトの名無しさんNGNG
名前がぶつかる悲劇か・・・
0493デフォルトの名無しさんNGNG
>>491
> ハア?

とか言ってる暇合ったら、>>490 の言うように CreateWindowExW() と CreateWindowExA() の引数の型をちゃんと書いてみなよ。
あんたの書いてる CreateWindowEx() の引数をどうすればいいか悩むと思うから。
0494デフォルトの名無しさんNGNG
>>493
ハア?

WINUSERAPI HWND WINAPI CreateWindowEx(
#ifdef UNICODE
 …
#else
 …
#endif
)
{
 …
}
0495デフォルトの名無しさんNGNG
>>493
ハア?

WINUSERAPI HWND WINAPI CreateWindowEx(
  DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
  DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
  HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
 …
}
0496デフォルトの名無しさんNGNG
>>494-495
lccやmingwのヘッダはそうなってるけど
それだと#define UNICODEして明示的にANSI版を呼び出したいとき
(あるいはその逆)ではまる罠
0497デフォルトの名無しさんNGNG
> それだと#define UNICODEして明示的にANSI版を呼び出したいとき
> (あるいはその逆)ではまる罠

CreateWindowExWかCreateWindowExAを呼べばいいだけ。
0498デフォルトの名無しさんNGNG
>>494
ププッ、やっとわかったか。
で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。
0499デフォルトの名無しさんNGNG
まあ実際のところは、関数定義をヘッダに入れるなんて嫌だな。
実体はLibファイルにでも入れて、それを切り換える方がいいかも。
0500デフォルトの名無しさんNGNG
>>498
> ププッ、やっとわかったか。

( ´,_ゝ`) プッ

自分の勘違いは素直に認めた方がいいよ。
0501デフォルトの名無しさんNGNG
>>500
> 自分の勘違いは素直に認めた方がいいよ。

それ >>494 に言ってんの ?

>>489 で引数書かなかったのは、不問にしても、>>490 に対して「ハァ?」って返した時点で、勝負決まったと思うけどね。

慌てて、>>494 書いたかと思ったら、逆切れですか ?
0502494NGNG
>>501
省略した引数の部分を書いてみろと言われたので
書きましたが、それがどうかしました?

で、書いたはいいが、その後はどうなったんでしょう。
是非ともアドバイスを承りたいんですが。
0503489 ◆CPP8mJMMbA NGNG
皆さん、早速のレスありがとうございます。(2回目のカキコです)

>>492
そうなんですよ。せめて#defineじゃなければ名前空間を分けて衝突は避けられるんですけど。

>>494-495
私も最初は全てそのように書き換えようと考えました。それこそ全てのヘッダまで。
定数の#defineも含めて。ただ、そこまでの労力が…
かと言ってその場で必要なものだけ宣言しなおすのも癪でして(^^;

>>496さんが仰っている状況に関しては、私も>>497さんのような解決方法でよいと思います。
lccやmingwからヘッダだけ抜き出して他の環境で、ってのはアリなんでしょうか?

>>499
確かにヘッダに定義を入れるのは気持ち悪いところですが…
0504デフォルトの名無しさんNGNG
>>502
> 省略した引数の部分を書いてみろと言われたので
> 書きましたが、それがどうかしました?
で、>>491 はどうなったん ? 都合の悪いところは、無視ですか ?

> で、書いたはいいが、その後はどうなったんでしょう。
> 是非ともアドバイスを承りたいんですが。

>>498 で、デメリット書いてますが必死すぎて見えてないのね。
0505デフォルトの名無しさんNGNG
おまえらがんばりすぎ
0506デフォルトの名無しさんNGNG
>>505
反論できなくなった時の、逃げ口上...
0507デフォルトの名無しさんNGNG
必死だな
0508デフォルトの名無しさんNGNG
>>507
ププッ、それしか書けないんならもうやめたら ? ちょっとカッコ悪いよ。

それとも、>>504 に対してなんか言うことある ?
0509494NGNG
>>504
491って何の話ですか? 私は494ですが491ではありません。

> >>498 で、デメリット書いてますが必死すぎて見えてないのね

↓これのことですかね。
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

必死以前に、これは
省略した引数をすべて書いてみることと
何のつながりがあるんでしょう?

引数を書けと言った意味がまずわからないのですが。

それと、「ラップ関数を経由するから嫌」なんて
質問者さんはそんな事書いてませんよね。
勝手に妄想されたのでしょうか?

納得のいくアドバイスをお願いします。
0510デフォルトの名無しさんNGNG
>>508
え?
0511デフォルトの名無しさんNGNG
508は自分に都合の悪い発言は全部494の仕業だと思ってるようだな
0512494NGNG
>>504
あれ? 意味が伝わりにくかったでしょうか。
まずは「引数を省略せずに書いてみる」というアドバイスに
どういう狙いがあったのかを教えてください。お願いします。

ちなみに >>493では
> あんたの書いてる CreateWindowEx() の引数をどうすればいいか悩むと思うから。
とありますが、どの辺で悩んでいいのかわかりませんでした。
0513デフォルトの名無しさんNGNG
こんばんは。最近お世話になった半透明に挑む者です。
Pen3 850MHz Win2kによる実験ができましたので、報告させていただきます。
世の中に計測ページは沢山ありますけどね(^^;

・24bitBMP
・1〜3はCreateDIBSectionで領域を確保。全て640*480
・4はmallocで領域を確保
・5はCreateCompatibleBitmapで領域確保

<1>
BitBltで背景を描画
テーブルを参照して半透明画像を重ねあわせ
透明色指定に基づき、1ドットずつ色を調べて指定されたものなら転送しない
(今回は指定しておいたものの、画像内にその色は一度もでてきません)

<2>
1の透明色指定できないバージョン(if文がない分だけ速い)
0514デフォルトの名無しさんNGNG

<3>
BitBltで背景を描画
画像重ね合わせのところをアセンブラで
テーブル参照ではなく、素直に計算する

<4>
memcpyで背景転送
画像重ね合わせのところをアセンブラで
テーブル参照ではなく、素直に計算する

<5>
BitBltで背景を描画
画像重ね合わせのところをAlphaBlendで

<1>21.085ms
<2>20.187ms
<3>13.417ms
<4>13.691ms
<5>速すぎ

何度やっても4のほうが3より遅い。
純粋にメモリー書きかえしかしていない4の方が早そうなものなんですが…。
0515デフォルトの名無しさんNGNG
>>481さんのアドバイスのもと、やねうらお氏のページを覗いてみました。
かなり参考になりますね。

でもちょっと気になったことがひとつ。
やねうらお氏がさらりと

>16bpp(RGB555,565)の半透明(α3bit)でWORDテーブル持ってます。
>だもんで、半透明もバリバリ速いです。(16bppのときだけ^^;)

とおっしゃっているのですが、意図するところが読めないのです。
馬鹿な私は即座に
((1 + 65536) * 65536 / 2)通りのテーブルなんて持てるわけねぇ(;´Д`)
と思ってしまったのですが、やねうらお氏の言うテーブルとはどんなものなのでしょう。
目を通しても「テーブルを持っています」としか書かれていなかったので…。
思いつくものがあったら、教えていただけると嬉しいです。
0516デフォルトの名無しさんNGNG
>>509
> 491って何の話ですか? 私は494ですが491ではありません。

あっそ、まあどうとでも言えるから。違うって言うなら、一応そう思っとくよ。

> 引数を書けと言った意味がまずわからないのですが。

>>489 は、少なくとも CreateWindowExA() と CreateWindowExW() の引数の違いは考慮してないから、それを考慮しなよ。って言う意味だよ。

> それと、「ラップ関数を経由するから嫌」なんて
> 質問者さんはそんな事書いてませんよね。

だって気付いていさなそうだからね。

> 勝手に妄想されたのでしょうか?

妄想 ? 具体的なデメリットがわかってないの ?
0517デフォルトの名無しさんNGNG
>>497
いやだからLPTSTRとかがLPWSTRとかに展開されちゃっててはまるの
説明めんどくさいからどうでもいいや
0518494NGNG
>>516
> >>489 は、少なくとも CreateWindowExA() と CreateWindowExW()
の引数の違いは考慮
> してないから、それを考慮しなよ。って言う意味だよ。

考慮していないのでなく、重要でないから
省略しただけとかもしれませんよね。

まあ仮に考慮してなかったとしましょう。
アドバイスの通りそれを考慮して書いてみました。

で、結局どんな進展があったのでしょうか?
ラップ関数を経由する話とどうつながっていくのでしょう?

> 妄想 ? 具体的なデメリットがわかってないの ?

妄想と書いたのはラップ関数のデメリットの話ではなく、
そのような意図の質問ではないということです。

同じことを書きますが、
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

質問者は名前の衝突等を気にしているのであって
「ラップ関数を経由するから、それが嫌」なんてことは
書いていませんね。妄想でしょうか?
0519デフォルトの名無しさんNGNG
>>516
> だって気付いていさなそうだからね。

お前、言ってることがハチャメチャだぞ
0520デフォルトの名無しさんNGNG
>>518
> 考慮していないのでなく、重要でないから
> 省略しただけとかもしれませんよね。

それがダメだって言ってるの。まだわからない ?

> で、結局どんな進展があったのでしょうか?
> ラップ関数を経由する話とどうつながっていくのでしょう?

一つヒントをあげよう。
引数が違うと言うことは、別の関数が必要と言うことだよ。

> 質問者は名前の衝突等を気にしているのであって
> 「ラップ関数を経由するから、それが嫌」なんてことは
> 書いていませんね。妄想でしょうか?

あんた、ヴァカじゃないの ?
衝突を気にするからと言って、>>489 みたいなこと (=ラップ関数を作る) やると、余計面倒だ (=デメリットがある) 。って言ってんだよ。
>>489 が書いてないのは、気付いてないからだと思うよ。

で、デメリットはわかったの ? それとも、>>494 みたいに書けば全て解決と思ってるの ?
0521デフォルトの名無しさんNGNG
この見事な殺伐っぷり、たまらんねぇ。
0522489 ◆CPP8mJMMbA NGNG
>>517
あっ、確かに…もっと手前の方で#ifdefとtypedefを山ほどかまして何とかなりませんかねぇ…

他にもラップ関数を使った場合には、

・ヘッダ内に関数定義が入る
・関数呼び出しオーバーヘッドがかかる(インラインじゃだめかなぁ)
・引数の違う場合、違いの吸収が面倒くさい

って感じになるんでしょうか。(他にも思いついたら列挙お願いします)
このくらいの範囲ではデメリットを考えましたが、後はそれと名前の衝突を
天秤にかけるしかないですかね…
0523494NGNG
>>520
> 一つヒントをあげよう。
> 引数が違うと言うことは、別の関数が必要と言うことだよ。

実体が2つ必要になるが同じ関数名では実体を2つは
作れないということでしょうか?
が、それだと引数を書かせることとは関係がないので
外れですかね?

ちょっとわからないのでヒントでなく具体的に
教えていただけないでしょうか。

> で、デメリットはわかったの ?
> それとも、>>494 みたいに書けば全て解決と思ってるの ?

デメリットは承知しているつもりです。
が、何度も言ってるように、その話をしているわけではありません。

> >>489 が書いてないのは、気付いてないからだと思うよ。

そうですか。ということは、上で書かれた
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

というのは妄想だったということでよろしいですね。
0524493NGNG
>>522
> 他にもラップ関数を使った場合には、

と言うか、CreateWindowExA() と CreateWindowExW() の引数が違うと言うことは、ラップ関数の引数も必然的に変える必要があると言うこと。
つまり、ラップ関数も二種類持つしかない。で、

> ・ヘッダ内に関数定義が入る

と言うのが一番問題だと思う。
CreateWindowEx() をグローバルにすると当然複数ファイルにインクルードされたら二重定義になるし、static にすると、実体を複数個持つこととなる。
CreateWindowEx() だけならまだいいかもしれないけど、他にも色々あるしね。
まあ、メモリーも安いからそれでもいいやって言う人もいるかもしれないけど、あまり誉められた設計じゃないよね。

ちなみに、もし CreateWindowExA() と CreateWindowExW() の引数が同一なら、その関数はライブラリに入れて、実行時に CreateWindowExA() か CreateWindowExW() に振り分けることもできる。
だから、引数が同一かどうかはかなり重要。
0525493NGNG
>>523
> 実体が2つ必要になるが同じ関数名では実体を2つは
> 作れないということでしょうか?
> が、それだと引数を書かせることとは関係がないので
> 外れですかね?

引数が一緒だったら、ラップ関数の実体は一つにする (=ライブラリに入れておく) ことができるよ。
そんなこともわからないの ?
0526489 ◆CPP8mJMMbA NGNG
いっそのことMSに
「C++向けに#defineを極限まで減らしたヘッダ激しくキボンヌ( ゚ρ゚)」
とでも要望出してみるかなぁ…
無視されるだろうなぁ…MSだし…
0527デフォルトの名無しさんNGNG
>>526
自分で書くという発想は無いのですか ?
0528494NGNG
>>525
> 引数が一緒だったら、ラップ関数の実体は一つにする (=ライブラリに入れておく) ことができるよ。

すみませんが、意味がよくわかりません。
名前も引数も同じ関数の実体を1つにできるんでしょうか?

(ちなみに、私が書いた実体というのはライブラリ単位の
 話ではありません)
0529リバーコントロール?NGNG
レバーコントロール"ReBarWindow32" の質問です。
ツールバー"ToolbarWindow32"(hwnd_tool)、ボタン"BUTTON"(hwnd_ok)、それぞれの為の帯を2本用意しました。

ボタンは帯のサイズで自動的にサイズ変更されます。
(帯サイズに合わせられる用にコードしておいたからです)
これはこのままでイイのですが(変えたくなったら帯サイズを変えるつもりです)、
ツールバーのサイズは自動的にサイズ変更されることはありません。
ということで、帯をツールバーのサイズにあわせようと思います。

で、試したソースの一部です

REBARBANDINFO rebarbandinfo = { 0 };

memset( &rebarbandinfo, 0x00, sizeof( REBARBANDINFO ) );
rebarbandinfo.cbSize = sizeof( REBARBANDINFO );
rebarbandinfo.fMask = RBBIM_STYLE | RBBIM_CHILD;
rebarbandinfo.fStyle = RBBS_BREAK | RBBS_GRIPPERALWAYS;
rebarbandinfo.hwndChild = hwnd_tool;
RebarBandCreateIndirect( -1, &rebarbandinfo );
// ↑RB_INSERTBAND を SendMessage しているだけの自作関数です

memset( &rebarbandinfo, 0x00, sizeof( REBARBANDINFO ) );
rebarbandinfo.cbSize = sizeof( REBARBANDINFO );
rebarbandinfo.fMask = RBBIM_STYLE | RBBIM_CHILD;
rebarbandinfo.fStyle = RBBS_BREAK | RBBS_GRIPPERALWAYS;
rebarbandinfo.hwndChild = hwnd_ok;
RebarBandCreateIndirect( -1, &rebarbandinfo );
// ↑RB_INSERTBAND を SendMessage しているだけの自作関数です
0530リバーコントロール?NGNG

これではレバー帯が2本ともまったく表示されません。

どちらか片方の帯に マスク RBBIM_CHILDSIZE と rebarbandinfo.cyMinChild = xx を足すと2本とも表示されました。
しかし、ツールバー帯のサイズが合わなくて困ってます。

同様に両方に足した場合、帯のサイズはどちらも最初に指定した帯の方のサイズになってしまいます。
こっちは更に問題で、ボタンが帯のサイズと合ってくれません。


そこで質問です。
�@帯を2本用意したときに、サイズをそれぞれ別管理できますか?
�Aツールバーのサイズに合わせて帯サイズを変更する方法はありますか?
�Bツールバーボタンのサイズを得る方法はありますか?

0531デフォルトの名無しさんNGNG
>>528
>>524 は、見てくれてる ?

> 名前も引数も同じ関数の実体を1つにできるんでしょうか?

名前も引数も同じなら、実体は一つでいいでしょ ?
もちろん機能が違うから、内部で実行時に振り分ける必要があるけどね。

でも、実体が一つでいいということはライブラリに入れることができるから、>>524 に書いた「ヘッダ内に関数定義が入る弊害」を避けることができる。
また、lcc とかは、引数の型の定義変えることでヘッダファイル上は同一に見せてるけど、これも実体は一つにはできない。
更に、>>517 の問題もあるしね。

とにかく、>>526 もそうだけど、一度実装してみればいろいろわかっていいと思うよ。
マイクロソフトの技術者だってヴァカじゃないんだからさ。
0532489 ◆CPP8mJMMbA NGNG
>>527>>531
一度自力で何とかしてみます。
0533デフォルトの名無しさんNGNG
座標x、yの色の値を取得するにはどうしたらいんでしょうか?
0534デフォルトの名無しさんNGNG
GetPixel
指定された座標のピクセルの RGB(赤、緑、青)値を取得します。

COLORREF GetPixel(
HDC hdc, // デバイスコンテキストのハンドル
int nXPos, // ピクセルの x 座標
int nYPos // ピクセルの y 座標
);
0535533NGNG
できました。ありがとうございました。
0536デフォルトの名無しさんNGNG
プロパティシートの特定のページのみ使用不可にするにはどうすればいいんでしょうか?
0537デフォルトの名無しさんNGNG
_beginthreadexで起動したスレッドって
スレッドが実行している関数内部で一切メッセージにタッチしてなくても
WM_QUITが来ると勝手に閉じちゃったりするんですか?

ウィンドウプロシージャでESCが押されたか判断して終了するプログラムなんですが
ESCが押された時点でスレッドから応答が無くなるのか、ビジー状態でフリーズしてしまいます

コードの流れは以下のような感じ

_beginthreadex
CreateWindowEx
message loop
{
 //WM_QUITが来たらbreak
 do something
}
//ここでフリーズ(WaitForSingleObjectまで到達していないのに...)
いろいろ終了処理
WaitForSingleObject
CloseHandle
return 0;
0538デフォルトの名無しさんNGNG
>>537
> WM_QUITが来ると勝手に閉じちゃったりするんですか?

んなこたあない。

ところでこれは別スレッドでCreateWindowしてるの?
よくわからない。
0539デフォルトの名無しさんNGNG
>>537 激しく既出

http://pc3.2ch.net/test/read.cgi/win/1021192107/
0540デフォルトの名無しさんNGNG
>536
たぶん標準の機能では出来ない。
『Best of MSJ Vol.8 ワンポイントレッスン 最新プログラミングテクニック』の
1069p に解決策が載っている。
0541デフォルトの名無しさんNGNG
Rebarで、あるBarのみ単独一行にしたら高さ(Height)を変えるって出来ますか?

・この時は一番高いBarにあわせる(例:20px)
| bar1 | bar2

・この時はbar2は高さを変える(bar1:20px、bar2:16px)
| bar1
| bar2
0542デフォルトの名無しさんNGNG
>>538
別スレッドではメッセージキュー越しに文字列を受け取って
ファイルに書き出しているだけです

メインスレッド
 _beginthreadex;
 ウィンドウ作る;
 メッセージループ開始
 {
  WM_QUITでbreak;
 }
 メッセージループから抜けた事を別スレッドに知らせる(PostThreadMessage);
 ワーカースレッドへ終了メッセージを送る(PostThreadMessage);
 WaitForSingleObjectしてから、終了処理;
お終い

ワーカースレッド
 メッセージキューを作る;
 終了メッセージが来るまでループ
 {
  文字列を受け取ってファイルへ書き出す(GetMessage);
 }
 _endthreadex;
お終い

こんな流れなんですが、メインスレッドのメッセージループを抜けたところで
ビジー状態から抜け出せなくなります
ところが、原因究明の為にデバッガでループ終了からずんずんトレースしていったら
なんと完走してしまいした・・・まったくもって意味不明です
0543542NGNG
怖ろしいのでデバッガでしか起動してなかったんですが
思い切って直接起動したら完走しました・・・

デバッガのバグなんですかね?
0544デフォルトの名無しさん NGNG
>>543
99%プログラムのバグ。
0545542NGNG
>>544
つまり「デバッガで起動した場合ハングアップしてしまうバグ」を作り込んだということでしょうか・・・?
「実行に時間がかかりすぎるとハングアップしてしまうバグ」かな

初心者がマルチスレッド関係いじくると良くあるバグなんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています