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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

横幅が小さいときは、

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

となる

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

538 名前:デフォルトの名無しさん :02/07/05 19:54
ありがとうございます。参考にさせて頂きます。


539 名前:デフォルトの名無しさん :02/07/05 21:48
>>531

case WM_NCCALCSIZE:
rc.top = 0;
rc.left = 0;
rc.bottom = 240;
rc.right = 320;

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

なことをしたら,タイトルバーも全部真っ白なクライアント領域だけが表示されました.
なんか激しく勘違いをしているようなので,どうやればよいのかご教授願えないでしょうか.
#MFCとか使っている人だと楽勝なのだらろうか...

540 名前:デフォルトの名無しさん :02/07/05 21:50
SendMessage(hwnd, WM_NCCALCSIZE,〜)だよ
リファレンス読め

541 名前:デフォルトの名無しさん :02/07/05 22:46
>>540
すんません.MSDNみてもいまいちピントこなかったのです.
で,googleで WM_NCCALCSIZE を調べても SendMessage(hwnd, WM_NCCALCSIZE, 〜
なのがひっかかからなくて,うーむという状態です.

どのタイミング+引数でSendMessage(hwnd, WM_NCCALCSIZE, 〜 すればよいのでしょうか.

542 名前:デフォルトの名無しさん :02/07/06 00:04
VCで使える、ウインドウに文字をいろんな方法で動かしたりして表示する
ライブラリっていうのは無いものでしょうか?
ゲーム内で使いたいんですが、
いちいち自分でフォントを作って動かし方の指定をするのは
めんどくさいなって思って・・・

543 名前:デフォルトの名無しさん :02/07/06 00:06
>>542
自分で作って以後それを利用する。

544 名前:デフォルトの名無しさん :02/07/06 00:09
>>543
やはりそれしかないのかな〜
頑張るか・・

545 名前:デフォルトの名無しさん :02/07/06 00:27
>>533 ありがとー

546 名前:デフォルトの名無しさん :02/07/06 00:53
画面上にテキスト出力するだけのスクロールバー付きの
サンプルプログラムってないかな?
ログ出力に使いたいんだけど。

547 名前:デフォルトの名無しさん :02/07/06 00:58
>>546
さすがにそのくらい自分で作れよ・・・

548 名前:デフォルトの名無しさん :02/07/06 01:00
>>546
標準出力に吐く

549 名前:デフォルトの名無しさん :02/07/06 01:49
>>539
AdjustWindowRectで求まった矩形をr1とすると、
r2 = r1;
SendMessage(hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&r2);
でr2にクライアント領域のサイズが入って戻ってくる。
これを見てr1を調整してからSetWindowPosかけれ。


550 名前:デフォルトの名無しさん :02/07/06 02:02
>546
エディットウインドウつくって、AppendTextすれば〜?

551 名前:デフォルトの名無しさん :02/07/06 07:18
2つのプロセスが交互にファイルを30秒おきに読み書きする。
ファイルの同時アクセスは許さない、時々ファイルは削除される、という場合に、

・一方がファイルを読み書き中にはエラーを返す。
・ファイルが存在しない場合にはファイルを作る。

という処理がしたいのですが、
ファイルが存在しない場合を知るにはどうすればいいのでしょうか?

hFile = CreateFile( "hoge.txt", GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

これで調べているのですが、ファイルの共有エラーの場合と、
ファイルが存在しない場合の区別の仕方がよく分かりません。
よろしくご教授お願いします。

552 名前:デフォルトの名無しさん :02/07/06 08:26
>>551
GetLastError()とか。


553 名前:デフォルトの名無しさん :02/07/06 08:30
OLEを利用するのに
OleInitialize()を呼び出しますが、
CoInitializeEx()は呼び出さなくても良いのでしょうか?

CoInitializeEx( NULL, COINIT_MULTITHREADED );
OleInitialize( NULL ); -> 失敗

OleInitialize( NULL );
CoInitializeEx( NULL, COINIT_MULTITHREADED ); -> 失敗

となるのですが。
OleInitializeが内部でCoInitializeを呼び出しているのなら良いのですが、
そうでないならOLE以外のコンポーネントを同時に使えないのかなと思いまして。

554 名前:デフォルトの名無しさん :02/07/06 09:31
>551
OPEN_ALWAYS使えばいいんでわ?

555 名前:デフォルトの名無しさん :02/07/06 09:33
>553

なぜMSDNを調べないか。
>OleInitialize calls CoInitializeEx internally to initialize the
>COM library on the current apartment.
>Because OLE operations are not thread-safe,
> OleInitialize specifies the concurrency model as
>single-thread apartment.
と明記されているではないか。

556 名前:デフォルトの名無しさん :02/07/06 11:55
>>542
そんなのあるなら俺も欲しいな〜
出来たらサンプル公開・・・してくれると嬉しいでやんす。

557 名前:sage :02/07/06 12:52
>>522
よく分からないまま、流れていってしまったのですが・・・
もしかしてメニューのサブクラス化というのは
割と初歩的な事で、本かなんか読めば書いてある事
なのでしょうか?
それとも逆にあまり一般的ではないのでしょうか?
いろいろ試しているのですが相変わらず出来ません
トホホ・・・

558 名前:デフォルトの名無しさん :02/07/06 13:09
>>557
一般的でないどころか世界中でそんなことしてるやつ一人もいないかも
どうしてもメニューをサブクラスかしたかったら
メニューのウィンドウハンドルを何とかしてゲットしてください
ポップアップ中なら座標から何とかなるでしょう

559 名前:デフォルトの名無しさん :02/07/06 13:18
メニューはウィンドウじゃないからサブクラス化なんてできないよ
なんて子供の純真な夢を打ち砕くような台詞をどうしても言わせたいのかキミは

オーナードローとかで我慢しる。

560 名前:デフォルトの名無しさん :02/07/06 14:54
メニューもウインドウなんだが?
誰からそんなウソ教わった?

561 名前:デフォルトの名無しさん :02/07/06 16:46
>>560
実際システムメニューとかって乗っ取れるしね。

562 名前:デフォルトの名無しさん :02/07/06 16:58
>>560-561
んじゃ、教えてやれよ

563 名前:デフォルトの名無しさん :02/07/06 18:25
つーかWindowsで画面に表示される
ユーザーの入力を受け取る事が可能な物は例外なくウインドウなんだが。

564 名前:デフォルトの名無しさん :02/07/06 18:26
burorororo

565 名前:デフォルトの名無しさん :02/07/06 18:26
あ、クラス名は"#32768"ね

566 名前:デフォルトの名無しさん :02/07/06 18:46
>>563
ステータスバーはウインドウではないと。

567 名前:デフォルトの名無しさん :02/07/06 18:52
流れ的にfj臭いな

568 名前:デフォルトの名無しさん :02/07/06 18:54
・基本

変に何かを定義付けしようとする奴は基本的に叩かれる。
よって多分俺も叩かれる。

569 名前:デフォルトの名無しさん :02/07/06 18:54
>>566 はぁ?
入力を受け取るオブジェクト⊂ウインドウ
入力を受け取る物だけがウインドウとは書いてない

570 名前:デフォルトの名無しさん :02/07/06 18:56
>>569
>ユーザーの入力を受け取る事が可能な物は例外なく

書いてある。

571 名前:デフォルトの名無しさん :02/07/06 18:59
ユーザーの入力を受け取る事が可能な物は例外なくウィンドウである
と、
ウィンドウとは例外なくユーザーの入力を受け取ることが可能である
は等価じゃないんだが。
つか、これ中学生レベルの数学で習わなんだか?

572 名前:デフォルトの名無しさん :02/07/06 19:00
>>570 おい、どう読んだらそうなるんだ?
「〜物のみ〜」とは書いてないだろ。
日本語読める?

573 名前:デフォルトの名無しさん :02/07/06 19:02
まだ小学生ですた

574 名前:デフォルトの名無しさん :02/07/06 19:43
>563
コマンドプロンプトのウインドウハンドル(゚∀゚)クレクレ

575 名前:デフォルトの名無しさん :02/07/06 19:45
>>574
Spy++じゃ取れないがWinSightとか自力なら普通に取れるが、何か?

576 名前:デフォルトの名無しさん :02/07/06 19:46
あ、コマンドプロンプトってNTか?それじゃ死らん
ウインドウのように見えるが、ウインドウじゃないのか?

577 名前:デフォルトの名無しさん :02/07/06 20:41
NT系のコマンドプロンプトはCSRSSが管理してるから
セキュリティの関係でいじれないようになってるんだよ。
パスワードとか入力される場合もあるしな。

578 名前:デフォルトの名無しさん :02/07/06 20:43
NTのコマンドプロンプトでもハンドル取れたぞ

002C0810
"コマンドプロンプト"
ConsoleWindowClass
14EF0000

579 名前:デフォルトの名無しさん :02/07/06 20:51
2000でコマンドプロンプトがフォアグランドだと
どうあがいてもSetForegroundWindowが効かないのは
どうしてですか。

580 名前:デフォルトの名無しさん :02/07/06 22:28
>>549
出来ました.ありがとうございます.

581 名前:デフォルトの名無しさん :02/07/06 23:54
LineToで線を書いた画面の上にTextOutで文字を出力すると
文字と被ってない部分の線も消えてしまうんですがそれを消えないようにする
方法ってありますか?

582 名前:デフォルトの名無しさん :02/07/07 00:00
MSDNでSetBkModeを検索するよろし。>>581

583 名前:581 :02/07/07 00:05
>>582
うまくいきましたー、ありがとうございます。


584 名前:デフォルトの名無しさん :02/07/07 02:36
>>551
fopen("file_path","a");
すりゃ、勝手にファイル作ってくれると思うが・・・・・
んで、mutexでプロセス間の排他はOK


585 名前:デフォルトの名無しさん :02/07/07 13:51
buroburoburo

586 名前:デフォルトの名無しさん :02/07/07 20:59
マルチモニタ対応のため、ダイアログをセンタリングするときは
スクリーンではなくアプリケーションウィンドウに対して
センタリングせよという意味のガイドラインがどこかに書かれていた
と思うのですが探し出せません。
どこに書いてるか知ってる人いませんか?

587 名前:551 :02/07/07 21:07
>>552,554,584
情報さんくすです。
結局、
GetFileAttributes(FILENAME) == 0xFFFFFFFF
でファイルの存在を調べて
hFile = CreateFile( FILENAME, GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)
で排他処理することにしました。

588 名前:デフォルトの名無しさん :02/07/07 21:33
ファイルの存在チェックとオープンの間に
ファイルが作られたり削除されたりという可能性は考慮しなくていいの?

(´-`).。oO(なんで素直にアドバイスどおりに作らないんだろ?)

589 名前:偽551 :02/07/07 21:50
>>588
大丈夫ですよ、チェックしたらすぐに作成しますから。最近のマシンなら
1/1000 もかからないでしょ。

まあ、俺が担当にいる間ぐらいはちゃんと動くだろうしね...。

590 名前:さらに偽551 :02/07/07 21:57
>>588
作らないじゃなくて作れないんです!

591 名前:デフォルトの名無しさん :02/07/07 22:01
>>590
なぜ OPEN_ALWAYS 使わないのか小一時間

592 名前:本物かもしれない551 :02/07/07 22:10
>>591
OPEN_ALWAYS はなかったら作る、あったらそのまま、なので
存在したかどうかの判断ができないと思われ。


593 名前:デフォルトの名無しさん :02/07/07 22:11
OPEN_EXISTSでいいじゃん

594 名前:デフォルトの名無しさん :02/07/07 22:14
>>592
551は

> ・ファイルが存在しない場合にはファイルを作る。

と言っているのでそれでもいいかと思われた


595 名前:デフォルトの名無しさん :02/07/07 22:14
つくってから、ファイルサイズとってくればいいやん。
書き込み権利は排他的にとれるでしょうに、

596 名前:デフォルトの名無しさん :02/07/07 22:21
その書き込み部分の処理にファイルとは別に排他処理するんでもいいと思われ

597 名前:デフォルトの名無しさん :02/07/07 22:37
排他権は、ファイルの書き込み権とおなじなので、
別のオブジェクトで排他処理すると、二重管理に
なるとおもうけれど、どうなんだろ。

598 名前:デフォルトの名無しさん :02/07/07 22:42
くだらない質問だと思うのですが

hFile = CreateFile("test.txt",GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
wsprintf(str, "%d\n", i);
WriteFile(hFile,(LPVOID)(&str),(lstrlen(str))*sizeof(char),&dwWrittenByte,NULL);

iはint型の変数で、中には100が入っています
strはchar型の配列の先頭へのポインタです
dwWrittenByteはDWORD型です

上のようにして、できたファイルをメモ帳で開くと
改行されずに100■となってしまいます。
なぜでしょうか?

599 名前:デフォルトの名無しさん :02/07/07 22:43
>>598
CreateFileだと全部バイナリ形式の読み書き?だったから
\nが\r\nに変換されないせいじゃねーの?


600 名前:デフォルトの名無しさん :02/07/07 22:48
プログラムはそのままで、改行部分だけ\nから\r\nに直したところ
きちんと改行されるようになりました。

こんなにあっさり直るなんて、ここで相談してよかったです。
早いレス本当にありがとうございました。

601 名前:デフォルトの名無しさん :02/07/08 15:29
質問ですが、
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。


602 名前:デフォルトの名無しさん :02/07/08 15:53
>>601
GetWindowThreadProcessID
OpenProcess
EnumProcessModules
GetModuleFileNameEx

かな?

603 名前:デフォルトの名無しさん :02/07/08 16:08
>>602
おおおおっ!!!
感謝です、ちょっとその辺りを調べてみます、

604 名前:デフォルトの名無しさん :02/07/08 22:54
質問です。
メッセージボックスを画面の中央に表示する方法はありませんか?
親を指定すると無理なのかなあ。

605 名前:デフォルトの名無しさん :02/07/08 23:14
SetWindowPos

606 名前:名無しさん :02/07/08 23:24
>>598
WriteFileの第2引数は本当に&strなのか?
と問い詰めたい…。


607 名前:デフォルトの名無しさん :02/07/08 23:56
>>605
SetWindowPosするにはhwndが必要なんですけど、
MessageBoxでもらえるんでしょうか?
それとも別のAPIがあるのかな?

608 名前:598 :02/07/09 00:49
>>606
あれ?
&strでもstrでもどっちでも同じ意味のはずですよね?
なんか見た目的に&strのが「アドレスだな!!」ってわかる気がしてw
いやまあ(LPVOID)で分かるんだけど。
やっぱり変ですか・・?

609 名前:デフォルトの名無しさん :02/07/09 01:06
>>608
……もう一度最初からCなりC++の勉強をやり直すことを強く推奨する。

610 名前:デフォルトの名無しさん :02/07/09 01:07
>>608
strが配列ならセーフだが、ポインタだと君のコンピュータが光の速さで吹っ飛んでいくぞ。
>>607
自作ダイアログで代用するのが定番。

611 名前:デフォルトの名無しさん :02/07/09 01:07
('〇';)
(゚ロ゚)
(゜〇゜;)
(゜o゜)

612 名前:デフォルトの名無しさん :02/07/09 01:09

んっと、いやだから
配列だから良いんですよね?

613 名前:デフォルトの名無しさん :02/07/09 01:09
よくない

614 名前:デフォルトの名無しさん :02/07/09 01:11
>>610が微妙

615 名前:デフォルトの名無しさん :02/07/09 01:14
良くないんですか・・・


616 名前:デフォルトの名無しさん :02/07/09 01:15
>>612
たまたま配列だから助かっていただけ
わざわざ危険側に振るなってこと。

617 名前:デフォルトの名無しさん :02/07/09 01:25
>>610
やっぱりダイアログで代用ですか。残念。
でも、REGEDITでキーを削除するときに出てくる確認は、
普通のMessageBoxっぽいのに中央に表示されるんですが...
あれもREGEDITが頑張ってるのかな。


618 名前:偽者604 :02/07/09 01:26
>>610
やっぱり方法ないんですね。
MFCのAfxMessageBoxではちゃんとhWndの中央にでますが
あれのソースってどうやったら見れますか?厨房+便乗質問でスマソ

619 名前:デフォルトの名無しさん :02/07/09 01:33
>>618
いや、hwndの中央じゃなく、画面の中央に出したいのです。
hwndには自分のウィンドウいれてね。

hwndにNULL入れると中央にでるけど親さわれちゃうし。
NULL入れてTASKMODALにすると親さわれなくなるけど、
タスクバーに表示される...

MFCのソースはステップ実行すれば簡単に見られるよ。
ソース漁るより楽。

620 名前:デフォルトの名無しさん :02/07/09 01:38
「画面」なんて曖昧な書き方するのが悪い。
自分で作成したウィンドウのことだろ?どうせ
MessageBoxを好きな位置に移動させる方法はある。

http://pc.2ch.net/test/read.cgi/tech/1024380249/159

621 名前:偽者604 :02/07/09 01:44
>>619
あれ?
MessageBoxは常にデスクトップの中央に表示されない?
OSで違ったっけ?Win2000ではそうなるけどな。

> MFCのソースはステップ実行すれば

ほんとだ。Thx!

622 名前:デフォルトの名無しさん :02/07/09 01:49
どーしてもMessageBoxにこだわるのなら、メッセージボックスもウインドウなのだから、
SetWindowsHookしてWM_CREATEなりWM_SIZEなりを捕まえてやれば出来るんじゃないかと思うが、
Spy++で見ると、メッセージボックスはごくふつうのダイアログであったりするから、常時フックしておく訳にもいかず、
出す直前にフックして直後に解除しなければならないと思われ。
そんなことするなら、ダイアログを自作する方がはやいと思われ。


623 名前:デフォルトの名無しさん :02/07/09 01:51
>>620
CBTフックですね。試してみます。
Thanks!

624 名前:デフォルトの名無しさん :02/07/09 01:57
>>622
ダイアログを作るなら、非表示のダイアログを作って
その中でMessageBoxすると可能でした。
でもなんかスマートじゃないなぁと思って。
フックがスマートなのかどうかはよくわかんないけど。
色々試してみます。

625 名前:偽者604 :02/07/09 02:19
AfxMessageBoxも最終的にはMessageBoxを呼んでいるのだけど
MFCの
int CWinApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
これを見ても何でhWndの中央に出るのかよく分りません・・・。

626 名前:デフォルトの名無しさん :02/07/09 02:29
>>625
CWinApp::DoMessageBoxの中も追わないと。

627 名前:デフォルトの名無しさん :02/07/09 06:52
なんで中央に出るか、お前らほんとに知らんのか?
それともわざと言わないのか? ぼけてるのか?

628 名前:デフォルトの名無しさん :02/07/09 07:20
>>627
説明する気もない奴は来なくていい

629 名前:デフォルトの名無しさん :02/07/09 08:42
>>628
説明するのは簡単だが、場の空気ってもんがあるだろ。
本人のために、あえて言わないのかもしれんからな。

630 名前:デフォルトの名無しさん :02/07/09 08:43
>>629
そういうヤシは黙っとけ

631 名前:おねがいします :02/07/09 08:48
Windows xp では、netstat に -o オプションが追加になりプロセスIDも見れる
ようになりましたが、これと同じことを Windows 2000 でもやりたいのですが、
プロトコル(TCP/UDP)とポート番号の組み合わせからプロセスIDを取得する方法
ってわかりますでしょうか?
パーソナルファイアーウォールなどでは、取得できているようなのですが。
お願いします。

632 名前:デフォルトの名無しさん :02/07/09 08:58
糞壁は黙ってろ

633 名前:デフォルトの名無しさん :02/07/09 11:10
C++Builder5を使ってますが、
GetWindowThreadProcessIdを使うと
[リンカ エラー] 外部シンボル 'GetModuleFileNameExA' が未解決
ってリンクでエラーになります、何が足りないのでしょうか?


634 名前:デフォルトの名無しさん :02/07/09 11:19
>>627-630
なんだこの無駄な漫才は。

635 名前:デフォルトの名無しさん :02/07/09 11:29
>>633
GetModuleFileNameExは使ってないの?

636 名前:デフォルトの名無しさん :02/07/09 11:39
>>635
激しく間違いました。
×GetWindowThreadProcessId
○GetModuleFileNameEx
ですね、はい。

637 名前:デフォルトの名無しさん :02/07/09 14:12
>>633
psapi.libが足りないんじゃない?

638 名前:デフォルトの名無しさん :02/07/09 14:12
>>633,636
implibでpsapi.dllから.lib作ればリンク出来るだろうけど
psapi.dllが入ってない環境だとアプリの起動も出来なくなるだろうから、
↓のようにdllを動的にロードしたほうがいいと思う。
http://techtips.belution.com/ja/vc/0022/

639 名前:デフォルトの名無しさん :02/07/09 15:12
ツリービューを使っていて、質問があります。
TVM_EXPAND/TVE_TOGGLEでプログラムから
ツリーを開いたり閉じたりしているのですが、
アイテムを閉じたときにTVN_ITEMEXPANDEDが送られてきません。
勿論、TOGGLEの後にTVIS_EXPANDEDONCEをリセットしているのですが。

どうすればいいのでしょうか?

640 名前:デフォルトの名無しさん :02/07/09 15:12
ageます

641 名前:デフォルトの名無しさん :02/07/09 15:28
検索してみましたが、
http://n76cd-01p05.ppp11.odn.ad.jp/old/a8575.html
ここのA8564に同様の質問があり、答えが出ていません。
なにかうまい方法無いでしょうか?

642 名前:デフォルトの名無しさん :02/07/09 20:39
ツリービューのオーナードローってどうやるんですか?
TVS_OWNERDRAWFIXEDみたいなの無いんですが。

643 名前:デフォルトの名無しさん :02/07/09 21:43
timeGetTimeは1/10ですよね。
QueryPerformanceCounter
って何分の何の単位の精度なんですか?

644 名前:デフォルトの名無しさん :02/07/09 22:34
timeGetTime()はちゃんと設定すれば1/1000 (sec)の精度があるはず。

QueryPerformanceCounterの精度は、
QueryPerformanceFrequency(&freq), 1/freq (sec)

645 名前:デフォルトの名無しさん :02/07/10 10:16
>>637-638
なるほど、やっぱそういうことですか、
ありがとうございますた。

646 名前:デフォルトの名無しさん :02/07/10 10:31
MAPIの関数の説明が書いてあるHPがあったら教えて下さい。
できれば、日本語で書いてるといいですね。

647 名前:デフォルトの名無しさん :02/07/10 10:32
自前のタスクバーを作っているのですが、タスクバー関連のAPIがわからず困っています。

ツールバーに登録されている(ツールバーにアイコンとして表示されている)アプリケーション(かウィンドウ)へのハンドル一覧を得たいのですが、どの関数を使えばよいのでしょうか。

また、タスクトレイをエミュレートするために、
(1)タスクトレイに登録されているアプリケーションのハンドル
(2)実際にタスクトレイに表示されているアイコンのハンドル
(3)そのアイコンがクリックされた際に適切なメッセージを生成してアプリケーションに送信したい場合に、そのメッセージの種類
を知りたいのです。

648 名前:デフォルトの名無しさん :02/07/10 10:49
>>646
MSDNで十分じゃない?

649 名前:クリップボードの使い方 :02/07/11 00:45
「猫でもわかるプログラミング」 http://www.kumei.ne.jp/c_lang/sdk/sdk_94.htm
など、多くのサイトでは、SetClipboardData を呼び出した後は、
メモリは Windows の管理下に置かれるので GlobalFree しては
いけない、と書かれています。

確かに実際に動かしてみた限りでは GlobalFree してしまうと、
動作がおかしくなります。(2回目の SetClipboardData が失敗する )
では、メモリが Windows の管理下になるとすると、解放はいつ
行われるのでしょうか?

一方、 MSDN では、
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_setclipboarddata.htm
「CloseClipboard 関数を呼び出すまでは、そのハンドルを解放
することや、ロックし続けることを避けなければなりません。」
と書かれていて、 CloseClipboard を呼び出した後であれば
解放しても良さそうにも思えます。

また、MSDN では
「CloseClipboard を呼び出した後も、アプリケーションはそのデータに
アクセスできます。」とも書かれていますが、いつ解放されるか分から
ないのでは怖くてアクセスできないと思うのですが・・・

650 名前:デフォルトの名無しさん :02/07/11 01:10
>>649
だから使うなってことだと思うんだけど。

651 名前:デフォルトの名無しさん :02/07/11 01:32
TextOutで画面上に出力した文字を消す方法って
画面全体を消去する以外にありますか?


652 名前:デフォルトの名無しさん :02/07/11 01:35
>>649
ふつうはコピーして使う
SetClipboardData したメモリのことは忘れたほうが無難



653 名前:デフォルトの名無しさん :02/07/11 01:36
>>651
背景と同じ色で上書きしたら

654 名前:デフォルトの名無しさん :02/07/11 01:41
>>647

タスクバーのツールバー?
あれはタブコントロールだよ。ボタンスタイルの。

(1)(2)(3) はできた、という話を聞いたことない。

655 名前:デフォルトの名無しさん :02/07/11 01:59
>>647
出来るかどうか知らんが、ITaskbarListでも調べてみれば?

656 名前:デフォルトの名無しさん :02/07/11 02:06
>>647
トップレベルウィンドウでかつSW_HIDEじゃない奴を表示してると思う。
ウインドウスタイルの条件があるかも。

トレイはどうだろう。
Shell_No〜をフックすればいけるかも。

657 名前:デフォルトの名無しさん :02/07/11 11:08
文字入力のカーソルの点滅速度を取得するにはどうすれば良いんでしょう?

658 名前:デフォルトの名無しさん :02/07/11 11:15
>>657
GetCaretBlinkTime

659 名前:657 :02/07/11 11:26
こりゃまたそのままの名前。
ありがとう。>>658

660 名前:デフォルトの名無しさん :02/07/12 22:11
ウィンドウ全体を背景色で塗りつぶすのに、もっとも手っ取り早い
方法って何?

661 名前:デフォルトの名無しさん :02/07/12 22:17
WM_ERASEBKGNDを送る

662 名前:デフォルトの名無しさん :02/07/12 22:24
>>661
おお、ありがとう。手っ取り早そう

663 名前:デフォルトの名無しさん :02/07/13 16:15
「メニュープロパティ」の「一般」-「ID(I): IDR_MENU1」として,

WNDCLASS wndclass ;

wndclass.lpszMenuName = IDR_MENU ;

てな感じで書くと,
--------------------------------------------------------------------
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
-------------------------------------------------------------------
とwarningがでるが,ちゃんとメニューは表示されるが,
wndclass.lpszMenuName = "IDR_MENU" ;
とかするとwarningはでないけど,今度はメニューが表示されません.
なんででしょうか?

664 名前:デフォルトの名無しさん :02/07/13 16:39
MAKEINTRESOURCE(IDR_MENU)
とゆうマクロがあるよん。
ウィザードでは(LPCSTR)IDR_MENU
ってキャストしてるけどね。

665 名前:デフォルトの名無しさん :02/07/14 20:45
buro

666 名前:デフォルトの名無しさん :02/07/15 05:19
タスクトレイを右クリックした時に表示されるポップアップメニューのハンドルから、
オーナーのハンドルを取得するにはどうすればいいのでしょうか?

ポップアップメニューのハンドルは取得できるのですが、
GetWindow(hWnd, GW_OWNER);
GetAncestor(hWnd, GA_ROOTOWNER);
では、0が返ってきます。

667 名前:デフォルトの名無しさん :02/07/15 11:28
GetWindowProcessIdとかEnumChildWindowsを串

668 名前:デフォルトの名無しさん :02/07/15 18:03
buroburo

669 名前:デフォルトの名無しさん :02/07/15 18:37
iniファイルの一つのセクションにあるキーの数がいくつかを
調べる方法はありますか?

670 名前:デフォルトの名無しさん :02/07/15 21:32
>669
GetPrivateProfileSectionを調べよ

671 名前:デフォルトの名無しさん :02/07/15 22:57
お絵かきプログラムでLineToで描いた一本の線を消すために
画面全体を消去してN-1本の線を復元しています。
あまり良い方法ではないと思うのですが、最後の線だけ消すと
その線と交わっている別の線も消えてしまうので仕方なくこうしてるんですが
いい方法ないですか?


672 名前:デフォルトの名無しさん :02/07/15 23:04
線引く前のイメージを保存しといたら?
差分を取るようにすれば相当圧縮が効くし。

673 名前:デフォルトの名無しさん :02/07/15 23:08
ベタ絵ベースのお絵かきプログラム?
ベクトルベースのお絵かきプログラム?

674 名前:デフォルトの名無しさん :02/07/15 23:11
>>672
私のプログラムでは好きな回数だけ前に戻れるようにしたいので
その方法ですとN個の線を描いた場合N個のイメージが必要になりますよね。
工夫すればイメージの量も小さくなるかもしれませんが、どうなんでしょう。

675 名前:671 :02/07/15 23:14
>>674
あ、671でした。

>>673
あまり詳しくないのでどっちと聞かれると困ってしまいますが
マウスの座標(x,y)を取得し、それを画面上に線として描画するだけの
プログラムです。答えになってるでしょうか・・・。


676 名前:デフォルトの名無しさん :02/07/15 23:17
>>675
BMPとかJPEGとかで保存するの?

677 名前:671 :02/07/15 23:20
>>676
いえ、今のところそのような保存は行わないです。
最初にお絵かきツールと書きましたが、主な使用目的は
簡単に線を書いたり消したりすることがメインです。
少し話が難しくなってしまいそうな表現でした、すいません。


678 名前:デフォルトの名無しさん :02/07/15 23:22
表示するのが線だけだったら、画像イメージ保存するよりは
線分の頂点を記録して再描画(つまり今やっている手段)が
むいているんじゃないかな?

679 名前:671 :02/07/15 23:26
>>678
そうですか、現在はおっしゃるように頂点を記録しているので
それを元に最初から復元するのは比較的容易です。
ただ、効率が悪いなぁと思いまして^^;。


680 名前:デフォルトの名無しさん :02/07/15 23:37
>>679
時間効率と空間効率は、しばしば相反する。トレードオフを探せ。

681 名前:デフォルトの名無しさん :02/07/15 23:38
>>679
両方組み合わせれば?
俺が今書いてるのは、基本はUndoの度に線を再描画して、
再描画にかかる時間が0.5秒を超えたらその状態を保持して
次からはそこから再描画するようにしてる

682 名前:679 :02/07/15 23:47
>>680
確かにトレードオフは重要ですね。妥協点を探します。

>>681
ある程度の処理時間がかかるところまで保存しておく方法ですね。
なかなか良さそうな方法なので簡単に実装できたらやってみます。


683 名前:デフォルトの名無しさん :02/07/15 23:51
burororororo

684 名前:666 :02/07/16 02:02
>>667
GetWindowProcessIdでいけました。ありがとう。

685 名前:デフォルトの名無しさん :02/07/16 04:37
エディットコントロールの最後尾に文字列を挿入すると
テキストの最初の方を見ていても、最後尾に移動してしまいます。
テキストを挿入しても、その場所に移動しないようにするには
どうしたらいいでしょうか?

686 名前:デフォルトの名無しさん :02/07/16 04:46
>>685
ハァ?

687 名前:デフォルトの名無しさん :02/07/16 04:56
>>685
自動スクロールオフ

688 名前:685 :02/07/16 05:01
>>687
自動スクロールオフとは?
ES_AUTOVSCROLなどは設定してません。

689 名前:カンで書いてみる人 :02/07/16 06:28
EM_SETCARET

690 名前:カンで書いてみる人 :02/07/16 06:30
はずした・・・

EM_SETSEL 0 0 とか

691 名前:デフォルトの名無しさん :02/07/16 10:57
置き換える前にEDITの先頭位置(S1)と、現在のセル(S2)の位置を記憶しておいて、
置き換え後に、S1にSETSELしてから、S2にSETSELでなんとかできん?

692 名前:デフォルトの名無しさん :02/07/16 17:06
http://www.nifty.ne.jp/forum/fdelphi/faq/00137.htm
などで、
SC_MOVE or 2
という指定になっていますが、なぜ2との論理和なのですか?
APIヘルプや、MSDNを見ても載っていなかったのですが・・・。

あと、出来ればReleaseCaptureについての詳しい解説もお願いします。

693 名前:デフォルトの名無しさん :02/07/16 21:53
>>692
2 は HTCAPTION です。

ReleaseCapture は SetCapture でキャプチャしたマウス捕捉を解除します。捕捉したままだと上手くいかないので、解除します。

694 名前:デフォルトの名無しさん :02/07/16 22:47
>>693
 あ!つまり、タイトルバーをつかんでいる様にしているわけですね!
だけどヘルプには論理和〜とか書いてないし・・・。しかも何故WM_NCHITTESTが?
何か、WinAPIの常識のようなものなんでしょうか・・・?
>ReleaseCapture
 なぜうまくいかないのですか?

695 名前:693 :02/07/16 23:56
>>694
SC_MOVE ... えーと。勘違い。適当なこと言ってました。
よく考えたらヒットテストコードなわけ無いですね(ヒットテストコードは21まであるし・・・ぐーぐると SC_MOVE|HTCAPTION とか出てくるのですが)。
これはなぜか2のようです。実際にタイトルバーをドラッグしたときに、Windowsから2が送られて来ます。よくわかりません。

ReleaseCapture ... なぜかキャプチャしてると実際に上手くいきません。キャプチャを解除してやると、なぜか実際に上手くいきます。そういうもんだと私は考えてますけれども、なぜかと言われると・・・なぜでしょう。

696 名前:694 :02/07/17 00:21
>>695
 そもそも何で論理和を取るのかが・・・。ヘルプに載ってないのに・・・。
一体どこに2を送る仕様とかについて書いてあるんでしょう?

 ・・・APIは謎の仕様が多いですね・・・。

697 名前:デフォルトの名無しさん :02/07/17 04:29
>>696
WM_SYSCOMMAND の WParam の SC_XXXX の定数定義はどうしてとびとび
の値になっているか、よーく考える。MS が公開してないメッセージが
たくさん飛び交っているのよ。

論理和ではなく、SC_MOVE+2 の数値が意味ある。

698 名前:デフォルトの名無しさん :02/07/17 19:50
FindWindow, FindWindowExで、
条件に一致するウィンドウが複数会った場合、どうなりますか?

699 名前:デフォルトの名無しさん :02/07/17 19:58
ハハーン。
In WM_SYSCOMMAND messages, the four low-order bits of the wParam
parameter are used internally by the system. To obtain the correct
result when testing the value of wParam, an application must
combine the value 0xFFF0 with the wParam value by using the
bitwise AND operator.

700 名前:デフォルトの名無しさん :02/07/17 20:38
>>698
その中から適当にどれか1個でしょう。

701 名前:デフォルトの名無しさん :02/07/17 21:39
LVS_OWNERDRAWFIXED | LVS_OWNERDATA で LVS_REPORT なリストビューを描画するとき、
WM_DRAWITEM の rcItem が微妙にオフセットずれるのって僕だけですか?
(0,0)から描画したいのに(0,2)とかになっちゃうんだけど。

702 名前:694 :02/07/17 21:56
>>699
 あ〜、つまり、タイトルバーをつかんでいると、
wParamの下位4ビットが、2になっていると言う事ですか・・・?

703 名前:697 :02/07/17 22:39
元質問の >>692 は Delphi ユーザだね。新規で以下のコードを試してごらん。
Form1 のタイトルバーをクリックしたり、ドラグすると SC_MOVE+2 が
WM_SYSCOMMAND の wParam として送られてくるのが分かるだろう。これを
コードで送って、枠なしフォームをドラグするわけね。

type
 TForm1 = class(TForm)
  ListBox1: TListBox;
 private
  { Private 宣言 }
 public
  procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SYSCOMMAND;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
 ListBox1.Items.Add(IntToStr(Msg.CmdType-SC_MOVE));
 inherited;
end;

704 名前:デフォルトの名無しさん :02/07/17 22:58
C言語の基本的なことを理解しただけの者デス。
Windowsアプリケーション作成しようと思ってAPIが必要という事が分かりました。
MFCは使わない方向です。
貴方の使用しているorお勧めする参考書籍おねがいします。。。

705 名前:デフォルトの名無しさん :02/07/17 22:59
>>704
検索すればその辺にコード転がってるだろ。

706 名前:デフォルトの名無しさん :02/07/17 23:06
MFC使え。

707 名前:デフォルトの名無しさん :02/07/17 23:29
>>702
たまたま2だけど2だと決め付けたコーディングは行儀が悪いと書いてるの。
読解力のない奴にいくら言っても無駄だが

708 名前:デフォルトの名無しさん :02/07/18 00:39
QueryServiceConfig2 と ChangeServiceConfig2 を使って、既存のサービス内容を
表示したり変更したりするアプリケーションを作成しています。

QueryServiceConfig2 に SERVICE_FAILURE_ACTIONS オプションをつけて、
サービスの回復設定情報を取得すると、
LPTSTR lpRebootMsg;
LPTSTR lpCommand;
の2つのデータだけ異常なデータが入ってきます。
ms-help://MS.MSDNQTR.2002APR.1041/dnw2k/html/shc.htm のサンプルを
コピペしたものでも同じく期待した文字列のアドレスじゃないデータが入ります。

もうひとつ。。。
ChangeServiceConfig2 に SERVICE_FAILURE_ACTIONS オプションをつけて、
サービスの回復設定情報を設定すると、SC_ACTION の SC_ACTION_TYPE が
SC_ACTION_REBOOTのときだけアクセスが出来ないエラーがLastErrorに入ります。
たとえば、SC_ACTOINを配列で複数設定した場合、タイプにリブートが1つでも
入っているとエラーになります。リブートが入ってない場合は正常に書き込まれます。
OpenSCManagerはSC_MANAGER_ALL_ACCESSで開いています。

どなたか、上記APIで正常に取得出来ている人はいませんでしょうか?


709 名前:デフォルトの名無しさん :02/07/18 03:16
子ウィンドウを作ってボタンをいくつか配置し、簡単なツールバーを作ろうとしています。
ところが、メインのウィンドウは生成できるのですが、
子ウィンドウを生成するときにCreateWindowEx()に失敗します。
問題のソースは大体下のような感じなのですが、
なぜCreateWindowEx()は失敗してしまうのでしょうか?
どなたかわかる方がいましたら、よろしくお願いします。

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){

case WM_CREATE: // メインのウィンドウのWM_CREATEメッセージ
 // RegistClassは内部でRegisterClassExを呼び出す関数
 if(!RegistClass(hInst, ToolWndProc, "ToolWnd", NULL)){ // hInstはWinMainの第1引数のコピー
  MessageBox(hwnd, "RegisterClass関数失敗", "ツールウィンドウ", MB_OK);
  break;
 }
 htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
  WS_CAPTION, 10, 10, 128, 64, hwnd, (HMENU)1000, hInst, NULL);
 if(!htool){
  MessageBox(hwnd, "CreateWindowEx関数失敗", "ツールウィンドウ", MB_OK);
  break;
 }



710 名前:デフォルトの名無しさん :02/07/18 03:19
ごめんなさい、ごめんなさい、ごめんなさい!

711 名前:どおすればいいんだ :02/07/18 04:18
http://www.gamecreators.net/
げげ!!!!!

712 名前:デフォルトの名無しさん :02/07/18 05:30
>>709
RegistClassの中身をみせろ。

713 名前:デフォルトの名無しさん :02/07/18 07:36
>>709
(1) InitCommonControls()は?
(2) ツールバーの作成にはCreateToolbarEx()を使うのでは?
(3) CreateWindowEx()を使うのなら
CreateWindowEx(0,TOOLBARCLASSNAME,NULL,WS_CHILD,0,0,0,0,hwnd,ID_TOOLBAR,hInst,NULL);
かな?
参考→ttp://www.kumei.ne.jp/c_lang/index_sdk.html

714 名前:デフォルトの名無しさん :02/07/18 08:25
>>709
(MENU)1000 ← これってツールバーにメニューがあるって事?

715 名前:デフォルトの名無しさん :02/07/18 08:43
WM_NOTIFYのときに送られてくるIDじゃなかったっけ?
シンボルブラウザからつくるかせめて
#define MyToolBar 1000
とかしてほしいけどな。

716 名前:デフォルトの名無しさん :02/07/18 09:35
>>695
WINEのソースみるとヒットテストコードとして扱ってるみたい。

717 名前:デフォルトの名無しさん :02/07/18 10:16
>712
すみませんです。
RegistClass()は下のようになっています。

int RegistClass(HINSTANCE hinst, WNDPROC proc, const char *classname, const char *menuname)
{
 WNDCLASS wc;
 wc.style     = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc  = proc;
 wc.cbClsExtra   = 0;
 wc.cbWndExtra   = 0;
 wc.hInstance   = hinst;
 wc.hIcon     = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor    = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
 wc.lpszMenuName  = menuname;
 wc.lpszClassName = classname;
 if(!RegisterClass(&wc)) return 0;
 return 1;
}

718 名前:709 :02/07/18 11:41
たびたびすみません。
過去に作った同様の方法で子ウィンドウを生成するプログラムのソースと比較してみました。
そして、1行1行切り詰めていって、普通のウィンドウと子ウィンドウを表示するだけの
プログラムにまでした結果、以下のようにすると子ウィンドウがきちんと生成できました。

これを・・・
htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
 WS_CAPTION, 10, 10, 128, 64, hwnd, (HMENU)1000, hInst, NULL);
こうする。
 htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
  WS_CAPTION, 10, 10, 128, 64, hwnd, NULL, hInst, NULL);

第10引数をNULLにしました。
子ウィンドウの生成ではここにはIDを指定しろというのに、なんか腑に落ちません。
さらに、これで原因がわかったと思って、切り詰める前のプログラムに同様の処置をしたところ、
依然として子ウィンドウの生成に失敗してしまいます。
この第10引数を使うには他に手続きとかいるのでしょうか?


719 名前:デフォルトの名無しさん :02/07/18 11:58
子ウインドウの生成というなら、WS_CHILDの指定はどうした?

720 名前:709 :02/07/18 12:24
>719
WS_CHILDってつけたら、
確か親ウィンドウの枠の外に出られないウィンドウになりますよね?
それだとツールウィンドウとしては不便なのではずしています。

721 名前:デフォルトの名無しさん :02/07/18 12:26
たしかNTのSP3あたりでパラメータチェックがいきなり
厳しくなってメニューハンドルが有効じゃないと
ウィンドウが作成されなくなったりしたんだよな

722 名前:デフォルトの名無しさん :02/07/18 12:27
>>720
WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ

もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
区別がついてないのかな。これをごっちゃにしてる人は
驚くほど多い。

723 名前:701 :02/07/18 12:47
つーか >701 ですが、どなたかおわかりになりませんでしょうか?
ウインドウ作る部分正確に書いときますね。

hwndListView = CreateWindow(WC_LISTVIEW, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSCROLL |
LVS_OWNERDATA | LVS_OWNERDRAWFIXED | LVS_NOCOLUMNHEADER,
0, 0, 0, 0, hWnd, (HMENU)IDC_LIST, hInstance, NULL);

こう作って WM_DRAWITEM を受けて DRAWITEMSTRUCT を参照しつつ描画
しようとすると、rcItem のY座標が 2 ピクセルずつ下にずれているんです。。。


724 名前:709 :02/07/18 13:16
>722
>WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ
>もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
>区別がついてないのかな。
どうも区別ついてなかったようです。

CreateWindow()に親ウィンドウハンドルをつけてウィンドウを作るときに、
・さらにWS_CHILDをつけると「子ウィンドウ」になる。
・WS_CHILDなしで呼び出すと「所有されてるウィンドウ」になる。
ということですね?
ひとつ、物知りになれました。ありがとう。

725 名前:708 :02/07/18 13:26
>>708の自己レスです。
ChangeServiceConfig2 のエラーは解決しました。
シャットダウン特権を与えていなかったのが原因でした。

QueryServiceConfig2 のほうは、まだ解決してません。
引き続き調査を続けています。
現在は、レジストリから直接取得といった方法でお茶を濁しています。
どなたか、うまく取得できているかたは、いらっしゃいませんでしょうか?


726 名前:デフォルトの名無しさん :02/07/18 14:16
とんでもない質問するよ?

727 名前:デフォルトの名無しさん :02/07/18 15:09
nani?

728 名前:デフォルトの名無しさん :02/07/18 16:45
Tabブラウザみたいな物を作っているのですが、
Tabコントロールの子ウインドウとしてウインドウを作ると、
ウインドウのリサイズ時にどうしてもちらついてしまいます。

CS_HREDRAWとCS_VREDRAWをスタイルから除去すると
ちらつきも消えるのですが、今度はTabコントロールの描画がおかしくなります。
何かイイ対処方法無いでしょうか?

729 名前:デフォルトの名無しさん :02/07/18 17:25
子供にするのやめたら?

730 名前:デフォルトの名無しさん :02/07/18 17:58
WS_CLIPCHILDRENを付けれ

731 名前:デフォルトの名無しさん :02/07/18 18:06
>>730
勿論付けてます。


732 名前:デフォルトの名無しさん :02/07/18 20:43
APIというかMFCというかなのですが…。
ローカルファイルを検索する関数、CFileFindのFindfile関数を使うと、そのフォルダ内
のファイルは検索できるのですが、ドライブ全体のファイルを検索したい時は
どうすればいいのでしょうか?なにか関数があるのですか?
なにかよい方法を教えていただけたらうれしいです。

733 名前:デフォルトの名無しさん :02/07/18 21:07
MFCは専用スレがあるからそっちで聞け。
マルチポストだったら頃す

■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/test/read.cgi/tech/1021620974/l50

734 名前:732 :02/07/18 22:06
すいません。気づきませんでした。そちらで聞いてみます。

735 名前:デフォルトの名無しさん :02/07/19 00:21
>>723
何と比べて2ピクセルずれてるの?
先頭の項目でrcItem.topが0でないってことだったら、
単純にリストビューがその分余白をとってるだけでしょ。
細かいこと気にせず、「ここに描いてね」と言われた所に
素直に描画しる!

736 名前:701 :02/07/19 02:18
>>735
レスTHX.

何と比べてって、リストビューのクライアント領域の上の端。
まさに先頭の項目で rcItem.top = 2 になっちゃうのです。

確かに単純に余白取ってるっぽいんですけど、
俺様が描くのだモードなのに何で勝手に余白取るのよ〜
ぴっちりと詰めて描きたいこともあるだろうに。。。
余白は取りたい奴が取ってくれよ〜
おかげで上は隙間ができるし、下は2ピクセル分切れちゃうんだよ〜

んで、やっぱこれって余白なんでしょうか?
0 にできないもんなんでしょうか?>識者の方

できないのならサブクラス化して隙間に描画するようにせんとしゃーないかな、やっぱ。

素直じゃない僕ちゃんでした。

737 名前:デフォルトの名無しさん :02/07/19 02:23
オーナードローというのは各アイテムの描画をクライアント(オーナー)に任せる物だから、
リストビューすべてをカスタマイズするという用途に使う物ではない。

738 名前:デフォルトの名無しさん :02/07/19 02:54
>>736
隙間ができて困るリストビューって……何か間違った使い方をしてそうな予感。
まあ、ダメモトでLVM_SCROLL送りつけてみれ。それでダメだったら、
別のウィンドウの子ウィンドウにしてしまって、上にちょこっとずらして収納するとか。

739 名前:デフォルトの名無しさん :02/07/19 08:51
すいません!ちょっと質問いいですか?
コントロールパネルの「サウンドとマルチメディア」ってやつで、オーディオ→優先するデバイスってあるじゃないですか。
あれを変更するプログラムを作りたいんですが、技術的に可能なんでしょうか・・・
教えてください!お願いします。

740 名前:デフォルトの名無しさん :02/07/19 10:34
ビデオからの入力画面をcapFileSaveDIB使ってBMPに保存したところ、
インターレース(奇数ラインと偶数ラインがずれている)になっているのですが、
ノンインターレースで保存する方法はありますか?


741 名前:デフォルトの名無しさん :02/07/19 11:03
無い。
自分で処理汁

742 名前:デフォルトの名無しさん :02/07/19 11:22
電信八号のログ表示みたいに計算過程をリアルタイムで表示する機能をつけたいのですが、
どのようにすればいいでしょうか?

ダイアログボックスにエディットボックスを貼り付けてそこに表示させることをかんがえたのですが、
次々と表示するようにはできません。表示する文字列を毎回更新してそれを一度に
表示させるしかないのでしょうか?追記できれば楽なんですが…

743 名前:デフォルトの名無しさん :02/07/19 11:32
>>742
超Fuck
EM_SETSEL->EM_REPLACESEL

744 名前:デフォルトの名無しさん :02/07/19 12:44
>>743

超FAQでしたか…すみませんでした。
それでもレスしてくださってありがとうございました。
早速やってみます。

745 名前:デフォルトの名無しさん :02/07/19 14:03
拡張コンボボックス(CBS_DROPDOWN)なんですが、
CB_LIMITTEXT や、CB_GETEDITSEL したときの挙動が
どうも二バイト文字も一文字と勘定してくれてるみたいなんですが、
これって漏れだけ?

例えば SendDlgItemMessage(hDlg, IDC_COMBO, CB_LIMITTEXT, 10, 0) とすると
半角でも全角でも10文字入ってしまいます。
また、エディットボックス内に「あいうえお」と入力し、「う」だけを選択した状態で
SendDlgItemMessage(hDlg, IDC_COMBO, CB_GETEDITSEL, &start, &end)
とやると、start = 2、end = 3 となってしまいます。

どうすりゃいいんだYO!

746 名前:デフォルトの名無しさん :02/07/19 14:24
_UNICODEを定義しているとか?

747 名前:745 :02/07/19 15:07
>>746
してないけど、ちなみに 2000 だから?
確かに spyxx で除くと(Unicode)ってなってる。
そうかと言って CBEM_SETUNICODEFORMAT を 0 にしてみてもダメだったけど(泣

748 名前:デフォルトの名無しさん :02/07/19 17:08
明示的に〜Aを呼び出してみたら?

749 名前:デフォルトの名無しさん :02/07/19 17:54
そういう仕様なんじゃないの? MSDNにも
> Specifies the maximum number of characters
と書かれてるし(number of bytesではない)。

750 名前:740 :02/07/19 21:27
>>741
レスどうもです。
仕方がないので、当面妥協しておきます(汗



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