Win32API質問箱 Build91
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/11/08(月) 02:01:42やさしいお兄さんや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:080578デフォルトの名無しさん
2010/11/28(日) 22:54:560579デフォルトの名無しさん
2010/11/28(日) 23:31:300580デフォルトの名無しさん
2010/11/28(日) 23:35:300581デフォルトの名無しさん
2010/11/29(月) 00:31:35回答ありがとう
深夜でほとんどやけくそになっていたから質問が日本語になってないな
要約すると、恐らく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:04TextOutW
にしたらどう?
0583デフォルトの名無しさん
2010/11/29(月) 01:00:46_T("文字列")
0584デフォルトの名無しさん
2010/11/29(月) 01:03:280585デフォルトの名無しさん
2010/11/29(月) 01:31:28CopyMemory
ttp://msdn.microsoft.com/ja-jp/library/cc430033.aspx
0586デフォルトの名無しさん
2010/11/29(月) 02:30:28助かった、ありがとう
tchar.hと_stprintf_sという関数があったのか
やっぱやり方ばかりに囚われないでユニとかマルチワイドとか基本的なことから押さえないとアカンね
0587デフォルトの名無しさん
2010/11/29(月) 03:50:370588デフォルトの名無しさん
2010/11/29(月) 03:55:380589デフォルトの名無しさん
2010/11/29(月) 05:21:130590デフォルトの名無しさん
2010/11/29(月) 05:23:02単純なプログラムほど出力物のファイルサイズ激減
CRT意外とおっき
0591デフォルトの名無しさん
2010/11/29(月) 05:39:05そんな大きいの入らないお?
0592デフォルトの名無しさん
2010/11/29(月) 09:21:34修飾部分が本体の文字数を超えるほど何度も拡張されてるんだな
0593デフォルトの名無しさん
2010/11/29(月) 10:11:250594デフォルトの名無しさん
2010/11/29(月) 10:20:480595593
2010/11/29(月) 10:24:460596デフォルトの名無しさん
2010/11/29(月) 10:30:370597デフォルトの名無しさん
2010/11/29(月) 10:42:550598デフォルトの名無しさん
2010/11/29(月) 11:18:230599デフォルトの名無しさん
2010/11/29(月) 14:36:240600デフォルトの名無しさん
2010/11/29(月) 17:12:120601デフォルトの名無しさん
2010/11/29(月) 17:16:020602デフォルトの名無しさん
2010/11/29(月) 17:22:080603デフォルトの名無しさん
2010/11/29(月) 17:25:500604デフォルトの名無しさん
2010/11/29(月) 17:43:190605デフォルトの名無しさん
2010/11/29(月) 19:14:350606デフォルトの名無しさん
2010/11/29(月) 23:00:500607デフォルトの名無しさん
2010/11/30(火) 03:32:490608デフォルトの名無しさん
2010/11/30(火) 09:50:150609デフォルトの名無しさん
2010/11/30(火) 23:13:39画像ファイルのサムネイルを表示してみようとしたのですが、
ImageListに80x80ピクセルのHBITMAPを設定したのですが、真っ黒でしか表示されません。
FillRectで紫で塗りつぶしたりしてみましたが、一向に変化なし。
ためしに、ピクチャーコントロールにHBITMAPを貼り付けてみたら、正しく表示されました。
これって、何か設定が足りないのでしょうか? もしかして、アイコンしか表示できないのでしょうか?
0610デフォルトの名無しさん
2010/11/30(火) 23:17:52ソース貼ってみろ
イメージリストにビットマップを読み込むところがおかしいんだろう
0611デフォルトの名無しさん
2010/11/30(火) 23:33:22問題なくリストビューに表示できるということですね。
0612デフォルトの名無しさん
2010/12/01(水) 00:04:210613デフォルトの名無しさん
2010/12/01(水) 00:10:30次はImageList_Drawで描画されるか確認したら良いんじゃないか?
0614デフォルトの名無しさん
2010/12/01(水) 00:16:33真っ黒でした。
やっぱフルカラーデータをリストビューに表示ってのがマズイのかも知れませんね。
0615デフォルトの名無しさん
2010/12/01(水) 00:19:330616デフォルトの名無しさん
2010/12/01(水) 00:27:300617デフォルトの名無しさん
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同様でした。
0619デフォルトの名無しさん
2010/12/01(水) 00:30:340620デフォルトの名無しさん
2010/12/01(水) 00:32:300621デフォルトの名無しさん
2010/12/01(水) 02:00:07拡大されてしまう為、これを阻止し、
アイコンを中央に表示したいと思うのですが、どういった方法をとればよいのでしょうか。
HBITMAPに貼り付けてAddしてみたのですが、ギザギザなアイコンしか表示することが出来ませんでした。
0622デフォルトの名無しさん
2010/12/01(水) 08:57:120623デフォルトの名無しさん
2010/12/01(水) 08:58:290624デフォルトの名無しさん
2010/12/01(水) 09:01:130625デフォルトの名無しさん
2010/12/01(水) 09:34:410626デフォルトの名無しさん
2010/12/01(水) 10:38:290627デフォルトの名無しさん
2010/12/01(水) 17:04:590628デフォルトの名無しさん
2010/12/01(水) 19:28:54元々、複数の同サイズのイメージを管理するためのものだから、
そういう対応は難しい気がする。
予め256x256の画像の中心に貼り付けてから追加するとか、
自前で好きなように描画するとかしかないんじゃないか?
0629デフォルトの名無しさん
2010/12/01(水) 20:04:250630デフォルトの名無しさん
2010/12/01(水) 20:07:470631デフォルトの名無しさん
2010/12/01(水) 21:15:07イメージリストに登録する前に、HBITMAPのデバイスコンテキストを
開放していないことがいけなかったようです。
0632デフォルトの名無しさん
2010/12/02(木) 02:34:57反転表示させず、エクスプローラの様に黒枠で囲むにはどのような操作が必要でしょうか。
0633デフォルトの名無しさん
2010/12/02(木) 03:10:550634デフォルトの名無しさん
2010/12/02(木) 13:41:57There are no programmers.
There are only 2channelers.
0635デフォルトの名無しさん
2010/12/02(木) 18:27:490636デフォルトの名無しさん
2010/12/02(木) 20:57:352重起動でプログラムを実行すると、1つ目のアプリにフォーカスが当たり最前に表示(最小化から復元)するのを見かけます。これと同じことをしたい
のですが、どのように実装すればよいのでしょうか?
0637デフォルトの名無しさん
2010/12/02(木) 20:59:46まず、多重起動してるかかくにんする。
次にウインドウハンドルをとって最小化を解除する。
後はお好きに。
0638デフォルトの名無しさん
2010/12/02(木) 23:35:560639デフォルトの名無しさん
2010/12/02(木) 23:43:280640デフォルトの名無しさん
2010/12/03(金) 01:11:180641デフォルトの名無しさん
2010/12/03(金) 01:47:070642デフォルトの名無しさん
2010/12/03(金) 07:46:100643デフォルトの名無しさん
2010/12/03(金) 08:09:22HMMIO 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。本物は
http://msdn.microsoft.com/en-us/library/dd757331(VS.85).aspx
0645デフォルトの名無しさん
2010/12/03(金) 09:19:39サンクスできた
0646デフォルトの名無しさん
2010/12/03(金) 15:27:530647デフォルトの名無しさん
2010/12/03(金) 17:30:100648デフォルトの名無しさん
2010/12/03(金) 17:57:340649デフォルトの名無しさん
2010/12/03(金) 18:27:500650デフォルトの名無しさん
2010/12/03(金) 18:29:090651デフォルトの名無しさん
2010/12/03(金) 18:32:500652デフォルトの名無しさん
2010/12/03(金) 18:40:110653デフォルトの名無しさん
2010/12/03(金) 18:59:230654640
2010/12/03(金) 19:32:520655デフォルトの名無しさん
2010/12/04(土) 10:37:230656デフォルトの名無しさん
2010/12/04(土) 11:33:240657デフォルトの名無しさん
2010/12/04(土) 11:35:300658デフォルトの名無しさん
2010/12/04(土) 12:07:190659デフォルトの名無しさん
2010/12/04(土) 19:45:240660デフォルトの名無しさん
2010/12/04(土) 20:16:180661デフォルトの名無しさん
2010/12/04(土) 20:17:210662デフォルトの名無しさん
2010/12/05(日) 01:01:140663デフォルトの名無しさん
2010/12/05(日) 01:17:38FindWindowExにはそのような問題はないのでしょうか?
最初にhwndChildAfter=NULLで呼び出したときにウィンドウツリーのスナップショットを持っていてくれればよいのですが、
EnumChildWindowsの場合と違って、スナップショットのメモリを解放すべき時期がWin32には分からないように思えます。
0664デフォルトの名無しさん
2010/12/05(日) 02:22:060665デフォルトの名無しさん
2010/12/05(日) 04:42:27ヤフオクとかで安く出てるけど。
0666デフォルトの名無しさん
2010/12/05(日) 04:43:370667デフォルトの名無しさん
2010/12/05(日) 09:07:26一部 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:050669デフォルトの名無しさん
2010/12/05(日) 19:48:550670デフォルトの名無しさん
2010/12/05(日) 21:06:47例えばコントロールAのクライアント内でマウスをクリックする度に
画像を切り替えていく処理を作っていてBitBltで実現しているのですが、
描画する度に前回の描画状態が残ってしまいます。
InvalidateRect( NULL, NULL, TRUE );でやると前回の描画状態も
消えてくれるのですが、画面全体がちらついてしまうので
やはり対象のコントロールAのクライアント領域に対してのみ
前回描画状態のリフレッシュをやったあと描画をやりたいのですが
どういうやり方でやればいいのでしょうか?
色々試したのですがどうしてもできません。
よろしくお願いします。
0671デフォルトの名無しさん
2010/12/05(日) 21:07:410672デフォルトの名無しさん
2010/12/05(日) 21:12:250673デフォルトの名無しさん
2010/12/05(日) 21:30:59せめて、第一引数にウインドウハンドル入れるんだ。改善しないと思うけど。
第二引数はGetCliantRectでとったものを入れるのが望ましく、
第三引数はFALSEにしておいて、ウインドウ全体をかきかえるのが望ましいかな。
ダーティレクトは捨てるんだ。
0674デフォルトの名無しさん
2010/12/05(日) 21:31:590675デフォルトの名無しさん
2010/12/05(日) 22:21:58>前回描画状態のリフレッシュをやったあと描画をやりたいのですが
消したいのか残したいのかどっちなんだ?
0676670
2010/12/05(日) 22:54:07コントロール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
教えていただいてありがとうございます。それも一つの案として他にも何かないかもう少し探してみます。
■ このスレッドは過去ログ倉庫に格納されています