トップページ⇒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から探してください。
0577デフォルトの名無しさん2010/11/28(日) 22:51:08
藤
0578デフォルトの名無しさん2010/11/28(日) 22:54:56
吉
0579デフォルトの名無しさん2010/11/28(日) 23:31:30
外
0580デフォルトの名無しさん2010/11/28(日) 23:35:30
郎…
0581デフォルトの名無しさん2010/11/29(月) 00:31:35
>>551
回答ありがとう
深夜でほとんどやけくそになっていたから質問が日本語になってないな
要約すると、恐らくLPCSTRやLPCTSTRやWってなんだよそれに整形して入れるにはどうしたらいいんだろうという話だったんだと思う

static TCHAR buf[4];
sprintf(buf,"%d",21);
TextOut(hdc,100,150,buf,lstrlen(buf));

をユニコードでやっていたからエラーだったのでググった結果マルチバイトにしたら通った
ただユニコードならどうやればいいのかまだ分からないのでどなたか教えて欲しい
同じように

static WCHAR buf[4];
wprintf(buf,"%d",21);
TextOut(hdc,100,150,buf,lstrlen(buf));

としてみたがコンパイラは通るが動かない
0582デフォルトの名無しさん2010/11/29(月) 00:38:04
>>581
TextOutW
にしたらどう?
0583デフォルトの名無しさん2010/11/29(月) 01:00:46
>>581
_T("文字列")
0584デフォルトの名無しさん2010/11/29(月) 01:03:28
自作の構造体my_tをコピーするCopyMyT() APIを実装するにはどうしたらいいですか?
0585デフォルトの名無しさん2010/11/29(月) 01:31:28
>>584
CopyMemory
ttp://msdn.microsoft.com/ja-jp/library/cc430033.aspx
0586デフォルトの名無しさん2010/11/29(月) 02:30:28
>>583
助かった、ありがとう
tchar.hと_stprintf_sという関数があったのか
やっぱやり方ばかりに囚われないでユニとかマルチワイドとか基本的なことから押さえないとアカンね
0587デフォルトの名無しさん2010/11/29(月) 03:50:37
WindowsプログラミンにおいてCRTで出来ることをWin32APIでやるのは基本的にいいことなのでしょうか?
0588デフォルトの名無しさん2010/11/29(月) 03:55:38
定期あげ
0589デフォルトの名無しさん2010/11/29(月) 05:21:13
SSEで今日の俺は4倍速
0590デフォルトの名無しさん2010/11/29(月) 05:23:02
>>587
単純なプログラムほど出力物のファイルサイズ激減
CRT意外とおっき
0591デフォルトの名無しさん2010/11/29(月) 05:39:05
>>590
そんな大きいの入らないお?
0592デフォルトの名無しさん2010/11/29(月) 09:21:34
_stprintf_sの本体ってprintだよな
修飾部分が本体の文字数を超えるほど何度も拡張されてるんだな
0593デフォルトの名無しさん2010/11/29(月) 10:11:25
ツールチップ(tooltips_class32)で、改行コード(\nや\r\n)を入れてもツールチップ文字列が改行されないのだが、改行させるにはどうすればいいだろうか
0594デフォルトの名無しさん2010/11/29(月) 10:20:48
普通に\nで改行するけど
05955932010/11/29(月) 10:24:46
バルーンチップにしたら改行できた 解決
0596デフォルトの名無しさん2010/11/29(月) 10:30:37
プリン
0597デフォルトの名無しさん2010/11/29(月) 10:42:55
プリン
0598デフォルトの名無しさん2010/11/29(月) 11:18:23
プリソ
0599デフォルトの名無しさん2010/11/29(月) 14:36:24
プンリ
0600デフォルトの名無しさん2010/11/29(月) 17:12:12
プソリ
0601デフォルトの名無しさん2010/11/29(月) 17:16:02
このスレBooで舐めまわされてるのか
0602デフォルトの名無しさん2010/11/29(月) 17:22:08
さげ
0603デフォルトの名無しさん2010/11/29(月) 17:25:50
定期あげ
0604デフォルトの名無しさん2010/11/29(月) 17:43:19
手動Fooですので
0605デフォルトの名無しさん2010/11/29(月) 19:14:35
定期あげ
0606デフォルトの名無しさん2010/11/29(月) 23:00:50
水揚げ
0607デフォルトの名無しさん2010/11/30(火) 03:32:49
おっす、オラ極右!
0608デフォルトの名無しさん2010/11/30(火) 09:50:15
定期あげ
0609デフォルトの名無しさん2010/11/30(火) 23:13:39
ダイアログベースのウインドウに、リストビューコントロールをくっつけて、
画像ファイルのサムネイルを表示してみようとしたのですが、
ImageListに80x80ピクセルのHBITMAPを設定したのですが、真っ黒でしか表示されません。
FillRectで紫で塗りつぶしたりしてみましたが、一向に変化なし。
ためしに、ピクチャーコントロールにHBITMAPを貼り付けてみたら、正しく表示されました。
これって、何か設定が足りないのでしょうか? もしかして、アイコンしか表示できないのでしょうか?
0610デフォルトの名無しさん2010/11/30(火) 23:17:52
>>609
ソース貼ってみろ
イメージリストにビットマップを読み込むところがおかしいんだろう
0611デフォルトの名無しさん2010/11/30(火) 23:33:22
ということは、大きなサイズのHBITMAP画像(フルカラー)でも
問題なくリストビューに表示できるということですね。
0612デフォルトの名無しさん2010/12/01(水) 00:04:21
顧問コントロールのリストビューは256までだったような
0613デフォルトの名無しさん2010/12/01(水) 00:10:30
とりあえずHBITMAPとしては正しいみたいだから、
次はImageList_Drawで描画されるか確認したら良いんじゃないか?
0614デフォルトの名無しさん2010/12/01(水) 00:16:33
ピクチャーコントロールに対して、ImageList_Drawも試してみましたが、
真っ黒でした。
やっぱフルカラーデータをリストビューに表示ってのがマズイのかも知れませんね。
0615デフォルトの名無しさん2010/12/01(水) 00:19:33
ためしに16*16の8BITデータ読ませてみるとか。映れば良しダメならコードに問題ある。
0616デフォルトの名無しさん2010/12/01(水) 00:27:30
イメージリスト作るときILC_COLOR32指定してないとか
0617デフォルトの名無しさん2010/12/01(水) 00:28:36
ん、文章がおかしいぞ。
ピクチャーコントロールに対して、HBITMAPの表示はOK。
イメージリストに登録したHBITMAPは、ピクチャーコントロール、リストビュー共にNG。
ということは、やっぱイメージリストの設定がおかしいのか…。
ちなみに、ImageList_Createの最後の引数、cGrowって0以外の数値でも大丈夫ですか?
ImageList_Addしてって、cInitialの個数を超えたら、cGrowまで拡張って解釈してるんですけど。
0618デフォルトの名無しさん2010/12/01(水) 00:30:06
最初はILC_COLOR24にしてましたが、真っ黒だったので、ILC_COLOR32も試してみましたが
同様でした。
0619デフォルトの名無しさん2010/12/01(水) 00:30:34
じゃあILC_COLORDDB試してみるとか
0620デフォルトの名無しさん2010/12/01(水) 00:32:30
hdc要求するような関数でNULL指定してるかそれ相当してるとか・・・。
0621デフォルトの名無しさん2010/12/01(水) 02:00:07
256x256のImageListに、SHGetFileInfo()で取得した32x32のアイコンをAddIconした場合、
拡大されてしまう為、これを阻止し、
アイコンを中央に表示したいと思うのですが、どういった方法をとればよいのでしょうか。
HBITMAPに貼り付けてAddしてみたのですが、ギザギザなアイコンしか表示することが出来ませんでした。
0622デフォルトの名無しさん2010/12/01(水) 08:57:12
定期あげ
0623デフォルトの名無しさん2010/12/01(水) 08:58:29
定期さげ
0624デフォルトの名無しさん2010/12/01(水) 09:01:13
ここゎ何のスレデスカ??@@
0625デフォルトの名無しさん2010/12/01(水) 09:34:41
@@
0626デフォルトの名無しさん2010/12/01(水) 10:38:29
過疎
0627デフォルトの名無しさん2010/12/01(水) 17:04:59
定期あげ
0628デフォルトの名無しさん2010/12/01(水) 19:28:54
>>621
元々、複数の同サイズのイメージを管理するためのものだから、
そういう対応は難しい気がする。
予め256x256の画像の中心に貼り付けてから追加するとか、
自前で好きなように描画するとかしかないんじゃないか?
0629デフォルトの名無しさん2010/12/01(水) 20:04:25
↑マジワロスww
0630デフォルトの名無しさん2010/12/01(水) 20:07:47
↑↑テラワロスww
0631デフォルトの名無しさん2010/12/01(水) 21:15:07
609ですが、解決しました。
イメージリストに登録する前に、HBITMAPのデバイスコンテキストを
開放していないことがいけなかったようです。
0632デフォルトの名無しさん2010/12/02(木) 02:34:57
リストビューでサムネイルを表示した際、アイテムをクリックすると、画像までもが反転表示されてしまいます。
反転表示させず、エクスプローラの様に黒枠で囲むにはどのような操作が必要でしょうか。
0633デフォルトの名無しさん2010/12/02(木) 03:10:55
定期あげ
0634デフォルトの名無しさん2010/12/02(木) 13:41:57
あげ
There are no programmers.
There are only 2channelers.
0635デフォルトの名無しさん2010/12/02(木) 18:27:49
定期あげ
0636デフォルトの名無しさん2010/12/02(木) 20:57:35
よくウィンドウズのアプリで2重起動を禁止しているアプリがありますが、起動しているアプリが最小化や他のアプリの背後に存在しているときに、
2重起動でプログラムを実行すると、1つ目のアプリにフォーカスが当たり最前に表示(最小化から復元)するのを見かけます。これと同じことをしたい
のですが、どのように実装すればよいのでしょうか?
0637デフォルトの名無しさん2010/12/02(木) 20:59:46
>>636
まず、多重起動してるかかくにんする。
次にウインドウハンドルをとって最小化を解除する。
後はお好きに。
0638デフォルトの名無しさん2010/12/02(木) 23:35:56
mutex
0639デフォルトの名無しさん2010/12/02(木) 23:43:28
findwindow
0640デフォルトの名無しさん2010/12/03(金) 01:11:18
CreateFontでメモリ上にあるフォントファイルを読み込む方法はある?
0641デフォルトの名無しさん2010/12/03(金) 01:47:07
メモリの内容を一時ファイルに書き出して、そのファイルを読み込むのが一般的。
0642デフォルトの名無しさん2010/12/03(金) 07:46:10
定期あげ
0643デフォルトの名無しさん2010/12/03(金) 08:09:22
mmioOpenを使い、メモリ上のファイルを読み込もうと思っていますが、うまくいきません。

HMMIO hMmio = NULL;

MMIOINFO m;
memset(&m, 0, sizeof(MMIOINFO));
m.pchBuffer = メモリへのポインタ;
m.fccIOProc = FOURCC_MEM;
m.cchBuffer = サイズ;
hMmio = mmioOpen(NULL, &m, MMIO_ALLOCBUF | MMIO_READ);

上のm.pchBuffer = メモリへのポインタ;でアクセス違反で止まってしまいます。
MSDNにMMIOINFOについて載っていないのでよくわかりません。ご教授お願いします。
0644デフォルトの名無しさん2010/12/03(金) 08:15:40
> MSDNにMMIOINFOについて載っていないのでよくわかりません
それは偽物のMSDN。本物は
http://msdn.microsoft.com/en-us/library/dd757331(VS.85).aspx
0645デフォルトの名無しさん2010/12/03(金) 09:19:39
>>644
サンクスできた
0646デフォルトの名無しさん2010/12/03(金) 15:27:53
偽者w
0647デフォルトの名無しさん2010/12/03(金) 17:30:10
為者w
0648デフォルトの名無しさん2010/12/03(金) 17:57:34
為箸w
0649デフォルトの名無しさん2010/12/03(金) 18:27:50
為替w
0650デフォルトの名無しさん2010/12/03(金) 18:29:09
はいはい終了
0651デフォルトの名無しさん2010/12/03(金) 18:32:50
為賛w
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
教えていただいてありがとうございます。それも一つの案として他にも何かないかもう少し探してみます。
■ このスレッドは過去ログ倉庫に格納されています