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


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

Win32API 質問箱 Build4
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フォントを入れるか、各言語ごとにフォントを指定してやらないと多言語混在表示は出来ません。


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