5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Win32API 質問箱 Build4

1 :CreateThread:02/06/06 20:03
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

Win32API【2】
http://pc.2ch.net/test/read.cgi/tech/1006783012/ (dat落ち)

Win32API 質問箱 Build3
http://pc.2ch.net/test/read.cgi/tech/1017072275/l50

参考
MSDN Online
http://www.asia.microsoft.com/japan/developer/

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang

2 :デフォルトの名無しさん:02/06/06 20:06
ポケコンのAPIは何個ぐらいあるんでしょうか?

3 :デフォルトの名無しさん:02/06/06 20:09
>>1

>>2
氏ね

4 :デフォルトの名無しさん:02/06/06 20:09
乙〜

5 :デフォルトの名無しさん:02/06/06 20:35
>>1
乙カレー

6 :デフォルトの名無しさん:02/06/07 10:25
APIのRegDeleteKeyなんですけど、書籍を見てもWebで調べても
「そのキーにサブキーがある場合は失敗します」って書いてあったんですけど、
何度やってもどうもサブキーごと消してくれちゃうんですよね。
いや、実はその方がありがたいんですけど。

こういう動作をするものだと思ってていいのでしょうか?
これ出来上がったら配布しなきゃならないものでちょっと心配です。

あ、私の環境はWin98です。

7 :デフォルトの名無しさん:02/06/07 10:35
SHDeleteKey使った方が良くないかな

8 :デフォルトの名無しさん:02/06/07 11:27
>>6
9xでは成功するけどNTでは失敗します。

9 :デフォルトの名無しさん:02/06/07 11:33
>>6
RegDeleteKey
Windows 95: 指定されたレジストリキーとそのサブキーを、すべて削除します。
Windows NT: 指定されたレジストリキーを削除します。サブキーを持つキーを削除することはできません。

ちゃんとMSDNに書いてある…

10 :6:02/06/07 15:15
>>7
今調べてみたんですけど、双方の違いがよくわかりませんでした。
どう違ってなぜそちらの方が良いのか教えてもらえると助かります。

>>8-9
どうやらそのようですね。(今MSDN見てきました)
調べ方が甘かったようです…。

おかげで助かりました。
みなさんありがとうございました。

11 :デフォルトの名無しさん:02/06/07 16:40
プログレスバーを使うときに、上限値が不明の場合は、どのようにするのがもっともらしくみえるでしょうか。

あるツールで、指定したディレクトリ以下のすべてのファイルとディレクトリをスキャンするような部分があります。
従来は単純にスキャンしたファイルの数を表示していたのですが、
上司から「次のバージョンからプログレスバーを付けて、処理状況をグラフィカルに表示するように」と言われました。

ファイルの数は少ないときでは数個、多いときでは数千個になると思います。

こういう場合は、どのようにするのが一般的なのでしょうか?

12 :デフォルトの名無しさん:02/06/07 16:45
1 最初にファイルリストを得る
2 エクスプローラのように、ゲージいっぱいで作業を続けてお茶を濁す

13 :デフォルトの名無しさん:02/06/07 17:11
>10
> 今調べてみたんですけど、双方の違いがよくわかりませんでした。

NTでもサブキーがあっても削除できるじゃん

14 :どはまり:02/06/07 17:47
BitBltについて確認させてください。
MSDNに「コピー先のデバイスコンテキストに対して、伸張、圧縮、回転のいずれかが実施されます」
とあるのですが、BitBlt(dcDst, 0, 0, 100, -100, dcSrc, 0, 0)
とやっても、Y軸に対して反転しませんよね?



15 :デフォルトの名無しさん:02/06/07 17:57
君はStretchBltと勘違いしている。

16 :どはまり:02/06/07 18:00
>15
srcDCとdstDCの座標を重ねて考えたとき、
BitBltは平行移動で、
StretchBltは座標変換という理解であってますか?

17 :デフォルトの名無しさん:02/06/07 18:11
>>16
両者の違いは「転送先のビットマップの幅と高さ」を指定するかしないか。
StretchBltでは転送先の幅と高さに負数を与えるとビットマップが反転する。
まあ色々と実験してみてくれ。

18 :またもや:02/06/07 20:25
GetDIBitsが動きません。
戻り値として指定したスキャンライン数が返ってくるのですが、バッファー内には0しかない…
ZeroMemoryせずにデバッグしてみたら、GetDIBitsで0で埋められているようです。
だれか、同じ事経験した方いませんか?
MSDN調べまくったのですが、わからない。

19 :デフォルトの名無しさん:02/06/07 20:40
>>11
じゃあ、探すディレクトリの直下のディレクトリ数を調べて、それで進行状況を出す。
直下に5個のディレクトリがあったら、それぞれ調べるごとに 20% ずつ進むことにする。

20 :デフォルトの名無しさん:02/06/07 20:53
>>18
GetDIBits使ったことがないんでアレなんだが、考えられそうなのはこれくらいか。

・GetDIBitsの引数を正しく指定しているか?
・ビットマップをデバイスコンテキストに選択していないか?

GetDIBitsって拡張エラー情報返さねぇのかな・・一応見てみてくれ。

21 :デフォルトの名無しさん:02/06/07 21:18
>20
レスありがとうございます。
エラーだと0が返るんですが、エラーにはなっていないようです。

ただ、どうも渡しているビットマップがおかしいようです。
ウィンドウに表示されている内容をファイルに落としたいのですが、
hDC = GetDC(..)
hMemDC = CreateCompatibeDC(hDC)
bitmap = CreateCompatibleBitmap(..)
BitBlt(hMemDC, ..., hDC)
GetDIBits(hMemDC, bitmap...)
とやっているのですがSelectObjectでbitmapを選択していないと0だけだし、
SelectObjectしているとちょっとだけゴミがはいります。

22 :デフォルトの名無しさん:02/06/07 21:24
>>21
正しく、真っ黒い画像が得られたとか。

23 :デフォルトの名無しさん:02/06/07 21:31
>>21
> BitBlt(hMemDC, ..., hDC)
何これ

24 :デフォルトの名無しさん:02/06/07 21:42
>>21
メモリDCにちゃんと描画されてないとか。

hDC = GetDC(..)
hMemDC = CreateCompatibeDC(hDC)
bitmap = CreateCompatibleBitmap(..)
// ここでSelectObject(hMemDC, bitmap)してるか?
BitBlt(hMemDC, ..., hDC)
// ここでSelectObjectで選択を解除し、以前のビットマップに戻す
GetDIBits(hMemDC, bitmap...)

25 :デフォルトの名無しさん:02/06/07 21:52
>24
MSDNによると選択中のビットマップではいけないとあるのですが…
SelectObjectで作ったビットマップを指定しないと何も返らないので、SelectObjectしていて、
元のオブジェクトをSelectObjectして、指定解除するのが無かったためですた。

どうもありがとうございました。

ついでといっては何ですが、もう一つ教えてください。
BITMAPINFOHEADERのbiCompressionなどにBI_JPEGやBI_PNGというのがありますよね。
このビットマップ形式でも表示できるということかと思うのですが。
さて、逆にJPEGやPNG形式で取得というのは可能なのでしょうか?

26 :デフォルトの名無しさん:02/06/07 22:06
>>25
結局GetDIBitsはダメだったのか?報告キボン

BI_JPEGとかBI_PNGは新しいOS(98, 2000以降)でしか
使えないみたいだから俺は知らない。あとは自分で調べるか
知ってるやつが来るまで待つか。

27 :デフォルトの名無しさん:02/06/07 22:18
>26
> 結局GetDIBitsはダメだったのか?報告キボン
おかげさまで、イメージの取得に成功しました。
親切な皆さんのおかげです。ありがとうございました。
BitsPerPixelが16bitや32bitでも取得できましたし、BI_BITFIELDSで
5:6:5マッピングも正常に動きました。

> BI_JPEGとかBI_PNGは新しいOS(98, 2000以降)でしか
> 使えないみたいだから俺は知らない。あとは自分で調べるか

やってみた限りでは、「パラメータが間違っています。」というエラーになるのですが…
私が指定しているパラメータの性もあるので、

> 知ってるやつが来るまで待つか。
です。

28 :デフォルトの名無しさん:02/06/08 17:39
BI_JPEGとかBI_PNGは、プリンタDCにしか使えないような
感じでMSDNに書いてあるけど、どうなんだろ。

前ここで質問したけど、誰も知らなかったですねぇ(´・ω・`)

29 :デフォルトの名無しさん:02/06/09 11:54
WAN側のLAN接続を取得する方法を教えてください。
以下のように取得すると、ダイヤルアップの設定は取れるのですが、LANの設定が取れません。
PCにLANカードが3枚指してあるので、RasEnumEntriesだとインターネットにつながっている
ルーター/PCとのコネクションを取得したいのですが。


RASCONN *rasconn = new RASCONN[1];
DWORD cb = sizeof(RASCONN);
DWORD connections;

rasconn[0].dwSize = sizeof(RASCONN);
DWORD code = ::RasEnumConnections(rasconn, &cb, &connections);

if (code == ERROR_BUFFER_TOO_SMALL) {
 delete [] rasconn;
 rasconn = new RASCONN[cb / sizeof(RASCONN)];
 rasconn[0].dwSize = sizeof(RASCONN);
 ::RasEnumConnections(rasconn, &cb, &connections);
}


30 :デフォルトの名無しさん:02/06/09 16:42
C言語なら俺に聞けスレから流れてきました
444で質問していたのですがこちらで質問です

猫でも分かるプログラミングという有名ページがありますが
あそこには超初心者用と書いてあります。
あれが理解できても初心者ですか?
Windows(Win32か)プログラミングに関してはかなりのものになると思うのですが
実際はまだまだなのでしょうか…
確かにあそこだけでは自分でオリジナルなものを作るのには
厳しいと思いますけどWindowsの仕組みを理解するには十分すぎる気もします。


31 :デフォルトの名無しさん:02/06/09 16:44
>>30
だから初心者ってのは意識の問題だっての。

32 :デフォルトの名無しさん:02/06/09 17:04
今31がいいこと言った!

33 :30:02/06/09 18:03
あそこのことが理解できていればWindowsプログラムの仕組みはOKということですね。
重複までしてご迷惑をおかけいたしました。
少しだけですが自信が出ました。

34 :デフォルトの名無しさん:02/06/10 09:55
理解することと使いこなすことは別物(ボソ

35 :デフォルトの名無しさん:02/06/11 05:22
ダイアログのリソースで、LTEXTの内容に(&R)を含めておいて、
ALT+Rを押すとComboBoxなどにフォーカスを移す処理をしたいのですが、
どのようにすればいいのでしょうか?

36 :デフォルトの名無しさん:02/06/11 05:35
2chには、初心者だといって、甘い対応をしてもらおうとする人間と、
初心者なのに有能なつもりの勘違い君の、2通りのタイプしかいない。

37 :デフォルトの名無しさん:02/06/11 06:01
>>35
タブオーダを確認する。
モードレスダイアログならIsDialogMessage()つける。
でいいとおもいます。

38 :デフォルトの名無しさん:02/06/11 12:51
ウィンドウクラスを列挙するAPIってありますか?

39 :デフォルトの名無しさん:02/06/11 12:52
RegisterClassで片っ端から検索。

40 :デフォルトの名無しさん:02/06/11 16:26
以下のコード(省略してありますが...)でHDDからFDDにファイルをコピーしています。
CloseHandleを行う前(<==ココで示したタイミング)にディスケットを取り出してしまう
とエラーのダイアログが表示されてしまいます。回避する方法をご存知の方、
ご教授いただけますでしょうか?

oldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
srcHandle = CreateFile(); //HDD上のファイル
destHandle = CreateFile(); //FDD上のファイル
while(1)
{
ReadFile(srcHandle,...);
WriteFile(destHandle,...);
}

CloseHandle(srcHdl);
      <==ココ
CloseHandle(destHdl);
SetErrorMode(oldMode);

41 :デフォルトの名無しさん:02/06/11 17:41
>>40
そこで取り出さないといけない理由ってのが気になる。なんで?

42 :デフォルトの名無しさん:02/06/11 17:54
>40
WriteFileの後に、FlushFileBuffers汁
もしくは、srcHandleのCreateFileでFILE_FLAG_WRITE_THROUGHを指定汁
結果キボンヌ

43 :デフォルトの名無しさん:02/06/11 18:40
早速の返答ありがとうございます。

>>41
ユーザーの方が誤って取り出した際にエラーメッセージが出てしまった状況です。
(ディスクアクセスしている最中なので、本来は触ってほしくないのですが...)

>>42
FlushFileBuffers、FILE_FLAG_WRITE_THROUGHの指定ともに確認してみましたが、
結果はやはり「ドライブにディスクがありません。・・・」とのダイアログが
表示されてしまいました。
システムでドライブの情報を保持でもしているのでしょうか?
もう少し、調べてみます。

44 :41:02/06/11 19:01
>>43
そういう状況でちゃんとエラーメッセージが出たんだから、
立派な製品じゃないか。胸を張れ(w

45 :41:02/06/11 19:05
>>43
ま、まさか、そういう状況でもエラーなしに書き込めっていう要求もらった?
ガクガクブルブル

46 :デフォルトの名無しさん:02/06/11 19:32
>>43
むしろエラーダイアログ出ない方がまずいだろ。
ユーザーも書き込めたと思うだろうし。

47 :デフォルトの名無しさん:02/06/11 20:14
エラーダイアログをカスタマイズしたいとか。

48 :デフォルトの名無しさん:02/06/11 23:39
いや、
 SetErrorMode(SEM_FAILCRITICALERRORS)
をしてるのになんで、エラーダイアログが出るのか、ということでないの?

49 :40:02/06/12 01:24
すみません。状況説明が不足していますね。

対象がマウス、PCキーボードが接続していないPCで、エラーダイアログが出るとそれに対して操作を行う事が難しいのです。
KIOSK端末みたいなもので、特殊なインターフェイスで専用のキーパッドを接続しています。
キー入力が矢印と数値しかできない(とお考えください)ので、エラーダイアログが出るとそれに対して操作を行う事が難しいのです。

そこでエラーをアプリケーションでハンドリングしようと、SetErrorMode(SEM_FAILCRITICALERRORS)としたにもかかわらず、
40で示したタイミングでダイアログが表示されてしまった...。ということです。

48さんがおっしゃるように
 >SetErrorMode(SEM_FAILCRITICALERRORS)
 >をしてるのになんで、エラーダイアログが出るのか、ということでないの?
というのが、疑問点です。

長文失礼しました。

50 :デフォルトの名無しさん:02/06/12 03:11
>>49
コードでコピーするんじゃなくてCopyFile()使うってのはどう?

あと、どうしてもダメな場合はダイアログでたらボタン押す
監視アプリを常駐させとくとか。
#確かローソンのロッピーとかもそうしてたような…

51 :デフォルトの名無しさん:02/06/12 04:15
そもそも、ディスクを引き抜いた事によるデータの矛盾はブルーバック物のエラーだけど、
さすがに簡単にブルーバックをだすのはユーザビリティに優れているとはいえないから、
ダイアログが出る程度にとどめただけだとおもわれ。

52 :デフォルトの名無しさん:02/06/12 08:28
WM_LBUTTONDOWNでコンテキストメニュー出すアプリケーション多すぎ。
何とかしてくだちい。

53 :デフォルトの名無しさん:02/06/12 13:11
何の話だ?
タスクトレイ?

54 :デフォルトの名無しさん:02/06/12 15:12
WM_CONTEXTMENUを使うべきところで、
WM_LBUTTONDOWNを使っている、て事だろ。

55 :初心者:02/06/12 17:17
通常、描画ルーチンではメモリーDCを作成して描画し、BitBltなどでスクリーンDCに転送
しますが、描画ルーチンでスクリーンDCに直接描画すると何が問題になるのでしょう?

複数の描画処理(線を引くなど)を行ったり、アニメーションする場合にちらつかないように?
という事は、単にビットマップを描画しているだけだと直接描画しても問題ないのかな。

オフスクリーンのイメージとして取っておくならともかく、毎回描画ルーチンでCreateCompatibleDC
でメモリーDCを作るサンプルばかりなので納得でけへん。


56 :デフォルトの名無しさん:02/06/12 17:22
>>54
つまりWM_CONTEXTMENUで処理していないから、
メニューキー押してもコンテキストメニューが出ないってことか。

57 :デフォルトの名無しさん:02/06/12 17:26
>>52
アプリケーションキーを押してもコンテキストメニューが出ないぞゴルァって事?
ちなみに俺はちゃんとWM_CONTEXTMENUで拾ってる。

58 :デフォルトの名無しさん:02/06/12 17:38
>>57被ってんな・・鬱

>>55
ディスプレイDCに何回も描画していると描画の過程が見えるのでちらつく。それだけ。
オフスクリーン使うにしても絶対に一回はディスプレイDCに描かないといけないんだから
GDI関数で線とか円を直接描いても別に問題なかろう。

59 :デフォルトの名無しさん:02/06/12 17:57
>WM_LBUTTONDOWNでコンテキストメニュー出すアプリケーション多すぎ。
左クリックで出ることになるから右クリックで出るようにすれってことじゃないのか。
もちろんWM_CONTEXTMENUで。

60 :デフォルトの名無しさん:02/06/12 18:22
>>59
わお!ミスった
WM_RBUTTONDOWNですた。
タスクトレイのほうも、XPで不具合でてるのわかってるはずなのにその後のアップグレードでも直されてなかったり。

61 :デフォルトの名無しさん:02/06/12 19:19
あるウィンドウの可視な部分のRECTなりRGNを取得するには、どうしたらよいのでしょう?
関係有りそうな、GetClipRgn, GetWindowRgn, GetUpdateRgnなどやりましたが、
どうもうまく取れません。

62 :デフォルトの名無しさん:02/06/12 20:21
>>61
取得できません。以上。

63 :デフォルトの名無しさん:02/06/12 20:40
ウィンドウの最大化ボタンを押したときに発行されるメッセージなどは有りますか?

64 :デフォルトの名無しさん:02/06/12 20:42
>>63
WM_SIZEで、wParam == SIZE_MAXIMIZEDが最大化ボタンのメッセージ。

65 :デフォルトの名無しさん:02/06/12 20:48
>64
即レスありがとうございました。

66 :デフォルトの名無しさん:02/06/12 22:16
>61
GetRandomRgn(hDC, rgn, SYSRGN);
ClientToScreen(m_hWnd, &org);
rgn.OffsetRgn(-org.x, -org.y);
でできますた。

67 :デフォルトの名無しさん:02/06/12 22:18
>>60
>タスクトレイのほうも、XPで不具合でてるのわかってる
詳細きぼんぬ

68 :デフォルトの名無しさん:02/06/12 22:29
>>67
右ボタンを押し下げたときにアプリケーションのコンテキストメニューが表示されて、
右ボタンを離したときにWinが出すタスクトレイ本来のコンテキストメニューが重ねて表示される。

69 :67:02/06/12 23:13
>>68
なるほど。自分のタスクトレイアプリでも WM_RBUTTONDOWN使ってたので(;´Д`)
今チェックしてみたんだけど再現しなかった。状況によるのかな?
っていうか、WM_CONTEXTMENUが飛んでこないっぽい...?

70 :デフォルトの名無しさん:02/06/12 23:17
ローカルなHTMLファイルをタグ?つきで表示したくて
ShellExecute(..."c:\\unkou.html#unkou"...);
ってやっても起動してくれないです。
いい方法あるのでしょうか?

71 :デフォルトの名無しさん:02/06/12 23:23
>>70 あ、それ、俺もちょうど知りたいと思ってた

72 :デフォルトの名無しさん:02/06/12 23:24
・WM_CONTEXTMENUはAPPキーが押されたときとクライアント領域で右クリックされたときに飛んでくる
・タスクトレイで飛んでくるメッセージはWM_*BUTTONDOWN/UP等。
で、タスクトレイとWM_CONTEXTMENUごっちゃにして考えてないか?

73 :デフォルトの名無しさん:02/06/12 23:26
file:///c:/unkou.html#unkou

と汁

74 :デフォルトの名無しさん:02/06/12 23:26
>>70
ここみれ
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB00014094.jpg

75 :52:02/06/12 23:27
>72
漏れは一度もWM_CONTEXTMENUとは言ってない、
とにかくWM_RBUTTONDOWN(当初間違ってLBUTTONと書いた)でメニュー出すのは止めてくれと

76 :デフォルトの名無しさん:02/06/12 23:28
>74
ネタが古い

77 :デフォルトの名無しさん:02/06/12 23:35
>>75
あんた出てこなくて良いって。
あんたの言ってることはたぶんわかってるから。
WM_CONTEXTMENUの話題に移っただけだk

78 :デフォルトの名無しさん:02/06/12 23:49
file:///
にしたらページは開いてくれたんですけど、
#unkouに移動してくれない希ガスるんですが。。
僕タンだけ?

79 :デフォルトの名無しさん:02/06/13 00:10
要するにコンテキストメニュー(ショートカットメニュー、右クリックメニューとも言うのかな?)
は、WM_COMTEXTMENUで表示しなさいって事ですか?

80 :デフォルトの名無しさん:02/06/13 00:24
M$製以外のソフトのトレイアイコン6個中5個がWM_RBUTTONDOWN・・・

81 :デフォルトの名無しさん:02/06/13 02:42
えーとつまりクライアント領域でメニュー出すときは、
WM_RBUTTONDOWNでなくてWM_CONTEXTMENUを使うべし、
タスクトレイでメニューを出すときは、
WM_RBUTTONDOWNでなくてWM_RBUTTONUPで開けってことでいいんすか?

82 :69:02/06/13 14:15
>>81 それなら激しく納得

83 :デフォルトの名無しさん:02/06/13 15:43
APIのみでMFCのビットマップボタンのような機能を実装する方法はありますか?

84 :デフォルトの名無しさん:02/06/13 15:49
BS_OWNERDRAWスタイルを指定してオーナードロー

85 :デフォルトの名無しさん:02/06/13 15:55
>>83
MFCを使え。
MFCもAPIのみで実現されてる

86 :デフォルトの名無しさん:02/06/13 16:12
>84
おかげさまでサンプルプログラムも見つかりましたので何とかなりそうです。
どうもでした。


87 :木村 キタキタマシーン:02/06/13 16:16
>>86
ヨカッタネ

88 :デフォルトの名無しさん:02/06/13 16:57
>>87=木村 キタキタマシーン
内容のないただの相槌を書き込むのはやめといたほうがいい。
反感をもたれるから。

89 :デフォルトの名無しさん:02/06/13 17:01
おまけにどこでもage

90 :62:02/06/13 17:18
>>66
ガーン取得できたのか
VS6.0のMSDNライブラリには載ってなくて
MSDN Onlineにはいつのまにかしれっと
> Windows NT/2000/XP: Included in Windows NT 3.1 and later.
> Windows 95/98/Me: Included in Windows 95 and later.
とか載ってるんですが非公開だったってことですか。
> Windows NT/2000/XP: The region returned is in screen coordinates.
> Windows 95/98/Me: The region returned is in window coordinates.
9xとNTで動作が違うのもいかにも非公開っぽいし

91 :デフォルトの名無しさん:02/06/13 18:16
すいません。MSDNサーフに疲れました。
WIN2000でLANの接続状態をひろえるAPIはありませんか。
またはそれに代わる良い方法があれば教えてください。
VBで接続状態の監視ができるようにしたいのです。

92 :デフォルトの名無しさん:02/06/13 18:24
その、「LANの接続状態」なる語はいったい何を示しているのか
まずはっきり教えてくれ。
まあとりあえず、定期的に鯖にpingでも撃っとけ。

93 :デフォルトの名無しさん:02/06/13 18:52
>>92
うーん、WIN2000のローカルエリアネットワークのプロパティで出てくる
ダイヤログに接俗の『状態:有効(または無効)』ってあるでしょ。
OSでLANの接続状態を監視しているのだろうけど、そいつを利用できないもの
かしらって思ったのです。
今作ってるのはMSDEを使う鯖蔵型のプログラムなんですが、LANが切断されると、
たとえすぐにLANが回復してもDBとのコネクトは回復しないでしょ。
だからLANが切れたときに即、エラー出してプログラムを強制終了させて、つまり
プログラムを再起動させるようにしてしまえば良いカナーっと思ったのです。

94 :デフォルトの名無しさん:02/06/13 18:55
>>93
あ、つまりその、接続状態が「有効」か「無効」かってのを知りたいのです。

95 :92:02/06/13 18:56
ああ、それなら、
GetIfEntry
を使ったらどうかな?

96 :デフォルトの名無しさん:02/06/13 19:03
>>95
即レス感謝です。しかしながらすいません。初耳APIです。
どこかに良いTipsなんて出てたらURL教えて下さい。

97 :デフォルトの名無しさん:02/06/13 19:15
ぐぐるってなぁに

98 :デフォルトの名無しさん:02/06/13 19:16
googleのこと

99 :97:02/06/13 22:44
>>96
googleだってよ。


100 :デフォルトの名無しさん:02/06/13 23:36
文字列を描画するときに文字にグラデーションを掛けたいのですが
使う文字だけ画像データとして持って BitBlt() とかで
描画するのが一般的なのでしょうか?

ttp://www.watch.impress.co.jp/game/docs/20010618/ys20.jpg
↑みたいな感じ
こういうのは使う文字だけ画像データで持っているのでしょうか?

101 :デフォルトの名無しさん:02/06/13 23:52
>100
"ROPコード"って言葉は知ってる?
文字を描いたビットマップとグラデーションのかかったビットマップを用意して、ROPコードを使って2枚を重ねるとできるよ。


102 :デフォルトの名無しさん:02/06/13 23:53
>>100
アルファベットと数字だけとかなら画像で持っててもいいが日本語は現実的じゃない(と思う)。
やるんならDIBSection作ってそこにTextOutして、そのビットイメージに対して加工するとか
するのがいいんじゃなかろうか?

103 :デフォルトの名無しさん:02/06/13 23:59
>>102
・・・・さっきどっかに誤爆したかも・・・?
俺は日本語も画像で持ってる。
画像つっても格納してるのは8bitの輝度情報だけで、実際の色は描画時に計算するんだけど。
JIS第1水準くらいなら画像サイズもそれほど大きくはならないよ

104 :102:02/06/14 00:06
>>103
考え方の違いなんだろうな。俺はチマチマしたゲームばっか作ってるから
そういう発想が全然なかった。うん、参考になったyo。

105 :100:02/06/14 00:07
>>101
知りませんでした。

簡単に言うと、グラデの掛かった画像を、フォントの画像を型として
抜くという感じでしょうか?

>>102, 103
どうしてもわからなかったらその方向にします…。

106 :100:02/06/14 00:27
そうです。
模様を書いた紙の上に文字を白抜きしたもう1枚の紙を置く感じです。
「ラスタオペレーションコード」ともいいます。
具体的には、文字と背景の画像を作って、
PatBlt(),BitBlt(),StretchBlt(),MaskBlt(),PlgBlt()
などで画像を加工します。
詳しくは、Charles Petzoldの「プログラミングWindows」やAPIヘルプに解説があります。


107 :デフォルトの名無しさん:02/06/14 00:31
>>103
たとえばゲームに使うとして、
必要なグリフをビットマップにして配布するのは、
ライセンス違反となることもあるので気をつけないとダメだぞ

108 :デフォルトの名無しさん:02/06/14 00:32
>>107
それはあり得るね、気をつけないとね。

109 :100:02/06/14 00:46
>>101-108
うまく行きました!
ありがとうございました。

またひとつ勉強になりました m(_ _)m

110 :デフォルトの名無しさん:02/06/14 03:22
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
while(1){
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam ;
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}else{
Mainloop(hWnd);
}
}
の様にすると、
1.9xでCPU占拠率が上がる(ノートのバッテリーの持ちが悪くなる)
2.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?

111 :デフォルトの名無しさん:02/06/14 03:24
インデントが崩れてしまったので再投稿です。
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
while(1){
  if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
    if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam ;
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
  }else{
    Mainloop(hWnd);
  }
}
の様にすると、
1.9xでCPU占拠率が上がる(ノートのバッテリーの持ちが悪くなる)
2.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?

112 :デフォルトの名無しさん:02/06/14 03:31
>>110
全部メッセージ経由で処理する。

1. timeSetEvent() を用い、一定時間毎に WM_USER + n をポストするように。
2. WM_USER + n に対するメッセージハンドラから Mainloop() を呼び出す。

113 :110:02/06/14 03:45
>>112
うわー、それ恐ろしく頭良い方法ですねぇ(笑)
ちょっと調べてみたら詳しい情報がわんさか出てきました。
やっぱこれってかなり初心者質問だったみたいですね...
こういうゲームプログラミングの基礎みたいなのって、どんな本に載ってるんですか?
やっぱGame Programming Gems ですか(高くて手を出しにくいんですが...)

114 :デフォルトの名無しさん:02/06/14 03:50
Mainloop(hWnd);
Sleep(1);

115 :デフォルトの名無しさん:02/06/14 03:50
gemsにこんな程度の低いことは乗ってません

116 :112:02/06/14 03:56
>>113
> こういうゲームプログラミングの基礎みたいなのって、どんな本に載ってるん
> ですか?
timeSetEvent() やメッセージを使って処理を進める方法は、ゲームとは無関係に
Win32 のバイブル「プログラミング Windows」を読んで知りました。

ゲームプログラミングの基礎を解説した書籍で「これは」というモノは見かけませ
んね……。Game Programming Gems は、むしろ既にゲームを 2, 3 本書いた人
間がさらなる情報を探す手がかりとして使うもので、論文の abstract 集のような
感じです。いきなり読んでも、あまり役に立たないかと。

117 :デフォルトの名無しさん:02/06/14 03:57
>>115
略すなよ。コの界隈で gems 本というと Graphics Gems もあるし。

118 :110:02/06/14 03:59
>>114
それは知っていましたが、あまりエレガントでは無いので...
>>115
そうなんですか...書評に初級者から上級者までって書いてあったので...
そういう低レベルな事って調べにくいんですがみなさんはどうやって調べたんですか?

119 :デフォルトの名無しさん:02/06/14 04:02
int WinMain(...)
{
try {
mymain(...);
} catch(...) {
// ここでエラーを起こした状態のレジスタ情報や
// スタック情報を取りたいんですがどうしたらいい
// のでしょうか?
}
}

120 :デフォルトの名無しさん:02/06/14 04:04
>>118
エレガントじゃないってどういうことだ?

だったらこう汁!
必要以上のCPU時間を取らないエレガントな実装だ(ワラ

DWORD frame_time = 1000 / 60;
while(1){
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
    if (msg.message == WM_QUIT) return msg.wParam ;
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
  }else{
    DWORD tick = timeGetTime();
    Mainloop(hWnd);
    int interval = timeGetTime() - tick;
    if (interval > 0) ※
      Sleep(interval);
  }
}

※ もしくは
> while (timeGetTime() < tick + frame_time)
> Sleep(0);
このように。

121 :デフォルトの名無しさん:02/06/14 04:04
>>119
すでにスタックが巻き戻っているので手はない。
例外クラスに状態を保存させるしかない。

122 :デフォルトの名無しさん:02/06/14 04:08
>>120
> エレガントじゃないってどういうことだ?
感性が微妙に鈍いな…

あと「もしくは」の方法だと、バッテリー消耗激しい問題は解決しないと思うぞ。
Sleep(0) って、呼び出し側のプロセスよりも実行優先度が高いプロセスが存在
しなければ、すぐに戻って来ちゃうでしょ?

123 :デフォルトの名無しさん:02/06/14 04:12
>>122
>感性が微妙に鈍いな…
どういう意味だ?
正直、すでに定番となっている形式のIdleLoopなのに、
それをエレガントじゃないと切り捨てる意味がわからないって事だが。

>バッテリー
問題ない。
基本的にhltでループ回しているのと変わらないから。
それでかつ精度もそれなりに高いやり方。


124 :デフォルトの名無しさん:02/06/14 04:15
>>121
ありがとうございます。
ということは、catch(...)でしか取れないような
エラーを起こした場合、その原因を知る方法って
ナイのでしょうか?

125 :110:02/06/14 04:23
>>116
しまった!!(^^;
たしかにプログラミングWindows(下)に載ってました。
下は恐れ多くも流し読みしてました(^^;
流し読みしちゃぁいけない本なんですね...
穴があくほど読んで出直します。
Game Programming Gems は、ゲーム2.3本作ってから買うことにします。
>>120
>エレガントじゃないってどういうことだ?
分かりません(^^; なんとなく(1)とかです。
>エレガントな実装だ
ぉお、それも良いですね。
たしかにかなりエレガントですね。
どっちが良いんでしょう。ちょっと自分でも調べてきます。

126 :110:02/06/14 04:39
>>120
if (interval > 0)
 Sleep(interval);
って
if (interval > 0)
 Sleep(frame_time - interval)
ですよね...?

127 :デフォルトの名無しさん:02/06/14 09:55
>>123
> 基本的にhltでループ回しているのと変わらないから。
いや、
> while (timeGetTime() < tick + frame_time)
> Sleep(0);
これは、どう見ても hlt でループ回すのとは別だろ。timeGetTime() も while の
条件分岐も CPU 働くよ。(これが Sleep(1) なら話は分かる)

128 :デフォルトの名無しさん:02/06/14 10:26
>>120ダサ杉
Sleep()中に来たイベントはどうすんだよ。

129 :デフォルトの名無しさん:02/06/14 17:41
質問です。
IEのプラグインツールバーを作ろうと思ってサイトを検索していると、
http://www.codeproject.com/atl/ietoolbartutorial.asp
というサイト見つけたんだけども、commctrl.h が古いらしくコンパイルがとおらない…。
(TBSTYLE_EX_MIXEDBUTTONSが定義されてないとエラーが出てくる)
これって最新のヘッダーファイルはどこに?
(ちなみにVC++6.0で開発しています)

130 :デフォルトの名無しさん:02/06/14 17:49
>>127
Sleep(0)でもSystem Idle Processに1tick処理が回るよ。

131 :デフォルトの名無しさん:02/06/14 17:53
129
VC++.net "commctrl.h"抜粋

#if (_WIN32_IE >= 0x0501)
#define TBSTYLE_EX_MIXEDBUTTONS 0x00000008
#define TBSTYLE_EX_HIDECLIPPEDBUTTONS 0x00000010 // don't show partially obscured buttons
#endif // 0x0501

132 :129:02/06/14 17:59
>>131
ありがとう!

…これって、最新のcommctrl.h が欲しいなら、.net 買うしかないってことなんですかね、
やっぱし。

133 :デフォルトの名無しさん:02/06/14 18:01
>>132
PlatformSDK落とせ

134 :デフォルトの名無しさん:02/06/14 18:02
つーかメッセージループにSleepを置くのはどうかと思うけど。
別スレッド作ってMsgWaitForMultipleObjects。
俺が模作したなかじゃこれが一番エレガント。
精度はパフォーマンスタイマーで補う。

135 :デフォルトの名無しさん:02/06/14 23:44
ゲームループ自体を別スレッドにするというのはどーよ。
Windowsのイベント処理は全部忘れられるぞ

136 :デフォルトの名無しさん:02/06/15 00:17
>>134-135
それは誰でもやること。
あくまでシングルスレッドでがんばりたいって事じゃないのか?

137 :デフォルトの名無しさん:02/06/15 12:13
シングルならなおさら MsgWaitForMultipleObjects じゃないかなあ

138 :デフォルトの名無しさん:02/06/15 14:53
タスクトレイに常駐させるプログラムを作りたいんですが
ウインドウを生成しないプログラムってどうやって作るんでしょう?
ウインドウクラスやcreatewindowは使わないんですよね?


139 :138:02/06/15 14:59
書き忘れましたがVisualCとSDKで作っています。

140 :デフォルトの名無しさん:02/06/15 15:06
>>138
WS_VISIBLE付けずにCreateWindow

141 :デフォルトの名無しさん:02/06/15 17:17
クラスタを直読みする方法を教えてください。

142 :デフォルトの名無しさん:02/06/15 17:57
>>140

HWNDがNULLでGetThreadMessage()でウインドウなしが実現できる

143 :デフォルトの名無しさん:02/06/15 18:12
>>138
普通非表示のウィンドウを作るんでないの

144 :デフォルトの名無しさん:02/06/16 00:38
>>138
て優香、ウィンドウを作らないとタスクトレイアイコンをクリックしたときなどの
通知メッセージを受け取れまへん。


145 :138:02/06/16 01:29
>>144
そうですね、HWNDが無ければダメですね。
非表示のウインドウを作るのが一般的な方法かな。

146 :デフォルトの名無しさん:02/06/16 01:35
マウスの座標(x,y)=(100,200)みたいなデータがchar型の変数に
char grid[128]="100,200"
のように入っているときxとyの値を個別に取り出して別の変数に入れたい時は
どんな感じでプログラミングすればよい?できればintやPOINT型で入れたいんですが。

147 :デフォルトの名無しさん:02/06/16 01:43
>>146
x=atoi(grid);
y=atoi(strstr(grid,',')+1);
ってな処か?
#これはAPIの質問なのか?

148 :デフォルトの名無しさん:02/06/16 01:56
>>146
どうせstdio.hをincludeするなら、
int x,y;
sscanf(grid,"%d,%d",&x,&y);
がスマートかも。
すれ違いなのでSEGA。

149 :デフォルトの名無しさん:02/06/16 02:00
sageてないでSEGAれよ。

150 :146:02/06/16 02:03
えっと、一応Windowsプログラミングをしていているのですが
Cのお話だと思うのですがこのスレで質問してしまいました。

151 :デフォルトの名無しさん:02/06/16 02:11
Cだと思ったらCスレいけよ

152 :146:02/06/16 03:13
APIで出来る範囲はやりたいと思って・・・。

153 :デフォルトの名無しさん:02/06/16 07:00
>>152
無意味

154 :デフォルトの名無しさん:02/06/16 16:16
winプログラムでscanfやsscanfってあまり使わないような・・・。


155 :デフォルトの名無しさん:02/06/16 16:26
stdinがなければscanf()はもちろん使えないけど、sscanf()なら使えるだろ。
実際に使うかどうかはまた別の問題だが、windowプログラムだからかどうかと
は無関係。


156 :デフォルトの名無しさん:02/06/16 16:33
ランタイムライブラリを使いたくない場合は?

157 :デフォルトの名無しさん:02/06/16 16:42
>>156
そういう場合は使わなきゃ良いじゃん

158 :デフォルトの名無しさん:02/06/16 16:52
>>157
スタートアップできないっす。

159 :デフォルトの名無しさん:02/06/16 17:15
>>158 は?

160 :デフォルトの名無しさん:02/06/16 17:17
void Startup()
{
 ExitProcess(0);
}

cl -link -entry:Startup

161 :デフォルトの名無しさん:02/06/16 18:32
プログラミングWindows第5版って上下で1万円以上するんだけど
買う価値あるかな?

162 :デフォルトの名無しさん:02/06/16 18:37
>>161
本気でWindowsプログラムをC言語で学びたければ買う価値あるよ。
SDKでやるんだよ。

でも
AdvancedWindowsと何が違うのでしょうか?
AdvancedWidnows買ってないのであちらはよく分かりません。
あちら、C++で書かれているようですけど。
C++分かれば今ならAdancedWindowsで良いのでしょうか?

163 :デフォルトの名無しさん:02/06/16 18:39
AdvancedWidnowsはこれ
http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/qid=1024220278/sr=1-1/ref=sr_1_2_1/249-7181027-3890743

164 :デフォルトの名無しさん:02/06/16 18:59
>>162
それでAPI勉強してからC++のMFC勉強しようと思ってるのですが
わざわざAPIを勉強する必要もないですか?

165 :デフォルトの名無しさん:02/06/16 19:05
ProgrammingWindowsはWindowsの仕組みがC言語で書かれている書籍。

MFC使っていてもWin32APIは出てくるよ。
.netになったらWin32APIは邪魔になりそうですけど同なのでしょうか?
APIやMFCって勉強するものですか?
C(の場合API)やC++(の場合MFC)が分かれば使えると思います。


166 :デフォルトの名無しさん:02/06/16 19:05
>>164
知ってた方が世界は広がる。

167 :デフォルトの名無しさん:02/06/16 19:23
いまさらC言語でWindowsアプリ作るためにAPIを学ぶってことに意味があるか?


168 :デフォルトの名無しさん:02/06/16 19:29
>>167
ないと思う。
って言うよりプログラミングWindowsはいまどきいるか?

169 :デフォルトの名無しさん:02/06/16 19:43
>>167
Win32 native なコードを書く人間にとっては、意味がある。MFC やら ATL を使う
にせよ、背後にあるメッセージの仕組みやら Win32 API 知らんと、実際にはマト
モにプログラミングできんし。

ただ、今更 Win32 native なコードを書く勉強をすることに意味があるかは、何と
も言えんな。現時点では仕事は結構あるけど、これから増えるとは思えんし。

(まぁ、まだ 1 年ぐらいは食えるよ。その先は世の中 .net になるのか、それとも
しぶとく Win32 native が残るのかに依る)

170 :デフォルトの名無しさん:02/06/16 19:46
.net逝けよ!
ヽ(`Д´)ノ ウワァァァン
漏れは貧しい学生なのに高い金出してプログラミングwindows買ったのに。
こんな漏れは逝ってよしですか?


171 :デフォルトの名無しさん:02/06/16 19:59
>>170
本買う前にやりたい分野のこと少しくらい調べろよ。

172 :デフォルトの名無しさん:02/06/16 20:54
>>170
正解!

173 :デフォルトの名無しさん:02/06/16 20:56
話の流れからすると.netではWin32APIを使わないっぽいけど、どゆこと?
.netでは、MFCとは異なるラッピングのライブラリがあるの?

174 :デフォルトの名無しさん:02/06/16 21:02
>>173
き、きみねぇ・・・

175 :デフォルトの名無しさん:02/06/16 21:10
.netがMFCの代わりだYO!

176 :173:02/06/16 22:13
>>174
な、なにその反応。俺、もしかして、「すごくくだらない質問スレ」級の
質問をしてしまったの? 逝くべき?
でも、その前に解説してくれー。

>>175
.net「が」!? わけわからーん。

自分で晒しageしとくか。

177 :デフォルトの名無しさん:02/06/16 22:15
.NETスレに行ってください。
APIスレであなたは「邪魔」です

178 :デフォルトの名無しさん:02/06/17 06:58
わかんねぇよ!何がなんだかさっぱりだよ!3時間悩んでます。VC++でさぁ、簡単なプログラムくんでみたんだけど、バグってるよ!
なんで?どこがいけないの?

メッセージキューを理解するってやつでマウスの左ボタンを押しながらマウスを動かすと(要はドラッグ)
小さい円を描くってやつで、マウスを早く動かすとWM_MOUSEMOVEの中身が入れ替わるから円がまばらになるってだけなんだけどどうしてもエラー(TωT)ブヒー
SPY++で見てみると、際限なくWM_PAINTがはっせいするんだよねぇ。ハマったよ。誰か教えて下さい。

注:そのままコピペしてビルドするとビジー状態になるから、強制終了してネ

*************************************こっから*************************************************************

#include "windows.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevinstance,
LPSTR lpCmdLine,
int nCmdShow)
{

WNDCLASSEX wcl;
HWND hWnd;
MSG msg;

wcl.cbSize = sizeof(WNDCLASSEX);
wcl.style = CS_HREDRAW | CS_VREDRAW;
wcl.lpfnWndProc = (WNDPROC)WndProc;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hInstance = hInstance;
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcl.lpszMenuName = NULL;
wcl.lpszClassName = "ModelApp";
wcl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wcl);



179 :デフォルトの名無しさん:02/06/17 07:00
178のつづき*************************************************************************************

hWnd = CreateWindow(wcl.lpszClassName,
"SetCursor3",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg, NULL, 0, 0));
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC hdc;
int x, y;

switch(message)
{
case WM_MOUSEMOVE:

if(wParam & MK_LBUTTON)
{
hdc = GetDC(hWnd);
x = LOWORD(lParam);
y = HIWORD(lParam);

Ellipse(hdc, x - 5, y - 5, x + 5, y + 5);
ReleaseDC(hWnd, hdc);
}
return 0;

case WM_DESTROY:

PostQuitMessage(0);
return 0;

default:

return DefWindowProc(hWnd, message, wParam, lParam);
}
}


180 :デフォルトの名無しさん:02/06/17 07:42
WM_PAINT は処理しない限り延々と発生し続けます。

PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);

これだけでいいから WM_PAINT の処理入れてみそ?

181 :デフォルトの名無しさん:02/06/17 07:58
>>179
while(GetMessage(&msg, NULL, 0, 0)); ←セミコロン
{


182 :デフォルトの名無しさん:02/06/17 08:10
だぁあああぁぁぁ
なんとセミコロンだぁ(〃∇〃) てれっ☆
こんな単純な、ミスをするなんて・・・・・俺もまだまだひよっこだな・・・・ふっ
間違えなくてもひよっこだけどね・・・ぼそっ

セミコロン消したら一発オーケーでした。
181さんありがとうございました。
180さんもありがとう。

VC++。警告ぐらい出してくれ!わからんじゃないか!

おそまつでした。(@^_^)ゞ ポリポリ

183 :デフォルトの名無しさん:02/06/17 10:39
>>182
ゴミ人間。

184 :デフォルトの名無しさん:02/06/17 11:14
>>183
大山鳴動してなんとやらだな、と滅多に
使えないことわざをここぞとばかりに使ってみる。

まぁ礼を言えるだけ真人間じゃないかな。最近はそれすら
言えないヤツが多いからね。このスレにもいっぱいだ。

185 :デフォルトの名無しさん:02/06/17 11:16
>while(GetMessage(&msg, NULL, 0, 0)); ←セミコロン

VC#では確か指摘してくれたはず。


186 :デフォルトの名無しさん:02/06/17 11:21
>>182
警告されたら困る。while中に式書いて空ループ廻すのは良くやる手法。

187 :デフォルトの名無しさん:02/06/17 11:32
>>186
でも、その直後にただのブロック置くことってかなり少ない罠。

188 :デフォルトの名無しさん:02/06/17 11:43
whileの空ループの効用は何?
無限ループならwhile(1)とかでしょうけど。

189 :デフォルトの名無しさん:02/06/17 11:57
>>188
前回の状態を保持する関数、もしくは同期用の待ち関数で、

while(hoge(1) != 0);
while(WaitThread(THR_ALL) != 0);

とか。

190 :デフォルトの名無しさん:02/06/17 12:56
とりあえずcontinue;だけでも置いとけ。

191 :デフォルトの名無しさん:02/06/17 13:31
while (1) {
}
がよろしいかと

192 :デフォルトの名無しさん:02/06/17 18:58
>>186
よくやるなよ〜。
ビジーループは俺的にタブーって感じだ。
while (1){}もそう。
検索するコンテナなりなんなり
そういうリソースってのは、必ず有限な訳で
()の中に条件式を入れられないケースなんて滅多にないはずだぞ。
何で使う?

193 :デフォルトの名無しさん:02/06/17 19:07
>>192
無限ループは常套手段だろう。Win32 API がらみだと、たとえばこんなコードとか。

  for (;;) {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
      if (msg.message == WM_QUIT)
        break;
      if (TranslateAccelerator(hWnd, hAccel, &msg) == 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    } else if (app.IsActive()) {
      app.ExecOneStep();
      Sleep(0);
    } else {
      WaitMessage();
    }
  }

194 :デフォルトの名無しさん:02/06/17 19:17
while (*dst++ = *src++);
こういうのだってあるだろ

195 :デフォルトの名無しさん:02/06/17 19:21
こんなのもアリだな。

for (List *p = phead->next; p != NULL; p = p->next)
  ;

196 :名無しさん@カラアゲうまうま:02/06/17 19:29
それじゃ意味ないだろ。
for (List *p = phead; p->next != NULL; p = p->next)
  ;


197 :デフォルトの名無しさん:02/06/17 19:30
>>196
リストの末尾探し?
ObjectPascalなら使えないけどいい!

198 :デフォルトの名無しさん:02/06/17 20:24
>192
> ビジーループは俺的にタブーって感じだ。

while (1)だけで回すってことじゃなくて、言いたかったのは、
空文";"じゃなくて中に何も無くても{}の方が、よろしかないかと
いふこと
while(getchar() != -1)でもfor(;;)でもなんでもいいんだけどね

199 :デフォルトの名無しさん:02/06/18 18:13
Windows2000 以上の環境の Fax Service を使った経験のある方、
情報が得られそうなサイトや書籍があれば教えていただけないでしょうか。

USのMSDNサイトと ASCIIのMSDN magazin No.18に記事があるのはGoogle等で
Hitしたのですが、他の出来れば日本語のドキュメントか、具体的なサンプルが
掲載されているサイト等を探しています。


200 :デフォルトの名無しさん:02/06/18 19:00
0x11001000関数電卓でのいんちきゲッチュ
記念age

201 :デフォルトの名無しさん:02/06/18 21:15
ウインドウの外にあるときも、もう画面の端に来てしまったときも
マウスの動き(中の歯車の動き。ちなみにX座標≪水平方向≫のみ)
を取りたいのですが、どうしたらよいでしょう。

とりあえず今は「猫でも出来る〜101章」にあったように
WM_LBUTTONDOWN:メッセージを受け取ると
SetCapture(hWnd)関数を呼ぶようにして、左クリックしたままなら
画面上の座標は取れるようになりました。

case WM_LBUTTONDOWN:
SetCapture(hwnd);
break;

しかしこれだと、左クリックし続けなければならないし
画面の端に来たときに止まってしまいます。

誰か分かる方いらっしゃいましたら、どうかよろしくお願い致します。

202 :デフォルトの名無しさん:02/06/18 21:16
フック

203 :デフォルトの名無しさん:02/06/18 21:18
追加
WM_MOUSEMOVEメッセージが来たときにSetCapture関数を呼んでも
ウインドウを外れると動かなくなってしまいます。

本当に初心者な質問ですみません。

204 :デフォルトの名無しさん:02/06/18 21:28
SetWindowsHookExだっけか

205 :デフォルトの名無しさん:02/06/18 21:31
フック船長!

206 :デフォルトの名無しさん:02/06/18 21:36
なるほど、フックというのを使って
メッセージの横取り?みたいなことが出来るんですね。
知りませんでした。
難しそうですが・・・何とか色々検索してやってみます。
ありがとうございました。

207 :デフォルトの名無しさん:02/06/18 22:37
>201
右クリックし続けないといけないのは、それなりに正常な動作
だったはず。画面の端にきたら止まるのがこまるなら、
それを検出してもう一方の端にマウスを設定すればいいのでは。

208 :デフォルトの名無しさん:02/06/18 23:04
なるほど、クリックし続けなきゃいけないって言うのは
避けようがないんですか。
>それを検出してもう一方の端にマウスを設定すればいいのでは。
もう一方の端に設定する仕方(マウスポインタの強制移動?)の仕方がわかりません。
本当に素人ですみません。検索してきます。
レス本当にありがとうございます。

209 :デフォルトの名無しさん:02/06/18 23:11
あ、SetCursorPos関数でできそうですね。
何度もすみません。

210 :デフォルトの名無しさん:02/06/18 23:17
実現したい処理が思いつかない場合どうしますか?
ライブラリ探しまくりますか?
そこで見つからなかったらどうしますか?

211 :デフォルトの名無しさん:02/06/18 23:44
その時点ではあきらめて、無駄が多くてもいいからとりあえず動くようにしとく。
全体が動いて落ち着くか、その部分がネックになるようだったらもう一度しらべなおす。


212 :デフォルトの名無しさん:02/06/18 23:48
>>210
> そこで見つからなかったらどうしますか?
どうしても必要なら、作るしかないだろ。

ただ、ライブラリを使うのに比べてコストがかかるから、まずは見積もりを
出して許容範囲にあるか、あるいは別の方法で安く逃げられないかを考え
るけど。

213 :デフォルトの名無しさん:02/06/19 00:21
2つのウインドウ(ウインドウ1とウインドウ2)を作成し,ウインドウ1のプロシジャで
ビットマップの読み込と表示を,ウインドウ2のプロシジャではウインドウ1
のプロシジャで読み込んだ画像の加工と表示をさせたいのですが,肝心の
ウインドウ1のプロシジャ内のデータ(ビットマップ情報などをまとめた構造体)を
ウインドウ2のプロシジャに受け渡す方法が分かりません.

googleで検索して見様見真似で以下のようなコードを書いてみたのですが,
矢印のところで「error C2115: '=' : 互換性のない型が含まれています。」と
エラーが表示されうまくいきませんでした.一応,参考にした所では
reinterpret_castでキャストしていたのですが,Cで使おうとしたらエラーがでて
使えませんでした.受け渡しの方法が間違っているのか,それとも構造体を
送るには別の方法があるのか分からなくて困っています.
どうかご教授をお願いします.

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
SendMessage(hWnd, WM_USER+100, 0, (LPARAM)(&im01));

/*ウインドウ2のプロシジャ*/
static IMAGE *im02;
switch(message){
 case WM_USER+100:
  * im02 = (IMAGE*)(lParam);   <===
  break;

214 :デフォルトの名無しさん :02/06/19 00:21
Win2000でメモリ書きかえるときってGetWindowThreadProcessIdと
OpenProcessとWrite/ReadProcessMemoryだけで可能ですか?


215 :デフォルトの名無しさん:02/06/19 00:24
>>213
im02 = (IMAGE*)(lParam);
または
* im02 = *(IMAGE*)(lParam);
では?

WM_COPYDATAってメッセージもあったと思うけど使えない?

216 :デフォルトの名無しさん:02/06/19 01:10
ウインドウから開いたダイアログの状態(開いているか、閉じたか)
を判定する方法ありませんか?

217 :デフォルトの名無しさん:02/06/19 01:27
モーダルダイアログなら、帰ってきた時には閉じている。
モードレスダイアログだとしたら……
a. ダイアログが閉じた時にオーナーウィンドウに通知する
b. IsWindowでハンドルが有効かどうか検査
c. FindWindowでダイアログを探してみる
あたりかな。

218 :デフォルトの名無しさん:02/06/19 01:32
>>217
ありがとうございます、やってみます。

219 :デフォルトの名無しさん:02/06/19 02:06
>>215
typedef struct {
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
int sx;
int sy;
int ex;
int ey;
} IMAGE;
上記のような構造体を渡したいので,WM_USERでやるのは(googleで見て回ると)
大変らしいので,WM_COPYDATAを使うことにしてみます.
まだ試してはいませんが,以下のような感じになるのでしょうか.
ただ,googleで見て回ったところ,構造体にポインタがあるとうまくいかないとかいう
記述があったので,ちょっと心配ですが...

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(IMAGE);
cds.lpData = &im01;
SendMessage (hWnd, WM_COPYDATA, (WPARAM)0, (LPARAM)(&cds));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
PCOPYDATASTRUCT pcds;
switch(message){
 case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lParam;
MemoryCopy (&im02, pcds->lpData, pcds->cbData);
break;

220 :デフォルトの名無しさん:02/06/19 03:39
以下のようにしたらエラーはでなくなったのですが,データがうまく渡せない...

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(IMAGE);
cds.lpData = &im01;
SendMessage (hWnd, WM_COPYDATA, (WPARAM)0, (LPARAM)(&cds));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
PCOPYDATASTRUCT pcds;

case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lParam;
memcpy(&im02,(PCOPYDATASTRUCT)lParam, sizeof(IMAGE));

221 :デフォルトの名無しさん:02/06/19 04:12
ういんどう1とういんどう2が同一プロセスなのか
同一スレッドなのかが重要


222 :デフォルトの名無しさん:02/06/19 07:06
>>220
>memcpy(&im02,(PCOPYDATASTRUCT)lParam, sizeof(IMAGE));

何をコピーしてるんだ、何を。

223 :デフォルトの名無しさん:02/06/19 11:57
>>221
同一プロセスです(ウインドウ1はWinMainで最初に作成し,ウインドウ2は
ウインドウ1のプロシジャ内でメニューからコピーを選んだときに作成されます).
あと,同一スレッドかというのは,どのような意味でしょうか?
CreatThredとか使ったことが無いので,スレッドの定義というか意味が
よくわからないのですが...

>>222
MSDNに,
void *memcpy( void *dest, const void *src, size_t count );
dest コピー先のバッファ
src コピー元のバッファ
count コピーする文字数
とあったので,,,てよく見たら「バッファ間で文字をコピーします。」と
書いてある.単純にmemcpy(送り先,送り元,大きさ)だと思ってました.
それでは,どのようにしたら構造体をコピーできるのでしょうか...
memcpy (&im02, pcds->lpData, pcds->cbData);
とかでは駄目でしょうか? それとも他に関数とかあるのでしょうか?

224 :デフォルトの名無しさん:02/06/19 15:42
memcpyすると何が起こるのですか?
memcpyはデータをメモリでコピーするものと言うことでよいのですか?
memory同士でコピーして何になるのでしょうか?

225 :デフォルトの名無しさん:02/06/19 15:50
>>224
いろいろあるぞ。
あるデータをちょっと弄って処理するときに、元データを保護する目的とか、
テンプレをconstで持ってて、それ弄る時とか…

226 :222:02/06/19 18:32
>memcpyすると何が起こるのですか?
memcpy (&im02, pcds->lpData, pcds->cbData);
lpDataをcdData分im02にコピーする.
#ということを期待している > 私

>memcpyはデータをメモリでコピーするものと言うことでよいのですか?
はい...
#違うんでしょうか...

>memory同士でコピーして何になるのでしょうか?
...上記のがそういう状態ということでしょうか...

うーん...

227 :デフォルトの名無しさん:02/06/19 18:51
2つのウインドウが同じスレッドならWM_COPYDATAは必要ない。
これは普通プロセス間でデータを渡すもの。最初の方法でいい
とおもう。

その2つのウインドウでそれぞれIMAGEを持ちたいのか
IMAGEは一つで、それをみんなで使いたいのか?
仕様が良く分からない。

228 :213:02/06/19 19:10
>>227
>2つのウインドウが同じスレッドならWM_COPYDATAは必要ない。
>これは普通プロセス間でデータを渡すもの。最初の方法でいい
>とおもう。

>215 での修正を加えたのですが,うまくいかなかったので,別の道に走った
のですが,ちょっと違う方向に走っていっていたようです...(−−;

>その2つのウインドウでそれぞれIMAGEを持ちたいのか
>IMAGEは一つで、それをみんなで使いたいのか?
>仕様が良く分からない。

各ウインドウで*違う*IMAGEを持たせたいのです.
感じとしては,ウインドウ1に原画像を表示し,加工した結果を,他のウインドウ
(ここではウインドウ2)に表示するということをしようとしています.

229 :デフォルトの名無しさん:02/06/19 20:06
ReadProcessMemory関数で
0x00000000〜0x003FFFFF
の情報は取得できるのですが
0x00400000
以降のメモリが
CD CD CD CD ・・・・
となってしまいます

どうすればきちんと取得できるでしょうか?

230 :デフォルトの名無しさん:02/06/19 20:28
IMAGE構造体はポインタを含んでいるのでコピーを作るなら
代入やmemcpyではだめで
>  * im02 = (IMAGE*)(lParam);   <===

たとえばCopyImageとか作って
CopyImage(IMAGE* pTo, const IMAGE* pFrom)
{
if(pFrom->pbmfh != NULL)
{
pTo->pbmfh = new BITMAPFILEHEADER ;
memcpy(pTo->pbmfh, pFrom->pbmfh, sizeof(BITMAPFILEHEADER));
}
else
pTo->pbmfh = NULL;
・・・
としないとコピーは作れない


231 :デフォルトの名無しさん:02/06/19 20:44
IMAGE構造体をクラスにしてシングルトンで実装。とかじゃだめなの?
最悪、グローバル変数にするとか。

232 :デフォルトの名無しさん:02/06/19 20:45
>>231
Javaの謎と落とし穴を奨める。
他のオブジェクト指向ユーザにも有益。

233 :デフォルトの名無しさん:02/06/19 20:59
仮想キーコードをアスキーコードに変換するにはどのように
すればいいでしょうか。
WM_CHARで処理すればいいんですが、CTRL+keyとしたときには
keyはWM_CHARで取れないので困ってます。
特にVK_OEMとかのキーボード固有のやつを処理したいのです。

234 :デフォルトの名無しさん:02/06/19 21:03
>>233
決まった方法はない。
変換テーブルを持ってやるのが一般的だが、
キーボード(正確にはドライバ)によって違ってくる。

235 :あぼーん:あぼーん
あぼーん

236 :デフォルトの名無しさん:02/06/19 21:45
>>235
マルチしまくりだな。お前、出会い系サイトかなんかにはまってんの?

237 :デフォルトの名無しさん:02/06/19 22:41
拡張子は.cと.cppのどちらでプログラムしてますか?
私はエラー(メモリ?)チェックが厳しいと聞いた.cppでプログラムしてますが。
みなさんはどうですか?

238 :デフォルトの名無しさん:02/06/19 22:42
>>237
取りあえず基礎からやり直せ。

239 :213:02/06/20 01:00
IMAGE構造体をコピーするための関数を以下のように作成し,

void CopyImage2(IMAGE* pTo, const IMAGE* pFrom){
if(pFrom->pbmfh != NULL){
pTo->pbmfh = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER)) ;
memcpy(pTo->pbmfh, pFrom->pbmfh, sizeof(BITMAPFILEHEADER));
pTo->pbmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFO));
memcpy(pTo->pbmi, pFrom->pbmi, sizeof(BITMAPINFO));
pTo->pBits = (BYTE *)malloc(sizeof(BYTE)*(pFrom->pbmi->bmiHeader.biSizeImage));
memcpy(pTo->pBits, pFrom->pBits,
sizeof(BYTE) * (pFrom->pbmi->bmiHeader.biSizeImage));
}
else{
pTo->pbmfh = NULL;
pTo->pbmi = NULL;
pTo->pBits = NULL;
}
}

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
static HWND hCwnd;

case IDM_IMAGE_COPY:
SendMessage(hCwnd, WM_USER+100, 0, (LPARAM)(&im01));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
static int cxDib, cyDib;

case WM_USER+100:
CopyImage2(&im02, (IMAGE *)(lParam));
if (im02.pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) {
cxDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcHeight ;
}
else {
cxDib = im02.pbmi->bmiHeader.biWidth ;
cyDib = abs (im02.pbmi->bmiHeader.biHeight) ;
}
return 0;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

if (im02.pbmfh)
SetDIBitsToDevice ( hdc, 0, 0, cxDib, cyDib, 0, 0, 0, cyDib,
im02.pBits, im02.pbmi, DIB_RGB_COLORS) ;
EndPaint (hwnd, &ps) ;
return 0 ;


と変更することでエラーもなくコンパイル+実行できるのですが,ウインドウ2に
なにも表示されません.
デバックモードで値を見てみたのですが,ちゃんと入っているようでした.
もう少しでちゃんと表示できそうなのですが...うーむ.
あとどこがおかしいのでしょうか?

240 :デフォルトの名無しさん:02/06/20 01:22
>>239
窓1からイメージが送られてきても、WM_PAINTメッセージが来ないとイメージ描かれない
よん。WM_USER+100の処理が終わったらUpdateWindow辺りでWM_PAINT送って…
じゃないかな?

241 :213:02/06/20 02:39
>240
WM_USER+100の処理の最後にUpdateWindow(hwnd);を入れて,WM_PAINTまで
処理がいっているのを確認したのですが,それでもウインドウ2には何も表示され
ません(正確にはウインドウクラスで定義した背景色の白が表示されています).
うーん...

242 :デフォルトの名無しさん:02/06/20 07:55
InvalidateRect

243 :デフォルトの名無しさん:02/06/20 10:09
CreateWindow()の第三引数、ウインドウのスタイルの種類ってどんなのがあるの?http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_createwindow.htm
で調べたけど、要領得なくてさぁ。
例えば、子ウインドウのエディットボックスで、
CreateWindow("EDIT", "", ここの部分, ・・・・・・・・・);
なんかで指定できる一覧なんか見たいんだけど、サクッと見られるサイトとかないかなー。


244 :デフォルトの名無しさん:02/06/20 10:13
え、MSDNのCD2持ってないの?

245 :デフォルトの名無しさん:02/06/20 10:18
243
MFCの解説
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_window_styles.htm
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_extended_window_styles.htm

246 :デフォルトの名無しさん:02/06/20 10:21
>>244
実を言うと俺が買ったんじゃなくってさぁ
VC++6.0の実物見たことなくて、あれってVC++とMSDNの2枚組なの?実は3枚あるとか?
漏れ2枚しかもって無くてフツーにインストールしたけど、なぜかヘルプがみれないんだよねー
しょうがないから、オンラインで検索しまくってんだけど、やっぱ正規に買った方がいいかなー?

247 :デフォルトの名無しさん:02/06/20 10:26
VS.NET安く買えるよ。


248 :デフォルトの名無しさん:02/06/20 10:26
>>245
ありがとう!
載ってるじゃん!、漏れの検索不足かよー。
できれば、どうやって検索したのかも教えてほちいなぁ。

249 :デフォルトの名無しさん:02/06/20 12:00
もう一つ質問です。
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_RIGHT, ・・・・);
こんな感じで、指定したんだけどどうしてもES_RIGHTが反映されなくて、左詰めになっちゃいます。

これって機種依存とかあるのかな。本に書いてあるとおりやっても出来ないんだよね。
付録のCD-ROMにサンプルとしてオリジナルがあるんだけど、それも試したけどやっぱり左詰になっててどう考えても俺のパソのせいなんだよね。誰か、うまく右詰にする方法知ってる人居ますか。
ちなみに俺の環境は
Win95OSR2
VC++6.0

250 :デフォルトの名無しさん:02/06/20 12:53
>>249
サンプルが絶対正しいという保証はないと思うが。

251 :デフォルトの名無しさん:02/06/20 13:19
>>249
Win2kは右詰になったりするが、本来は複数行エディットでないとES_RIGHTは効かない
ことになっとる。ES_MULTILINE付けてみそ。

252 :デフォルトの名無しさん:02/06/20 17:48
>>251
できました!ES_MULTILINEでばっちりです。
ありがとうございました。
>>250
指摘通りサンプルにはES_MULTILINEはついていませんが、Win2kで右詰になるならあながち間違いとも言えないようですね。ただ単にWin95で、動作確認をしていないだけでしょうか。

いまどきいねーもんな・・・・95

253 :213:02/06/21 00:09
ウインドウ1からウインドウ2に,下記の画像用の構造体をおくりたくて,

typedef struct {
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
} IMAGE;

>>239 のようにしたのですが,>>240 >>242 のアドバイスもあったのですが,
ビットマップの縦横の大きさはとれるのですが,肝心のデータ部がうまく表示できません.
構造体のコピーの仕方が悪いのか,それとも表示方法がまずいのか分かりません.
どこがおかしいのかご教授お願いします.
もしくは,似たようなことを解説しているページがありましたら教えてもらえないでしょうか.
よろしくお願いします.

/* ウインドウ2のプロシジャ(>>239 からの変更部) */
case WM_USER+100:
CopyImage2(&im02, (IMAGE *)(lParam));
if (im02.pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) {
cxDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcHeight ;
}
else {
cxDib = im02.pbmi->bmiHeader.biWidth ;
cyDib = abs (im02.pbmi->bmiHeader.biHeight) ;
}
rc.top = 0;
rc.left = 0;
rc.bottom = cyDib;
rc.right = cxDib;

AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
SetWindowPos(hwnd,HWND_TOP,0,0,rc.right-rc.left,rc.bottom - rc.top,SWP_NOMOVE);

InvalidateRect (hwnd, NULL, FALSE) ;
UpdateWindow(hwnd);
return 0;

254 :213:02/06/21 00:10
あと,きになるとすれば,ウインドウ2をウインドウ1のプロシジャ内で以下のように作成
していることぐらいです...

/*ウインドウ1のプロシジャ*/
HWND Chwnd;

case WM_CREATE:
 // ウインドウ2 用
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc2 ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = (HINSTANCE)GetWindowLong(HWND_DESKTOP,GWL_HINSTANCE);
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = TEXT("Image2");

RegisterClass (&wndclass);

// ウインドウ2を作成
hCwnd = CreateWindow (TEXT("Image2"),
TEXT ("Image Processing Result"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hCInstance, NULL) ;
ShowWindow (hCwnd, SW_SHOWNORMAL) ;
UpdateWindow (hCwnd) ;
return 0 ;

255 :デフォルトの名無しさん:02/06/21 00:12
213
おまえウザイよ。
いちいちインデント崩れまくりのソースを貼るのはよせ。
現象を再現できる最小限の完全なコードをどこかにUPして、
施した変更や処理の要点だけをここに書け。

256 :デフォルトの名無しさん:02/06/21 00:13
http://lounge.dip.jp/~yoshinoya_off/up/upb.cgi
とりあえず、あぷろだ見つけてきたからソースはここにUPれ

257 :デフォルトの名無しさん:02/06/21 00:27
im01にセットする部分が無いんだが、それはちゃんと出来てるのか?
im01がちゃんと出来てないとどうしようもないぞ。

258 :213:02/06/21 01:25
>>255 >>256
申し訳ありません.まわりでWindowsでCでプログラムをしている人がいないもので,こちらに
何度も聞いてしまいました.

>>256 のところに,タイトル「1047/ Win32APIスレより」,投稿者「213」でアップしました.

259 :デフォルトの名無しさん:02/06/21 02:01
>>258
bmiHeader.biSizeImageからサイズを取ってはダメ。MSDNにも、「BI_RGBの時は多分
0が入ってる」と書いてある。BITMAPFILEHEADERのbfSizeから計算するか、biWidthと
biHeightから計算するかどっちかにして。


260 :デフォルトの名無しさん:02/06/21 02:10
問題は>>259だな。

それから、もう一つ。
BITMAPINFO構造体をコピーするのもあのままじゃダメ。
パレットをキッチリコピーしてやらないと。

261 :213:02/06/21 04:31
>>259>>260
ご指摘ありがとうございます.
BITMAPINFO構造体のコピーを下記のよう直したら,ちゃんと表示されるようになりました.

pTo->pbmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFO) + pFrom->pbmi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
memcpy(pTo->pbmi, pFrom->pbmi, sizeof(BITMAPINFO) + pFrom->pbmi->bmiHeader.biClrUsed * sizeof(RGBQUAD));

#2箇所直すのに2時間もかかってしまった...
#pgm形式とppm形式しか扱ったことがなかったので,よい勉強になりました.

262 :デフォルトの名無しさん:02/06/21 05:19
SetLayeredWindowAttributesを使おうと思ったのですが、定義されていないという
エラーでビルドできませんでした。
下記の環境ですがDLLから明示的に呼び出さないと使えないのでしょうか?

環境:Windows2000Pro+SP2, VC++6.0Pro+SP5
   Platform SDK November 2001 インストール済み

263 :デフォルトの名無しさん:02/06/21 05:43
>>261
>>259が言うように絵本体のコピーも変更しないと駄目なケースが多いぞ

264 :デフォルトの名無しさん:02/06/21 11:10
>>262
VC++.NETの話だけど、Wizardが吐いたデフォルトのstdafx.hだと
やっぱ同じようなエラーになったあるよ。
#define _WIN32_WINNT 0x500
に変えないとSetLayeredAttributesのプロトタイプを読み込まなかったよ。
デフォルトはこの値が0x400だったよ。

265 :デフォルトの名無しさん:02/06/21 14:52
>>264
#define _WIN32_WINNT 0x500
でビルド/実行できました。

266 :デフォルトの名無しさん:02/06/21 16:47
Windowsでプログラムを作るとき,C標準のmallocとWindows APIでGlobalAllocではどっちを
使った方がよいのでしょうか?
私の見た範囲では,クリップボードにコピーする必要がなかったらGlobalAllocは使わずに
mallocを使ったほうがよいように思うのだが.
それともGlobalAllocはmallocより便利/お得な機能(例えば,早いとか)でもあるのでしょうか?

267 :デフォルトの名無しさん:02/06/21 16:50
>>266
mallocは結局APIでアロケートしてます。

268 :762:02/06/21 16:56
>>266
そりゃ API の方が速いだろうけど、素直に malloc() 使っときなさい。

269 :デフォルトの名無しさん:02/06/21 16:59
>>266
mallocの方がお手軽。
でも、ランタイムのメモリ機能使ってると、DLLだらけの時にたまにはまるんだよなあ。


270 :デフォルトの名無しさん:02/06/21 17:12
教えてください。
現在Windows2000で常駐してスクリーンセーバが起動中とか、
コンピュータがロック中とかを監視するアプリケーションを
作っています。
スクリーンセーバの方は何とかできたのですが、ロック中は
どうにもわかりません。
コンピュータがロック中かどうかを取得する事は可能でしょうか?
ご存知の方、お教えください。
よろしくお願いいたします。

271 :デフォルトの名無しさん:02/06/21 17:14
>>266
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_globalalloc.htm
によると、

GlobalAlloc
指定されたバイト数のメモリをヒープから割り当てます。Win32 のメモリ管理機能は、グローバルヒープとローカルヒープを区別していません。

注意 グローバル関数は他のメモリ管理関数より低速で、提供する機能も多くありません。そのため、新しいアプリケーションは「heap functions」(ヒープ関数)を使うべきです。しかし、DDE 関数とクリップボード関数では、依然としてグローバル関数が使われています。

だそうだ。
「他のメモリ管理関数」が何をさしているか分からん+ヒープ関数ってなんだってのが
あるので、誰か解説してくれ。俺も知りたい。

272 :デフォルトの名無しさん:02/06/21 17:22
>>271
HeapCreate(), HeapAlloc(), HeapFree(), HeapDestory()
あたりでしょ。

273 :266:02/06/21 17:40
>>267 >>268
mallocよりGlobalAllocの方が,早くてよさそうですが,>>271 にある「他のメモリ関数より
低速」とあるのですが,「他の関数」は他のAPI関数を指しているということでしょうか?

早さ比較: malloc() -> GlobalAlloc() -> HeapAlloc() の順で早くなるという理解で
よいのでしょうか.

274 :デフォルトの名無しさん:02/06/21 17:47
>>273
得に問題が起こってない限りはmalloc使っといたほうがお得だと思うよ
ライブラリ実装者はmallocに何らかの機能を加えて高速化してるかもしれないでしょ。
だいたい、どれが速いかなんて自分で調べればわかるもの。

275 :デフォルトの名無しさん:02/06/21 17:52
>>273
速さの差は誤差の範囲と言っていいと思うよ。順序はあってるけどさ。

むしろ、それが気になるほど頻繁に割り当て・解放を行なっているのなら
別の問題が起きそう。ヒープの断片化とか。


276 :デフォルトの名無しさん:02/06/21 18:19
>>270
OpenInputDesktop→GetUserObjectInformationでOK、
と思って試してみたら、ロックされているときはエラーになるなあ。
はっ、そうか、エラーが帰ってきたらロックされていると思えばいいんだ。(いいのか?)


277 :デフォルトの名無しさん:02/06/21 18:57
GlobalAlloc() や HeapAlloc() より malloc() のほうが速いだろうと
思ってたんだけどな。malloc() が遅いというデータってある?


278 :デフォルトの名無しさん:02/06/21 19:03
malloc()の方が早いと思うよ。API呼び出しはオーバーヘッドがでかいって聞いた事あるし。

279 :275:02/06/21 19:04
>>277
「順序はあってる」って書いたんだけど、実はReleaseモードで試したら
mallocの方が速かった。面倒くさいからそう書いちゃったけど。


280 :デフォルトの名無しさん:02/06/21 19:12
mallocやGlobalAllocは、内部でHeapAllocを呼び出している。
よって、最初の1度の確保に限れば、HeapAllocがもっとも高速と思われ。
但し、細切れを何個も確保するのであれば、愚直なHeapAllocより
それなりの管理をしてくれるmallocの方が、よりbetterな選択と思われ。

281 :デフォルトの名無しさん:02/06/21 19:16
計測した。

block size = 1024 bytes, 1000000 times
malloc: 595msec.
GlobalAlloc(GMEM_FIXED): 743msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1158msec.
HeapAlloc(0): 629msec.
HeapAlloc(HEAP_NO_SERIALIZE): 603msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1089msec.

block size = 10240 bytes, 1000000 times
malloc: 630msec.
GlobalAlloc(GMEM_FIXED): 735msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3441msec.
HeapAlloc(0): 665msec.
HeapAlloc(HEAP_NO_SERIALIZE): 626msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3346msec.

block size = 102400 bytes, 1000000 times
malloc: 1020msec.
GlobalAlloc(GMEM_FIXED): 1118msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 55862msec.
HeapAlloc(0): 1036msec.
HeapAlloc(HEAP_NO_SERIALIZE): 1011msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55839msec.

block size = 1048576 bytes, 1000000 times
malloc: 25076msec.
GlobalAlloc(GMEM_FIXED): 25633msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25267msec.
HeapAlloc(0): 25631msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25630msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25269msec.


282 :デフォルトの名無しさん:02/06/21 19:21
>>280
最初の1度に限るのってあんまり意味無くない?
mallocって何か閾値を境に動作が変わるんだったっけ。


283 :デフォルトの名無しさん:02/06/21 19:27
>>278
>malloc()の方が早いと思うよ。API呼び出しはオーバーヘッドがでかいって聞いた事あるし。
あふぉか。

284 :デフォルトの名無しさん:02/06/21 19:29
>>281はVC6
今度はbcc32

block size = 1024 bytes, 1000000 times
malloc: 227msec.
GlobalAlloc(GMEM_FIXED): 705msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1189msec.
HeapAlloc(0): 655msec.
HeapAlloc(HEAP_NO_SERIALIZE): 609msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1144msec.

block size = 10240 bytes, 1000000 times
malloc: 227msec.
GlobalAlloc(GMEM_FIXED): 735msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3344msec.
HeapAlloc(0): 685msec.
HeapAlloc(HEAP_NO_SERIALIZE): 612msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3304msec.

block size = 102400 bytes, 1000000 times
malloc: 71526msec.
GlobalAlloc(GMEM_FIXED): 1068msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 56017msec.
HeapAlloc(0): 1015msec.
HeapAlloc(HEAP_NO_SERIALIZE): 1008msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55774msec.

block size = 1048576 bytes, 1000000 times
malloc: 51318msec.
GlobalAlloc(GMEM_FIXED): 53775msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 53803msec.
HeapAlloc(0): 53058msec.
HeapAlloc(HEAP_NO_SERIALIZE): 52757msec.
HeapAlloc(HEAP_ZERO_MEMORY): 53770msec.


285 :デフォルトの名無しさん:02/06/21 19:32
>283
......

286 :デフォルトの名無しさん:02/06/21 19:37
bcc32で来たか...

VCとの差はヒープ管理にかける時間の差かな。
単純パターンじゃなくて複雑な使い方すると、また違った比率になるかも。


287 :デフォルトの名無しさん:02/06/21 19:39
g++ 2.95.3-4

malloc: 672msec.
GlobalAlloc(GMEM_FIXED): 697msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1173msec.
HeapAlloc(0): 642msec.
HeapAlloc(HEAP_NO_SERIALIZE): 582msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1126msec.

malloc: 671msec.
GlobalAlloc(GMEM_FIXED): 718msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3350msec.
HeapAlloc(0): 660msec.
HeapAlloc(HEAP_NO_SERIALIZE): 602msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3321msec.

block size = 102400 bytes, 1000000 times
malloc: 677msec.
GlobalAlloc(GMEM_FIXED): 1080msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 55596msec.
HeapAlloc(0): 1032msec.
HeapAlloc(HEAP_NO_SERIALIZE): 951msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55542msec.

malloc: 35152msec.
GlobalAlloc(GMEM_FIXED): 25284msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25550msec.
HeapAlloc(0): 25143msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25544msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25554msec.


288 :デフォルトの名無しさん:02/06/21 19:43
bccは10kb以下の小さなブロックでは高速な結果になっている。
謎なのが、100kbの時のmallocの異常な遅さと、
1MBの時の遅さ(他のコンパイラのおよそ2倍)
API呼び出しも遅くなってるのが謎。


289 :デフォルトの名無しさん:02/06/21 19:56
VCのソース見ると、

if (割り当てサイズ <= __sbh_threshold) 独自のメモリ割り当て
else HeapAlloc()

みたいなのが書いてある。大きなブロックではAPIと同じぐらいの時間ということか。
謎は解けんが・・・0クリアごときでなぜそんなに違いが出る?


290 :デフォルトの名無しさん:02/06/21 20:01
>>288
>1MBの時の遅さ(他のコンパイラのおよそ2倍)
>API呼び出しも遅くなってるのが謎。
アフォか。

291 :デフォルトの名無しさん:02/06/21 20:04
>>290

[VC6]
block size = 1048576 bytes, 1000000 times
malloc: 25076msec.
GlobalAlloc(GMEM_FIXED): 25633msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25267msec.
HeapAlloc(0): 25631msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25630msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25269msec.

[BCC]
block size = 1048576 bytes, 1000000 times
malloc: 51318msec.
GlobalAlloc(GMEM_FIXED): 53775msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 53803msec.
HeapAlloc(0): 53058msec.
HeapAlloc(HEAP_NO_SERIALIZE): 52757msec.
HeapAlloc(HEAP_ZERO_MEMORY): 53770msec.

[g++]
malloc: 35152msec.
GlobalAlloc(GMEM_FIXED): 25284msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25550msec.
HeapAlloc(0): 25143msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25544msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25554msec.


292 :デフォルトの名無しさん:02/06/21 20:10
>>290 >>283 は何が言いたいのだ.


293 :デフォルトの名無しさん:02/06/21 20:11
OpenWatcomのCRTも測ってホスィ..

294 :デフォルトの名無しさん:02/06/21 20:13
>>292
単にアフォかといいたいだけちゃうんか。

295 :デフォルトの名無しさん:02/06/21 20:15
APIで大きなメモリを確保するとヒープの拡張に時間とられるかもな。

>>292
283は確かに俺も「オーバーヘッドって何のことだ?」と思った。


296 :デフォルトの名無しさん:02/06/21 20:36
watcomは自分で計ってくれ
VMwareでインストールしたけど、PSDKを入れないといけないんで面倒
DMCも面倒だ

297 :201:02/06/21 20:41
WIN32APIで
「手元でマウスが何センチ動いたか」知る方法は無いでしょうか?

今は、例えば400CPIのマウスだと、ウインドウズ側のマウスの速度の設定を
最大にすれば手元で一インチ動かすあたり400カウント取れるので
そこからセンチを逆算しているのですが、
できればウインドウズ側の設定によらず取りたいのです。

つまり、マウスを距離を測るセンサのように使うことはできないかということです。

昔の98だと、マウスはただ単にロータリーエンコーダとしてしか
見ていなかったと思うので、出来ると思うのですが・・・
よろしかったら、どなたかよろしくお願い致します。
パソコン自体初心者なので、間違いがあったら申し訳ありません。

298 :デフォルトの名無しさん:02/06/21 20:52
>>297
定規で測る。

299 :デフォルトの名無しさん:02/06/21 21:00
>>298
鬼だね。
でも、mousemoveで始点から終点の座標とれば動いた分は分かると思うのですが。
って、思いついただけなのでコード書いてないけど。

300 :デフォルトの名無しさん:02/06/21 21:02
>>297
マウスの分解能はマウスの機種によりさまざま。
インターフェイスもPS/2マウスでなくUSBでより自由になっている。
また、ドライバにより普通に「加速」が行われるため、マウスが元の位置に戻ってきても
マウスカーソルは元の位置に戻らないことも多い。

さらに、ポインティングデバイスがマウスでない環境もノートには多い。

301 :デフォルトの名無しさん:02/06/21 21:04
3Dモデリングで使う、奇妙なアームのついたペンなら実際の移動距離取れそうだ。

302 :デフォルトの名無しさん:02/06/21 21:06
マウスドライバから作った方が早い。でOK?

303 :デフォルトの名無しさん:02/06/21 21:09
用途は?
>>301のように、デバイスの座標がそのままディスプレイ上の座標になるような物を使えば測れそうだけど
(俺の使ってるマウスも測れる)

304 :デフォルトの名無しさん:02/06/21 21:21
用途なのですが、光学式マウスを
位置の変化量を検出するセンサとして使いたいのです。

詳しく言うと、光学式マウスの発光部というかマウスパッドを見ている部分に
焦点をあわせて細長い紙かなんかを付け
それを上下させて何センチ動いたかどうかを知りたいのです。

だから一般的なソフトとしてすべての環境で動かすことを考えるのではなく
今の自分の環境(光学式マウス、400CPI)で動けばよいのですが・・・
説明下手ですみません。

305 :デフォルトの名無しさん:02/06/21 21:23
マウスじゃなくて専用のデバイスをシリアルなりGP-IBなりで接続すれば?

306 :デフォルトの名無しさん:02/06/21 21:27
>>304
光学式マウスの精度ってそんなに信頼できるものなの?

307 :デフォルトの名無しさん:02/06/21 21:28
なんで光学式にしたかといいますと、紙に触れずに測定がしたいからです。
またシリアルにああいったセンサを取り付けても良いのですが
予算の問題で・・・

308 :デフォルトの名無しさん:02/06/21 21:31
>>307
紙を動かすことは可能ですか?
タブレットを使えば1万円程度で出来そうですけど

309 :デフォルトの名無しさん:02/06/21 21:32
>光学式マウスの精度
そこは問題ですね。
とりあえずは1ミリ単位(できれば0.1ミリ単位)で測定できればいいと
思っていたので
まあこのくらいなら誤差も無く測定できるかと決め付けていたのですが・・

310 :デフォルトの名無しさん:02/06/21 21:33
>>308
紙を上下してその動きを見るつもりです。
タブレットで出来るのでしょうか。
タブレットの仕組みがいまいちよく分からないので
今から検索してきます。

311 :デフォルトの名無しさん:02/06/21 21:48
なんだか説明がわけわからなくなってしまいすみません。

やりたいことは単純にいうと、
「上下動する細い針金の変位の推移を見たい」っていうことです。

ただ上下動する力が大変弱い(だろう)ので、針金に紙を張って
紙の上下動を固定した光学式マウスのセンサ部で見たいっていうことです。
(それなら紙に触らなくてすむだろうってことです)

なんだか板&スレの趣旨とかけ離れてきてしまって
申し訳ありません。
やっぱりマウスドライバを自作
(マウスの中でシリアルとして変換されている信号を直に取る)
しかないのでしょうか・・・でもそんなの出来なさそう・・・

312 :デフォルトの名無しさん:02/06/21 21:50
光学マウスって光の反射を見てるんで、
接触させないと最大限の精度は出ないでしょ

313 :能無しさん:02/06/21 21:55
レンズの焦点はセンサから結構離れたところにあるようなので
そこを上手く常に通るようにすれば接触無しでも大丈夫かと思ったのですが・・・
周りを覆って暗くしないと駄目っていうことでしょうか。

314 :デフォルトの名無しさん:02/06/21 22:49
超初心者なのですが、質問です。

簡単なタイマーを作ろうと思ってます。<時間が来たらなるやつです
まず、WM_CREATEメッセージが来たときにCREATEWINDOW関数で
ウインドウの中のクライアント領域に
タイマーの開始、終了というボタンを作ります。

そして裏画面のビットマップに「残り時間9:54」みたいな感じで
TEXTOUT関数で表示し、そのビットマップを表画面に転送します。

これを一秒ごとにやると
クライアント領域のボタンがチラチラします。
なぜでしょうか?また解決法などございましたらご教授ください。
よろしくお願いします。

315 :デフォルトの名無しさん:02/06/21 22:51
>>314
書き換えにも時間がかかるからです。
ダブルバッファとか調べてみればいいかと。

316 :デフォルトの名無しさん:02/06/21 22:53
>>315
即レスありがとうございます。
ダブルバッファですね。調べてみます。

317 :デフォルトの名無しさん:02/06/21 22:54
普通それくらいじゃダブルバッファ使わないし、
ちらつかない。
WM_ERASEBKGNDでreturn NULL;するといいと思われ

318 :デフォルトの名無しさん:02/06/21 22:58
>>317さん
ありがとうございます。
早速試してみます。

319 :デフォルトの名無しさん:02/06/21 22:59
裏画面のビットマップから表画面に転送してるって書いてあるべさ。
>314 クラススタイルにCS_CLIPCHILDRENとか付けてみたら?

320 :デフォルトの名無しさん:02/06/21 23:08
CS_CLIPCHILDRENっていうのは定義されてないって出るのですが・・
WNDCLASSEX wcl;
wcl.style = CS_CLIPCHILDREN;
でいいんですよね・・?

321 :デフォルトの名無しさん:02/06/21 23:09
WS_だろ

322 :デフォルトの名無しさん:02/06/21 23:09
>>320
WS_CLIPCHILDREN?

323 :デフォルトの名無しさん:02/06/21 23:09
>>319-320
WS_では?

324 :デフォルトのななしさん:02/06/21 23:12
つか、裏のビットマップなんぞ使わずInvalidateRect(残り時間表示部分)しれ。

325 :デフォルトの名無しさん:02/06/21 23:17
wcl.style = 0から
wcl.style = WS_VISIBLE|WS_CLIPCHILDREN;に変更すると
なぜか全くウインドウが表示されなくなりました・・・

326 :デフォルトの名無しさん:02/06/21 23:18
WSはCreateWindow(Ex)で

327 :314:02/06/21 23:23
ほんとに何も分からずすみません。

ようやくちらつかないで描画が出来ました。
WS_CLIPCHILDRENっていうのは子ウインドウ以外のところを
描画するようにするっていう命令なんですね。
皆さん、本当にありがとうございました。

328 :デフォルトの名無しさん:02/06/22 14:38
WinXPでCreateDIBSectionとCreateCompatibleDCのDCに
BitBltすると異常に遅くなるんだけど理由知ってる人いる?

Celeron850Mhz,MX400で320x240x16bitの転送に
200msecぐらいかかった。鬱。

329 :デフォルトの名無しさん:02/06/22 15:58
サイズは1対1であってて、フラグもSRCCOPYのみ?

330 :328:02/06/22 16:30
>>329
その通り。

Celeron500のNTでは8msecぐらいなんだけど。
俺なんか間違ってるかなあ?

331 :デフォルトの名無しさん:02/06/22 16:34
再現コードを作って、どこかにアプして試してもらうのがいいんじゃないかなあ
画面の色数の設定や、ドライバのバージョンでも変わりそうな気がするよ
特にXPはいろいろ変わってそうだし

332 :328:02/06/23 13:01
結局どうやっても無理ですた。

DirectX使ってビデオメモリアクセスまでやったけど
なんかビデオメモリやDDBにアクセスする時点でOSが介入して
なんかしてるみたいなんだよね。
(DDB→DIB変換は仕方ないとして。)

で、どうやったかというと、GetBitmapBits使った。
大丈夫かどうかは分からんけどとりあえず解決。

333 :デフォルトの名無しさん:02/06/23 17:08
スクリーンセーバーの起動がわかるAPIってありますか?
チャットプログラムなんですがスクリーンセーバーが起動すると
自動的にニックネームを変えたいので、監視したいんですが。

334 :デフォルトの名無しさん:02/06/23 18:41
>>328
GetDIBitsも駄目でしたか

335 :デフォルトの名無しさん:02/06/23 18:43
>>333
SPI_GETSCREENSAVERRUNNING
ただしWin98/2000以降

336 :328:02/06/23 18:56
>>334
うん。GetDIBitsは80msecぐらいだった。
GetBitmapBitsは6msecぐらい。

XPは色々変わってるからいや〜よ。

337 :デフォルトの名無しさん:02/06/24 14:35
Windowのタイトルバーを変える時に手を抜く関数をつくろうと思っています

void title(HWND, const char*, ...);
として、
title(hWnd, "ゲームを開始して%dミリ経過", tim);

つまり内部でsprintfすることによって、関数を呼ぶ側での手を抜きたいのですが、
自作関数title内部でうまーくsprintfにもっていく方法がわかりません
何か妙案はございませんでしょうか?

338 :デフォルトの名無しさん:02/06/24 14:41
>>337
マクロとかは?

339 :デフォルトの名無しさん:02/06/24 14:58
>>338
早速の解答ありがとうございます
マクロですか。ですが「不特定の数の引数を考慮したマクロ」の記述方法がわからないのです
#define TEST(x) if (x)〜〜〜〜
などは今も色々なHPで確認できたのですが、不特定の数の〜〜マクロはさすがに扱っているところが見つかりません

よろしければ組み方の例など教えていただけるとうれしいです
もしくはマクロに詳しいサイトなど教えていただけると

340 :デフォルトの名無しさん:02/06/24 15:11
>339
http://www.st.rim.or.jp/~phinloda/cqa/cqa8.htmlはどうですか?
誤爆しちゃったよ

341 :デフォルトの名無しさん:02/06/24 15:21
おお、良いページをありがとうございます
そこによるとどうやら「使わないほうがいい」という結論のようですが、他のFAQもかなり参考になるものばかりでした
感謝いたします

うーん。やはり素直にtitle(const char*)にして、アプリ側で文字列用意させるしかないですかね

342 :デフォルトの名無しさん:02/06/24 15:21
vsprintfだな。


343 :デフォルトの名無しさん:02/06/24 15:33
>>342
お、新情報ありがとうございます
ぱっと見たところうまくいきそうな予感がします
今から作成してみますのでまた詰まったら相談しに来させていただきたいと思います。では

344 :デフォルトの名無しさん:02/06/24 15:51
ありがとうございました。完成です
一応同じ質問がきたときのために私のサンプルを張っておきますね


#include <stdio.h>
#include <stdarg.h>

void title(const char *Format, ...){
char str[256];
va_list argp;

va_start(argp, Format);
vsprintf(str, Format, argp);
va_end(argp);

printf(str);
}


int main(){
title("%d秒%s", 150, "でやんす");
return 0;
}


345 :デフォルトの名無しさん:02/06/24 16:08
バッファオーバーランを防ぐために
vsprintfではなく、vsnprintfを使えという声が近頃は大きい。

しかしWindowsのLIBCにはvsnprintfがない罠

346 :デフォルトの名無しさん:02/06/24 19:03
>>344
サンプルとは言え、printf(str) はまずいだろう。str に '%' が含まれてた
ら、こけるぞ。printf("%s", str) か puts(str) にした方が無難だよ。

>>345
_vsnprintf() じゃダメなの ?

347 :デフォルトの名無しさん:02/06/24 19:04
Win98SEでUNICODEを表示する方法をご存知の方いませんか?
"Microsoft Layer for Unicode"使って、プログラム内部でUNICODEを扱えるようにはなってます。

しかし、エディットコントロール上だとUNICODEフォントを指定していても全角文字は化けてしまう…。
ちなみに、半角英数はなぜか大丈夫です。

348 :デフォルトの名無しさん:02/06/24 20:05
>>347
MSLU入れてもコントロールの実態は影響受けない(→今まで通り使えない)のでは。
リッチエディット使うとか…MSLU入れなくてもWin9x系でUNICODEが扱えます。

349 : ◆tYf6yb3Y :02/06/24 21:09
Win32APIはいつ頃使われなくなるんですか?

350 :デフォルトの名無しさん:02/06/24 21:30
>>349
Win64API が流行るまでじゃないの ?

351 :デフォルトの名無しさん:02/06/24 21:36
>>350
それはいつくらいになりそう?


352 :デフォルトの名無しさん:02/06/24 21:42
>>351
5年後ぐらいかなあ...

353 :デフォルトの名無しさん:02/06/24 22:18
>394
つーか、主語を明確にしろよ・・

354 :デフォルトの名無しさん:02/06/24 23:52
>>353
何に対するレスなのか明確にしろって

355 :デフォルトの名無しさん:02/06/25 00:05
>>354
そりゃ、>>394 に対するレスだろ。充分明確だよ。
このスレには存在しないのが問題だけどさ...。

356 :394:02/06/25 01:21
アホやなあ。

357 :デフォルトの名無しさん:02/06/25 01:25
394コウリ━━━━━━(゚∀゚)━━━━━━ン!!!!

358 :デフォルトの名無しさん:02/06/25 01:40
int main(int argc, char* argv[])
{
  ::CreateFile(argv[0],GENERIC_READ,0,0,OPEN_EXISTING,0,0); // 2重起動防止
〜〜〜〜〜〜〜
.exe の拡張子を .ini にしただけのINIファイルを守るために、
↑のようなコードを思いつきました。
小手先技くさいので、ちゃんと守れてるか心配です。
main開始からCreateFileの間の時間以外に、抜け道ありますかね?

359 :デフォルトの名無しさん:02/06/25 01:47
Mutex使え

360 :358:02/06/25 01:49
>>359
ほかのパスや名前の実行ファイルなら、同時に起動できてもいいんです。

361 :デフォルトの名無しさん:02/06/25 03:24
>>360
Mutex の名前をパス名から生成すれば良いやん。

362 :デフォルトの名無しさん:02/06/25 11:12
グローバルフックが効かなくなる事があるのですが。
アクティブウィンドウが無い場合に起こりやすいです。
回避方法はあります?

363 :デフォルトの名無しさん:02/06/25 11:32
>>360
関係ないけど、VBのApp.PrevInstanceってまさに360+361の動作するんだよねえ。Semaphoreみたいだけど。
ヘタレVBめ。


364 :347:02/06/25 13:59
>>348
レスありがとう。
その指摘を受けてさっそくRichedit2.0を使ってみたんだけど、上手くいきませんでした。

結果、入力はどれもダメ。
文字入力したときの表示は問題ないけど、GetWindowTextで文字列取得するとUNICODEでも
S-JISでもない、バイナリ(既に文字でない)が返ってくる。

で、正しいコードを入れて表示させると各言語によって対応は大違い。
日本語は、日本語のみOK、簡体、繁体は一部文字化け。ハングルは全部ダメ
英語は、半角英数のみOK、他言語表示はまるでダメ。
韓国語は、ハングルのみOK。日本語、簡体、繁体は一部文字化け。
中国語は、OS入れるスペースがないので試してません…。

…と、自分の国以外は完全対応してないようです。
やっぱり、Win98でUNICODEは無謀なのか…。(;´д⊂

365 :U-ハァハァ(;´Д`)さん:02/06/25 14:35
>>364
オラオラ もっとキッチリ試せ (#゚Д゚)ゴルァ!

各文字コードセットの値の端っこ付近とか、
1コずつブッ込んで試してみれ。
入力した値に対して、表示だけではなく、
各桁位置から取得できるコード(1バイトずつ桁をずらしてみる)を
元のコードと比べて評価しよう DEATH!

丹念に小一時間調べれば、
誰も知らない、新事実をお前様があきらかにすることに
なりましょうぞ ・・・・・(;´Д⊂

366 :デフォルトの名無しさん:02/06/25 15:38
>>364
M$からzh-chとzh-twのフォントDLさせてもだめ?
(すれ違いだけど)WebBrawserコントロールかCHtmlViewなら簡単に表示できそう
だけど。

367 :デフォルトの名無しさん:02/06/25 16:01
>>364
SendMessage(…,EM_GETTEXTEX,…);
で取ってみそ。

368 :367:02/06/25 16:56
1つ忘れてた。リッチエディットはRichEdit20Wで作ってね。

369 :347:02/06/25 17:23
>>365
励ましありがと〜。どうも、最近になって諦め癖がついてたようです。

まだ調査継続中ですが調査の中間結果を…
GetWindowText()が変更するバイト数は、[S-JISでの入力バイト数*2+2](最後の+2はNULLかも)
どうも、リッチエディット(以下Riched)のフォントはUNICODEでも、実際にRichedが保持している
文字情報はS-JISっぽい?

で、私見ですがWin98SEにMSLUを使用した場合のGetWindowText()内部は、
Richedに入力されたS-JISのデータを(制御コード含め)「そのまま」にUNICODEに読み替える。
 ↓
読もうとして読めたやつはその文字コードで固定。読めなかったやつは、"?"[0x003F]に変換。
S-JISで換算して奇数Byteの入力の場合、1Byte余るので[0x00]をくっ付けてそのままUNICODEに。
 ↓
そうすると、変更予定バイト数に明らかに足りないのでそこは[0x0000]で埋める。

こんな感じかな。そうなると大半の出力が"?"だけになるのとも合致する。
それと実験して見つけた実証パターンとして"0テf"[36-83-65-66]を入力すると
"茶ユ"[36-83-65-66]とでるので、部分的に違うところがあっても完全に間違いではないと思う。

逆にこれが本当だとすると、使い物にならないと言う結論が出そうで怖い…(;´д⊂

-------------
…と、ここまで書いて>>367さんの書き込みを発見。
で、それを使ったら入力は一発で出来ました。ヽ( ̄▽ ̄)ノ
ありがとうございます。

結論:
 MSLUの実装するGetTextWindowW()など、ウィンドウからテキストを取得する関数は
 UNICODEに対応してない!

さて、次は多言語表示だな…。とりあえず、>>366さんの発言を見てフォントを
DLしましたがダメでした。コントロール系はまだ試してません。

長々と書いてしまって、すみません…

370 :デフォルトの名無しさん:02/06/25 18:03
>>369
マズUNICODEフォントを拾ってくるべし。
http://www.microsoft.com/downloads/searchdl.asp?
で、keyword searchにしてunicodeで検索すると、
Arial Unicode MS Font for Publisher 2000
ってのがある。フォントの中身を全部確認した訳ではないが、漢字・ハングル・簡体
は少なくとも同時に表示できる。
あとは実際の表示だが、MSLUがどこまで出来るかワカランからあれだが、漏れが
Win9xで作ったソフト(MSLU無し)では、TextOutWを使った。これはWin9xにもある
APIだす。がんがれ!

371 :デフォルトの名無しさん:02/06/25 18:55
>>362
アクティブウインドウが存在しない状態は有り得ない。
たとえばデスクトップやタスクバー、
もしくは不可視のウインドウにかならずアクティブ属性が設定されている

372 :362:02/06/26 00:15
>>371
でも、GetForegraundWindow()の結果が0になる場合があります。
その時は、フックに通知がいかないみたいです。


373 :デフォルトの名無しさん:02/06/26 00:43
0=デスクトップです
デスクトップに表示されているリストビューとかとは別の。

374 :362:02/06/26 07:47
>>373
GetDesktopWindow()は0じゃないですよね。
別物なんですか?

375 :デフォルトの名無しさん:02/06/26 07:50
>>374
それもデスクトップ。
しかし、Windowsにおける(本来の)デスクトップはもっと
上の階層で、Winlogonデスクトップ(だっけ?)とか、
スクリーンセーバーのデスクトップなる物が存在し、
特定のウインドウをデスクトップと呼ぶ物ではなく
0をデスクトップを表す物として扱っている。

376 :デフォルトの名無しさん:02/06/26 10:46
デスクトップとデスクトップウィンドウ混同してるだろ。
デスクトップはHDESK型のハンドルで識別されるまったく別の概念のオブジェクトなので、
GetForegroundWindowの返却値にはなりえない。

MSDNで見つけた0を返すケースとして、
・他のデスクトップがアクティブのとき
・アクティブなウィンドウが変わる瞬間
みたいな記述見つけたけど、もっとベタなケースあったような気がするんだけどなー。NT3.51の時だったかなあ。


377 :362:02/06/26 12:18
>>375-376 返事ありがとうです。
タスクトレイをいじっていると、0を返す場合があるみたいです。
Win98/2000で確認しました。

こうなったらフックは駄目みたいなので、諦めます。
いろいろありがとうございますた。

378 :347:02/06/26 14:36
>>370
"Arial Unicode MS"は既に入ってます。それとこっちの事情でしかないんですが、現在
作ってる物はいろいろ制限がありまして、GDI関連やMFCは使えないのです…。(;´д⊂

で、昨日の続き。
WebBrowserコントロールを使ってみました。なにも入れなくてもすんなり表示してくれました。
でも、やっぱりこれって文字列そのまま入力は出来ないですよね…。
やるとすれば表示する文字列を逐次ファイルに書き込んで、そのURIを参照すると言う方法かな。
ついでに装飾も出来て面白そうかも。(必要ないけど)
でも、IEに関する余計な(表示以外の)機能を封じないといろいろ問題が出そうな気がする。

とりあえず、リッチエディットとWebBrowserの両方をもう少し探ってみます。

379 :デフォルトの名無しさん:02/06/26 21:33
> でも、やっぱりこれって文字列そのまま入力は出来ないですよね…。
TEXTAREAを全面に貼ったらどうよ

>>350
.NETが流行るまでだと思う
Win64 APIは今までのように直接使われることはあまりないと予想

380 ::02/06/27 11:43
デスクトップがアクティブになっている状態でプログラムでマウスの座標を
取得する方法ありませんか?


381 :デフォルトの名無しさん:02/06/27 13:29
>>380
自分のプログラムがアクティブのときは
マウスの座標の取得できるんだよねぇ。
グローバルフックでいろいろ検索してみそ。

382 :デフォルトの名無しさん:02/06/27 13:33
GetCursorPos()でどう?

383 :デフォルトの名無しさん:02/06/27 13:42
380がどんなアプリをつくるかによるな。

384 :デフォルトの名無しさん:02/06/27 14:48
インターネット電話関連で簡単なフリーウェアを作っているのですが、
Windows の ミキサー制御低レベル API を使って録音ソースの選択を
プログラムから切り替えようとしたところうまくいかず行き詰まっています。

以下のような手順で録音ソース選択のコントロールを取得できると思った
のですがうまくいきませんでした。

mixerGetNumDevs()
mixerGetDevCaps()
mixerOpen()
mxl.dwDestination = 1; // 録音ライン
mxl.dwSource = 1; // 録音ソースとして選択したいコネクション(マイク)
mixerGetLineInfo((HMIXEROBJ)hMixerHandle,&mxl, MIXER_GETLINEINFOF_SOURCE )

この時点で mxl.cControls が1となっていて、Volume Control のみが
関連付けられています。

試しに mxl.dwDestination を再生ラインに変えて各コネクションの
コントロールを調べるとVolume Control 以外に Mute Control もあったので、
てっきり録音ラインのコネクションにも Select Control ? のようなものが
関連付けられていると思っていたのですが・・・

ミキサー制御に詳しい方、ご教授をよろしくお願いいたします。
この辺詳しく勉強したいので参考になる本なども合わせて
教えていただけると助かります。


385 ::02/06/27 15:44
>>381-382
グローバルフックでいけそうです。
感謝感激です。


386 :347:02/06/27 18:43
>>379
あ、いや入力とは言ってもユーザーからの入力ではなくプログラム内部からの入力でして…。

結局、RichEdit3.0でなら表示含め可能でした。ちなみに、EM_GETTEXTEXとEM_SETTEXTEXを使って実現してます。
WebBrowserの方はIEのバージョンによって微妙なところがありそうなのと
「RichEditが使えるならいいや」という事で放置しました。(^^;

ただ、Win95/98/98SEにRichEdit3.0対応のDLLが入ってないんで、
Riched20.dll(5.30.23.1200以降?)をアプリに付けて再配布しなきゃいけませんが。
その前に再配布可なバージョンはどれだろう…。

387 :デフォルトの名無しさん:02/06/27 18:50
ラインじゃなくて、mixerOpenしたミキサーハンドル自体に
mixerGetControlDetailsしてみるとどう?

あとは提示のコードでMIXER_GETLINEINFOF_DESTINATIONとか。


388 :デフォルトの名無しさん:02/06/27 21:49
はじめまして。
VC++でAPIプログラミングしてます。
ダイアログボックスをリソースエディタで作成し、閉じるの×ボタンを表示しないようにして、
ダイアログを終了されないようにしています。
ところが、Alt+F4で閉じてしまいます。
WM_DESTROYなどでも、検出できなくて困っています。
ご教授お願いします。

389 :デフォルトの名無しさん:02/06/27 21:55
終了しないダイアログを作って何がしたいんだ?
嫌がらせか?
とりあえずここでも読んどけ。
readme.txtにアンインストール情報を!
http://pc.2ch.net/test/read.cgi/prog/997370579/l50

390 :デフォルトの名無しさん:02/06/27 22:04
>>388
WM_COMMAND の LOWORD(wParam) == IDCANCEL で検出できますね。
ただ、この場合、タスクマネージャーから強制的に終了してやらないといけなくなるので注意

391 :389:02/06/27 22:07
>>388
補足。return TRUE ; とすると、終了できなくなるよん。
return FALSE ; だと、デフォルトのダイアログプロシージャ
に処理がわたってしまうのでの

>>389
まぁ、スプラッシュウインドウとかもあるしね。
B's Gold の焼いてる途中のダイアログも終了できないし(w

392 :デフォルトの名無しさん:02/06/27 22:56
>390
まったく、効かないです。
強制的にどころか、デバッグでブレークポイントを作ったのですが、
とまりません。
ダイアログの表示自体は、DialogBox()で、作っているのですが…。
なにか、解りませんでしょうか?

393 :デフォルトの名無しさん:02/06/27 22:58
IDCANCELに相当するボタンを除去すれば良いんじゃないの?

394 :デフォルトの名無しさん:02/06/27 23:00
ボタンなんて最初からないですよ…。
消してます!

395 :デフォルトの名無しさん:02/06/27 23:08
>>387
ありがとうございました。

教えていただいたとおり
mxl.dwDestination = 1; // 録音ライン
に対して
mixerGetLineInfo(
    (HMIXEROBJ)hMixerHandle, &mxl,
    MIXER_GETLINEINFOF_DESTINATION )
すると "Record Select Switch" というコントロールが見つかりました。

あとは
mixerGetControlDetails(
    (HMIXEROBJ)m_hMixerHandle, &mxcd,
    MIXER_GETCONTROLDETAILSF_VALUE )
で MIXERCONTROLDETAILS_BOOLEAN の配列を取得して録音ソースの選択状態を
正しく調べることが出来ました。

こんなところにあったのですね。ありがとうございました。


396 :デフォルトの名無しさん:02/06/27 23:10
alt+f4はWM_CLOSEが飛んできたような・・

397 :デフォルトの名無しさん:02/06/27 23:13
WM_SYSCOMMAND/SC_CLOSEだろ

398 :デフォルトの名無しさん:02/06/28 02:47
モニタ一台しかないんですけどマルチモニタ環境での動作を
確認する方法はありませんか?
なんかマルチモニタ環境でしか起きない不具合を報告されて
かなり悩んでます。

399 :デフォルトの名無しさん:02/06/28 03:03
マルチモニタ未サポート

400 :デフォルトの名無しさん:02/06/28 03:39
できれば対応したい
他に方法がなければ安い外付けディスプレイを調達して来ようかと
本気で考え中だけど金掛けずに済む方法があれば
それにこしたことはないので

401 :デフォルトの名無しさん:02/06/28 03:42
シングルじゃテストのしようがない。

プライマリディスプレイとセカンダリディスプレイのDCに
互換があると思ってはいけない。
互換性がないと思いながらコーディングをしていくしか無いんじゃないかと。

402 :デフォルトの名無しさん:02/06/29 00:15
いきなりな質問なのですが、SetTimer関数が100ミリ秒に1回って
設定しても、きちんとメッセージを送っていないようなのですが
こんなに速くは動かせないってことなのでしょうか?

時間の測り方
・左クリックをしたらSetTimer関数を使ってタイマーをかけ、
GetTickCount()でそのときの時間をとります。
・WM_TIMERの中では変数をインクリメントします。
・もう一度左クリックをしたらタイマーを殺し
GetTickCount()でまた時間をとります。

で、GetTickCount()で得られた値を引き算して
タイマーの動いた時間を得ているのですが、2000ミリ秒くらい
動かしても16回くらいしかWM_TIMERが呼ばれていないのです。

将来的にはマウスカーソルの動きを10ミリ秒に一回くらい取りたいのですが
そんなのは不可能なのでしょうか?
長文失礼致しました。
誰か、よろしかったら教えてください。

403 :デフォルトの名無しさん:02/06/29 00:22
単に計測方法が間違ってるんじゃないかと言ってみるテスト

404 :デフォルトの名無しさん:02/06/29 00:25
>>403
そうなんでしょうか。
どうやったら正しい計測が出来るでしょうか?

405 :デフォルトの名無しさん:02/06/29 00:26
>>404
測定時間を2秒なんつー短い時間にしないでせめて20秒見てみるとか

406 :デフォルトの名無しさん:02/06/29 00:30
約20秒見てみた結果です。
計測時間:22237ミリ秒
計測回数:199回    でした。
本来なら222回呼ばれてないとおかしいと思うのですが・・・

407 :デフォルトの名無しさん:02/06/29 00:31
>>404
どうやったら、以前に
おまえのプログラムにバグがあるか確認しろよ

408 :デフォルトの名無しさん:02/06/29 00:40
>>407
バグは無いと思います。


409 :デフォルトの名無しさん:02/06/29 00:42
思いますってなんだよ

410 :デフォルトの名無しさん:02/06/29 00:44
日本語も分からないのですか?
思いますは思いますでしょう?
可哀想な方ですね(ププ

411 :デフォルトの名無しさん:02/06/29 00:47
大人しくマルチメディアタイマ使えよ

412 :402:02/06/29 00:48
410は僕じゃ有りません。
思いますっていうのは・・・たぶん無いだろうってことなんですが・・
なんせ素人なんで良く分かりません。
どうやったらいいのかって聞いたのは>>403さんが
僕の書いた計測方法を読んで
間違いがあるのに気付いたのかと思ったからです。

413 :402:02/06/29 00:50
マルチメディアタイマっていうのがあるんですね。
本当にありがとうございます。
早速検索してみます。

414 :デフォルトの名無しさん:02/06/29 01:17
WM_TIMERに精度を求めてはいけません。。

415 :デフォルトの名無しさん:02/06/29 01:19
分解能も今市だしね。

416 :デフォルトの名無しさん:02/06/29 01:38
標準タイマに10msの分解能を期待するなんて無茶もいいとこ
NT系ではいちおう10msの精度があることになってるらしいが

417 :デフォルトの名無しさん:02/06/29 01:46
timeBeginPeriodも忘れないでね…ボソ

418 :402:02/06/29 02:13
とりあえずマルチメディアタイマを使って
マウスの変位を文字列に入れて描画して
その変位を配列に次々に保存していっても
きちんと10ミリ秒で動くようになりました。

アドバイスくださった皆様、本当にありがとうございました。
そのうち恩返しが出来るよう頑張ります。

419 :デフォルトの名無しさん:02/06/29 04:27
>>418
2ちゃんにはめずらいしい、まじめなレスだのう
しかし、あと半年も2ちゃんにいれば、
「氏ねやゴルァ」とか言ってるんだろうなぁ シミジミ <- テナニガ?

420 :デフォルトの名無しさん:02/06/29 04:41
WM_LBUTTONDOWN がマウスのボタンを押しっぱなしにしても
クリックした時の一回しか来ないんですけど
マウスのボタンが押されている間中届いている
メッセージってあるんですか

421 :デフォルトの名無しさん:02/06/29 04:48
>>420
普通、WM_LBUTTONDOWN来たらSetCaptureしてWM_LBUTTONUP監視じゃねぇの?
もしかして、もっと簡単な方法あるのか…

422 :デフォルトの名無しさん:02/06/29 04:48
ない。
押してる間中届いてたらマシンがとんでもなく重くなる罠

423 :デフォルトの名無しさん:02/06/29 05:45
やっぱりないんですか。
case WM_CHAR:
switch (wParam) {
case 'i':
i++;
break;
}
これだとキーボードが押されているあいだくりかえされるのですが
これをウインドウの一点がクリックされてる間にも
くりかえされるようにしたかったんです。
これを実現する何か簡単な方法があったら教えてください。

424 :デフォルトの名無しさん:02/06/29 05:51
自分でメッセージ出せ

425 :デフォルトの名無しさん:02/06/29 05:52
それはTranslateMessageでWM_KEYDOWNとWM_KEYUPをハンドリングしているだけ。

426 :デフォルトの名無しさん:02/06/29 06:04
>>425
それは関係ない。キーリピートが原因。

427 :デフォルトの名無しさん:02/06/29 06:12
>>426
おいおい、マジで言ってるの?
TranslateMessageでWM_KEYDOWN/UP WM_SYSKEYDOWN/UPから
キーボードドライバを通してWM_CHAR/WM_SYSCHARを生成してるんだよ。

428 :デフォルトの名無しさん:02/06/29 06:20
>>427
あんたこそマジ?
WM_KEYDOWN が実際にたくさん来てるんだよ。
ちなみに、WM_KEYUP は最後だけね。

429 :デフォルトの名無しさん:02/06/29 08:20
CreateProcessとかShellExecuteで起動した
アプリケーションのメッセージキューが作成されるまで待機する方法ありませんか?
起動直後に処理が戻るのではなく、準備が出来るまで待機したいのですが。

430 :デフォルトの名無しさん:02/06/29 08:32
>>429
使ったこと無いから実は実際の動作は知らんのだけど、WaitForInputIdle() は?

431 :デフォルトの名無しさん:02/06/29 09:13
>>430
thx!
期待通りの動作でした。

432 :デフォルトの名無しさん:02/06/29 23:27
自分自身のThreadはGetCurrentThereadIDで取得出来るけど
他のアプリのThreadを取得出来るAPIはない?

433 :デフォルトの名無しさん:02/06/29 23:35
OpenProcess

434 :デフォルトの名無しさん:02/06/29 23:45
>>433
それはハンドル

435 :デフォルトの名無しさん:02/06/29 23:51
>>432
DLLにでも入れとけ。

436 :デフォルトの名無しさん:02/06/30 11:05
>>432
GetWindowThreadProcessIdとか?

437 :デフォルトの名無しさん:02/06/30 15:02
>>436
Thanks!

438 :デフォルトの名無しさん:02/07/01 01:02
ウィンドウのないアプリだったらToolhelp32

439 :デフォルトの名無しさん:02/07/01 16:25
ビットマップを読み込む際に、今までのようにリソースでいちいち管理するのは非効率なので
LoadImageを使ってビットマップをそのまま読み込むようにしました。
ただ、この場合必ずビットマップの全域を読み込んでしまってビットマップのある一部分だけを
読み込むことができないんですが、これをする方法ってあるのでしょうか?


440 :デフォルトの名無しさん:02/07/01 16:29
自力でBMPヘッダ解析しる

441 :デフォルトの名無しさん:02/07/01 18:51
Windows で、ProgramFilesフォルダや、Windows・WinntフォルダそれからSystem・System32フォルダなどの
パスを取得するにはどうすればいいでしょうか?

442 :デフォルトの名無しさん:02/07/01 19:01
がんばれ

443 :デフォルトの名無しさん:02/07/01 19:54
不思議なことが起こるのです。
ポインタうんぬんで、char型を返したときに、
半角カナの「へ」がたくさん並ぶことがあるじゃないですか。
NULLあたり(?)でしょうか。
これは、検出する方法はあるのでしょうか?
教えてください。

444 :デフォルトの名無しさん:02/07/01 20:10
デバッグビルドでは、身初期化メモリが0xcdに初期化されるはず

445 :デフォルトの名無しさん:02/07/01 20:16
有難うございます。

446 :デフォルトの名無しさん:02/07/01 20:17
>>441
GetWindowsDirectoryやらGetSystemDirectoryやら環境変数やら


447 :デフォルトの名無しさん:02/07/01 21:06
有難うございました。

448 :デフォルトの名無しさん:02/07/01 21:13
>>446
環境変数やらとありますが、ProgramFilesディレクトリは
どのようにして環境変数から取り出せばいいでしょうか?

449 :デフォルトの名無しさん:02/07/01 22:06
>>448
環境変数?
SHGetFolderPathではダメなのかいの?

450 :デフォルトの名無しさん:02/07/01 22:13
SH系ってバージョンに気を使うんだよね。
後はSHRegGetPathやらGetEnvironmentVariableやら色々

451 :デフォルトの名無しさん:02/07/01 22:16
>>450
SHRegGetPathはマチガイデシ

452 :デフォルトの名無しさん:02/07/01 22:18
つ〜か、>>446調べた時点で、ExpandEnvironmentStrings()まで気が付かなきゃ…

453 :デフォルトの名無しさん:02/07/02 00:47
>>446
SHGetSpecialFolderLocation()とSHGetPathFromIDList()を組み合わせて使え。

454 :446:02/07/02 11:00
>>452
それは文字列中に%ABC%みたいな形で書いてある環境変数を展開するやつだから、
使っても良いけどGetEnvironmentVariableで十分でしょ。

>>453
あー俺だったらそれ使うけど、初心者向きじゃないかなと思って薦めなかった。

455 :名無しさん@カラアゲうまうま:02/07/02 11:31
>>453
なんでそれはあんなにめんどくさいインターフェースになってるんだ?

456 :デフォルトの名無しさん:02/07/02 13:47
ファイルシステムを抽象化した「シェル名前空間」というものがあって、
その世界ではフォルダを識別するのにitem id listというのを使ったり、
COMベースでインターフェースが提供されていたりするわけだ。
面倒くさいけど、「コントロールパネル」みたいな仮想フォルダを実現できるのは
このおかげ。

…そもそも環境変数の内容取得するのにわざわざAPIを使う必要わない。

457 :デフォルトの名無しさん:02/07/02 15:10
HWNDを受け取ってその対象のDCにグラフを描画するクラスを作成しているのですが
更新時にちらついてしまい、更新頻度を50ms等にするとかなり見にくい状況です。
一応hWndを受けた時にメモリDCを作成してそこに描画し、
メインフレームで OnPaint が発生した時には
グラフ描画クラス内で GetDC して ウィンドウにBitBlt したあと ReleaseDC しています。

なんとかしてちらつきを低減したいのですが
DirectX以外の方法で実現する方法を教えてください。おながいします。

458 :デフォルトの名無しさん:02/07/02 15:20
>>457
WM_ERASEBKGNDを処理汁

459 :デフォルトの名無しさん:02/07/02 15:26
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm
新しいSDKが出てた、あげ

460 :457:02/07/02 15:55
>>458
メインフレームで OnEraseBkgnd をオーバーライドして
return 1; としたところ、ウィンドウサイズ変更時に全体がちらつく現象はなくなりました。
しかしスクロールするグラフ部分のちらつきは解消されませんでした。
こちらについてなにかご存知でしたら教えてください。

461 :デフォルトの名無しさん:02/07/02 16:36
>>460
お前のスクロール処理がまずいんだろ

462 :名無しさん@カラアゲうまうま:02/07/02 17:56
>>456
> 面倒くさいけど、「コントロールパネル」みたいな仮想フォルダを実現できるのは
> このおかげ。

GetWindowsDirectory()みたいのがあってもいいじゃん、と思ったんだが。
なんつーか、SHGetSpecialFolderLocation()の後始末がめんどくさ杉。

> …そもそも環境変数の内容取得するのにわざわざAPIを使う必要わない。

逆にCSIDL_PERSONALをsetenv("HOME")したかったんだけどね。

463 :デフォルトの名無しさん:02/07/02 18:01
>>460
もしかして、OnPaint以外で画面の更新かけてる?
その場合ちらつきを防ぐのはかなり面倒だったような気が…
画面内容の更新は全てメモリDCにやって、OnPaintで実際のウィンドウに反映とか。

で、50ms間隔で更新したければそのタイミングでInvalidateRect()呼ぶとかでダメ?

464 :457:02/07/02 18:48
>>461
その通りですた。
>>463
OnTimer でInvalidateRect(FALSE) と書いています。

どうやら本当にスクロール処理に問題があるようでした。
ためしにスクロール関数内でスクロールの代わりに
ランダムに線を描画させてみたところちらつきは発生しませんでした。

void CGraph::Scroll(int Pixcel, int direction)
{
  POINT pnt;
  MoveToEx(m_memdc, 0, 0, &pnt);// 以前のカーソルの位置を取得
  BitBlt(m_memdc, rcPoint.left + 1, rcPoint.top + 1,
      rcPoint.right - 1, rcPoint.bottom - 1,
      m_memdc, rcPoint.left + Pixcel + 1,
      rcPoint.top + 1, SRCCOPY);// 指定範囲をスクロール
  MoveToEx(m_memdc, pnt.x - Pixcel, pnt.y, NULL);// スクロールした分カーソル位置を補正
}

まだバグバグですがとりあえずちらつきを直したかったので質問させていただきました。
描画自体は OnPaint() から、

void CGraph::Draw(int x1, int y1, int x2, int y2)
{
  if(x2 == 0) x2 = ptGrid.x;// 全体の幅
  if(y2 == 0) y2 = ptGrid.y;// 全体の高さ
  HDC hdc;
  hdc = GetDC(m_hWnd);
  BitBlt(hdc, x1, y1, x2, y2, m_memdc, x1, y1, SRCCOPY);
  ReleaseDC(m_hWnd, hdc);
}

こんな感じです。
スクロール処理の改善方法について何かご存知でしたらご教授いただけると助かります。


465 :デフォルトの名無しさん:02/07/02 18:49
Windows で raw socket を扱うにはどうすればいいのでしょうか?
あ、ファイアーウォールのテストに使いたいだけです。

466 :デフォルトの名無しさん:02/07/02 19:19
http://tangentsoft.net/wskfaq/examples/rawping.html

467 :デフォルトの名無しさん:02/07/02 19:33
>>462
ああそういうことか。
でもまさしくそういう用途のためにSHGetSpecialFolderPath()があるんじゃん?
動作環境の制限がうざいけどさ。

…最近はShGetFolderPath()なんていうのもあるのか、いじってないとすぐ知識が廃れるな。

468 :462:02/07/02 20:10
>>467
> でもまさしくそういう用途のためにSHGetSpecialFolderPath()があるんじゃん?
それを知らなかった。逝ってきます。


469 :デフォルトの名無しさん:02/07/02 22:29
>>464
ScrollWindow使ってみろんぬ。
どうでもいいが、OnPaintに渡されたDCを使わずに勝手にGetDCするのは
最近の流行りなのか?

470 :デフォルトの名無しさん:02/07/03 01:33
>>468
Win95にはなかったところを見るとMicrosoftもさすがに不便だと
思い直したんだろうな

471 :457:02/07/03 11:39
>>469
ScrollWindowEx と ScrollDC を使用することで
ちらつきの無いスクロールが実現できました。
ありがとうございました。本当に助かりました。

あと、勝手に GetDC しているのは OnPaint 以外の箇所から呼ばれた場合を考慮したからです。


472 :デフォルトの名無しさん:02/07/04 00:13
エディットコントロールに
äöüß <-ドイツ語のウムラウト
を表示させたいのですが、どうすればよいのでしょうか?
UNICODEアプリではないです。

473 :デフォルトの名無しさん:02/07/04 00:25
>>472
欧文フォントを指定してはいかが?

474 :デフォルトの名無しさん:02/07/04 00:35
たとえばメモ帳で欧文フォントを指定して、
上のドイツ語を貼り付けても aous としか表示してくれないです。

IEのテクストエリアだとちゃんと表示してくれます。
なぜなの。鬱

475 :デフォルトの名無しさん:02/07/04 00:55
>>474
メモ帳なら表示するけど・・・。
欧文フォントでなくてもFixedSysで。

476 :デフォルトの名無しさん:02/07/04 00:56
>>474
Unicodeアプリじゃないと不可能
でもUnicodeアプリはWin9xで動かない罠
ちなみにNT/2000/XPのメモ帳ならまったく問題なし
どうしても9xで使いたきゃActiveXでIEのエディット使え

477 :デフォルトの名無しさん:02/07/04 01:12
ありがとうございます。
絵ディとコントロールは無理ということであきらめます。

ところで、IEのエディットっていうのはHTMLEditのことで
しょうか?これもちょっと大掛かりになりそうなので、
自作する方向で考えてみます。

478 :デフォルトの名無しさん:02/07/04 01:15
>>477
RichEdit 3.0とか

479 :デフォルトの名無しさん:02/07/04 01:21
>>477
VBだったらフォームに置くだけだけどな
>>478 にあるRichEditも検討に値する

480 :デフォルトの名無しさん:02/07/04 01:22
>>478
Delphiで使えるRichEdit 3.0のコンポーネントってあります?

481 :デフォルトの名無しさん:02/07/04 01:32
ありがとうございます。
RichEdit調べてみます。

482 :デフォルトの名無しさん:02/07/04 01:56
>>477
どう考えても自作する方が大掛かりだろ……

483 :デフォルトの名無しさん:02/07/04 01:59
エディットコントロールが自作できる人間は、
こんなとこで質問しません。

484 :デフォルトの名無しさん:02/07/04 02:58
HTMLEditをつかうとなれば、IhogeSiteとかIDispatchとかコネクションポイント
とかを用意しなければならないので大変かなと。重くなりそうだし
エディットコントロールの変わりに使ってるのはみたことないしで、

それに比べれば、エディットの自作なんて、DrawText系で書くくらいかな
と思った次第です。

485 :デフォルトの名無しさん:02/07/04 03:32
あるクラス(CWin)にstaticなWndProcを定義したときに、
WndProc内でそのクラスのメンバ変数にアクセスできるようないい方法ないでしょうか?

考えたのはCreateWindowEx(・・・,this)
としておいて、そのクラスにstaticじゃないウィンドウプロシージャ(MsgProc)
ようなものを用意する。それで、

static LRESULT CALLBACK CWin::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CWin *pWin;

switch(message)
{
case WM_CREATE:
pWin = (CWin *)lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lParam);
break;
default:
pWin = (CWin *)GetWindowLong(hWnd, GWL_USERDATA);
}

return pWin->MsgProc(hWnd, message, wParam, lParam);
}

として実際の処理はMsgProcでするようにしてたんですけど、
他に何かいい方法がありませんか?



486 :デフォルトの名無しさん:02/07/04 03:37
他に
・MFC方式(テーブルからHWNDつかってルックアップ)
・ATL方式(「hWndをCWindow*にすり替え、本当のWndProcに
 jmpするコード片」を自動生成して、WndProcとして登録する)
・グローバル変数を用いる方法(あんまし考えてないね)
などがあるようです。

487 :デフォルトの名無しさん:02/07/04 03:44
> それに比べれば、エディットの自作なんて、DrawText系で書くくらいかな
> と思った次第です。

その程度の知識じゃ、プロポーショナルフォントで
カーソル制御するだけでも、苦労しそうだな。
とりあえず、マウスクリックされた位置が、
文字列のどの位置当たるか、判定する関数書いてみなさい。

488 :デフォルトの名無しさん:02/07/04 03:48
シャットダウン(?)ってどーやるんですか?

489 :デフォルトの名無しさん:02/07/04 03:50
http://www.google.com/search?q=+Windows終了+API

490 :デフォルトの名無しさん:02/07/04 03:52
HTMLEditを使ったことが無いんでどの程度大変なのかは知らんが、
エディットくらいは自作も簡単だろ、色分けやフォント変え(サイズ含む)出来るエディットコントロール作ったことがあるが、EM_系メッセージに対応させるのが量的に面倒だった事意外は別段普通だと思うが。

491 :デフォルトの名無しさん:02/07/04 03:53
>.486
hwndをCWindow*にすり替えるってどういう事?

492 :デフォルトの名無しさん:02/07/04 04:03
正直、エディットコントロールを自作できるような奴が、ここにいるとは思えない・・・

493 :デフォルトの名無しさん:02/07/04 04:38
正直、テキストエディタを自作できない奴は初心者だけだろ

494 :デフォルトの名無しさん:02/07/04 04:39
>>490
自作とカスタマイズを、混同してる気がするが?

495 :デフォルトの名無しさん:02/07/04 04:41
>>491
VC6 持ってるなら、ATL のソース読むのが確実。

class CWndProcThunk;
CWindowImplBaseT<CWindow, CControlWinTraits>::Create()
CWindowImplBaseT<CWindow, CControlWinTraits>::StartWindowProc()

このあたりね。検索すると、いくつか解説のページが見つかるよ。

496 :デフォルトの名無しさん:02/07/04 04:46
>>493
エディタからエディットコントロールまでには、
まだいくつかハードルがある。
まあ、エディットコントロールを
自作したほうが楽なんてキティな意見を、
無理矢理通そうとする奴に、何言っても無駄だろうが。

497 :デフォルトの名無しさん:02/07/04 05:10
>>496
アンタの言うテキストエディタって、
RichEditやEDITを貼り付けるだけの物を言ってる?
コントロール自作出来ない奴は初心者だって言ってるんだが。

498 :デフォルトの名無しさん:02/07/04 09:32
IMEの入力受けるだけでも一苦労

499 :デフォルトの名無しさん:02/07/04 09:55
>>498
おぃおぃ

500 :デフォルトの名無しさん:02/07/04 10:40
>>476
> でもUnicodeアプリはWin9xで動かない罠
これ微妙。MSLUを使えば9x系でもプログラム内部でUNICODE使えます。
で、Richedit2.0以降を使えばUNICODE対応してるし。
ただし、Richedit3.0でないとEM_SETTEXTEXが使えないのでRichedit上に
UNICODEを表示したい場合は、5.30系のriched20.dllを用意するべし

さらに、9x系での入力はAciveIMM(GlobalIME)を使わないとコピペする以外に方法ない。(たぶん)
ちなみに、ActiveIMMはActiveXなんでIEコンポーネント使わなくても単独で使えるはず。

もう一つ言うと、NT系でもXP以外はデフォルトでUnicodeフォントが入ってないので、
Unicodeフォントを入れるか、各言語ごとにフォントを指定してやらないと多言語混在表示は出来ません。

501 :デフォルトの名無しさん:02/07/04 11:07
Win2kでもMS(P)ゴシック、MS(P)明朝はUNICODEフォントだよ。

502 :デフォルトの名無しさん:02/07/04 11:50
Arial Unicode MS とかも入ってるんでない?

503 :デフォルトの名無しさん:02/07/04 12:20
>>484
何か勘違いしてないか?
誰もHTMLEditだなんて言ってないだろ。
FM20.DLLを知らないの?

504 :デフォルトの名無しさん:02/07/04 12:21
>>500
#define UNICODE
してコンパイルしてみそ
CreateWindowEx()すら落ちるようになるから

505 :デフォルトの名無しさん:02/07/04 12:22
>>504
明示的にTextOutWとか呼べばいいだけじゃん。

506 :デフォルトの名無しさん:02/07/04 12:34
>>505
今回の話はEDITをUnicode対応にするって話だから、
単に表示できるかどうかって話じゃないのよ。
EDITをUnicode対応にするには、
CreateWindowExW()を使わないと駄目ってこと。

507 :デフォルトの名無しさん:02/07/04 12:35
TextOutW()とかを使ってEDIT相当のものを自作するのは話が別

508 :デフォルトの名無しさん:02/07/04 12:36
ExtTextOutWはWin95でも使えるね。
コレなら9x対応のUNICODEテキストエディタ簡単に作れるよ。

509 :デフォルトの名無しさん:02/07/04 12:36
そんなもの作らなくてもFM20.DLLに入ってる。
いくらCOMが面倒でも、コードの量的に考えて、
全部自作する方が10倍以上コード量多いだろ、という話。

510 :デフォルトの名無しさん:02/07/04 12:37
自作できるかどうかを問題にしてない

511 :デフォルトの名無しさん:02/07/04 12:47
どうなの?
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q224305


512 :デフォルトの名無しさん:02/07/04 13:01
>>511
VBのランタイム入れれば済む話
どうせ今回は内輪で使うためで
一般配布が目的じゃないんだろうし

513 :デフォルトの名無しさん:02/07/04 13:12
>>512
VBのランタイムに入ってないだろ
Officeの一部だろ
ま、内輪で使うんなら関係ないのは確かだけど

514 :デフォルトの名無しさん:02/07/04 13:14
自作自作っつってる奴が多いけど、
そんなに簡単に作れるんだったら、
誰か再配布自由なの作って配ってないの?

515 :デフォルトの名無しさん:02/07/04 13:20
TEditorがあるやん

516 :デフォルトの名無しさん:02/07/04 13:27
>>501
あら、そうだったのね。と言う事は「Unicodeフォントが入ってない」ではなく
「自国語以外の部分が無い」と言う方が正しいのか?

>>502
XP以外のOSでは、"Arial Unicode MS"はOffice2Kを入れるか、別途ダウンロードしないと
入ってないようです。XPは無くても上手くできるようになってるみたいだけど。

>>504
9x系で普通に"UNICODE"定義しただけでは、落ちるのは当たり前。OSがUnicode対応してないからね。
だから、"Microsoft Layer for Unicode(MSLU)"と言うライブラリがあるんだけど…。


517 :デフォルトの名無しさん:02/07/04 13:34
>>516
Win2k使ったことあるか?
MSゴシックも明朝もハングル・ウムラウト表示できるし。

MSLUは使わなくても基本的なWideCharToMultiByteとか
TextOutとかGetTextExtentPoint32とかはW版もついてくるから
Unicodeアプリは動かなくても内部でUnicodeを使うことが出来る。

518 :デフォルトの名無しさん:02/07/04 14:24
>>515
なるほど、こちらですね。
http://member.nifty.ne.jp/~katsuhiko/hedit.html
今回はWin32APIまたはMFCのアプリ作成が目的みたいですが、
Delphiコンポーネントって簡単に使えるのでしょうか?

>>516
こちらですね。
http://www.microsoft.com/globaldev/articles/mslu_announce.asp
つまり、MSLUを使うと、
OS組み込みのEDITコントロールも
XP相当のUnicode対応にできるということですね。
それでしたら一発解決ですね。

519 :デフォルトの名無しさん:02/07/04 14:27
ちなみに元のやりとりはこれ
>>472-476

520 :500=516:02/07/04 15:54
>>517
> MSゴシックも明朝もハングル・ウムラウト表示できるし。
IMEパッドで見たところ、ラテン系は"MS Pゴシック"がほぼ全域をカバーしてる。
他のはラテン拡張Bがほとんど無いですが、基本的なところはあるのである程度の表示は出来そう。
ハングルに関しては"MS(P)ゴシック","MS(P)明朝"には無かったけど、これってうちの
フォントがおかしい?
なので、"MS(P)ゴシック","MS(P)明朝"は「Unicodeでも表示できる」というだけな気が…
"MS UI Gothic"ならハングルからタイやアラビアまで、かなり広範囲をカバーしてました。

> Unicodeアプリは動かなくても内部でUnicodeを使うことが出来る。
もちろんそれは可能。でもAPIにUnicodeを渡せないと面倒じゃない?
いちいち変換かける必要が出てくるし。それが面倒じゃなければそれでも良いけど…。

>>518
あ〜、それがすんなり行かないのです。MSLUはあくまでAPIのラッパー的な役割しかなくて
コントロールまでは影響しません。ここらへんの解決策は >>347-378 にポツポツとありました。


521 :デフォルトの名無しさん:02/07/04 16:03
>>520
CreateWindowWしたウインドウじゃなくても
TextOutWで描画出来るから、普通はあんまり問題にならないでしょ。

XP版msgothic.ttcと2k版msgothic.ttcは同一バイナリだった。
コンペア結果も一致。
msmincho.ttcは違ったけども。

522 :デフォルトの名無しさん:02/07/04 19:49
メニューのサブクラス化をしたいのですが
GetWindowLong, SetWindowLongを失敗してしまいます

OrgMenuProc = (WNDPROC)GetWindowLong((HWND)GetMenu(hwnd), GWL_WNDPROC)
SetWindowLong((HWND)GetMenu(hwnd), GWL_WNDPROC, (LONG)MyMenuProc)

というような感じでやっているのですが
どこがいけないんでしょう?

523 :デフォルトの名無しさん:02/07/04 20:50
VC++ 6.0でMFCを使わずに(使えずに)APIを使ってCでプログラムを組んでいます.
それで質問なのですが,ファイルを指定して開くときに GetOpenFileName を
使いますが,フォルダの場所だけを指定したいときには,どのような処理を
行えばよいのでしょうか?

やりたいことは,フォルダの参照ダイアログ ボックスを表示して,そこで検索したい
フォルダの場所(ディレクトリ)を指定するということをしたいです.

524 :デフォルトの名無しさん:02/07/04 21:05
SHBrowseForFolder

525 :デフォルトの名無しさん:02/07/04 21:13
ビットマップを読み込んで表示するときに、AdjustWindowRectを使って読み込んだ画像の
大きさになるように調整しているのですが、メニューの折り返しがあった場合(読み込んだ
画像の横幅が小さいとき)、その折り返しがあった分だけ、ビットマップを表示するスペース
が小さくなってしまい正しく表示されません。
なんかよい方法がないでしょうか。。。
分かりにくいので図に描くと以下のような感じです。

ある程度横幅があると正しく表示されるが、

     タイトルバー
メニュー1 メニュー2 メニュー3
○○○○○○○○○○○○○○○○
△△△△△△△△△△△△△△△△
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇

横幅が小さいときは、

メニュー1 メニュー2 
メニュー3         <--- メニューの折り返し
○○○○○○○○○
△△△△△△△△△
◇◇◇◇◇◇◇◇◇  <--- この部分が切れて表示されない
                  枠をマウスで広げないと表示されない

となる

526 :デフォルトの名無しさん:02/07/04 21:14
CW_USEDEFAULTで作った後に差分を取ってリサイズ

527 :デフォルトの名無しさん:02/07/04 22:46
>>524
おぉ!出来た!!
ありがとうございます.

528 :デフォルトの名無しさん:02/07/04 23:51
>>522
HMENUはHWNDじゃないってことだよ。

>>525
アジャくんはあくまでメニューが1行としてしか計算してくれないからね。
サイズ変更した後にクライアント領域のサイズを調べて、
希望どおりになっていなかったらその分引き伸ばして
もう一回リサイズかけるくらいしか思いつかん。

529 :522:02/07/05 05:52
>>528
ありがとうございます。
でもHWNDにキャストしてやらないとコンパイル出来ないのですが・・・
もしかしてメニューハンドルを使う事自体間違ってるのでしょうか?

530 :デフォルトの名無しさん:02/07/05 06:03
なんでもキャストすりゃ済むってもんじゃない。

531 :デフォルトの名無しさん:02/07/05 11:23
>>525
WM_NCCALCSIZEを投げれば
実際にサイズ変更しないでサイズ計算できる

532 :デフォルトの名無しさん:02/07/05 17:32
開いたファイルを任意のサイズに変更したい(後半部分を切り捨てたい)
のですが何か良いAPIはありませんか?
今は ReadFile() WriteFile() を繰り返して実現してるのですが…

533 :デフォルトの名無しさん:02/07/05 18:05
SetEndOfFile

The SetEndOfFile function moves the end-of-file (EOF) position for the
specified file to the current position of the file pointer.

This function can be used to truncate or extend a file.

534 :デフォルトの名無しさん:02/07/05 18:56
VC++6.0でPOP3, SMTPクライアントを実装したいのですが、
便利なライブラリってないでしょうか?


535 :デフォルトの名無しさん:02/07/05 19:07
>>534
ttp://www.vector.co.jp/soft/win95/prog/se115574.html

536 :デフォルトの名無しさん:02/07/05 19:11
>>535
その他にありませんかね?ライセンス気にせず自由に使用できるもので。


537 :デフォルトの名無しさん:02/07/05 19:30
>>536
拙作の作りかけpop3ライブラリ。
plain/APOP/AUTH(CRAM-MD5)対応
http://lounge.dip.jp/~yoshinoya_off/up/img/pop3.zip

538 :デフォルトの名無しさん:02/07/05 19:54
ありがとうございます。参考にさせて頂きます。


539 :デフォルトの名無しさん:02/07/05 21:48
>>531

case WM_NCCALCSIZE:
rc.top = 0;
rc.left = 0;
rc.bottom = 240;
rc.right = 320;

AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, TRUE);
SetWindowPos(hwnd,HWND_TOP,0,0,rc.right-rc.left,rc.bottom - rc.top,SWP_NOMOVE);
return 0;

なことをしたら,タイトルバーも全部真っ白なクライアント領域だけが表示されました.
なんか激しく勘違いをしているようなので,どうやればよいのかご教授願えないでしょうか.
#MFCとか使っている人だと楽勝なのだらろうか...

540 :デフォルトの名無しさん:02/07/05 21:50
SendMessage(hwnd, WM_NCCALCSIZE,〜)だよ
リファレンス読め

541 :デフォルトの名無しさん:02/07/05 22:46
>>540
すんません.MSDNみてもいまいちピントこなかったのです.
で,googleで WM_NCCALCSIZE を調べても SendMessage(hwnd, WM_NCCALCSIZE, 〜
なのがひっかかからなくて,うーむという状態です.

どのタイミング+引数でSendMessage(hwnd, WM_NCCALCSIZE, 〜 すればよいのでしょうか.

542 :デフォルトの名無しさん:02/07/06 00:04
VCで使える、ウインドウに文字をいろんな方法で動かしたりして表示する
ライブラリっていうのは無いものでしょうか?
ゲーム内で使いたいんですが、
いちいち自分でフォントを作って動かし方の指定をするのは
めんどくさいなって思って・・・

543 :デフォルトの名無しさん:02/07/06 00:06
>>542
自分で作って以後それを利用する。

544 :デフォルトの名無しさん:02/07/06 00:09
>>543
やはりそれしかないのかな〜
頑張るか・・

545 :デフォルトの名無しさん:02/07/06 00:27
>>533 ありがとー

546 :デフォルトの名無しさん:02/07/06 00:53
画面上にテキスト出力するだけのスクロールバー付きの
サンプルプログラムってないかな?
ログ出力に使いたいんだけど。

547 :デフォルトの名無しさん:02/07/06 00:58
>>546
さすがにそのくらい自分で作れよ・・・

548 :デフォルトの名無しさん:02/07/06 01:00
>>546
標準出力に吐く

549 :デフォルトの名無しさん:02/07/06 01:49
>>539
AdjustWindowRectで求まった矩形をr1とすると、
r2 = r1;
SendMessage(hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&r2);
でr2にクライアント領域のサイズが入って戻ってくる。
これを見てr1を調整してからSetWindowPosかけれ。


550 :デフォルトの名無しさん:02/07/06 02:02
>546
エディットウインドウつくって、AppendTextすれば〜?

551 :デフォルトの名無しさん:02/07/06 07:18
2つのプロセスが交互にファイルを30秒おきに読み書きする。
ファイルの同時アクセスは許さない、時々ファイルは削除される、という場合に、

・一方がファイルを読み書き中にはエラーを返す。
・ファイルが存在しない場合にはファイルを作る。

という処理がしたいのですが、
ファイルが存在しない場合を知るにはどうすればいいのでしょうか?

hFile = CreateFile( "hoge.txt", GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

これで調べているのですが、ファイルの共有エラーの場合と、
ファイルが存在しない場合の区別の仕方がよく分かりません。
よろしくご教授お願いします。

552 :デフォルトの名無しさん:02/07/06 08:26
>>551
GetLastError()とか。


553 :デフォルトの名無しさん:02/07/06 08:30
OLEを利用するのに
OleInitialize()を呼び出しますが、
CoInitializeEx()は呼び出さなくても良いのでしょうか?

CoInitializeEx( NULL, COINIT_MULTITHREADED );
OleInitialize( NULL ); -> 失敗

OleInitialize( NULL );
CoInitializeEx( NULL, COINIT_MULTITHREADED ); -> 失敗

となるのですが。
OleInitializeが内部でCoInitializeを呼び出しているのなら良いのですが、
そうでないならOLE以外のコンポーネントを同時に使えないのかなと思いまして。

554 :デフォルトの名無しさん:02/07/06 09:31
>551
OPEN_ALWAYS使えばいいんでわ?

555 :デフォルトの名無しさん:02/07/06 09:33
>553

なぜMSDNを調べないか。
>OleInitialize calls CoInitializeEx internally to initialize the
>COM library on the current apartment.
>Because OLE operations are not thread-safe,
> OleInitialize specifies the concurrency model as
>single-thread apartment.
と明記されているではないか。

556 :デフォルトの名無しさん:02/07/06 11:55
>>542
そんなのあるなら俺も欲しいな〜
出来たらサンプル公開・・・してくれると嬉しいでやんす。

557 :sage:02/07/06 12:52
>>522
よく分からないまま、流れていってしまったのですが・・・
もしかしてメニューのサブクラス化というのは
割と初歩的な事で、本かなんか読めば書いてある事
なのでしょうか?
それとも逆にあまり一般的ではないのでしょうか?
いろいろ試しているのですが相変わらず出来ません
トホホ・・・

558 :デフォルトの名無しさん:02/07/06 13:09
>>557
一般的でないどころか世界中でそんなことしてるやつ一人もいないかも
どうしてもメニューをサブクラスかしたかったら
メニューのウィンドウハンドルを何とかしてゲットしてください
ポップアップ中なら座標から何とかなるでしょう

559 :デフォルトの名無しさん:02/07/06 13:18
メニューはウィンドウじゃないからサブクラス化なんてできないよ
なんて子供の純真な夢を打ち砕くような台詞をどうしても言わせたいのかキミは

オーナードローとかで我慢しる。

560 :デフォルトの名無しさん:02/07/06 14:54
メニューもウインドウなんだが?
誰からそんなウソ教わった?

561 :デフォルトの名無しさん:02/07/06 16:46
>>560
実際システムメニューとかって乗っ取れるしね。

562 :デフォルトの名無しさん:02/07/06 16:58
>>560-561
んじゃ、教えてやれよ

563 :デフォルトの名無しさん:02/07/06 18:25
つーかWindowsで画面に表示される
ユーザーの入力を受け取る事が可能な物は例外なくウインドウなんだが。

564 :デフォルトの名無しさん:02/07/06 18:26
burorororo

565 :デフォルトの名無しさん:02/07/06 18:26
あ、クラス名は"#32768"ね

566 :デフォルトの名無しさん:02/07/06 18:46
>>563
ステータスバーはウインドウではないと。

567 :デフォルトの名無しさん:02/07/06 18:52
流れ的にfj臭いな

568 :デフォルトの名無しさん:02/07/06 18:54
・基本

変に何かを定義付けしようとする奴は基本的に叩かれる。
よって多分俺も叩かれる。

569 :デフォルトの名無しさん:02/07/06 18:54
>>566 はぁ?
入力を受け取るオブジェクト⊂ウインドウ
入力を受け取る物だけがウインドウとは書いてない

570 :デフォルトの名無しさん:02/07/06 18:56
>>569
>ユーザーの入力を受け取る事が可能な物は例外なく

書いてある。

571 :デフォルトの名無しさん:02/07/06 18:59
ユーザーの入力を受け取る事が可能な物は例外なくウィンドウである
と、
ウィンドウとは例外なくユーザーの入力を受け取ることが可能である
は等価じゃないんだが。
つか、これ中学生レベルの数学で習わなんだか?

572 :デフォルトの名無しさん:02/07/06 19:00
>>570 おい、どう読んだらそうなるんだ?
「〜物のみ〜」とは書いてないだろ。
日本語読める?

573 :デフォルトの名無しさん:02/07/06 19:02
まだ小学生ですた

574 :デフォルトの名無しさん:02/07/06 19:43
>563
コマンドプロンプトのウインドウハンドル(゚∀゚)クレクレ

575 :デフォルトの名無しさん:02/07/06 19:45
>>574
Spy++じゃ取れないがWinSightとか自力なら普通に取れるが、何か?

576 :デフォルトの名無しさん:02/07/06 19:46
あ、コマンドプロンプトってNTか?それじゃ死らん
ウインドウのように見えるが、ウインドウじゃないのか?

577 :デフォルトの名無しさん:02/07/06 20:41
NT系のコマンドプロンプトはCSRSSが管理してるから
セキュリティの関係でいじれないようになってるんだよ。
パスワードとか入力される場合もあるしな。

578 :デフォルトの名無しさん:02/07/06 20:43
NTのコマンドプロンプトでもハンドル取れたぞ

002C0810
"コマンドプロンプト"
ConsoleWindowClass
14EF0000

579 :デフォルトの名無しさん:02/07/06 20:51
2000でコマンドプロンプトがフォアグランドだと
どうあがいてもSetForegroundWindowが効かないのは
どうしてですか。

580 :デフォルトの名無しさん:02/07/06 22:28
>>549
出来ました.ありがとうございます.

581 :デフォルトの名無しさん:02/07/06 23:54
LineToで線を書いた画面の上にTextOutで文字を出力すると
文字と被ってない部分の線も消えてしまうんですがそれを消えないようにする
方法ってありますか?

582 :デフォルトの名無しさん:02/07/07 00:00
MSDNでSetBkModeを検索するよろし。>>581

583 :581:02/07/07 00:05
>>582
うまくいきましたー、ありがとうございます。


584 :デフォルトの名無しさん:02/07/07 02:36
>>551
fopen("file_path","a");
すりゃ、勝手にファイル作ってくれると思うが・・・・・
んで、mutexでプロセス間の排他はOK


585 :デフォルトの名無しさん:02/07/07 13:51
buroburoburo

586 :デフォルトの名無しさん:02/07/07 20:59
マルチモニタ対応のため、ダイアログをセンタリングするときは
スクリーンではなくアプリケーションウィンドウに対して
センタリングせよという意味のガイドラインがどこかに書かれていた
と思うのですが探し出せません。
どこに書いてるか知ってる人いませんか?

587 :551:02/07/07 21:07
>>552,554,584
情報さんくすです。
結局、
GetFileAttributes(FILENAME) == 0xFFFFFFFF
でファイルの存在を調べて
hFile = CreateFile( FILENAME, GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)
で排他処理することにしました。

588 :デフォルトの名無しさん:02/07/07 21:33
ファイルの存在チェックとオープンの間に
ファイルが作られたり削除されたりという可能性は考慮しなくていいの?

(´-`).。oO(なんで素直にアドバイスどおりに作らないんだろ?)

589 :偽551:02/07/07 21:50
>>588
大丈夫ですよ、チェックしたらすぐに作成しますから。最近のマシンなら
1/1000 もかからないでしょ。

まあ、俺が担当にいる間ぐらいはちゃんと動くだろうしね...。

590 :さらに偽551:02/07/07 21:57
>>588
作らないじゃなくて作れないんです!

591 :デフォルトの名無しさん:02/07/07 22:01
>>590
なぜ OPEN_ALWAYS 使わないのか小一時間

592 :本物かもしれない551:02/07/07 22:10
>>591
OPEN_ALWAYS はなかったら作る、あったらそのまま、なので
存在したかどうかの判断ができないと思われ。


593 :デフォルトの名無しさん:02/07/07 22:11
OPEN_EXISTSでいいじゃん

594 :デフォルトの名無しさん:02/07/07 22:14
>>592
551は

> ・ファイルが存在しない場合にはファイルを作る。

と言っているのでそれでもいいかと思われた


595 :デフォルトの名無しさん:02/07/07 22:14
つくってから、ファイルサイズとってくればいいやん。
書き込み権利は排他的にとれるでしょうに、

596 :デフォルトの名無しさん:02/07/07 22:21
その書き込み部分の処理にファイルとは別に排他処理するんでもいいと思われ

597 :デフォルトの名無しさん:02/07/07 22:37
排他権は、ファイルの書き込み権とおなじなので、
別のオブジェクトで排他処理すると、二重管理に
なるとおもうけれど、どうなんだろ。

598 :デフォルトの名無しさん:02/07/07 22:42
くだらない質問だと思うのですが

hFile = CreateFile("test.txt",GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
wsprintf(str, "%d\n", i);
WriteFile(hFile,(LPVOID)(&str),(lstrlen(str))*sizeof(char),&dwWrittenByte,NULL);

iはint型の変数で、中には100が入っています
strはchar型の配列の先頭へのポインタです
dwWrittenByteはDWORD型です

上のようにして、できたファイルをメモ帳で開くと
改行されずに100■となってしまいます。
なぜでしょうか?

599 :デフォルトの名無しさん:02/07/07 22:43
>>598
CreateFileだと全部バイナリ形式の読み書き?だったから
\nが\r\nに変換されないせいじゃねーの?


600 :デフォルトの名無しさん:02/07/07 22:48
プログラムはそのままで、改行部分だけ\nから\r\nに直したところ
きちんと改行されるようになりました。

こんなにあっさり直るなんて、ここで相談してよかったです。
早いレス本当にありがとうございました。

601 :デフォルトの名無しさん:02/07/08 15:29
質問ですが、
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。


602 :デフォルトの名無しさん:02/07/08 15:53
>>601
GetWindowThreadProcessID
OpenProcess
EnumProcessModules
GetModuleFileNameEx

かな?

603 :デフォルトの名無しさん:02/07/08 16:08
>>602
おおおおっ!!!
感謝です、ちょっとその辺りを調べてみます、

604 :デフォルトの名無しさん:02/07/08 22:54
質問です。
メッセージボックスを画面の中央に表示する方法はありませんか?
親を指定すると無理なのかなあ。

605 :デフォルトの名無しさん:02/07/08 23:14
SetWindowPos

606 :名無しさん:02/07/08 23:24
>>598
WriteFileの第2引数は本当に&strなのか?
と問い詰めたい…。


607 :デフォルトの名無しさん:02/07/08 23:56
>>605
SetWindowPosするにはhwndが必要なんですけど、
MessageBoxでもらえるんでしょうか?
それとも別のAPIがあるのかな?

608 :598:02/07/09 00:49
>>606
あれ?
&strでもstrでもどっちでも同じ意味のはずですよね?
なんか見た目的に&strのが「アドレスだな!!」ってわかる気がしてw
いやまあ(LPVOID)で分かるんだけど。
やっぱり変ですか・・?

609 :デフォルトの名無しさん:02/07/09 01:06
>>608
……もう一度最初からCなりC++の勉強をやり直すことを強く推奨する。

610 :デフォルトの名無しさん:02/07/09 01:07
>>608
strが配列ならセーフだが、ポインタだと君のコンピュータが光の速さで吹っ飛んでいくぞ。
>>607
自作ダイアログで代用するのが定番。

611 :デフォルトの名無しさん:02/07/09 01:07
('〇';)
(゚ロ゚)
(゜〇゜;)
(゜o゜)

612 :デフォルトの名無しさん:02/07/09 01:09

んっと、いやだから
配列だから良いんですよね?

613 :デフォルトの名無しさん:02/07/09 01:09
よくない

614 :デフォルトの名無しさん:02/07/09 01:11
>>610が微妙

615 :デフォルトの名無しさん:02/07/09 01:14
良くないんですか・・・


616 :デフォルトの名無しさん:02/07/09 01:15
>>612
たまたま配列だから助かっていただけ
わざわざ危険側に振るなってこと。

617 :デフォルトの名無しさん:02/07/09 01:25
>>610
やっぱりダイアログで代用ですか。残念。
でも、REGEDITでキーを削除するときに出てくる確認は、
普通のMessageBoxっぽいのに中央に表示されるんですが...
あれもREGEDITが頑張ってるのかな。


618 :偽者604:02/07/09 01:26
>>610
やっぱり方法ないんですね。
MFCのAfxMessageBoxではちゃんとhWndの中央にでますが
あれのソースってどうやったら見れますか?厨房+便乗質問でスマソ

619 :デフォルトの名無しさん:02/07/09 01:33
>>618
いや、hwndの中央じゃなく、画面の中央に出したいのです。
hwndには自分のウィンドウいれてね。

hwndにNULL入れると中央にでるけど親さわれちゃうし。
NULL入れてTASKMODALにすると親さわれなくなるけど、
タスクバーに表示される...

MFCのソースはステップ実行すれば簡単に見られるよ。
ソース漁るより楽。

620 :デフォルトの名無しさん:02/07/09 01:38
「画面」なんて曖昧な書き方するのが悪い。
自分で作成したウィンドウのことだろ?どうせ
MessageBoxを好きな位置に移動させる方法はある。

http://pc.2ch.net/test/read.cgi/tech/1024380249/159

621 :偽者604:02/07/09 01:44
>>619
あれ?
MessageBoxは常にデスクトップの中央に表示されない?
OSで違ったっけ?Win2000ではそうなるけどな。

> MFCのソースはステップ実行すれば

ほんとだ。Thx!

622 :デフォルトの名無しさん:02/07/09 01:49
どーしてもMessageBoxにこだわるのなら、メッセージボックスもウインドウなのだから、
SetWindowsHookしてWM_CREATEなりWM_SIZEなりを捕まえてやれば出来るんじゃないかと思うが、
Spy++で見ると、メッセージボックスはごくふつうのダイアログであったりするから、常時フックしておく訳にもいかず、
出す直前にフックして直後に解除しなければならないと思われ。
そんなことするなら、ダイアログを自作する方がはやいと思われ。


623 :デフォルトの名無しさん:02/07/09 01:51
>>620
CBTフックですね。試してみます。
Thanks!

624 :デフォルトの名無しさん:02/07/09 01:57
>>622
ダイアログを作るなら、非表示のダイアログを作って
その中でMessageBoxすると可能でした。
でもなんかスマートじゃないなぁと思って。
フックがスマートなのかどうかはよくわかんないけど。
色々試してみます。

625 :偽者604:02/07/09 02:19
AfxMessageBoxも最終的にはMessageBoxを呼んでいるのだけど
MFCの
int CWinApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
これを見ても何でhWndの中央に出るのかよく分りません・・・。

626 :デフォルトの名無しさん:02/07/09 02:29
>>625
CWinApp::DoMessageBoxの中も追わないと。

627 :デフォルトの名無しさん:02/07/09 06:52
なんで中央に出るか、お前らほんとに知らんのか?
それともわざと言わないのか? ぼけてるのか?

628 :デフォルトの名無しさん:02/07/09 07:20
>>627
説明する気もない奴は来なくていい

629 :デフォルトの名無しさん:02/07/09 08:42
>>628
説明するのは簡単だが、場の空気ってもんがあるだろ。
本人のために、あえて言わないのかもしれんからな。

630 :デフォルトの名無しさん:02/07/09 08:43
>>629
そういうヤシは黙っとけ

631 :おねがいします:02/07/09 08:48
Windows xp では、netstat に -o オプションが追加になりプロセスIDも見れる
ようになりましたが、これと同じことを Windows 2000 でもやりたいのですが、
プロトコル(TCP/UDP)とポート番号の組み合わせからプロセスIDを取得する方法
ってわかりますでしょうか?
パーソナルファイアーウォールなどでは、取得できているようなのですが。
お願いします。

632 :デフォルトの名無しさん:02/07/09 08:58
糞壁は黙ってろ

633 :デフォルトの名無しさん:02/07/09 11:10
C++Builder5を使ってますが、
GetWindowThreadProcessIdを使うと
[リンカ エラー] 外部シンボル 'GetModuleFileNameExA' が未解決
ってリンクでエラーになります、何が足りないのでしょうか?


634 :デフォルトの名無しさん:02/07/09 11:19
>>627-630
なんだこの無駄な漫才は。

635 :デフォルトの名無しさん:02/07/09 11:29
>>633
GetModuleFileNameExは使ってないの?

636 :デフォルトの名無しさん:02/07/09 11:39
>>635
激しく間違いました。
×GetWindowThreadProcessId
○GetModuleFileNameEx
ですね、はい。

637 :デフォルトの名無しさん:02/07/09 14:12
>>633
psapi.libが足りないんじゃない?

638 :デフォルトの名無しさん:02/07/09 14:12
>>633,636
implibでpsapi.dllから.lib作ればリンク出来るだろうけど
psapi.dllが入ってない環境だとアプリの起動も出来なくなるだろうから、
↓のようにdllを動的にロードしたほうがいいと思う。
http://techtips.belution.com/ja/vc/0022/

639 :デフォルトの名無しさん:02/07/09 15:12
ツリービューを使っていて、質問があります。
TVM_EXPAND/TVE_TOGGLEでプログラムから
ツリーを開いたり閉じたりしているのですが、
アイテムを閉じたときにTVN_ITEMEXPANDEDが送られてきません。
勿論、TOGGLEの後にTVIS_EXPANDEDONCEをリセットしているのですが。

どうすればいいのでしょうか?

640 :デフォルトの名無しさん:02/07/09 15:12
ageます

641 :デフォルトの名無しさん:02/07/09 15:28
検索してみましたが、
http://n76cd-01p05.ppp11.odn.ad.jp/old/a8575.html
ここのA8564に同様の質問があり、答えが出ていません。
なにかうまい方法無いでしょうか?

642 :デフォルトの名無しさん:02/07/09 20:39
ツリービューのオーナードローってどうやるんですか?
TVS_OWNERDRAWFIXEDみたいなの無いんですが。

643 :デフォルトの名無しさん:02/07/09 21:43
timeGetTimeは1/10ですよね。
QueryPerformanceCounter
って何分の何の単位の精度なんですか?

644 :デフォルトの名無しさん:02/07/09 22:34
timeGetTime()はちゃんと設定すれば1/1000 (sec)の精度があるはず。

QueryPerformanceCounterの精度は、
QueryPerformanceFrequency(&freq), 1/freq (sec)

645 :デフォルトの名無しさん:02/07/10 10:16
>>637-638
なるほど、やっぱそういうことですか、
ありがとうございますた。

646 :デフォルトの名無しさん:02/07/10 10:31
MAPIの関数の説明が書いてあるHPがあったら教えて下さい。
できれば、日本語で書いてるといいですね。

647 :デフォルトの名無しさん:02/07/10 10:32
自前のタスクバーを作っているのですが、タスクバー関連のAPIがわからず困っています。

ツールバーに登録されている(ツールバーにアイコンとして表示されている)アプリケーション(かウィンドウ)へのハンドル一覧を得たいのですが、どの関数を使えばよいのでしょうか。

また、タスクトレイをエミュレートするために、
(1)タスクトレイに登録されているアプリケーションのハンドル
(2)実際にタスクトレイに表示されているアイコンのハンドル
(3)そのアイコンがクリックされた際に適切なメッセージを生成してアプリケーションに送信したい場合に、そのメッセージの種類
を知りたいのです。

648 :デフォルトの名無しさん:02/07/10 10:49
>>646
MSDNで十分じゃない?

649 :クリップボードの使い方:02/07/11 00:45
「猫でもわかるプログラミング」 http://www.kumei.ne.jp/c_lang/sdk/sdk_94.htm
など、多くのサイトでは、SetClipboardData を呼び出した後は、
メモリは Windows の管理下に置かれるので GlobalFree しては
いけない、と書かれています。

確かに実際に動かしてみた限りでは GlobalFree してしまうと、
動作がおかしくなります。(2回目の SetClipboardData が失敗する )
では、メモリが Windows の管理下になるとすると、解放はいつ
行われるのでしょうか?

一方、 MSDN では、
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_setclipboarddata.htm
「CloseClipboard 関数を呼び出すまでは、そのハンドルを解放
することや、ロックし続けることを避けなければなりません。」
と書かれていて、 CloseClipboard を呼び出した後であれば
解放しても良さそうにも思えます。

また、MSDN では
「CloseClipboard を呼び出した後も、アプリケーションはそのデータに
アクセスできます。」とも書かれていますが、いつ解放されるか分から
ないのでは怖くてアクセスできないと思うのですが・・・

650 :デフォルトの名無しさん:02/07/11 01:10
>>649
だから使うなってことだと思うんだけど。

651 :デフォルトの名無しさん:02/07/11 01:32
TextOutで画面上に出力した文字を消す方法って
画面全体を消去する以外にありますか?


652 :デフォルトの名無しさん:02/07/11 01:35
>>649
ふつうはコピーして使う
SetClipboardData したメモリのことは忘れたほうが無難



653 :デフォルトの名無しさん:02/07/11 01:36
>>651
背景と同じ色で上書きしたら

654 :デフォルトの名無しさん:02/07/11 01:41
>>647

タスクバーのツールバー?
あれはタブコントロールだよ。ボタンスタイルの。

(1)(2)(3) はできた、という話を聞いたことない。

655 :デフォルトの名無しさん:02/07/11 01:59
>>647
出来るかどうか知らんが、ITaskbarListでも調べてみれば?

656 :デフォルトの名無しさん:02/07/11 02:06
>>647
トップレベルウィンドウでかつSW_HIDEじゃない奴を表示してると思う。
ウインドウスタイルの条件があるかも。

トレイはどうだろう。
Shell_No〜をフックすればいけるかも。

657 :デフォルトの名無しさん:02/07/11 11:08
文字入力のカーソルの点滅速度を取得するにはどうすれば良いんでしょう?

658 :デフォルトの名無しさん:02/07/11 11:15
>>657
GetCaretBlinkTime

659 :657:02/07/11 11:26
こりゃまたそのままの名前。
ありがとう。>>658

660 :デフォルトの名無しさん:02/07/12 22:11
ウィンドウ全体を背景色で塗りつぶすのに、もっとも手っ取り早い
方法って何?

661 :デフォルトの名無しさん:02/07/12 22:17
WM_ERASEBKGNDを送る

662 :デフォルトの名無しさん:02/07/12 22:24
>>661
おお、ありがとう。手っ取り早そう

663 :デフォルトの名無しさん:02/07/13 16:15
「メニュープロパティ」の「一般」-「ID(I): IDR_MENU1」として,

WNDCLASS wndclass ;

wndclass.lpszMenuName = IDR_MENU ;

てな感じで書くと,
--------------------------------------------------------------------
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
-------------------------------------------------------------------
とwarningがでるが,ちゃんとメニューは表示されるが,
wndclass.lpszMenuName = "IDR_MENU" ;
とかするとwarningはでないけど,今度はメニューが表示されません.
なんででしょうか?

664 :デフォルトの名無しさん:02/07/13 16:39
MAKEINTRESOURCE(IDR_MENU)
とゆうマクロがあるよん。
ウィザードでは(LPCSTR)IDR_MENU
ってキャストしてるけどね。

665 :デフォルトの名無しさん:02/07/14 20:45
buro

666 :デフォルトの名無しさん:02/07/15 05:19
タスクトレイを右クリックした時に表示されるポップアップメニューのハンドルから、
オーナーのハンドルを取得するにはどうすればいいのでしょうか?

ポップアップメニューのハンドルは取得できるのですが、
GetWindow(hWnd, GW_OWNER);
GetAncestor(hWnd, GA_ROOTOWNER);
では、0が返ってきます。

667 :デフォルトの名無しさん:02/07/15 11:28
GetWindowProcessIdとかEnumChildWindowsを串

668 :デフォルトの名無しさん:02/07/15 18:03
buroburo

669 :デフォルトの名無しさん:02/07/15 18:37
iniファイルの一つのセクションにあるキーの数がいくつかを
調べる方法はありますか?

670 :デフォルトの名無しさん:02/07/15 21:32
>669
GetPrivateProfileSectionを調べよ

671 :デフォルトの名無しさん:02/07/15 22:57
お絵かきプログラムでLineToで描いた一本の線を消すために
画面全体を消去してN-1本の線を復元しています。
あまり良い方法ではないと思うのですが、最後の線だけ消すと
その線と交わっている別の線も消えてしまうので仕方なくこうしてるんですが
いい方法ないですか?


672 :デフォルトの名無しさん:02/07/15 23:04
線引く前のイメージを保存しといたら?
差分を取るようにすれば相当圧縮が効くし。

673 :デフォルトの名無しさん:02/07/15 23:08
ベタ絵ベースのお絵かきプログラム?
ベクトルベースのお絵かきプログラム?

674 :デフォルトの名無しさん:02/07/15 23:11
>>672
私のプログラムでは好きな回数だけ前に戻れるようにしたいので
その方法ですとN個の線を描いた場合N個のイメージが必要になりますよね。
工夫すればイメージの量も小さくなるかもしれませんが、どうなんでしょう。

675 :671:02/07/15 23:14
>>674
あ、671でした。

>>673
あまり詳しくないのでどっちと聞かれると困ってしまいますが
マウスの座標(x,y)を取得し、それを画面上に線として描画するだけの
プログラムです。答えになってるでしょうか・・・。


676 :デフォルトの名無しさん:02/07/15 23:17
>>675
BMPとかJPEGとかで保存するの?

677 :671:02/07/15 23:20
>>676
いえ、今のところそのような保存は行わないです。
最初にお絵かきツールと書きましたが、主な使用目的は
簡単に線を書いたり消したりすることがメインです。
少し話が難しくなってしまいそうな表現でした、すいません。


678 :デフォルトの名無しさん:02/07/15 23:22
表示するのが線だけだったら、画像イメージ保存するよりは
線分の頂点を記録して再描画(つまり今やっている手段)が
むいているんじゃないかな?

679 :671:02/07/15 23:26
>>678
そうですか、現在はおっしゃるように頂点を記録しているので
それを元に最初から復元するのは比較的容易です。
ただ、効率が悪いなぁと思いまして^^;。


680 :デフォルトの名無しさん:02/07/15 23:37
>>679
時間効率と空間効率は、しばしば相反する。トレードオフを探せ。

681 :デフォルトの名無しさん:02/07/15 23:38
>>679
両方組み合わせれば?
俺が今書いてるのは、基本はUndoの度に線を再描画して、
再描画にかかる時間が0.5秒を超えたらその状態を保持して
次からはそこから再描画するようにしてる

682 :679:02/07/15 23:47
>>680
確かにトレードオフは重要ですね。妥協点を探します。

>>681
ある程度の処理時間がかかるところまで保存しておく方法ですね。
なかなか良さそうな方法なので簡単に実装できたらやってみます。


683 :デフォルトの名無しさん:02/07/15 23:51
burororororo

684 :666:02/07/16 02:02
>>667
GetWindowProcessIdでいけました。ありがとう。

685 :デフォルトの名無しさん:02/07/16 04:37
エディットコントロールの最後尾に文字列を挿入すると
テキストの最初の方を見ていても、最後尾に移動してしまいます。
テキストを挿入しても、その場所に移動しないようにするには
どうしたらいいでしょうか?

686 :デフォルトの名無しさん:02/07/16 04:46
>>685
ハァ?

687 :デフォルトの名無しさん:02/07/16 04:56
>>685
自動スクロールオフ

688 :685:02/07/16 05:01
>>687
自動スクロールオフとは?
ES_AUTOVSCROLなどは設定してません。

689 :カンで書いてみる人:02/07/16 06:28
EM_SETCARET

690 :カンで書いてみる人:02/07/16 06:30
はずした・・・

EM_SETSEL 0 0 とか

691 :デフォルトの名無しさん:02/07/16 10:57
置き換える前にEDITの先頭位置(S1)と、現在のセル(S2)の位置を記憶しておいて、
置き換え後に、S1にSETSELしてから、S2にSETSELでなんとかできん?

692 :デフォルトの名無しさん:02/07/16 17:06
http://www.nifty.ne.jp/forum/fdelphi/faq/00137.htm
などで、
SC_MOVE or 2
という指定になっていますが、なぜ2との論理和なのですか?
APIヘルプや、MSDNを見ても載っていなかったのですが・・・。

あと、出来ればReleaseCaptureについての詳しい解説もお願いします。

186 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)