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


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

Win32API質問箱 Build22
501 名前:デフォルトの名無しさん :04/09/02 22:12
>>497
どうなってれば納得できます?

で、黒ってデータ(数値)としてはどうなってると思います?

502 名前:デフォルトの名無しさん :04/09/02 22:19
>>497
Windows 9X、Millenium ではゴミデータが入ってたような気がする。
NT 系の OS ではセキュリティ上の配慮のため、確保されたメモリは既にクリアされてる。

503 名前:デフォルトの名無しさん :04/09/02 22:22
>>499
>keybd_even も反応しないみたいです。

反応するよ。
仮想キーコードじゃなくてスキャンコードを送信すればいい。
dinput.hに書いてある、仮想キーマクロ DIK_????? を参考にしてみれ。
ちなみにキーボードデバイスでサポートしてないキー入力送信は無理。
英語キーボードの「半角/全角」キーに相当するアンサン・グラブ(DIK_)は、
日本語キーボード環境だとうまくDirectInputに送信できない。

「A」キーのキー入力を送信する例:
#include <dinput.h>
WORD key = DIK_A;
keybd_event(0, key, 0, 0);
keybd_event(0, key, KEYEVENTF_KEYUP, 0);

504 名前:デフォルトの名無しさん :04/09/02 22:36
>>501,502
画面全体が真っ白になって欲しいです。
メモリはクリアされていて黒ってことはデータ的には0が入っているってことですかな?

具体的に白くするにはどうすればいいんだろ。

505 名前:デフォルトの名無しさん :04/09/02 22:39
>>504

24ビットDIBSectionなら

FillMemory(lpPixel, iWidth * iHeight * 3, 0xff);

とか(lpPixelがピクセル列のバッファの先頭アドレスね)。


506 名前:デフォルトの名無しさん :04/09/02 22:52
>>505
あー。なるほど。32で作ってましたけど出来ました。thx!

507 名前:デフォルトの名無しさん :04/09/02 22:57
>>503
おーなるほど。これで上手くいきました。
あとは文字列からスキャンコードへの変換ルーチン書けば行けそうです。
ありがとうございました。

508 名前:デフォルトの名無しさん :04/09/02 23:07
つーか、WM_PAINTを横取りしようと思うと無効領域も手当てせんといかんやろ。

509 名前:デフォルトの名無しさん :04/09/03 00:33
>>508
乗っ取ったFakeBeginPaintで領域を制限しなければ良いと思うんだけど、、、

HDC FakeDC = ...;
HDC WINAPI FakeBeginPaint(HWND hwnd, PAINTSTRUCT* ps)
{
 ::ZeroMemory(ps, sizeof PAINTSTRUCT);
 ::GetClientRect(hwnd, &ps->rcPaint);
 return ps->hdc = FakeDC;
}


510 名前:デフォルトの名無しさん :04/09/03 01:06
なんだかこちらのスレに誘導されたので、失礼します。
http://pc5.2ch.net/test/read.cgi/tech/1093996761/41-42

なんだかこっちでもスレ違いな気がして気が引けます…

511 名前:デフォルトの名無しさん :04/09/03 01:26
スレは違わないと思う。

512 名前:デフォルトの名無しさん :04/09/03 03:44
プログラムになにか法則みたいなものありますか?

これを書いたらこれを書けみたいな



513 名前:デフォルトの名無しさん :04/09/03 04:11
(を書いたら)を書け。
[を書いたら]を書け。

514 名前:デフォルトの名無しさん :04/09/03 08:03
ぬるぽを書いたらぬるぽを書け。

515 名前:デフォルトの名無しさん :04/09/03 09:10
>>514
ガッ

516 名前:デフォルトの名無しさん :04/09/03 09:22
右の頬をかいたら左の頬をかけ。

517 名前:デフォルトの名無しさん :04/09/03 09:24
「たらちねの」の次には「母」と書け

518 名前:デフォルトの名無しさん :04/09/03 09:45
「真剣」と書いたらマジと読め

519 名前:デフォルトの名無しさん :04/09/03 09:53
拝啓と書いたら敬具と書け

520 名前:デフォルトの名無しさん :04/09/03 10:26
肉を煮込んだら灰汁を取り除け

521 名前:デフォルトの名無しさん :04/09/03 10:51
鰹節をかいたら鍋を火にかけ

522 名前:デフォルトの名無しさん :04/09/03 11:13
「姉さん」と書いたら「事件です」と書け

523 名前:デフォルトの名無しさん :04/09/03 11:22
流れをぶったぎって失礼します。
RegisterClassにわたすクラス名は
ユニークでなければいけませんか?

524 名前:523 :04/09/03 11:26
しっかり書いてありました。
すみません、すみません。

525 名前:デフォルトの名無しさん :04/09/03 11:32
恥をかいたら頭を掻け

526 名前:デフォルトの名無しさん :04/09/03 12:32
BitBltとかStretchBltで、転送元、先のHBITMAPが同じでも大丈夫なんでしょうか。
画面のスクロールの処理の時に、そうなってしまうのですが。

527 名前:デフォルトの名無しさん :04/09/03 12:38
>>526
スクロールの方向によってはえらいことになる。


528 名前:526 :04/09/03 12:45
>>527
詳しくお願いします。
方向ということは、もしかしたら、端を飛び越したときとかですかね。

529 名前:デフォルトの名無しさん :04/09/03 12:49
なぜ転送先にHBITMAPが?

530 名前:526 :04/09/03 12:51
>>529
言葉が足りませんでした。SelectObjectしたHDCです。

531 名前:526 :04/09/03 13:00
>>529>>530
あっ、そういう意味ではないですね。
裏ビットマップに書きたいのでHBITMAPと言いました。

スクロール前の裏ビットマップの、スクロールしても残る位置を、
同じ裏ビットマップに描いて、残りを部分は新たに描くという感じです。

532 名前:デフォルトの名無しさん :04/09/03 13:01
>>528
527じゃないが

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for(int i = 0; i < 9; ++i)
a[i + 1] = a[i];

多分こんなようなことになると思う。

533 名前:デフォルトの名無しさん :04/09/03 13:07
そういうことなら、「重なる部分は自分で考慮しないと何が起こるかわからん」が答えでないかと。
重ならない領域の転送なら、なんも問題無いよ。

534 名前:デフォルトの名無しさん :04/09/03 13:13
んなもんBitBlt側で考慮してくれて、重なろうが問題なさそうだけど。
MoveMemoryみたく。

535 名前:526 :04/09/03 13:15
>>532
詳しく説明していただき、ありがとうございました。

>>533
自分もそんな感じに考えていました。
変更前の物を転送した後に、変更されるならいいのですが、
逆だとどうなるのかなと。実験してみます。

536 名前:526 :04/09/03 13:16
>>534
そうだといいのですが。実験してみます。

537 名前:デフォルトの名無しさん :04/09/03 13:19
スクロール操作だとわかるならScrollDCすればいいんじゃないんですか?

538 名前:526 :04/09/03 13:34
おなじHBITMAPだと絵が変更されていませんでした。戻り値は正常でした。
ただ、別のプログラム中に、強引に作ったので、
ちゃんとすればできるかもしれません。

>>537
ありがとうございます。調べてみます。

539 名前:デフォルトの名無しさん :04/09/03 13:35
質問です。
デスクトップカレンダーのように、常に背景に表示されているソフトを作りたいと考えています。
「常に最背面に表示」はできるようになったのですが、
「デスクトップの表示」ボタンを押すと隠れてしまいます。
何かいい方法はないでしょうか。

540 名前:デフォルトの名無しさん :04/09/03 13:39
MFCで作ったアプリって、別段ライブラリを一緒に配布したりしなくても動きますか?

541 名前:526 :04/09/03 13:42
>>537
RECTが分からないので勉強してみます。

542 名前:デフォルトの名無しさん :04/09/03 13:49
>>540
faq

static link

543 名前:デフォルトの名無しさん :04/09/03 13:52
>>539
壁紙をカレンダーに摩り替える。

544 名前:(・∀・)ニヤニヤ :04/09/03 13:54
>>539
WM_SIZEで最小化されたことを検知して、
自分で元に戻してやればいいんじゃねーの?

545 名前:デフォルトの名無しさん :04/09/03 13:56
>>542
そのものに組み込めと言うことですか・・・
MFCってMSのライブラリのくせに、標準じゃないんでしょうか・・・

546 名前:デフォルトの名無しさん :04/09/03 13:58
イヤだったら付けずに出して、「動かない」と文句言ってきた客には
「あなたの環境は標準的ではありません」と突っ返せばよし。

547 名前:デフォルトの名無しさん :04/09/03 13:59
>>545
スレ違いだ

MFCスレに行きやがれ

548 名前:デフォルトの名無しさん :04/09/03 14:06
>>545
パソコンは起動時にWINDOWS.EXEを実行して起動されます。MFCはこの中にはいっています。
それでも動かないのならあなたは不正なVisualStudioを使っていることになります。
恐らくコピー版を使っていると思われるのでMicrosoftに通告しときます。ご愁傷様でした。

549 名前:デフォルトの名無しさん :04/09/03 14:06
すんません
お騒がせしました

550 名前:539 :04/09/03 14:16
>> 543
新しい壁紙にすると、カレンダーをD&Dで移動させるときに難しそうなので避けてました。

>>544
「デスクトップの表示」ボタンを押したときには、WM_SIZEのメッセージはこないみたいです。



551 名前:デフォルトの名無しさん :04/09/03 14:22
そういえば、自分のパソコンに始めから付いていたDrag'n Drop CDも、
デスクトップの表示ボタンを押すと消える。
別の何かを開くと、復活するけど。
同じような現象なのかな。

552 名前:539 :04/09/03 14:32
>> 551
同じ現象だと思います。
例えばSamurizeなんかは理想の挙動になっているのですが・・・

553 名前:デフォルトの名無しさん :04/09/03 14:41
>>552
spy++でどんなメッセージが来てるか調べれば?

554 名前:539 :04/09/03 14:48
>>553
はい。調べました。
「デスクトップの表示」ボタンを押してもメッセージは送られていないようです。

555 名前:デフォルトの名無しさん :04/09/03 14:56
>>554
本当に調べた?
思いっきりWM_SIZE送られてるんだけど。

556 名前:デフォルトの名無しさん :04/09/03 14:57
WM_SIZE(SIZE_MINIMIZEDとSIZE_RESTORED)がキッチリ来るな。
何を調べたのかと(ry

557 名前:539 :04/09/03 15:30
>>555
>>556
すいません。確認してみたら、普通のアプリケーションだったらメッセージがくるようですね。
調査不測でした。

調べてみたところ、私のプログラムでは親ウィンドウを作成する際に、WS_EX_TOOLWINDOWを指定していたため、
子ウィンドウにWM_SIZEがこなかったようです。
(WS_EX_TOOLWINDOWを指定したのは、親ウィンドウをタスクバーに表示させない為です)

ここら辺を直せばメッセージをキャッチできそうですね。
お手数おかけしました。

558 名前:デフォルトの名無しさん :04/09/03 15:47
mallocと書いても、freeと書かなくてもよい

559 名前:デフォルトの名無しさん :04/09/03 16:18
windows.exeって何

560 名前:デフォルトの名無しさん :04/09/03 20:35
>>559
windows.comのこと?

561 名前:デフォルトの名無しさん :04/09/03 20:36
windows.mpg

562 名前:560 :04/09/03 20:38
win.comだったorz
MFCって別の(ry

一応、張っておきますね
■MFC相談室 mfc11.dll■
ttp://pc5.2ch.net/test/read.cgi/tech/1088084875/

563 名前:デフォルトの名無しさん :04/09/04 00:19
int型の変数をTextOutで描画しようとするとエラーになってしまうのですが、
intを描画するにはどうすればいいですか?

564 名前:デフォルトの名無しさん :04/09/04 00:34
>563
wsprintf

565 名前:デフォルトの名無しさん :04/09/04 01:16
>564
sptintfとの違いはあるのでしょうか?

それと、MFC使うよりもWin32APIで作った方がプログラム実行が僅かに
速いって本当なんでしょうか?

566 名前:デフォルトの名無しさん :04/09/04 01:21
wsprintfはfloat使えないぞ!気をつけろ!

> プログラム実行

何のプログラムだ?

567 名前:デフォルトの名無しさん :04/09/04 01:45
本日のマツケンショーのプログラムでは最後にマツケンサンバが入っています。

568 名前:デフォルトの名無しさん :04/09/04 01:57
画面を描画するのに、
CreateCompatibleBitmapやCreateCompatibleDC
で裏画面を作成し描画しているのですが、
画面全体を新たに再描画(真っ白に)する場合、
それまで使っていた裏画面を破棄して新しくメモリを作成する方法と、
画面を背景の色で塗りつぶす(FillRectとかそんな感じで)方法があると思うのですが、
どちらが速いのでしょう??
環境はWinXP+VC6.0+APIです。


569 名前:デフォルトの名無しさん :04/09/04 01:58
>>565
MFC固有のdllの初回読み込み(OS起動以後)に時間がかかるってだけでしょ。
2回目以降の起動ではほとんど関係ないかと。
実行パフォーマンスを理由にしてMFCを使わないというのは稀。
2次配布問題やファイルサイズ・カスタマイズ効率の面からMFCを使わないというのはあるけど。

570 名前:デフォルトの名無しさん :04/09/04 02:03
ウィンドウプロシージャべた書きでいけるような極単純なものならMFC使わないほうがほんの少し効率がいいんじゃないか?
大して意味はないレベルにせよMFCのウィンドウ−C++オブジェクトマッピングはコスト0じゃない。

571 名前:デフォルトの名無しさん :04/09/04 02:09
定番の言い方だと、体感できるほどの差ではない、かな。

572 名前:568 :04/09/04 03:59
>>571
どちらでも大差無いって感じですかね。


573 名前:デフォルトの名無しさん :04/09/04 04:25
MFCはサンクじゃなくてマップを使ってるから
検索の分遅いんじゃないか?

574 名前:デフォルトの名無しさん :04/09/04 05:07
>>568
後者・・・じゃないかなぁ。
せっかくだから、測定してみるといいんじゃない?


575 名前:デフォルトの名無しさん :04/09/04 05:26
それ以前にCreateCompatibleBitmapで作成したてのビットマップって何色かで塗りつぶされてる保証なんかあったか?
どのみち作成後に塗りつぶすなら再作成の意味は無い気がするんだが。

576 名前:デフォルトの名無しさん :04/09/04 06:03
>>575
NT系ならセキュリティ上の理由から塗りつぶされてると思うが
期待しちゃいけない気がするな

577 名前:568 :04/09/04 17:00
そうですね,確かにCreateCompatibleBitmapの後に塗りつぶしてましたorz
FillRectで塗りつぶす方法で良さそうですね.

あと話が変わるのですが,
複数のウインドウプロシージャで変数を共有したいのですが,
どうすればよいでしょう?
変数のポインタを渡せば良さそうなのですが,
どこで渡せばいいのやら・・・

578 名前:デフォルトの名無しさん :04/09/04 17:23
>どこで
好きなところで。

グローバルにしてもいいし、
上位のオブジェクト(たとえばアプリケーションクラスのインスタンス)とかに持たせて、
その上位オブジェクト経由でアクセスするとか。

どちらも嫌な場合は、CreateWindowの最後の引数とか。

579 名前:デフォルトの名無しさん :04/09/04 17:30
> 複数のウインドウプロシージャで

複数のウィンドウクラス間で、ということ?

580 名前:568 :04/09/04 17:42
>>578
今はグローバルで宣言していますが,変数が多くなってきたので
クラスか構造体のポインタを他のプロシージャに渡せればいいなと思いました.
とりあえず,CreateWindowの最後の引数に渡す方法をやってみます.


581 名前:デフォルトの名無しさん :04/09/04 18:12
>>577
速さを気にするんだったらブラシ用意してFillRectより、CDC::FillSolidRectみたいに
SetBkColor→ExtTextOutの方が速いはず。

582 名前:デフォルトの名無しさん :04/09/04 18:47
>>581
あれ、背景色を元に戻してないよな。
いいのかMicrosoftがそんなことで…

583 名前:デフォルトの名無しさん :04/09/04 19:04
まぁ、塗りつぶしに使いたい色=背景色にしたい色って状況のほうが多いだろう、と。
でも、一言注意書いといて欲しいよな。

584 名前:デフォルトの名無しさん :04/09/04 19:16
少なくとも 2001/10以降のMSDNには
 >メ モ FillSolidRect を呼び出すと、以前に SetBkColor を使って設定した背景色が、
 >clr で指定した色に設定されます。
と書いてあるケドナー

585 名前:デフォルトの名無しさん :04/09/04 19:33
MSDNはネットで見ろってことなんだろ。

586 名前:デフォルトの名無しさん :04/09/04 21:52
よろしくお願いします。
プログラム実行中に Windows が休止状態に入った場合、その状態から
復帰した後に特別な作業を行いたいんですが、これを感知する方法が
あれば教えてください。
動作させたい OS は Windows 2000 SP4 です。

587 名前:デフォルトの名無しさん :04/09/04 21:55
wm_powerbroadcastとかなんとか

588 名前:デフォルトの名無しさん :04/09/04 23:17
他のアプリケーションにメッセージを送るにはどうすればいいですか?

589 名前:デフォルトの名無しさん :04/09/04 23:20
メッセージを送ればいい。

590 名前:デフォルトの名無しさん :04/09/04 23:36
メッセージを送りたいアプリのHWNDを取得して
SendMessage() でいいんでしょうか・・・?

取り合えずHWND取得からやってみます。
ありがとでした。

591 名前:デフォルトの名無しさん :04/09/04 23:40
ただしポインタが絡むものは普通に送っても無駄だからな。

592 名前:デフォルトの名無しさん :04/09/05 17:13
システムイメージリストについて教えてください。
これはアプリケーションが破棄してはいけないと言われますが、
(9x系だけかな?)それって全部のプロセスで中身が共通だからですよね?

と言う事は、アプリケーションから勝手にアイコンを登録したりすると
再起動するまで残りつづけるって事なんですか?
2000では破棄しても問題ないし、アイコンを好きなだけ追加しても
プロセスを起動しなおすと中身が初期化されています。

それでもやっぱりいじらない方がいいと思うのですが、
システムイメージリストとアプリケーション独自のアイコンを
ひとつのツリービューやツールバーで利用したい場合、
どうするのがいいのですか?

593 名前:デフォルトの名無しさん :04/09/05 23:13
質問です。
トップレベルのモードレスダイアログを同時に2つ作成しようとしています。
メッセージループには2つの IsDialogMessage() を組み込んでいるものとします。
このとき、片方のダイアログの上で MessageBox() 等でモーダルダイアログを表示すると、
独自のメッセージループに突入してしまうため、もう片方のモードレスダイアログでは
TABキーによるフォーカスの移動ができなくなってしまいますよね。
スレッドを分ければ解決するのですが、できればマルチスレッドにはしたくないのです。
シングルスレッドでこの問題を回避するいい方法があればご教示ください。

594 名前:デフォルトの名無しさん :04/09/05 23:44
>>592
システムイメージリストから必要なアイコンをコピーして使えばいいだけでは?

595 名前: ◆Z0vd5w812U :04/09/06 00:00
>>593
両方ともモードレスにして、モーダル風にふるまわせれば?

596 名前:デフォルトの名無しさん :04/09/06 02:01
>>593
>もう片方のモードレスダイアログでは

モーダルダイアログを表示したら、モードレスダイアログは inactive なんじゃ・・・

597 名前:デフォルトの名無しさん :04/09/06 02:29
>>593
自前でTABキー等を処理する。

598 名前:ほんたま :04/09/06 06:13
おみゃ〜らよ、APIをパブリック名でDLL内から文字列検索すると、
9割方のAPIはヒットする。
だが残る1割のAPIは文字列検索してもヒットしないぞ。
ちゃんとそのDLL内に記述されているのにだ。
これがどういうことかわかるかな?

599 名前:デフォルトの名無しさん :04/09/06 06:16
そんなこともわからんのか

600 名前:デフォルトの名無しさん :04/09/06 06:31
>>598
自分じわかるかな?

601 名前:デフォルトの名無しさん :04/09/06 10:46
>>595
うーん、確かにそういう手もありそうですが…結構面倒になりそうですね。

>>596
最初はアクティブではありませんが、表示されたモーダルダイアログは
もう片方のモードレスダイアログとは被所有関係にないため、
表示中でもアクティブにすることは可能なわけです。

>>597
自前で処理するのは最後の手段かなと思っていたのですが…考えてみます。

レスをいただいた皆さん、どうもありがとうございました。

602 名前:593 :04/09/06 10:49
>>601>>593 の書き込みでした。

603 名前:デフォルトの名無しさん :04/09/06 11:21
>>601
WH_KEYBOARD のローカルフックで TABキーだけ一括処理する。

604 名前:デフォルトの名無しさん :04/09/06 12:44
Windowsのロックが解除されたことを知るにはどうしたらよいのでしょうか。
LockWorkStationでロックをして
ロックが解除されたら別の処理に移るようにしたいのですが・・・。

605 名前:593&601 :04/09/06 12:56
>>603
どうもありがとうございます。
自分がローカルフックを使おうとしなかった理由は、
グローバル変数を導入することを避けたい気持ちもあったからです。
でもシングルスレッド限定だとフックを使うのが一番よさそうですね…。

606 名前:デフォルトの名無しさん :04/09/06 13:12
>>604
OpenInputDesktopでwinlogonデスクトップがアクティブかどうか
調べるとか

607 名前:デフォルトの名無しさん :04/09/06 13:44
>>605
グローバル変数なんか必要ないけど? 

608 名前:605 :04/09/06 14:01
>>607
え…そうなんですか?
モードレスダイアログのハンドルをフックプロシージャに渡すのに必要な気がしますし、
少なくとも SetWindowsHookEx() の戻り値であるハンドルを
フックプロシージャ内の CallNextHookEx() に渡すためには
グローバル変数の導入は避けられないような気がしていたのですが…。

609 名前:デフォルトの名無しさん :04/09/06 15:35
あるプロセスがAdministrators権限で動いているとして、子プロセスを別ユーザーで実行したいのですが
その別ユーザーのパスワードを知らない状況でそれは可能でしょうか。
UNIXのsuみたいに、権限をもっているユーザならパスワードがいらない方法を探しています。
お知恵を拝借されてください。

610 名前:デフォルトの名無しさん :04/09/06 15:39
CreateProcessAsUser
のMSDN解説をよく嫁

俺は読んだが分からなかった。スマソ

611 名前:586 :04/09/06 18:14
>>587
遅くなりましたが今日対象のパソコンで試したところ
WM_POWERBROADCAST で通知を受け取ることができました。
ありがとうございました。

612 名前:デフォルトの名無しさん :04/09/06 18:17
Administrators権限ではそもそも必要な特権がないので
CreateProcessAsUserは無理
2000以降ならCreateProcessWithLogonWでできるけど
これもパスワードが必要

613 名前:デフォルトの名無しさん :04/09/07 01:04
>>607
グローバル変数を使わない方法、私も興味があります。ぜひ教えてください。

614 名前:デフォルトの名無しさん :04/09/07 01:35
>>613
プロセス間通信で共有してもいいし、
今回のケースはローカルフックなんだからハッシュとかに突っ込んでも良い。
んでもって、CallNextHookExは第一引数を無視する。

615 名前:デフォルトの名無しさん :04/09/07 02:29
>>614
調べてみたら、確かにCallNextHookExは第1引数を無視するようですね。
新たな収穫でした。サンクス!!

616 名前:デフォルトの名無しさん :04/09/07 03:09
SetDlgItemTextで自作ダイアログのEDITTEXTに改行されたテキストを送っても
改行されないで表示されてしまいます

スタイルの設定は
ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL
にしてあって、ES_READONLYをES_WANTRETURNにして
手入力すれば改行されるんですが、何が問題なのでしょうか

あと改行に成功してもたぶん1行目の行頭から表示されると思うんですが
最終行を一番下に表示する方法は何かあるのでしょうか
(見た目はチャットウィンドウっぽいものです 機能は全然違いますが・・・)

617 名前:616 :04/09/07 03:56
すみません、検索の仕方間違えてたようです・・・
\r\nじゃないと改行できないんですね
最初の質問は取り下げさせていただきます

2つ目の質問も
まずEM_SETSELにMAKELONG(0xFFFF, 0xFFFF)渡して
直後にVK_HOMEも送るという方法で回避できましたが、
こんなまどろっこしい方法しかないんでしょうか

618 名前:デフォルトの名無しさん :04/09/07 08:29
>>617
EM_SETSELで最後を選択して、EM_REPLACESELかな?

619 名前:デフォルトの名無しさん :04/09/07 13:20
>>617
良くwカランけど、その2つのコンボって単純に EM_SETSEL に 0, 0 でいいんじゃない?


620 名前:デフォルトの名無しさん :04/09/07 13:41
>>618
何を置換するんですか・・・?NULLを渡したらアクセス違反で落ちました

>>619
それだと1行目の行頭にキャレットが行ってしまいます

やりたいことは、3行表示できるエディットに5行送り込んだとして、
_____
| I1行目
| 2行目
| 3行目        ←こうではなくて(Iはキャレットのつもり)
 ̄ ̄ ̄ ̄ ̄
_____
| 3行目
| 4行目
| I5行目        ←こういう状態にしておきたいんです
 ̄ ̄ ̄ ̄ ̄

621 名前:616 :04/09/07 14:00
>>618
あーわかりました
EM_SETSEL,MAKELONG(0xFFFF,0xFFFF)でEDITの最後に移動して
EM_REPLACESEL,0,<追加する文字列\r\n>の後VK_HOMEで
望む挙動を実装できました ありがとうございます

622 名前:デフォルトの名無しさん :04/09/07 15:08
EM_SCROLLCARET


623 名前:デフォルトの名無しさん :04/09/07 17:49
Win32でCreateWindowにてComboBoxを作成して
それをサブクラス化したのですが
置き換えたコールバックプロシージャに
WM_KEYDOWNが送られてきません。
これはなぜでしょうか?そういう仕様?
キー入力を取得したいので解決法を教えて頂けませんか?

*Edit,Button,ListView,TreeViewなどはちゃんとWM_KEYDOWNが送られてきています。

よろしくお願いします。


624 名前:623 :04/09/07 17:57
上記にからんだ事なのですが
リソースエディタを使わずに動的にダイアログボックス上のリソースを作成した場合に
Tabキーを押したときに次のリソースにフォーカスが移動という機能を
自分で実装しなければならないために上記のような手段にでました。

親ウィンドウに子リソースのキー入力状況などは通知されないのでしょうか?
WM_NOTIFYなどでNM_KEYDOWNなどはありますが、
あくまでもコモンコントロールであって
Editなどがあてはまらず一貫した実装に出来ません。
一番手っ取り早いのは親にTabキーが押されたことを通知する機能が実装されていれば
よいのですが・・
見た限りないようなので、サブクラス化して子からWM_KEYDOWNのときに
SendMessage(hParent,WM_KEYDOWN, wParam, lParam);
とするぐらいしか方法は思いつきませんでした。

どうしたらよいのでしょうか?

625 名前:デフォルトの名無しさん :04/09/07 18:16
ドロップダウンリストにすりゃ送られてくるだろ。
コンボボックスで送られてこないのは、インプットフォーカスがあるのが
コンボボックスそのものではなくて中にあるエディットだから。

で、ダイアログの機能を実現したいなら
IsDialogMessageとかモードレスダイアログで検索しなさい。

626 名前:デフォルトの名無しさん :04/09/07 18:42
624 CreateWindowでWS_TABSTOP立ってないのでは?

627 名前:623 :04/09/07 18:51
>>626
セットしてます

628 名前:デフォルトの名無しさん :04/09/07 22:59
ランチャなんかでよくあるような、
起動するとポップアップメニューが出て、項目を選択すると
それに応じた作業をこなした上で終了する、というツールを作りたいんです。
ポップアップメニューだけを表示させるにはどうしたらいいのでしょうか?

今は試しに何もしないウィンドウをCreateWindowしておいて
そのWM_CREATEのところでCreatePopupMenuしてメニューを作成して
TrackPopupMenuした上でPostQuitMessageしてみてるんですが、
当然一瞬何もしないウィンドウが表示されてから終了します。
ウィンドウをSW_SHOWしないでおくと、メニューがカーソルと重なっただけで消えてしまって
メニューを選択できません。
何か上手い方法はないものでしょうか?

629 名前:デフォルトの名無しさん :04/09/07 23:12
>>628
冷やかしは(・∀・)カエレ!!

630 名前:628 :04/09/07 23:20
>>629
…一応マジなわけですが。

631 名前:デフォルトの名無しさん :04/09/08 00:10
>>628
もう寝るので質問だけ。
PostQuitMessageしている理由は何ですか?
しなければいいのでは?と思うので…

632 名前:デフォルトの名無しさん :04/09/08 00:13
>>631
メニューを選択して、それに応じた作業をこなし次第終了させたいからです。

633 名前:デフォルトの名無しさん :04/09/08 00:54
>>628
0x0か1x1のサイズで作れば見えないんじゃない?

634 名前:デフォルトの名無しさん :04/09/08 03:44
C,C++の宿題スレから誘導で来ました。
DLL側のcppファイルに
declspec(dllexport) int flag;
を宣言して、
EXE側のヘッダファイルに
declspec(dllimport) int flag;
を宣言して、cppにインクルードしました。
EXE、DLLの両方で共通のフラグを使おうと思ったのですが、
デバッガでトレースすると、EXE側で1に設定したflagが
DLL側の関数に入るとflagの値が0になってしまいました。
フラグのメモリアドレスを見ると、DLLとEXEで異なっていて
別領域が取られているようです。EXE、DLLの両方で共通の
同じフラグを使用するには、どのようにexport,importをすれば
よいのでしょうか?長くなってすいません。

635 名前:デフォルトの名無しさん :04/09/08 04:00
>>634
フラグ用のインターフェース関数を用意して
exeとdllでのフラグのやり取りはその関数経由で行えば良いのでは?

636 名前:デフォルトの名無しさん :04/09/08 04:15
>>634 こんな感じで。
[exe]
#include "dll.h"
int main(void)
{
printf("%d\n", dll_get_flag());
dll_set_flag(1);
return 0;
}

[dll]
int flag;
dll_get_flag(void){ return flag; }
dll_set_flag(int f){ flag = f; }

637 名前:デフォルトの名無しさん :04/09/08 04:23
>>634の通りやって、ちゃんと意図どおりになったど。

638 名前:デフォルトの名無しさん :04/09/08 04:25
>>635-636
ありがとうございます。libファイルを使って静的リンクさせる場合は
[dll]の関数の頭にdeclspec(dllexport)を宣言すればよいのでしょうか?

639 名前:609 :04/09/08 13:04
>>610
>>612
ありがとうございます。
なるほど。
ということは、Windowsではパスワード無しでsudoみたいなことをする方法はないって事なんでしょうか?
その辺を調べる方法はないものでしょうかねぇ

#Cygwinにsuってないんだっけ?あるとすれば、その辺のソースをみればいい?


640 名前:デフォルトの名無しさん :04/09/08 13:14
>>639
suだってsudoだってパスワードは必要だろうが。

641 名前:639 :04/09/08 13:20
上には書いてあるんですが、もちろんどのユーザーからでもということではなくて、
特権をもっている場合でいいんです。
UNIXだったら、rootからsuするのにパスワードいりませんよね?(UNIXというか僕はLinuxしかしらないのですが(汗))
そこから連想して、WindowsだったらAdministratorでできないかなと想像してます。
その辺、できるのかできないのか、できるとしたらどうすればいいのか。
ちょっとでもヒントになりそうなことがあったら、ぜひお教えください。
重ねてお願いします。

642 名前:デフォルトの名無しさん :04/09/08 14:39
>>641
WindowsはUNIXではなくAdministratorはrootではありません。
Administrator権限を持つユーザーでしかないです。


643 名前:デフォルトの名無しさん :04/09/08 15:33
質問です。
メニューから項目を選んでからクライアントエリアをクリックすると
座標値が得られ、それをメッセージボックスで表示させたいんですけど、

メニューの項目を選んだ時点で(クライアントエリアをクリックしてないのに)メッセージボックスが表示されてしまうんです。(座標値は0,0)
こういう場合どういうふうに組んだらいいんでしょうか?

644 名前:デフォルトの名無しさん :04/09/08 15:39
今現在どういう変てこな造りになっているのかわからんとねー

645 名前:643 :04/09/08 15:52
プログラムは、
case WM_COMMAND:
hMenu = GetMenu(hWnd);
hdc = GetDC(hWnd);
switch (LOWORD(wp)) {
case ZAHYOU:{
  case WM_LBUTTONDOWN:

  pt.x=LOWORD(lp);
  pt.y=HIWORD(lp);
  wsprintf(szBuff,"座標値%d,%d",pt.x,pt.y);
  MessageBox(hWnd,szBuff,"タイトル",MB_OK);
 }
こんな感じなんですが、わかりますでしょうか・・?;}

646 名前:デフォルトの名無しさん :04/09/08 16:06
break;
死ね。

647 名前:デフォルトの名無しさん :04/09/08 16:22
デバイスコンテキストで文字を表示する際に文字のフォントサイズを小さく表示するにはどうすれば
いいのですか?

648 名前:デフォルトの名無しさん :04/09/08 16:36
>>645
わかんにゃい
何をやっているのかさっぱり

649 名前:デフォルトの名無しさん :04/09/08 16:44
>>647
CreateFontして、SelectObject

650 名前:デフォルトの名無しさん :04/09/08 19:48
>>649
レスありがとうございます
CreateFontして、SelectObjectを調べてみます

651 名前:デフォルトの名無しさん :04/09/08 21:54
>>643=645
かなり深刻に勘違いしていますので、
C (C++) と Win32 APIの入門書等を見て勉強したほうがよいです。

652 名前:デフォルトの名無しさん :04/09/08 22:41
>645
こんな感じのコードでいいのかな?

// これをどっかに宣言
static bool fViewZahyou = false;

case WM_COMMAND: {
 switch (LOWORD(wp)) {
  case ZAHYOU: {
   // 次のクリックでは座標を得る処理をする、という意味で
   fViewZahyou = true;
   break;
  }
 }
 break;
}

case WM_LBUTTONUP: {
 if (fViewZahyou) {
  pt.x=LOWORD(lp);
  pt.y=HIWORD(lp);
  wsprintf(szBuff,"座標値%d,%d",pt.x,pt.y);
  MessageBox(hWnd,szBuff,"タイトル",MB_OK);
  fViewZahyou = false;
 }
 break;
}

>651 の言う通り、まず C/C++ の文法をしっかり勉強するように。

653 名前:デフォルトの名無しさん :04/09/09 01:11
Windows XP SP2 Platform SDK でまつた。
ttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm

654 名前:デフォルトの名無しさん :04/09/09 01:23
結局ATLのサンクはどうなったのかと。

655 名前:デフォルトの名無しさん :04/09/09 01:54
>>654
http://pc5.2ch.net/test/read.cgi/jisaku/1094220209/11-23 あたり参照

656 名前:デフォルトの名無しさん :04/09/09 02:00
やっと新SDK出たか

657 名前:デフォルトの名無しさん :04/09/09 09:01
壁紙をクライアントウィンドウに表示したいので
外部画像ファイル(bmpやjpg)をクライアントウィンドウの背景に設定したいのですが
どのようにすればいいでしょうか?

画像 背景などで検索してもリソースから入手するものばかりです。

壁紙の位置を知る方法はレジストリの
マイ コンピュータ\HKEY_CURRENT_USER\Control Panel\Desktop\OriginalWallpaper
から取得する事はわかりましたが
その画像をクライアントウィンドウの背景にする方法がわかりません。

どうか教えてください

658 名前:デフォルトの名無しさん :04/09/09 09:45
WinXPで他のウィンドウのIMEのモードを変えたいのですが、
GetForegroundWindowで取ってきたHWNDをImmGetContextに
入れてもNULLしか返ってきません。自分のウィンドウがたまたま
最前列だった場合は、自分のIME制御はできたのですが、何が足
りないのでしょうか。


659 名前:デフォルトの名無しさん :04/09/09 10:03
>>657
>>2

660 名前:デフォルトの名無しさん :04/09/09 11:04
>>658
NT系だと他のスレッドのIME監視するの面倒じゃなかったっけ.


661 名前:デフォルトの名無しさん :04/09/09 11:26
>>659
どれでしょうか?

662 名前:657 :04/09/09 11:27
聞くだけでは失礼だと思ったので
一応>>2のリンク先を見たところ
二つがリンク切れ(一個は表示できない?)でした。

もう二つを見てみましたが
思わしきリンクが見つかりません。
どこのどれを見ればいいか、もしくは検索のヒントを教えてください

663 名前:デフォルトの名無しさん :04/09/09 11:33
>>662
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/index.html

Win32 API入門
http://black.sakura.ne.jp/~third/system/winapi/win.html

664 名前:657 :04/09/09 11:38
>>663
上下で分かれてて、下の一番上がWin32〜となってたので
下がWin32API用のリンクかと勘違いしてました
上も入ってるんですね。

ちなみに下のリンクは全部みましたが
思わしき内容がありませんでした。

せっかく張っていただいたWin32 API入門では
残念ながらリソースからBMPファイルを読み込む内容しか書かれていませんでした。

今から猫でもわかるプログラミングの方を読んでみます。

665 名前:デフォルトの名無しさん :04/09/09 11:43
>>664
ttp://www.wotsit.org/download.asp?f=bmp
ttp://www.wotsit.org/download.asp?f=lzwexp
ttp://www.wotsit.org/download.asp?f=itu-1150
ttp://www.wotsit.org/download.asp?f=png

あとはSetDIBitsToDevice/CreateDIBSection/BitBlt/StretchBltあたりだ

いまさら教えても文句はいうけどお礼は言わないよということか>メアド欄
相当に失礼な奴だな。

666 名前:657 :04/09/09 11:46
>>665
何か勘違いをしているようですが
教えてくれている方に向かって文句を言うほどバカではありません。
口は悪いですがリンク先を教えてもらったりしてるだけで心の中ではありがたく思ってます。
更に使用関数の名前まで教えていただき感謝のきわみです。
ありがとうございます

667 名前:663 :04/09/09 12:03
>>664
http://black.sakura.ne.jp/~third/system/winapi/win.html
・DIB ファイルヘッダ
・DIB 情報ヘッダ
・DIB ピクセルビット
・Windows DIB
・DIB の表示

http://www.kumei.ne.jp/c_lang/index.html
の方は170〜172章

WIN32APIと呼べるかどうか分からんが、
336章にJPEGなども表示できる方法がある(環境限定)

COMだが、JPEGに関してはOleLoadPictureなども使える

668 名前:デフォルトの名無しさん :04/09/09 12:27
>>664
蛇足。心の中でどう思ってようが構わないが表に出すな。
付け加えれば教えてもらってるのに素直にお礼言わないってどういうこった。
頭膿んでるんじゃねぇか?


669 名前:デフォルトの名無しさん :04/09/09 13:22
>>657
>>661
>>662
>>664
>>666


670 名前:デフォルトの名無しさん :04/09/09 13:41
あの質問を相手にするほうもどうかと思うが。

671 名前:657 :04/09/09 14:12
>>667さんが>>663さんということは>>665さんは>>663さんじゃないのか…
>667さん、ありがとうございます
とりあえず色々試行錯誤してみます

672 名前:デフォルトの名無しさん :04/09/09 14:24
ではここで新しいPlatformSDKの主な変更点をどうぞ
 ↓

673 名前:デフォルトの名無しさん :04/09/09 14:34
>>672
「新しい Platform SDK」っていう表現は微妙。
単独では使えないし。

674 名前:デフォルトの名無しさん :04/09/09 14:47
バージョンアップしたのがTable/MDAC/MSIだけじゃ
あんまり俺には関係ないな。


675 名前:デフォルトの名無しさん :04/09/09 16:13
>>673
どういう表現ならいいんだ?

676 名前:デフォルトの名無しさん :04/09/09 16:25
ナウい Platform SDK

677 名前:デフォルトの名無しさん :04/09/09 16:25
差分とかじゃないの?

678 名前:デフォルトの名無しさん :04/09/09 16:28
差分てことは新しいってことじゃないのか

679 名前:デフォルトの名無しさん :04/09/09 16:59
新しいってことは差分てことじゃないのか

680 名前:デフォルトの名無しさん :04/09/09 17:01
じゃあ「新しい Platform SDK」という表現でいいな。
改めてどうぞ
 ↓

681 名前:デフォルトの名無しさん :04/09/09 17:11
XP SP2に対応しました。

以上

682 名前:デフォルトの名無しさん :04/09/09 17:12
ポカーン・・・

683 名前:デフォルトの名無しさん :04/09/09 17:13
またこっそり新しいAPI入れてるんでしょ?そうなんでしょ?

684 名前:デフォルトの名無しさん :04/09/09 17:13
古くする差分だったらどうするニダ

685 名前:デフォルトの名無しさん :04/09/09 17:15
>>684
新しいSDK=新しくするSDKって意味じゃないべ。
新しく出たSDKって意味だべ。

686 名前:デフォルトの名無しさん :04/09/09 17:18
>>683
頭おかしいのか?

687 名前:デフォルトの名無しさん :04/09/09 17:19
追加API一覧とかつけてほしいよ

688 名前:デフォルトの名無しさん :04/09/09 17:54
どっかにあったぞ

689 名前:デフォルトの名無しさん :04/09/09 17:59
マジでか

690 名前:デフォルトの名無しさん :04/09/09 18:12
ウソでした

691 名前:デフォルトの名無しさん :04/09/09 18:22
ホントだって。
http://msdn.microsoft.com/library/en-us/winprog/winprog/functions_by_release.asp
http://msdn.microsoft.com/library/en-us/win9x/append_4cs3.asp
あーでもXPSP2はまだ入ってないな

692 名前:デフォルトの名無しさん :04/09/09 18:22
自己解決しました

693 名前:デフォルトの名無しさん :04/09/09 18:30
spy++を使わずに届いたメッセージをフックしてくれるソフトってありますか?
どうも探しても見つかりません。

694 名前:デフォルトの名無しさん :04/09/09 18:31
メッセージをフックした上でメッセージを表示してくれるプログラムです

695 名前:デフォルトの名無しさん :04/09/09 18:34
>>691
おまえ神だろ

696 名前:デフォルトの名無しさん :04/09/09 18:35
なんでspy++じゃだめなの

697 名前:デフォルトの名無しさん :04/09/09 19:11
>>693
http://www.windows-spy.com/
とかは?

698 名前:デフォルトの名無しさん :04/09/09 19:23
C+Win32APIでウィンドウズアプリケーションを作っているのですが、
最大化できなくする方法(最大化ボタンを無くす)を教えてください。
WNDCLASS.styleにCS_*だと思うのですが、見つかりませんでした。

699 名前:デフォルトの名無しさん :04/09/09 19:25
WS_MAXIMIZEBOX

700 名前:698 :04/09/09 19:40
>>699
できました。ありがとうございました。

701 名前:デフォルトの名無しさん :04/09/09 21:06
>>696
VC++持ってないので…

>>697
ありがとうございます

702 名前:デフォルトの名無しさん :04/09/09 23:09
ステータスバー上にマウスがきたら、マウスアイコンを変更させようとお
もって、WM_MOUSEMOVEが特定の位置にきたらseticonを使用して変えよう
としたのですがうまくいきません。
ステータスバーをcreatewindowexでつくったので、その前にWNDCLASSEX
にステータスバーを処理するためのメッセージ処理関数を登録して
RegisterClassExを実行しました。RegisterClassExの戻り値は0なので
うまくいくはずはないのでしょうが、そもそもこのような手順であってい
るのでしょうか?

703 名前:デフォルトの名無しさん :04/09/09 23:47
>702
ステータスバーというと msctls_statusbar32 の事かな。
もしくは STATUSCLASSNAME か。ってか、同じだけど。
で、メッセージ処理関数を置き換えるという発想は正解。
でも方法は間違い。次のようにする事。

// msctls_statusbar32 オリジナルのプロシージャを退避させておく変数
static WNDPROC original_procedure = 0;
static LRESULT CALLBACK my_statusbar_procedure (HWND .. /* 略 */ ..) {
 /* ここでやりたい事をすればよい */

 /* 重要。自分で処理しないメッセージは必ず元のプロシージャに任せる事! */
 return CallWindowProc (original_procedure, hwnd, msg, wParam, lParam);
}

HWND create_my_statusbar() {
 HWND statusbar = CreateWindowEx ( /*略。普通にステータスバーを作る */ );

 /* こうやってメッセージ処理関数を置き換える */
 original_procedure = (WNDPROC)SetWindowLong (
       statusbar, GWL_WNDPROC, (LONG)my_statusbar_procedure,);

 return statusbar;
}

704 名前:デフォルトの名無しさん :04/09/10 00:29
>>697
それ、Win9x系では死ぬほど重いんだよな…。

705 名前:702 :04/09/10 00:31
>>703
うまくいきました〜
トンクス!

706 名前:デフォルトの名無しさん :04/09/10 04:17
WirteFileの非同期書き込みって処理がすぐ帰って来るだけで
スレッドセーフなわけではないですよね?

707 名前:デフォルトの名無しさん :04/09/10 11:50
>>706
WriteFile はどう呼び出してもスレッドセーフだよ。
呼び出し側のコンテキストもOS内のステータスも壊れないし、
書いただけちゃんと書かれる。

書き込みを同期化してくれるわけではないけど(先方がデータグラム型ソケットの場合を除く)。

708 名前:デフォルトの名無しさん :04/09/10 12:33
SetTimer、KillTimerがありますが、
それのタイマーを0にするAPIがあるなら教えてください。

709 名前:デフォルトの名無しさん :04/09/10 12:36
>>708
ないと思う。

0にしてどうするの?というか、なぜ0にしたいの?

710 名前:708 :04/09/10 12:44
>>709
例えば、ゲームのカーソルを0.5秒単位に点滅させる処理で、
0.5秒毎にWM_TIMERが発生しますが、
ユーザーが十字キーを動かしたときに、時間を0に戻して、
次からの点滅のタイミングを同じにしたいのです。
KillTimerした後、すぐSetTimerすればそれができると思うのですが、
APIがあればそちらの方がいいかなと。

711 名前:デフォルトの名無しさん :04/09/10 13:11
>>710
ウィンドウに関連付けてるなら、出来そう

以下、MSDNより抜粋
>hWnd パラメータで NULL 以外の値を指定し、
>hWnd パラメータで指定したウィンドウに、
>nIDEvent と同じ値のタイマが既に割り当てられている場合、
>新しいタイマは既存のタイマを置き換えます。

>SetTimer 関数がタイマを置き換えた場合、
>そのタイマはリセットされます。
>したがって、現在のタイムアウト時間が経過すると
>1 つのメッセージが送信されますが、
>それまでのタイムアウト時間は無視されます。

712 名前:708 :04/09/10 13:26
>>711
詳しくありがとうございます。
KillしてすぐSetする方法でやってみたいと思います。

713 名前:デフォルトの名無しさん :04/09/10 13:41
POPサーバーにアクセスするAPIを教えてくださ

714 名前:デフォルトの名無しさん :04/09/10 13:48
>>712
711を読む限りkillしないてもいいんでない?

715 名前:デフォルトの名無しさん :04/09/10 13:59
>>713
gethostbyname(), socket(), connect(), send(), recv(), close()
MAPI を提供するメーラがあって、そのアカウントが使いたいなら MAPI 経由でもいいかも。

716 名前:デフォルトの名無しさん :04/09/10 14:15
標準スタイルのボタンやチェックボックスはDrawFrameControlで描画できますが、
同様にタブを自前で描画する方法はありませんか?


717 名前:デフォルトの名無しさん :04/09/10 14:15
>>715
あ、それ系のAPIでやるんですか、ありがとー

718 名前:デフォルトの名無しさん :04/09/10 14:29:32
>>716
uxtheme
嫌ならボタンの上半分とかでそれらしく描画するしかないな

719 名前:708 :04/09/10 15:49:06
>>714
それでもいけました。ありがとうございました。

720 名前:デフォルトの名無しさん :04/09/10 18:55:29
WM_PAINTがキューにもう一つあるなら、
その回は描画しても無駄なのでスキップする

という処理をしたいのですが上手くいきません
どのようにすれば良いのでしょうか?今はこうやって失敗してます。

case WM_PAINT:{
 MSG m;
 if( PeekMessage( &m, hWnd, WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) return 0;

 //以下描画処理
}

721 名前:デフォルトの名無しさん :04/09/10 18:57:17
WM_PAINTはキューにひとつしかないけど何がしたいの?

722 名前:デフォルトの名無しさん :04/09/10 18:59:24
システムが勝手に1つにまとめてくれるわけだな

723 名前:デフォルトの名無しさん :04/09/10 19:06:15
つーか、ウィンドウの無効領域を自動的にまとめて、暇そうなときにWM_PAINTを発行するんじゃなかったか?

724 名前:デフォルトの名無しさん :04/09/10 19:08:42
>>721-722
レスありがとうございます。まとめてくれるんですね。道理で上手くいかないわけだ。

ヘルプ見ても該当の記述が見つからないので、重ねてすいません。
WM_MOUSEMOVEとかならば、この方法で良いのでしょうか?

725 名前:デフォルトの名無しさん :04/09/10 19:21:49
APIとSDKはどう違うんですか?

726 名前:デフォルトの名無しさん :04/09/10 19:48:18
猫でウインドウに関連付けられているメニューは、ウインドウ破棄と同時に捨てられるみたいな事が書いてあるのですが、

HMENU menu1=CreateMenu();
HWND hwnd1=CreateWindowEx(..., menu1, ...);

HMENU menu2=CreateMenu();
HWND hwnd2=CreateWindowEx(..., menu2, ...);

と二つのオーバーラップウインドウを作った場合、どうも最後に作られたメニューは破棄されるけど
それ以前に作ったメニュー(この場合はmenu1)は破棄されないようなのです。
以下3, 4...と作っていくと、menu2のDestroyMenuが成功するようになります。

何か大きなミスをしているような気がするのですが、ウインドウメニューと破棄の関係について
正確に掛かれているページってどこかに無いでしょうか?

727 名前:デフォルトの名無しさん :04/09/10 19:50:57
そのウィンドウに関連付けられたメニューだけが破棄されるのは
分かってるか?

728 名前:デフォルトの名無しさん :04/09/10 20:05:35
ウインドウが閉じた(WM_DESTROYが送られた後)タイミングで破棄されるから
明示的に閉じたウインドウ以外は、破棄される前にDestroyMenuが呼ばれてるのかな
だからDestroyMenuが成功してるんだと思う。

729 名前:デフォルトの名無しさん :04/09/10 21:33:57
タブコントロールにスライダーコントロールが乗っかっているWINアプリがあるのですが、
このスライダーコントロールを別のWINアプリを作りたいなあと思っています。
このときにスライダーコントロールのハンドルをどうやったら取得できるのでしょうか?

730 名前:デフォルトの名無しさん :04/09/10 21:47:18
>>729
自分の書いた文章読んで意味わかるか?

731 名前:デフォルトの名無しさん :04/09/10 21:55:48
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
上ので、WndProcはどこで呼び出しているのでしょう。

732 名前:デフォルトの名無しさん :04/09/10 21:57:17
ですぱっち

733 名前:731 :04/09/10 21:59:48
>>732
ありがとうございました。

734 名前:デフォルトの名無しさん :04/09/10 22:27:50
>>729
なんかなぞなぞみたいでつ

735 名前:デフォルトの名無しさん :04/09/10 22:50:10
>>729
スルーですね。

736 名前:デフォルトの名無しさん :04/09/10 23:16:55
SetWindowsHookExを使って"コピーされた"ってのを知りたいんですけど
WH_CALLWNDPROCRETを使ってWM_COPYを見ていればいいんですか?

737 名前:デフォルトの名無しさん :04/09/10 23:22:34
だめ

738 名前:デフォルトの名無しさん :04/09/10 23:34:33
C+ウィンアプリは、イベントがあるまでOS?で待ちながら、
イベントが発生すると、GetMessageでそれを得て、
TranslateMessageで使いやすく翻訳し、
DispatchMessageでWndProcを呼び出し実行する、
という感じでいいのでしょうか。

また、TranslateMessageとDispatchMessageの引数が、
constポインタなのはなぜでしょう。

TranslateMessageはGetMessageで得たものをポインタで渡し、
中で書き換えるとイメージしたのですが、
constだと書き換えられないような気がするのですが。

また、DispatchMessageは実行するだけだから、
書き換える必要が無く、ポインタで渡す必要が無いと思うのですが。

739 名前:デフォルトの名無しさん :04/09/10 23:42:04
TranslateMessageはメッセージを書き換えないで、
WM_(SYS)KEYDOWNからWM_(SYS)CHARを生成したりしてキューにポストする。
書き換えちゃったらKEYDOWN系がこなくなる。

740 名前:デフォルトの名無しさん :04/09/10 23:44:47
ポインタなのは構造体コピーより速いから。じゃねーかな。

741 名前:738 :04/09/10 23:50:43
ありがとうございます。

>>739
そういえば、キーを押した時、2回メッセージが来ているような
気がする事があったのですが、もしかしたらそれかもしれません。

>>740
なるほど。
自分は、引数がNULLでも動く関数の時は、constポインタにする事が
ありますが、そういう利点もあったのですか。

742 名前:デフォルトの名無しさん :04/09/10 23:52:05
>>738
> TranslateMessageで使いやすく翻訳し、
TranslateMessageはただWM_KEYDOWN/UPなどからWM_CHARなどのメッセージを作り出しているだけだから、それじゃ間違い。
WM_CHARなどのメッセージが要らなければ、TranslateMessageを呼ぶ必要も無い。

> TranslateMessageはGetMessageで得たものをポインタで渡し、中で書き換えるとイメージしたのですが、
そうじゃない、PostMessage(それかWin内部でごにょごにょ)で送り出すので書き換える必要は無い。

> 書き換える必要が無く、ポインタで渡す必要が無いと思うのですが。
構造体を直接関数の引数にすると、いちいちコピーする時間が掛かる。
なので代わりにポインタ(あるいは参照)にするのごく一般的に行われる。(sizeof (MSG)は28だがsizeof (MSG*)なら4)
その場合、通常の値渡しのように関数に渡した変数の中身が変わらないことを表明するためにconstポインタ(あるいはconst参照)にするのは常識。

743 名前:738 :04/09/10 23:59:26
>>742
さらに詳しくありがとうございます。
すごく勉強になりました。

744 名前:デフォルトの名無しさん :04/09/11 09:57:30
次スレはスレタイにWin64の文字も入れてください

745 名前:デフォルトの名無しさん :04/09/11 10:56:10
Win64は別スレにした方がよくね?

746 名前:デフォルトの名無しさん :04/09/11 11:05:55
んだ

747 名前:デフォルトの名無しさん :04/09/11 11:11:14
>>745
話題が分散するだけで、あんまり意味ないような感じがするけどどうでしょ。
しかも物凄く過疎な予感もするし。16->32みたいにそんなに違うわけでもないし。

748 名前:デフォルトの名無しさん :04/09/11 13:20:57
質問する前に、「Win64についてですが・・・」とでも
書き添えてくれるのならいいけど、ここじゃルール守るヤツの方が
少数だからなぁ。

749 名前:デフォルトの名無しさん :04/09/11 13:21:40
一緒が良いよ。

750 名前:デフォルトの名無しさん :04/09/11 13:49:51
当面は【Win64可】をスレタイに入れればいいんじゃない。


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