■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

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
サンプルが絶対正しいという保証はないと思うが。


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.