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

Win32API質問箱 Build47

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/13(月) 08:56:12
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0669デフォルトの名無しさん2006/12/05(火) 05:42:42
>>620
ExpandEnvironmentStringsの話ならおk?
0670デフォルトの名無しさん2006/12/05(火) 05:47:34
>>596
Vistaに限らずNT系の新APIに見えるものは実はntdllの非公開APIに公開の皮を
かぶせただけ、ってパターンも結構あるな。
Win9x切り捨てたので遠慮する必要がなくなったんだろう
0671デフォルトの名無しさん2006/12/05(火) 09:51:21
>>668
ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/aboutdialogboxes.asp
>Dialog boxes usually belong to a predefined, exclusive window class.
>The system uses this window class and its corresponding window procedure for both modal and modeless dialog boxes.
>When the function is called, it creates the window for the dialog box, as well as the windows for the controls in the dialog box,
>then sends selected messages to the dialog box procedure.
0672デフォルトの名無しさん2006/12/05(火) 10:15:18
初歩的な質問ですみません。

VisualC++ 2005 EE を使い始めたのですが、
VisualC++ 6.0と違ってリソースエディタがありません。

なので、無理矢理コントロールをウインドウに貼り付けて処理したいと思うのですが、
どのように貼り付ければ良いのか、参考となるサイトなど教えていただけないでしょか?
0673デフォルトの名無しさん2006/12/05(火) 10:33:34
>>672
VC6のリソースエディタなりサードパーティ製リソースエディタ使えば?BCCFormとか。
0674デフォルトの名無しさん2006/12/05(火) 10:41:56
ダイアログのWindowProc(DefDlgProc)はこんな感じ。

LRESULT API DefDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  BOOL result = FALSE;
  hwnd->DWL_MSGRESULT = 0;
  if(hwnd->DWL_DLGPROC
    && (result = CallDlgProc(hwnd, message, wParam, lParam))
  {
    //メッセージに応じてDWL_MSGRESULTかresultを返す
    return DWL_MDGRESULT or result;
  }
  else
  {
    switch(message)
    {
    /*さまざまなメッセージハンドラ*/
    case WM_XXXX:
      return 何とか
    default:
      return DefWindowProc(hwnd, message, wParam, lParam);
    }
  }
}

DlgProcはダイアログのWindowProcのフロントエンドなので、
DlgProcでデフォルト処理後に独自の処理を加えるのはメンド臭いです。
06756722006/12/05(火) 11:14:36
>>673-674
迅速なレス有難う御座います。
方法すら見当もつかなかった自分としては、お二方のご指南本当に有難いです。
やはりソースコードで全て処理するとなるとやや時間もかかり、
面倒かもしれませんが、頑張ってみようと思います。
0676デフォルトの名無しさん2006/12/05(火) 11:28:37
ドラッグ・アンド・ドロップで
DragQueryFile関数を使いパスつきのファイル名が取得できますが
パスなしのファイル名が取得できる関数はあるのでしょうか?
0677デフォルトの名無しさん2006/12/05(火) 11:30:53
パス削ったらいいがな(´・ω・`)
0678デフォルトの名無しさん2006/12/05(火) 11:37:49
PathFindFileName
06796762006/12/05(火) 11:44:27
>>678
ありがとうございます。
0680デフォルトの名無しさん2006/12/05(火) 13:35:57
>>672
その方法は面倒だが、それだって探せばいくらでも見つかる。
親のWM_CREATEで子をCreateWindow(Ex)すればいいだけ。
0681デフォルトの名無しさん2006/12/06(水) 13:52:31
WindowsでUSBメモリとかで繋いだときにそのタイミングで
接続されたイベントを取得したい場合どうすればいいでしょうか?
ipodを繋いだらitunesが起動するみたいなことがやりたいです。
msdnとかで調べたけどわかりませんでした。
お願いします。
0682デフォルトの名無しさん2006/12/06(水) 14:04:19
WM_DEVICECHANGE
0683デフォルトの名無しさん2006/12/06(水) 15:19:42
DirectXを利用しているプログラムで
日本語入力をしたいのですが
IMEに未確定文字を表示させないようにして
独自で描画することはできますか?
06846832006/12/06(水) 15:49:39
すまん、やっぱDirectXスレのほうで聞いてくる。
0685デフォルトの名無しさん2006/12/06(水) 17:10:55
>>681
SHCNE_MEDIAINSERTEDだな。
0686デフォルトの名無しさん2006/12/06(水) 19:21:50
ツールバーのあるアプリケーションを
ValidateRectで描画を更新しているのですが

VC++6.0から実行すると、ツールバーが消えてしまいますが
exeから動かすとツールバーが表示されています。

これはどうしようも無いんでしょうか。
BeginPaint〜EndPaintだとVC++6.0の実行でも問題なし
0687デフォルトの名無しさん2006/12/06(水) 21:16:06
>>686
絶対なんかやってることがおかしい。

あと「ValidateRectで描画を更新」って何だよ?
0688デフォルトの名無しさん2006/12/06(水) 21:33:28
ValidateRectって「もう描画しなくてもいいよ」って命令じゃなかったぽ?
0689デフォルトの名無しさん2006/12/06(水) 21:35:21
WM_PAINTする領域に含めなくていいよ、という命令
0690デフォルトの名無しさん2006/12/06(水) 21:37:14
その逆はそのまんまでInvalidateRect。
06912032006/12/06(水) 21:48:28
メッセージは
while( 1 )
{
 if( ::PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ) )
 {
  if( ::GetMessage( &msg, NULL, 0, 0 ) <= 0 )
   return msg.wParam;

  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
 }
}

プロシージャでは
GetClientRect( g_hWnd, &wrc );
GetClientRect( g_hTool, &trc );
wrc.top = trc.bottom;
を
case WM_TIMER:
 InvalidateRect( g_hWnd, &wrc, TRUE );
 UpdateWindow( g_hWnd );
 break;

case WM_PAINT:
 ValidateRect( g_hWnd, &wrc );
 break;
といった感じで処理しています。
たまにツールバーが出現したりして謎です。
ValidateRectの描画の更新は、すいません表現を間違えました。
0692デフォルトの名無しさん2006/12/06(水) 21:50:27
標準リストビューの行の高さって変更できますか?
やり方教えてください。
06936912006/12/06(水) 21:50:56
名前欄間違えた。
×203
○686
0694デフォルトの名無しさん2006/12/06(水) 21:51:25
そのビジーループには何か意味があるの?
06956922006/12/06(水) 21:51:31
全部の行ではなくて指定した行の高さってことです。
0696デフォルトの名無しさん2006/12/06(水) 21:52:50
TextOutで�@、�Tとかの表示の文字化けは大丈夫でしょうか。
0697デフォルトの名無しさん2006/12/06(水) 21:53:28
Sleep(1)とかしろよ。
06986962006/12/06(水) 21:54:44
自分は9x系を使っていて、9x系なら大丈夫みたいですが、
他ののWindowバージョンだとどうでしょうか。
0699デフォルトの名無しさん2006/12/06(水) 21:57:10
PeekMessageは何の意味が?
0700デフォルトの名無しさん2006/12/06(水) 21:59:53
>>692
http://www.google.com/search?num=100&hl=ja&ie=EUC-JP&q=%A5%EA%A5%B9%A5%C8%A5%D3%A5%E5%A1%BC%A4%CE%B9%D4%A4%CE%B9%E2%A4%B5
0701デフォルトの名無しさん2006/12/06(水) 22:00:33
IDLE時に何かしたい時にあういうループ組むね
ゲーム作ってる時とか
0702デフォルトの名無しさん2006/12/06(水) 22:02:11
ループなんてどうでもいいが
WM_PAINT内の処理がありえないな
せっかく描画しようとしてるところを、描画もせずに「もう描画しなくていいよ」なんていや消えるのは当たり前だろ
ツールバーも親ウィンドウ上にあるものだぞ?
0703デフォルトの名無しさん2006/12/06(水) 22:05:48
>>691は要は
人に「ちょっとこっち来て!」って呼んどいて
来たら「こっち来るんじゃねーよ!」って言うようなもんだな。
07046862006/12/06(水) 22:06:39
InvalidateRect と ValidateRect に
NULLなりGetClientで得た領域をそのまま渡すと
ツールバーが塗り潰されてしまいます。

ツールバーとValidateRectは合わないのだろうか
0705デフォルトの名無しさん2006/12/06(水) 22:07:49
>>700
>>695
0706デフォルトの名無しさん2006/12/06(水) 22:09:42
>>704
つーかあんた、最初の自分の書き込みで最後に結論出してるだろうが
07076862006/12/06(水) 22:12:12
>>706
BeginPaint〜EndPaint を使うと
DirectXの
Clear, BeginScene, EndScene, Present使うと
チラチラチラチラするもんで
出来れば ValidateRect を使いたいなと
07087042006/12/06(水) 22:12:30
後キミ、InvalidateRectを目が痛くなるまで調べてこい
0709デフォルトの名無しさん2006/12/06(水) 22:44:13
ちょっと待って
>>686=>>704=>>708なの?
0710708=7062006/12/06(水) 22:46:58
すごく、ミスです・・・orz
07116962006/12/06(水) 22:54:02
どなたか、>>696>>698についてお願いします。
0712デフォルトの名無しさん2006/12/06(水) 22:56:44
文字化けが大丈夫かって、どう大丈夫なのかわかりゃせんし
文字化けするかしないかってだけなら

そ ん な こ た ぁ 自 分 で 実 行 し て み り ゃ わ か る だ ろ
0713デフォルトの名無しさん2006/12/06(水) 22:59:31
そもそも、�@とか�Tとかの文字化けがなぜ起こるのかを知ってたら
>>696みたいな質問は出てくるわけがないと思うんだが。
0714デフォルトの名無しさん2006/12/06(水) 23:00:38
丸数字とかはOSの違いによる文字化けじゃなかったか?
まあソフトで使う分には、対象言語圏が日本なら心配要らないだろう
0715デフォルトの名無しさん2006/12/06(水) 23:03:07
そんなに心配ならTextOutW使っておけ。9xでも対応している。
0716デフォルトの名無しさん2006/12/06(水) 23:05:44
かなり誤解を招きそうなので訂正

丸数字の文字化けを考えないといけないのは違うOSで表示させる場合
(WEBアプリケーションとか)
0717デフォルトの名無しさん2006/12/06(水) 23:06:26
つ プリンタにフォントが無い

この場合も化けはしないけどな
07186962006/12/06(水) 23:21:48
みなさまありがとうございます。
参考になりました。
0719デフォルトの名無しさん2006/12/06(水) 23:34:04
うっかりCreateFontでCharSet(文字集合)がとんでもないものを指定してしまったフォントでは化ける。
勿論丸付き数字どころの騒ぎではない。
0720デフォルトの名無しさん2006/12/07(木) 00:09:42
タスクバーに表示させない方法はあるのでしょうか?
0721デフォルトの名無しさん2006/12/07(木) 00:15:00
何を?
0722デフォルトの名無しさん2006/12/07(木) 00:26:59
天は自ら助くる者をタスク
07237202006/12/07(木) 00:41:14
ウインドウが開いているときにタスクバー
に表示させない(つかわない)方法はないでしょうか?
0724デフォルトの名無しさん2006/12/07(木) 01:09:40
ウィンドウのスタイルを変えるかタスクバーのリストビューをフック
0725デフォルトの名無しさん2006/12/07(木) 01:20:22
WS_EX_APPWINDOWだっけ?
0726デフォルトの名無しさん2006/12/07(木) 02:07:18
アイコンエディタって何が使いやすい?
0727デフォルトの名無しさん2006/12/07(木) 05:58:30
俺は Axialis のシェアウェア使ってる。
その他のアイコンエディタをほとんど使ってないから、
他と比べてどうかは知らんが満足してる。
0728デフォルトの名無しさん2006/12/07(木) 07:05:56
>>720
不可視の親ウィンドウ
0729デフォルトの名無しさん2006/12/07(木) 10:15:11
>>704
>ツールバーが塗り潰されてしまいます。
DirectXが塗りつぶしているのなら、DirectXの使う領域を指定する。
単一色で塗りつぶされているのなら、ウィンドウスタイルにWS_CLIPCHILDRENをつける。
または、WNDCLASS(EX)のhbrBackground=NULLでもいいと思う。

それより、DirectX描画用の子ウィンドウをつくり、
WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
0730デフォルトの名無しさん2006/12/07(木) 10:27:26
つーか何ゆえに
別にウィンドウが一旦隠れたわけでもないのに
メッセージループ内からWM_PAINT発生させてんのか理解できんのだが
そんなことすりゃチラつくのは当たり前だろうと
WM_PAINTの存在意味を解って無いだろ
0731デフォルトの名無しさん2006/12/07(木) 11:39:00
>そんなことすりゃチラつくのは当たり前だろうと
BeginPaintせずにValidateRectしてるんだからちらつきましぇん。
07326862006/12/07(木) 11:59:59
>>729
有難うございます
WS_CLIPCHILDRENで解決しました。

領域を指定しての最初のValidateRect
は無効領域を残したままだったので
いつまでもWM_PAINTが残っている状態でした。
かといって全領域を指定するとWM_PAINTは消えますが
ツールバーごと塗り潰すといった事態に

DirectXに関してはPresentに
ツールバー分を引いたクライアント領域に
転送(2番目引数)するようにしています。

>DirectX描画用の子ウィンドウをつくり、
>WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
その内使わせて頂きます。

>>730
アニメーションやらシミュレーションやらを入れたいと思ったので
WM_PAINTを発生させまくる状況を作ってみました。
0733デフォルトの名無しさん2006/12/07(木) 16:31:03
>>726
@icon + ドットエディタ
0734デフォルトの名無しさん2006/12/07(木) 20:26:05
Direct3Dを使っていてなぜ
アニメーションやらシミュレーションやらを入れるのにWM_PAINT連打せねばならぬのか
0735デフォルトの名無しさん2006/12/07(木) 23:34:51
C#を使ってプログラミングしてます。
他アプリケーションのDataGridに表示されている値を取得する方法はありますでしょうか?
LABELやConboBoxの値はWin32APIを使って取得する方法は分かるのですが
DataGrid系に表示されている値の取得方法がどうしても分かりません・・・('A`)
0736デフォルトの名無しさん2006/12/08(金) 01:29:31
マ板で質問したのですが、ム板に誘導されましたので、こちらで質問します。

CD-Rや、DVD-Rなどの光メディアに、プログラムから書き込むことって可能ですか?
API名とか、ヒント下さい。

0737デフォルトの名無しさん2006/12/08(金) 01:56:42
>>736
IMAPI
0738デフォルトの名無しさん2006/12/08(金) 01:59:27
>736
SPTI
0739デフォルトの名無しさん2006/12/08(金) 02:00:54
GetPixel()でDirectX使ったアプリの色情報を取得したいのですが、
どうしても0が返されます。

DirectXアプリ以外のエリアで情報を取得する分には問題ないのですが。

特殊なやり方をしないととれないのでしょうか。
0740デフォルトの名無しさん2006/12/08(金) 02:07:02
>>737-738
なるほど、こんなのが有ったんですね。
ありがとうございます。助かりました。
0741デフォルトの名無しさん2006/12/08(金) 03:15:59
文字認識や手書き認識の再利用可能なモジュールってどこかにあるのだろうか?
0742デフォルトの名無しさん2006/12/08(金) 04:25:42
Win32 APIに?
0743デフォルトの名無しさん2006/12/08(金) 05:08:28
Tablet PC Platform SDKでは提供されているみたいだけどね。
0744kk2006/12/08(金) 08:51:48
WinAPI + C++で、リソーススクリプトで作った
ダイアログのエディットボックスに入力されてる文字列はどうすれば
PTSTRなどに入れられるのでしょうか
0745デフォルトの名無しさん2006/12/08(金) 08:57:56
普通にGetDlgItemText/GetWindowText
0746kk2006/12/08(金) 09:17:28
リソーススクリプトを使用しているので、エディットボックスのHWNDがないのですが。。。
0747デフォルトの名無しさん2006/12/08(金) 10:02:43
なんで、リソーススクリプトを使用していると、エディットボックスのHWNDが無いと思うの?
07482452006/12/08(金) 11:21:04
CreateCompatibleDCで作った場所に、
rectangleで書きこんで一部消去とか(真中だけ抜く)は、
抜きたい部分をXORで合成するしかないでしょうか?
指定したrectの分だけ消去するとかできないもんでしょうか。
CreateCompatibleDCで作った場所に書きこんで、
ほかのDCに書きこんだら、CreateCompatibleDCにrectangleしたところ意外は、
透明でほかのDCに書きこまれるので、rectangleの真中だけ書きこむ前の透明にしたいです。
0749デフォルトの名無しさん2006/12/08(金) 11:23:28
>>748
日本語でおk

rectangleしたところって意味不明すぎるw
0750デフォルトの名無しさん2006/12/08(金) 11:25:40
>>746
GetDlgItemTextは親のウィンドウハンドルと子のIDがあれば十分。
GetWindowTextLengthとGetWindowTextのコンビを行いたければ、GetDlgItem使え。
07517482006/12/08(金) 12:33:40
// Rectangleするとこ
HDC hDC = GetDC(hWnd)
HCD hMemoryDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateComatibleBitmap(hDC, 640, 480);
SelectObject(hMemoryDC, hBitmap);
DeleteObject(hBitmap);
SelectObject(hMemoryDC, GetStockObject(GRAY_BRUSH));
Rectangle(hMemoryDC, 0, 0, 640, 480);
ClearRect(hMemoryDC, 160, 120, 480, 360);// Rectangleで書いたところの一部を消したい

----------
WndProcでWM_PAINTのところ
case WM_PAINT:
 hDC = BeginPaint(hWnd, &ps);
 BitBlt(hDC, 0, 0, 640, 480, hMemoryDC, 0, 0, SRCCOPY);
 EndPaint(hWnd, &ps)

↑みたいな処理で、ClearRectに該当する処理を探しています
0752デフォルトの名無しさん2006/12/08(金) 12:47:57
>>751
>SelectObject(hMemoryDC, hBitmap);
>DeleteObject(hBitmap);

こういうところ見ると仕組みを理解してないのがよくわかる。
ここを一通り呼んで勉強してくれ。
ttp://msdn.microsoft.com/library/en-us/dnanchor/html/gdi.asp
07537482006/12/08(金) 13:02:33
>>752
ttp://www13.plala.or.jp/kymats/study/MULTIMEDIA/bmp_multibuf.html
ここを参考にしました
07547482006/12/08(金) 13:11:20
>>751
使っている間は、DeleteObjectしたらあかんという意味ですね。
プログラミングWindowsを読むと、WM_DESTROYでDeleteObject(hBitmap)みたくなっているのが多いので。
0755kk2006/12/08(金) 13:27:56
>>745>>747>>750
ありがとうございます。
>>747
そう思ったのは、リソーススクリプトを使用したので
HWND = CreateWindow(--------,---,-,-,.....);
と書かなかったからです。
>>750
GetDlgItemText()で、ちゃんと入力された文字列を取り入れることができました。
ありがとうございます。
0756デフォルトの名無しさん2006/12/08(金) 15:17:28
>>753
何そのダメすぎるサイト
そんなとこ参考にしてたらキミも終わっちまうぜ
07577482006/12/08(金) 15:39:20
オレ・オワタ
0758デフォルトの名無しさん2006/12/08(金) 16:50:47
JavaでいうところのSystem.currentTimeMillisはありますか?
0759デフォルトの名無しさん2006/12/08(金) 16:54:01
途中で投稿してしまいました。

JavaでいうところのSystem.currentTimeMillisはありますか?
GetLocalTimeでSYSTEMTIMEとって自分で掛け算ですか?
0760デフォルトの名無しさん2006/12/08(金) 17:00:46
ttp://msdn.microsoft.com/library/en-us/sysinfo/base/time_functions.asp
0761デフォルトの名無しさん2006/12/08(金) 18:57:27
ほかのプログラムにバイナリデータを渡して起動するには
どんな方法がよさげ?

コマンドラインパラメータ以外で。
0762デフォルトの名無しさん2006/12/08(金) 19:10:59
量とかどういう処理なのかとかもっと具体的じゃないと検討しようがない。

コマンドライン以外だと渡して起動というよりも起動後通信だな。
pipe、共有メモリ、ネットワーク等。
0763デフォルトの名無しさん2006/12/08(金) 19:18:10
>>762
量は多くても1KBくらい。
確実に渡せる方法がいいです。
0764デフォルトの名無しさん2006/12/08(金) 19:39:20
データ受け渡し用ファイルでも作れば?
0765デフォルトの名無しさん2006/12/08(金) 19:46:54
>>764
そうしてみるわ
トンクス
0766デフォルトの名無しさん2006/12/08(金) 20:30:14
質問です。
Windowsのエクスプローラの、ファイルやフォルダが表示される部分を
自分で作ったウィンドウに埋め込むにはどうすれば良いでしょうか。
0767デフォルトの名無しさん2006/12/08(金) 20:37:23
ttp://www.nitoyon.com/vc/tips/ie_component.htm
IEコンポーネントを使っている例だが参考になる。
アドレスバーに入力すればわかるが、フォルダだって表示できる。
0768デフォルトの名無しさん2006/12/08(金) 20:43:30
右クリックで警告がでたりするがな。
■ このスレッドは過去ログ倉庫に格納されています