- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 09:56:18 ]
- スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。 「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ! 過去スレ、関連リンクは>>2-10くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/)の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build75 pc11.2ch.net/test/read.cgi/tech/1231423602/
- 348 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:26:28 ]
- >>339
待機とは関係ないんだが FILE_FLAG_OVERLAPPEDを指定したら ReadFileの最後はNULLじゃ駄目なんじゃないか
- 349 名前:カイロ mailto:sage [2009/02/11(水) 17:28:52 ]
- >341
>dwReadを確認してないみたいだけど? dwReadは、読み取ったバイト数が入るんですよね。 どうやって確認すればいいのでしょうか? 聞いてばかりで、すみません。
- 350 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:29:01 ]
- 関係なくはないけどな
- 351 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:29:35 ]
- >>348が真理
つかGetLastErrorぐらいしろ
- 352 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:32:44 ]
- つーかウォッチ式に @err,hr を入れとけ
- 353 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:38:10 ]
- >>349
dwReadが0だったらどうなると思う?
- 354 名前:カイロ mailto:sage [2009/02/11(水) 17:46:09 ]
- >>348
>待機とは関係ないんだが >FILE_FLAG_OVERLAPPEDを指定したら >ReadFileの最後はNULLじゃ駄目なんじゃないか 調べてみたら、通信プログラムでは、 FILE_FLAG_OVERLAPPEDではなく、 属性なしの FILE_ATTRIBUTE_NORMALを指定するのが正しいようですね。 >>353 >dwReadが0だったらどうなると思う? 0だったら、まだ、受信してない状態ってことですか?
- 355 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:01:04 ]
- FILE_FLAG_OVERLAPPEDはブロッキングしたくない時に使うんだよ。
- 356 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:08:16 ]
- >>354
dataを1バイトにして、dwReadが0以外のときに表示するようにしてみたら?
- 357 名前:カイロ mailto:sage [2009/02/11(水) 18:49:06 ]
- >>356
>dataを1バイトにして、dwReadが0以外のときに表示するようにしてみたら? やってみました。 以下、修正後のソースの一部です。 ☆ポートを開いているところ handle = CreateFile("COM4", // ファイル名: COMポート名を指定 GENERIC_READ | GENERIC_WRITE, // アクセスモード: 読み書き 0, // 共有モード: 共有しない NULL, // セキュリティ記述子: 取得したハンドルを子プロセスへ継承しない OPEN_EXISTING, // 作成方法: ファイルを開いたときに指定したファイルが存在していなければエラーとする FILE_ATTRIBUTE_NORMAL, // ファイル属性: 特に指定しない NULL // テンプレートファイルのハンドル: 特に指定しない ); ☆受信するところ。 char data[1]; DWORD dwRead; DWORD dwErrors; COMSTAT ComStat; while(1) { ClearCommError(handle, &dwErrors, &ComStat); ReadFile(handle, data, sizeof(data), &dwRead, NULL); if(dwRead != 0) { printf("%c", data[0]); } }
- 358 名前:カイロ mailto:sage [2009/02/11(水) 18:49:39 ]
- 続き・・・
なんとか、待機するところまでは、うまくいきました。 Tera Termで入力した文字が、表示されました。 ありがとうございます。 ですが、表示された文字が文字化けしていて、以下のような感じで、表示されます。 解決方法をどなたか、教えてください。 Bャツ・・・・・
- 359 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:55:07 ]
- ClearCommErrorって毎回チェックしないといけないんだっけ?
- 360 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:57:56 ]
- マルチバイト文字を送信してるように見える
- 361 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:59:05 ]
- ヌルターミネートしてないからだろ
受信したバイトの最後にゼロ入れとけ
- 362 名前:360 mailto:sage [2009/02/11(水) 19:01:20 ]
- マルチバイト文字じゃなくて、シングルバイトじゃない文字
- 363 名前:カイロ mailto:sage [2009/02/11(水) 19:15:15 ]
- 自己解決いたしました!!
テラターム側のボーレートの値が受信プログラムで設定した値と違っていたので、 文字化けしていたようです。 同じ値にしたら、ちゃんとした文字が出るようになりました!! これで、すべて解決しました!! みなさま、どうもありがとうございました。 数ヶ月前から、出来ずに困っていたのですが、 なんとか、動くものが出来ました。 よかったです。(TーT)
- 364 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:16:25 ]
- まあオメデトウ
そして死ね
- 365 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:22:47 ]
- >>364
死ねは酷くね? せめて成仏しろとか永眠しなさいと地獄に落ちろ、位にしといてやれよ。
- 366 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:34:18 ]
- フフフ…
- 367 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:34:44 ]
- ウッゼ
- 368 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:49:07 ]
- 釣れた釣れた
- 369 名前:デフォルトの名無しさん [2009/02/11(水) 19:56:01 ]
- >>314
ありがとうございます!、出来ました。 #define _WIN32_WINNT 0x0500に変更で解決しました。 本当にありがとうございました。
- 370 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:27:20 ]
- 相手のボーレート自動で判断してあわせてくれるシリアル通信ソフトあるけど
合ってるかどうかってどうやって判断してるんだろう
- 371 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:31:04 ]
- IME の前後参照変換に対応するため、WM_IME_REQUEST の IMR_DOCUMENTFEED を
拾うルーチンを書きました。が、XP や Vista + ATOK なら期待通り動作するのですが、 Vista + MS-IME では全く機能しません。 TSF 絡みっぽいところまでは推測がつくのですが、その先がさっぱりです。 そのあたりの仕組みについて記述している資料があれば、教えてください。
- 372 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:11:37 ]
- >>370
分からんけど。 例えば、相手が送ってくるデータが分かっていれば、 ボーレートを色々変えてみて正しく読めるのを探すとか?
- 373 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:17:10 ]
- >>314>>369
それで解決したなら、後からメンバが増えたせいだな。 msdn.microsoft.com/en-us/library/bb760256.aspx _WIN32_NTが0x501以上だとlpReservedメンバが追加されるが、 これはNULLじゃないといけないと書いてある。 ところが、108のコードではそれが欠けていたのでうまくいかなかった。 まあ、良くある話だ。_WIN32_NTほかバージョン定義をきちんと定義して自己防衛するしかない。
- 374 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:20:27 ]
- NULLじゃないといけないReservedなメンバをわざわざ追加して互換性無くすとか
MSが何をしたいのかさっぱり分からん
- 375 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:34:31 ]
- >>371
IMR_DOCUMENTFEED固有の話はないけれど。 d.hatena.ne.jp/NyaRuRu/20070308 d.hatena.ne.jp/NyaRuRu/20070309
- 376 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:53:34 ]
- >>373
そんな単純な話でもない もともと>>314の参照先はちゃんと0初期化してて マルチバイトでは動作するのに、Unicode では 動作しないって質問だし、自分でやってみても うまくいかなかった OSはVistaなのでOS側の問題とかはないはずなんだけど
- 377 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:03:12 ]
- >>375
ありがとうございます。なるほど、テキストストアっぽい単語が関係ありそうですね。
- 378 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:07:09 ]
- >>376
うおすまん、リンク先まで読んでいなかった。
- 379 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:13:08 ]
- >>376
manifestが無くてcomctl32.dll ver5系を使ってたってオチだろ 多分ver5系はcbSizeにTOOLINFO::lpReservedのサイズを含めてはいけない
- 380 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:30:45 ]
- >>379
まさにそのとおりでした なんか昨日から気になってたんだけど、ようやくスッキリした ありがとう
- 381 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:33:44 ]
- 結局、TOOLINFO::lpReservedってそういう時わざと失敗させるために、構造体のサイズを変えるべく入れただけのような気がしてきた
NULL以外の適当な値を入れても動くみたいだし
- 382 名前:デフォルトの名無しさん [2009/02/11(水) 22:37:47 ]
- D:→E:のようにドライブレターを変更するにはどうしたらいいんでしょうか?
- 383 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:41:18 ]
- コマンドプロンプトで
D:\> E: と入力する。
- 384 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:42:30 ]
- つーか板違い
- 385 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:42:46 ]
- >>382
char path[MAX_PATH] = "D:\dokoka"; char drive[MAX_PATH]; char dir[MAX_PATH]; char name[MAX_PATH]; char exp[MAX_PATH]; _splitpath( path, drive, dir, name, exp); drive[0] = 'E'; _makepath( path, drive, dir, name, exp); ネタなので反論は許さない。
- 386 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:47:14 ]
- >>385
expって何だよw エクスプローラの略か?
- 387 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:53:01 ]
- >>386
うっせw 突っ込むなって言ったろw pじゃなくてtだったよ、うろ覚えすぎたw よく考えたら拡張子だからエクステンションの略なのか。
- 388 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:55:09 ]
- >>382
MSDN Library ↓ Win32 and COM Development ↓ System Services ↓ File Services ↓ File Systems ↓ Volume Management ↓ Volume Management Reference ↓ Volume Management Functions にお探しのAPIがあると思うよ
- 389 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 22:59:42 ]
- たまに優しい人が居るスレだ
- 390 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:18:48 ]
- たまに知らないならレスしないでください。ウザイだけですな人がいるスレだ
- 391 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:20:41 ]
- >>385
_splitpath, _makepath こんなのあったんか、知らんかったぽ
- 392 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:22:54 ]
- これでもイジワルしたつもりなんだ、優しい人なもんか
まず質問者が最低限自分で調べてから質問する人かどうかを見極めるために >ドライブレターを変更するにはどうしたらいいんでしょうか? という質問から「api ドライブレターを変更」でググったら上位3件(1件重複あり)全てにAPI名が出てきたんだぞ ここでイジワル心が働いた 今度はそのAPI名でまたググって英語版MSDN Libraryに飛んで ツリー形式になってる項目を一つ一つコピペしてrootへ向かってだなあ・・・
- 393 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:28:16 ]
- >>392
お前のツンデレっぷりに感動したので、付き合ってください
- 394 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:29:41 ]
- ハ,,ハ
( ゚ω゚ ) お断りします / \ ((⊂ ) ノ\つ)) (_⌒ヽ ヽ ヘ } ε≡Ξ ノノ `J
- 395 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:35:54 ]
- Linuxユーザーがググった知識を披露するスレになり下がってる。
- 396 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:38:05 ]
- 定型レスしかできないクソバカに比べれば100倍マシだからいいよ
- 397 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:38:09 ]
- まともな答えになっていれば別に何ユーザでも構わないでしょ。
ツンデレならWine使いかもしれないし。
- 398 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:40:35 ]
- >>397
>ツンデレならWine使いかもしれないし 詳しく
- 399 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:47:00 ]
- >>398
LinuxでWinAPIを実装してWindowsアプリケーションが動くというやつ。 使ったことないから出来は知らないけど。
- 400 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:54:22 ]
- >>397
使ったこともないのにググった知識で答えるのは無駄だろ。 質問者が一番知識があるという状態をよく目にする。
- 401 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:56:16 ]
- 知識のある人が知らないフリして質問して、知ったかで回答する馬鹿を突付いて遊んでるんだよ
- 402 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 23:59:28 ]
- 母無職、弟ニート、俺派遣
3人家族月10万(家賃含)でなんとかしてるけどなあウチは 残りは昔の生活費の借金返済に充てて
- 403 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:01:46 ]
- 母無職、弟無職、俺無職
3人家族月0.1万(家賃含)でなんとかしてるけどなあウチは 残りは昔の生活費の借金返済に充てて
- 404 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:02:46 ]
- ここまで人工無能アイちゃんのレス
- 405 名前:402 mailto:sage [2009/02/12(木) 00:02:55 ]
- ごめんなさい
- 406 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:35:45 ]
- >>402
うわあ…
- 407 名前:108 [2009/02/12(木) 00:43:34 ]
- >>379
出力ウィンドウのデバック表示で C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6001.18000_none_886786f450a74a05\comctl32.dll' を読み込みました C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_5cdbaa5a083979cc\comctl32.dll' を読み込みました と2種類のバージョンのcomctl32.dllを読み込んだように表示されているんですが、これは関係あるのでしょうか? 最近Win32APIプログラミング始めた素人なので変な質問だったらすいません。
- 408 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 01:03:24 ]
- >>407
Side-by-Sideでググっとけ てか、内部or外部のXMLで、同名DLLのバージョンを切り替えるなんてアホだろ 誰が考えたんだよ全く・・・
- 409 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 01:26:10 ]
- >>407
CommonControl 6.0を使用するための具体的な対処ということなら、 以下をstdafx.hあたりに記載しとけばいけるばず #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
- 410 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 01:38:01 ]
- >>408
ちなみにお前だったらどういうのがいいと思うのか聞きたい。
- 411 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 02:05:23 ]
- directxみたいにファイル名を変えとけばいいんじゃねーの?
- 412 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 10:45:47 ]
- dll heaven状態ですね
- 413 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 13:07:34 ]
- Direct2DとかWriteってDirectXになるの?
それともWIn32API?
- 414 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 14:51:53 ]
- 1GBくらいのメモリを確保する場合はnewとGlobalAllocどちらがいいですか?
またその他に適した関数はありますか?
- 415 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 14:57:59 ]
- VirtualAlloc
- 416 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:01:48 ]
- >>415
ありがとうございます〜 さっそく調べてみます!
- 417 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:02:22 ]
- そんなに独り占めしてずるいわあ
- 418 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:24:14 ]
- 1Gバイトのシリコンメモリ領域を明示的に確保し
それにスワップ無しでランダムアクセスするようなアプリを 動作させることが出来る商用パッケージOSは今のところ無い。 (近い将来出るかも知れないが) Windowsの場合VirtualAllocとか使って、シリコンメモリに 領域を確保したつもりになってももどうせディスクにスワップ されるので、1Gバイトのファイルを作成し、それにランダム アクセスするコードと速度面では大差が無い。
- 419 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:37:20 ]
- >>418
使ったこと無いから詳しくは知らんがAWE APIは?
- 420 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:45:32 ]
- >>418
そうなんですか>< すみません。GlobalAllocもVirtualAllocも500Mくらいを超えたらエラーになってしまうんですが 一度に取ってもダメで500Mを2回に分けても2回目のVirtualAllocでエラーになります。 ちなみにVirtualAllocで1回で取れる最大サイズってなんぼなんですか?
- 421 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 15:54:29 ]
- >>418
本当に欲しければ、VirtualLockがあるよ。Unix系だってmlockがあるだろう。 果たして使いこなせるかどうかはともかく。
- 422 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 16:27:46 ]
- >>420
環境によるし、その時のアドレス空間の空き状況にもよる。
- 423 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 16:35:09 ]
- >>422
そうみたいですね・・・ いちおうメモリは4GBあるのですが、1MBづつ取ると970MBの所でエラーになりました タスクマネージャの利用可能メモリは3.4GBあるのですが 2GBくらい取れないんですか?
- 424 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 16:37:58 ]
- なるべくプログラム開始直後にVirtualAllocで予約かけたら、
もうちょっと大きくとれないか?
- 425 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 16:38:48 ]
- >>423
環境によるし、その時のアドレス空間の空き状況にもよる。
- 426 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 17:03:25 ]
- 特に設定しなければ、ユーザーエリアは最大2GB
そこをプログラムで使用中の上、連続したエリアを取りたいんだろうからそんなもんだな
- 427 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:40:03 ]
- PCに1GBのメモリを確保できるだけの余力がなかったりして。:-)
- 428 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:43:40 ]
- そんな大量に物理メモリを取りたければドライバ書けばいいだろ
- 429 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:45:44 ]
- つーか64bitに移行しろ
- 430 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:57:29 ]
- 顧客にそんなこと言えますか? ねぇ、あなた
- 431 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:00:54 ]
- こんなとこでそんな質問すんなよ
- 432 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:02:39 ]
- メモリが少ない別PCの方が多く確保できた
これタスクマネージャのコミットチャージの最大値までしか取れないみたいですが 物理メモリが少ない方のPCはここの値がちょっと大きいのですが これってどこで調整できますか?まあAPIとは関係ないっぽい話になっちゃいますが・・・
- 433 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:03:09 ]
- 32APIスレなのに64ビットに移行しろとか言わなくても
- 434 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:06:56 ]
- >>429みたいな馬鹿はスルーしましょう。
- 435 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:12:15 ]
- >>432
強制的にramdiskとしてメインメモリより1GB搾取して それをおれおれ専用メモリにしたら? でも、どうやればよいのしらん
- 436 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:14:13 ]
- うんこしてきます。
しばらくお待ちください
- 437 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:15:02 ]
- >432
合計はスワップファイル+物理メモリでしょ。
- 438 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:21:46 ]
- >>413
そもそもDirectX自体、広義にはWin32 APIの一部分ということはともかく、 DirectXの一部みたいだけど、GDI/GDI+の置き換えとか言っているし、 どっちで質問するのがふさわしいかまだよく分かんないね。
- 439 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:31:47 ]
- ここ → DirectXスレへ行け
DirectXスレ → Win32APIスレへ行け って言われるんですね、分かります
- 440 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:34:34 ]
- だったらDirect2Dのスレでも立てればいいだけだろうが
- 441 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:38:20 ]
- 実装はCOMだろうしここになるとは思えない。
- 442 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:38:32 ]
- >>440
スレ立てできないくせにレスしないで下さい。ウザいだけです。
- 443 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 19:42:29 ]
- >>441
(´,_ゝ`)プッ
- 444 名前:108 mailto:sage [2009/02/12(木) 20:16:11 ]
- >>408
ありがとうございます、勉強になりました。 >>409 ありがとうございます。 CommonControl 6.0を使用出来るようになりました。
- 445 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:21:02 ]
- ま、Win7のリボンコントロールもCOMだからな
てかIUIFrameworkでググっても日本語のサイトが1件も出ねぇw
- 446 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:26:02 ]
- これをwin32の質問と見なして良いかどうか微妙ですが、
考えていると脳みそが沸騰して訳が分からなくなったので質問させていただきます。 質問 ・VISTAのAero ON でウィンドウを作成する前にそのサイズを知る方法。 開発環境 SDK/VC++ 2005 問題の解決には、通常GetSystemMetrics()かAdjustWindowRectEx()を使うと思います。 ところが、VISTAのAeroが有効なときは奇妙な現象が起こります。 そこで実験してみました。 dwStyleA = (WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN); dwStyleB = dwStyleA | WS_THICKFRAME; の設定で、100,100 (800x600)をAdjustWindowRectEx すると dwStyleA: 97,76 806x627 border w,h: 3,3 dwStyleB: 92,71 816x637 border w,h: 8,8 という結果が返ります。各borderは、次の式で求めています。 横は(ウィンドウ幅-クライアント幅)/2 縦は(ウィンドウ高-クライアント高-::GetSystemMetrics(SM_CYSMCAPTION))/2 一見して当たり前で、作成されたウィンドウをキャプチャしてサイズを確認した ところ、確かに2000/Xp/VISTA aero off の時は見た目もこの通りになります。 しかし、VISTAのaeroが有効な環境では、dwStyleAでもdwStyleBでも、 見た目はdwStyleBと同じ(!)になるのです。 しかも、GetSystemMetricsもAdjustWindowRectExもAero on/off で同じ値を返します。 もちろん作成後に GetWindowRect()した場合、AdjustWindowRectEx()と 整合性のある値(つまり見た目とは違った値)を返します。 これがAPIのバグでないとしたら、dwm.exeが独自にウィンドウを装飾している ものと思われますが、その値を取得する方法がわかりません。 1.Aero on時に見た目通りのウィンドウサイズを取得する方法は? 2.Aero on時のウィンドウサイズは常に thickframeと同じと見なしていいの? 3.2が良いとした場合、Aero on を手軽に知る方法は?
- 447 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:54:38 ]
- Theme系のAPIを使えば、もう少しまともな値が得られそうな予感。
あまりに面倒臭そうで試す気にもならんが。 ちなみに、AdjustWindowRectExは 必要なクライアント領域を確保するのに指定すべきウィンドウサイズを求めるAPIだから、 その周りのフレームについては何の保証もしていないと思う。
- 448 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:57:20 ]
- そもそも2000/XPでもメニューが2段以上になる場合とかは想定してくれないからな
|

|