■ VisualC++(MFC限定)相談室 2■

このエントリーをはてなブックマークに追加
1MFC
Managed Code?知らん!

前スレ ■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/test/read.cgi/tech/989902845/
2956:01/12/11 10:45
>957
おお、立てやがった!?
でも話題とか特に無いんだよな〜
・・・質問できるまで消えないでね。
3デフォルトの名無しさん:01/12/11 11:01
じゃあ質問。unixのmanコマンドは女性差別ですか?
4デフォルトの名無しさん:01/12/11 11:16
とりあえず954の回答を待とうや
5デフォルトの名無しさん:01/12/11 12:25
質問です。
ある一定時間だけループさせたい場合、やはりCTimeとか、CTimeSpanとかで
経過時間を利用しか無いですか?何かシンプルな方法があったら教えてください。

あと、wait(BASICにあった気がする)みたいなひたすら待つような命令って無いすかねぇ?
SetTimerとかSleepとか。
75:01/12/11 13:42
>>6
ありがとうございます。

waitの変わりとしてSleepは使えそうです。
ところでSleepってシングルスレッドでも使えますよね?使う意味の有無は別として・・・
8質問者:01/12/11 16:46
>EnableWindowでできますよ。
>ボタンに割り当てる画像(操作不能時)のリソースIDを
>"hogehogeX" にしてますよね?

からかわれてると思ったけど、いいヒントになりました。
いやー、さすがに2チャンネル風回答ですね。
>>7
できるけど、ウィンドウ持ってるスレッド眠らせると、
ユーザには凍ってるようにしか見えんぞ。
105:01/12/11 18:24
>>9
OKです。凍らせます。
一応、ループ中にCPU占有度を下げる目的でやってみようかと思います。
11デフォルトの名無しさん:01/12/11 19:24
>>8
普通に答えたんだけど……
12デフォルトの名無しさん:01/12/11 23:37
フルカラーのビットマップをビットマップリソースとして
登録して、CTreeCtrlにくっつけて使ってるのですが、
16色になってしまいます。何がわるいのでしょうか?
>>12
オマエが悪い。
14デフォルトの名無しさん:01/12/12 00:42
MFCでMD5みたいなハッシュ関数を使いたいのですが、
どうやればいいのでしょうか?
15デフォルトの名無しさん:01/12/12 00:46
RTFの何番かに関数がありましたよ。
16デフォルトの名無しさん:01/12/12 01:28
RTFって何?
17デフォルトの名無しさん:01/12/12 01:29
>>16

Run Time Functions
>>16
Rich Text Format
RFCじゃった。
20デフォルトの名無しさん:01/12/12 04:06
eの値を小数点以下100桁まで求めるプログラムと
πの値を小数点以下100桁まで求めるプログラムを教えてください。
マルチポストウザ氏ねヴォケ
22デフォルトの名無しさん:01/12/12 12:28
質問です。
CStringの文字列をFormatなどでまとめて16進表記したいのですが
どうすればいいのでしょうか?やはり1バイトずつ%Xするしかないのでしょうか?
2322:01/12/12 15:58
レス無いので、勝手に不可能と断定しました。
ループまわして1文字ずつやっていきます。
24デフォルトの名無しさん:01/12/12 22:03
エディットコントロール(CEdit)のキャレット位置の取得/設定って可能?
2524:01/12/12 22:39
下のようにして一応できたが、こうするしかないわけ?
(あ、エディットコントロールはシングルライン)

CEdit* m_edit;

UINT GetPos()
{
POINT point;
::GetCaretPos(&point);

return LOWORD(m_edit->CharFromPos(point) );
}

void SetPos(UINT pos)
{
POINT locate = m_edit->PosFromChar(pos);
::SetCaretPos(locate.x, locate.y);
}
26デフォルトの名無しさん:01/12/12 22:55
>>24-25
GetSel / SetSel で出来なかったっけ?
27デフォルトの名無しさん:01/12/14 14:35
ダイアログを使わずに、親ウィンドウ+子ウィンドウ×複数を
表示させて、エセチャットみたいなのを作りたいのですが、
イマイチよく分かりません。ヒントだけでも教えてもらえると
うれしいです。
SDIで作れば良いのは分かったけど、親ウィンドウから
子ウィンドウを呼び出す方法が分からない。
28デフォルトの名無しさん:01/12/14 14:50
>>27 とりあえずどんなコード書いたか見せてみ。
29デフォルトの名無しさん:01/12/14 15:47
割り込み質問で申し訳ないです。

CWndクラスのタイトルバーの部分のみのサイズ(上下)を取得するには
どうすればよいのでしょう?
デフォルトは18ピクセルだと思いますが、デスクトップのプロパティで
変わってしまいます。
>>29
int n = GetSystemMetrics(SM_CYCAPTION);
31デフォルトの名無しさん:01/12/14 16:25
>>30
ありがとうございます。
32色数を知るには?:01/12/14 23:26
Windowsプログラム実行時にシステムの表示可能色数の設定を調べる事はできるんでしょうか?
コントロールパネルの画面設定でやる256色とかHighColorとかTrueColorとかの現在の設定を知りたいんです。
スレ違いだったらゴメンなさい。
EnumDisplayDevices
EnumDisplaySettings
GetDeviceCaps
辺り
34デフォルトの名無しさん:01/12/15 01:13
CDCのオブジェクトからDIBを取得するにはどうすればいいですか?
CDCってカメラ?
>>35
それは CCD。
ここのスレ役立ちますね
回答しておられるかたには、フリーでご活躍のプログラマーさんも
いらっしゃるのですか?
3834:01/12/15 02:42
自己解決しました。どうもです。
GetDIBits()を使うと出来ました。一応ログとしてかいとく

GetDIBits()にはパラメータは以下を与える。
・取得したいCDCのhDC(pDC->GetSafeHdc())
・そのDCのビットマップハンドル((HBITMAP)pdc->GetCurrentBitmap().m_hObject))?←ホントはもっと違うやり方をした。
・BITMAPINFO構造体(ここにサイズとかカラー情報をこちらで指定してやる。これがフォーマットを指定するという事らしい)

そして以下を受け取れる
・LPVOID型のlpvBitsにこちらが指定したカラー情報にあったフォーマットでデータがセットされる
・lpvBitsにNULLを指定した場合はBITMAPINFO構造体に値を入れてくれるらしい

そのあとは・・・
・このデータを加工したりしてあそぶ。

※フォーマットが24ビットでプレーン数1だとgrb、grb・・・と1ドットづつgrbの順で埋められるらしい。しかも上下逆?
3934:01/12/15 02:47
ごめん。grbじゃなくてbgrの順だった

ところでなんかさぁ・・・MFCでもSDKでも何を渡して何を得られるのかいまいち判りづらくない?
MSDNってそういうことちゃんと書いてないよね。
HBITMAPとかCBitmap::m_hObjectとかさぁ、なんかたくさんあるけどどれとどれが同じだとかサパーリわからんよ。
>>38
上下ひっくり返るのはDIBの特徴ですな。
ファイル形式とか解説した本とかによく載ってる。
Bitmap周りに関しては、MSDNの記述がどうこうよりも、
地道に弄り回してknow how得るくらいしか手はない、
と個人的には思う。

参考になる所としては、
http://www.sm.rim.or.jp/~shishido/windows.html
とかは個人的にお勧め。
>>40
トップダウンのDIBも(今は?)作れるでしょ。
アクセス速度的にはトップダウンのほうが有利だとかどこかで見たような
気がするけど実際どうなんだろう?
どうでもいいけど全然MFCの話題じゃないな(w
>>41
BITMAPINFOHEADERのbiHeightを負にするとトップダウンになるね。
気にしてなかったから、いつからできるようになったのかは知らんけど。

# そういやその昔、WinGインストール時に、
# トップダウン有利かボトムダウン有利か、
# 実際に描画してベンチマークしてる節があったっけ。

>どうでもいいけど全然MFCの話題じゃないな(w
そうだね(w
でもまあ、CBitmap使うにしても必要な事項ではあるということでsage。
43デフォルトの名無しさん:01/12/15 19:43
あるフォルダ/ファイルに対して現在ログオンしているユーザに
書き込み権限があるかどうかを判断するにはどうすればよいでしょうか。
実際に何か書いてみるとか。
45デフォルトの名無しさん:01/12/15 23:04
ツリーコントロールに表示するビットマップが16色になってしまいます。
256色とか使えるようにするにはどうしたらいいでしょうか?
4643:01/12/15 23:12
>>44
便利なAPIとか無いかなーなんて。
とりあえず書こう…
このスレ便利ですね
48デフォルトの名無しさん:01/12/16 02:06
MFCのCProgressCtrlを使って自作ツールに
データを読み込んでいる間、プログレスバーを表示させ、
データ読み込み時間に応じてプログレスバーの位置を
変化させる機能を実装させたいと思ってます。
一般的なアプリケーションで行っているあの機能です。

CProgressCtrlのサンプルはいくつかネットで探したのですが,
プログレスバーの位置をデータ読み込み時間に応じて
変化させるという方法がわかりません。

上記の件についてご存知の方いれば,
教えてもらえると助かります。よろしくお願いします。
49デフォルトの名無しさん:01/12/16 02:30
>48
なんで進捗率じゃなくて読み込み時間に応じて変化させる
必要があるのかは知らんが、やりたいんなら時間毎にプログレス
バーを更新させればいいだけだろ。
50デフォルトの名無しさん:01/12/16 02:48
初めまして。
さっそくですが、質問を。

先日めちゃイケを見ていて、(浜口イイ!)
果たして、俺は一日にどれだけマウス(ポインタ)を移動させているのか?
気になりました。

タイマーを利用したのは作成できました。
しかし、移動していないのにGetCursorPos()を使って現在位置を得るのは、
いささか間抜けです。

ダイアログ外でのマウスの位置を「マウスの移動」によって、
ゲットしたいです。いい案を乞います。
51デフォルトの名無しさん:01/12/16 02:58
>50

キャプチャーすれば?
フックすれば?
52デフォルトの名無しさん:01/12/16 03:54
MFCの入門書をいくつか読みました。
だいたい基礎的なことはOKになったので、MFCのテクニック的
なこととか、ネットワーク回りについて勉強したいと思ってい
ます。そうした場合のお勧めの本って何かありますか?
53デフォルトの名無しさん:01/12/16 11:06
どいつもこいつもレベル低いな。
MFCのソースついてるんだから解析して理解しろ。
>>52
推薦書籍はスレ違い
55デフォルトの名無しさん:01/12/16 16:05
>>53
あるクラス(例えば、CButton)のソースを検索するにはどうしたら
よいのですか?
実際のヘッダですら、afx〜〜.hなどで定義されているし、規則性が・・
56デフォルトの名無しさん:01/12/16 16:09
>>55
"CButton" でgrepすればよかろ。
57デフォルトの名無しさん:01/12/16 16:31
ここって、前はもっとレベル高い人がいたのに、
今じゃ簡単な質問にもまともなレスがないね・・・
けっこう人へったんじゃねーか?
59デフォルトの名無しさん:01/12/16 17:07
>>55
デバッガでトレースすれ。
>>59
アフォ?
>>57
あんたみたいなのがいるからな(w
62デフォルトの名無しさん:01/12/16 22:14
CHtmlViewクラスにページを表示する時はNavigate2関数を使用
すればいいというのは分かったのですが、この方法だとファイル
かwebの情報だけしか表示できません。

プログラム中で処理されたHTML等を直接表示するには一度ファイル
に書き出し、Navigate2関数で呼び出す方法しかないのでしょうか?

CString型のクラスに入っているHTMLのテキストを直接表示させる
方法等があれば教えてください。

よろしくお願いします。
msdnを探せば確かあるはず。
about:blankがキーワードだ(不確か)
64デフォルトの名無しさん:01/12/17 00:24
>62

COMを勉強しろ。
IEがどのようにしてできているかがわかる。
COMを直接いじればIEは自由自在に操れる。
65デフォルトの名無しさん:01/12/17 00:30
IHTMLDocument だっけ?
ただ、62 のスキルではちょっと難しいかもね。
6662:01/12/17 00:34
>>64
COMを勉強している時間があまりないので、、、
何かサンプルがあったら教えてほしいのですが、、、
67デフォルトの名無しさん:01/12/17 00:40
>>66

たかが2chごときで真剣に教えてもらおうとするな。
COBOLやJAVAに、難しい知識は不要です。
>>66
> COMを勉強している時間があまりないので、、、
だったら金払ってプロのプログラマに頼め。
70デフォルトの名無しさん:01/12/17 00:54
68 が何を言っているのかがわからん
7148:01/12/17 01:01
>なんで進捗率じゃなくて読み込み時間に応じて変化させる
>必要があるのかは知らんが...
CProgressCtrlで進捗度(データを読み込んでる進捗度)
 を反映させる方法が知りたいです。
 説明不足でした。よろしくお願いします。ぺこりん。
72デフォルトの名無しさん:01/12/17 01:04
>>71

SetPos じゃだめなのか?
>62
IE使ってる2chブラウザのソースでも眺めれば〜
大抵ソースはでるはいだけどな(ワラ
7462:01/12/17 02:41
>>73
デルファイはよくわからないのです。。。
しょうがないので、一度ファイルに出力してやるようにします。
トホホ、、、
7548:01/12/17 03:22
>SetPos じゃだめなのか?
 SetPosでプログレスバーの位置を指定できるのは
 分かるのですが,進捗度(データ読み込みの)を
 取得する方法がわからないです。よろしければ
 教えて下さい。
おもしろレスが思いつかないので放置
マジレスしてやれよ・・・
進捗度が‰だとするなら、1000*read_length/total_lengthでわかるだろ。
あとは、SetRange(0,1000)しといて、SetPos( Permil )で
いけるんやないのか。

あー、しかし、「読み込み時間に応じて」いうのが引っかかるな。
いつ終わるか、いうんは、予測するしかないわけで、read_speedを
ひっぱってきて、(1000*read_time/(total_length/read_speed))でも
使おういう話なんか?
79ネット初心者再び:01/12/17 05:51
また達人達に質問します、、

いまCSocketを使ったクライアントとサーバー作って、ファイル転送機能つきチャット作ってますが、
クライアントがログインする時に自分のデータ(名前などいろいろ 約5行)を送りますが、
sendで送ってったら、 相手のほうが受信する時、それを同時に受信してしまった(分かりにくくてすみません
{詳しい説明:
例えば、サーバーはクライアントがログインした直後、sendは別々に、4回送った()
1回目 /server xxxxxx
2回目 /name xxxxxx
3回目 /otheruser xxxxxx xxxx xxxx
4回目 /tekitou xxxx xxxx
んでクライアント側がなぜか
"/server xxxxxx /name xxxxxx/otheruser xxxxxx xxxx xxxx/tekitou xxxx xxxx"
と言う風に、全部一気に受け取った。 これじゃコマンドの解析が不可能になるからかなり困る、、

CSocketはブロッキングとかいう機能で、送った後相手が受け取らない限り返ってこないと言う風に
見えたが、勘違いしたのかな?
そして、なにか妙案あればぜひ伝授していただきたい、お願します。
#コマンド受け取ったあと返事して、また送ればいいが、多少面倒なので、、、
80ネット初心者再び:01/12/17 06:07
質問するだけでちょっと悪いかなーと思ったので笑える話ひとつ。
さっきの質問の奴、6時間以上も詰まってやっと気付いた。どうだ、こんな笑えるアホなかなか居ないだろう。
81ネット初心者再び:01/12/17 06:15
あ、、眠いから何かいてるかわけわからない、、、
ローカルだとどうやらマシン早いのかなんかの理由で、全部別々に受信してくれるから正常に動く、でも
ノート(セレロン650)だと4回のコマンドが2回にまとめられる。ネットになると、全部で一行。ネットむずかしいねー
ムキになって虫取ろうと頑張ったがもう限界、、、お休み、、
(゚Д゚)ハァ?つか、ネットワークについて、理解が不足しているな。
sendや、その下のTCP/IPスタック、OSがどういう風にpacketを飛ばすかは、
あんたの自由にはならないの。どうしても自由にしたかったら、UDP使えば〜。

普通は、デリミタをつけるとか、メッセージ長をつけるとかするけどな〜

>CSocketはブロッキングとかいう機能で、送った後相手が受け取らない
>限り返ってこないと言う風に 見えたが、勘違いしたのかな?
OS・ドライバ・プロトコルスタックのバッファはどうなる。
83ネット初心者再び:01/12/17 10:38
ふむ、、 つまり、CSocketは相手が受け取らないと帰ってこないのはそうだが、ハードウェアやOSが
受け取ってバファに入れるからソケットが受け取る時は一緒になると言うことですね?
ちゃんと考えれば分かるのにおれの馬鹿(ToT) レスありがとうございました。
84ネット初心者再び:01/12/17 13:36
えーと、メッセージ処理全部直してうまく動くようになったが、不可解な現象が起きてます、、
デバッグビルドでは正常に動くプログラムが、リリースビルドでは凍って動かない。リリースなのでなんで落ちたか分からないし、、
しかも、VCの中で実行ボタン押して実行すると、正常に動く。
わけわからない質問ですが、このような症状起きた場合まず何見ればいいでしょうか?
85・・・:01/12/17 13:43
>>83
本当に分かったのか?端からみてても訳わかんないぞ。
CSocketっていうか、ストリーム転送してるだろ?レコード境界がないってMSDNに書いてなかったか?
もう対策が分かったならいいが。
自分の能力の限界をわきまえて、debug版で配布すれば〜。
凍ったところで、VCでプロセスアタッチして、機械語の中を
はいずり回れば〜。
リリース版にデバッグ情報でも混ぜ込めば〜。
87デフォルトの名無しさん:01/12/17 15:12
CSplitterwndでCEditを1stペインにすると、X軸のスクロールバー
がなくなる。MSDNでもおかしくなるからやめとけみたいなことが書いてあるのですが、
そこをナントカうまくやる方法ないですかね?要はスクロールバーがほしいのですが・・
88いっぱいいっぱい:01/12/17 15:20
mafxcrd.lib : ライブラリが見つかりません
というエラーメッセージが出てしまうのですが、どうすればなおるのか
わかりません、どなたかご教授くださいお願いします。
8987:01/12/17 15:51
・・・・。
解決しました。しかも結構あっさりと。
かなりはずかしいので、とりあえず消えときます。
9087:01/12/17 15:55
消えとくと書いといてナンですが、訂正(いまさら)
誤)CSplitterwndでCEdit

正)CSplitterWndでCEditView

失礼しました。今度こそ消えます。
91デフォルトの名無しさん:01/12/17 15:58
>>88
まずは検索。
>>86
デバッグ版は配布しちゃいかんよ
配布禁止なのは、デバッグ版DLL(MSVCRTD.dll等)だけなんじゃ
なかったっけ?
そうだけどそれないと動かないし
スタティックリンクすれば?
96デフォルトの名無しさん:01/12/17 18:56
素のWin98はmsvcrt.dllをシステムディレクトリから読むようですが、
カレントディレクトリにあるdllを使うようにはできんでしょうか。
Second Editionからなら.local等で何とかなることはわかったんですが。
>>95
それで配布していいの?
つーかそんなでかいのDLしたくない(;´Д`)
98デフォルトの名無しさん:01/12/17 19:12
再頒布可能なDLLをアプリケーションに取り込むことはできないのですか?
MFCスタティックリンクみたく。
>97
でるはいのソフトつかったことない?
それに、サイズなんて圧縮すりゃそんなにかわらないよ。
>>99
なぜでるはい?
10132:01/12/17 22:48
33番の名無しさんありがとうございました。
おかげさまでうまい事できました。
>>98
見た目の誤魔化しでよけりゃあ、あるよ。
103デフォルトの名無しさん:01/12/18 02:45
>>102
どんな?
104デフォルトの名無しさん:01/12/18 11:06
CViewのメンバ、OnUpdate(protected)をpublicにしちゃった者です。
なんか弊害ありますかね?
105105:01/12/18 16:24
簡単なことで恐縮ですが、
ダイアログでエディタボックスを使ってデータ結果を表示したいのですが
どういう風にプログラムを作ればいいのかわかりません。
どうすればいいのでしょうか?
>>105
猫にも劣るヤツ
107デフォルトの名無しさん:01/12/18 16:50
>>105 いいから入門書一冊買え。
ダイアログとエディットボックスが表示できるようになってからまた来い。
108デフォルトの名無しさん:01/12/18 22:26
Bitmapを読み込むときにHBITMAPとかいろいろ使うじゃないですか。
それを、最終的にはCBitmapクラスに格納したいんですけど、
方法知っておられますか?
>>108
CBitmap だけでなく、基本クラスのメンバを見てみ。
>84 の問題でいろいろいじって、エラー処理して、無限ループなども注意してやっても、やっぱりだめ。
とりあえずおかしいことに、VCの中で実行ボタンを押すと正常に実行できるが直接そのファイルを実行すると
無限ループ突入。VCのなかの実行ボタンは実行する以外なにか特別な処理でもしてるのでしょうか?
卒研だからべつに人前で実行できればいいからリリースにしなくてもいいが、どうしてもきになるので、、、
>110
無限ループ中にプロセスアタッチしてみろ。
すみません、プロセス アタッチはなんでしょうか、、、?検索してもわからない、、(汗
凍ってCPU100%になるが落ちないのでわけわかめ。
>>105
ダイアログクラスに、EditBoxに対応するCEdit型のメンバを追加して、
そのメンバを経由してアクセスすればいいよ。かんたんかんたん。

ところで、なんで簡単なことだって知ってるのかしらん?
>112
VCなら、ビルド->デバッグの開始->プロセスへアタッチ。
>114
VCの中の実行ボタンだと正常に実行されるから困る、、、ま、いいか。放置(;´Д`)
だからー。プロセスへアタッチは、VCで実行してない
プロセスを取り込む、って事。
ふつーにプログラムを実行して、dだところで、
VCを立ち上げ、プロセスへアタッチするの。
>>102はどこ逝った?
俺も興味あるんだけどな〜。
あれだろ。リソースなんかに埋め込んで、実行時にテンポラリファイルに
書き出して、LoadLibraryする、っていう方法じゃないのか?
最近だと、かちゅ〜しゃプラグインのkage.exeあたりが使ってるな。
(あれはあれで、実行時メモリ書き換え&スタック実行なんかが
混ざってて、結構おもしろい。)
>>118
なるほど・・・確かにごまかしだな。
まあ、アーカイブを展開したときに余計なDLLを見せないっていう
利点にはなるけど。
ListViewに表示されているリストの内容を取得するという
部分を作っているのですが、リストの内容の取得方法が分からず
難儀しています。

void CxxxView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
 HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
 // TODO: この位置にコントロール通知ハンドラ用の〜〜
 CListCtrl& List = GetListCtrl();
 CxxxDoc *pDoc = GetDocument();
 LVITEM itm;
 List.GetItem(&itm);
 Doc->CSName = List.GetItemText(itm.iItem,0); //CString CSName

 最初の内、このようなやり方で取得できるだろうと思っていたのですが、
ListCtrl::GetItem() では LVITEM の行位置(iItem)のパラメータを変更
しない事に気づき、いろいろ手段を探してみたのですが詰まってしまいました。
 ListCtrlで行位置を取得する手段について、教えていただけませんでしょうか?
>>120
リスト中のどのアイテムを取得したいのかよくわからないのだけれど、
現在フォーカスがあるアイテムのインデックスなら
List.GetNextItem(-1, LVNI_FOCUSED)
で取得できると思う。選択されているアイテムを全部取得するなら
nFlagsにLVNI_SELECTEDを指定してループ。

GetItemでアイテムの属性を得るには、LVITEMのmask, iItem, iSubItemに
あらかじめ値を設定する必要がある。テキストを取得したいなら、さらに
文字列取得用の領域を用意しておいてpszTextとcchTextMaxもセット。
122デフォルトの名無しさん:01/12/20 15:33
BITMAPを貼り付けた CStaticに、EnableWindow(FALSE) しても、
淡色表示にならないんですが。
何で、ならないんだろう? そんな仕様、無いですよね?
123122:01/12/20 15:48
ちなみに、IsWindowEnableではちゃんと FALSEが返ってきます。
 EnableWindow(FALSE);
 UpdateWindow();
でも駄目。
試しに、リソースのプロパティで「無効」にチェックを入れても淡色表示にならないし。

もともとそういう仕様? それとも環境依存?
124デフォルトの名無しさん:01/12/20 16:35
>>122
自動的に淡色表示にはならんだろ。
オーナードローにして自分で淡色描画すれ。
125デフォルトの名無しさん:01/12/20 22:36
困ってます。
TIFFファイルをCStaticに表示させたいのですが
さっぱりわかりません。
どなたか教えてもらえませんでしょうか?
126デフォルトの名無しさん:01/12/20 23:34
Textout よりも printf
127デフォルトの名無しさん:01/12/21 02:51
本や、Web上のHowToページをみながら
VC++6.0+MFCでモードレスダイアログを作って、表示してるんですが、
このモードレスダイアログが表示されてる間、親ウィンドウが
アクティブになっても前に出てこないのですが、どうすればこの
モードレスダイアログが後ろに行くんでしょうか?
ダイアログウィンドウの属性を変えるのでしょうか?

ちなみに、親からはこう呼んでます。

(CDialog*)pDlg->Create( IDD_DIALOG1 );
//IDD_DIALOG1はダイアログのリソースID
>>127
親ウィンドウのアクティベーションを引っかけてダイアログの属性を変える。
が、そんなクソUIのアプリなんか使いたくねえけどな。
ミ田+Mとかでデスクトップ見ようとすると、
忘れ去れたモードレスダイアログが出てきたり。
130デフォルトの名無しさん:01/12/21 15:35
問) "hogehoge,hoge"という文字列をhogehogeとhogeに分けたい。
次の例文をお願いだから簡略化してください。
例文)
CString hoge==("hogege,hoge");
CString hoge2=hoge.SpanExcluding(",");
hoge.Delete(0,hoge2.GetLength()+1);

ASSERT(hoge=="hoge");
ASSERT(hoge=="hogege");
>>130
簡略化?
132130:01/12/21 16:11
>>131
SpanExcluding(),Delete(),GetLength()といった感じで、
ちょっとストレートじゃないので。
133デフォルトの名無しさん:01/12/21 16:20
>>132
i=hoge.Find(',');
hoge2=hoge.Mid(i+1);
hoge=hoge.Left(i);

じゃダメ?
134130:01/12/21 16:23
なんか、一応strtokとかでスパッといきそうですが・・・・。
CStringには無いのかー!?
135130:01/12/21 16:27
>>133
すいません。気が付きませんでした。
参考にさせていただきます。
仕事以外でVC++つかうとき、
どんなものをつくっているか
教えてくれぃ
137120:01/12/21 21:58
>>121
 出来ました!どうもありがとうございます!
138127:01/12/22 14:04
>>128
くそUIでしょうか・・・。

では、どういったUIが望ましいのでしょうか?
わからなくなってしまいました。

「ダイアログ上のなんらかの情報を見ながら
メインウィンドウの入力をしていく」というUIを
持つアプリを、よく見かけるような気がしていて、
似たような事をやりたいのですが、
これは、モーダルダイアログではないんでしょうか?

また、「親ウィンドウのアクティベーションを引っ掛けて属性を変える」
との事ですが、まず、親ウィンドウのイベントの引っ掛け方が
よくわかりません。
教えていただけますか?

あと、属性を変えるのは親ウィンドウと、ダイアログのどちらでしょうか?
属性とはウィンドウスタイルフラグで良いのですか?

レベルが低すぎるのであれば、初心者コーナーを教えていただければ幸いです。

質問ばかりで申し訳ないですが、よろしくお願いします。


クーパーは、モードレスダイアログはインターフェースとして最悪で、
ツールバーが取って代わるべき、みたいなことを言ってたな。
>>138
>レベルが低すぎるのであれば、初心者コーナーを教えていただければ幸いです。

それすら自分で探せないのか?
>>139
最悪はモーダルダイアログだと思うんだけどなぁ。
>>138が実現したいことって、要するにヘルプのような気が。
あるいは、メール返信での「元発言参照」とか。

ダイアログじゃなくてただのウィンドウでいいと思われ
>141
何で?
>>138
親ウィンドウにスッポリ隠れていたらモードレスダイアログをアクティベーとできなくなりますが。
145仕様書無しさん:01/12/24 22:40
上のほうでちょっと扱われていることなのですが、
DoModalじゃなくてCreateを使いたいのですが、引数をどうやって
あてがえばいいかわかりません。DoModalみたいに引数なしで
やるとエラーが出てしまうのですがどうすればいいでしょうか。
いっつもthisポインタをわたしてたような
147デフォルトの名無しさん:01/12/25 00:37
CDialogベースでダイアログを作成して,
そのダイアログにリストボックスを作成しました。

ですが,ダイアログの大きさを変えても,
リストボックスの大きさはそのままで
サイズ変更がされません。。
いろいろプロパティをいじっているのですが・・

どなたかダイアログサイズを変更すると
リストボックスのサイズも変更する方法を
ご存知の方いらっしゃれば教えて下さい。
よろしくお願いします。
ダイアログのOnSizeで引っかけて、リストボックスにSetWindowPosとか?
149デフォルトの名無しさん:01/12/25 02:00
ダイアログにサイズグリップを表示させるにはどうしたらよいでしょうか?
150デフォルトの名無しさん:01/12/25 10:44
>>147
自動では変わらんから、OnSizeハンドラで自分で
ダイアログに合わせてリストボックソの大きさを変えろ
151デフォルトの名無しさん:01/12/25 11:27
>>145
CDialog::Create()の第1引数?
だったら、そのダイアログのリソースID(IDD_ABOUTとか)を
指定すればいいかと。
>>151補足
ClassWizard使ってダイアログクラスを作成すれば

class CAboutDlg : public CDialog
{
public:
  enum { IDD = IDD_ABOUTBOX };

みたいに生成されるから、CAboutDlg::IDDを使う。

…ってCDialog::Create()の話じゃなかったらスマソ

 ダイアログ上のピクチャーコントロールに線を加工としたのですが、
以下のやり方で試したところ、返り値では問題がない時のものが
返るのに、実際には引かれていないと言う状態になってしまいました。
 何か抜けているかアホな間違いをしているかのどちらかだと思うのですが、
問題点について教えていただけませんでしょうか?

 置いた場所はOnInitDialog() になります。


CDC *pDC;
CWnd *pict=GetDlgItem(IDC_PICTURE);
pDC = pict->GetDC();

CPen NewPen(PS_SOLID,2,RGB(0,255,0));
CPen *OldPen = pDC->SelectObject(&NewPen);

pDC->MoveTo(0,0);
pDC->LineTo(200,10);

pDC->SelectObject(OldPen);
m_PoBar.ReleaseDC(pDC);
pict->GetDC()で取得したdcを、
なぜ、m_PoBar->ReleaseDCで解放していますか?
155153:01/12/26 00:10
>>154
 あ゛っ、直し抜けです(涙
 ここは問題に関係……あるのでしょうか?
156デフォルトの名無しさん:01/12/26 00:32
OnInitDialogで描画処理をやってもダメだよ!
157仕様書無しさん:01/12/26 00:43
145です。
いろいろアドバイスありがとうございます。
やりたいことはSDIで作ったウィンドウにダイアログを追加して、SDI
のウィンドウのツールバーに作ったボタンを押すとダイアログが立ち上がり
ダイアログに文字列を入れた後にダイアログにあるボタンを押すとSDIで
作ったウィンドウに文字が入力されるようなものを作りたいと思ってます。

とりあえず。ダイアログクラスをCmyDlgとして、ツールバーに作ったボタン操作の
記述に
CmyDlg myDL;
myDL.DoModal();

とやると立ち上がるのですが、Createでやりたいと思い、ただ書き換えてみたの
ですが引数無しでエラーが出ました。

まだ初めて1ヶ月の初心者ですが、クラス間で値を受け渡す行為ができず、戸惑い
を覚えています。まあ、これからもこのスレッドで勉強させていただこうと思います。
>>153
OnPaintに書いてください。
>>157
第一引数にダイアログのIDを指定してください。
関数の使い方などはMSDNで確認したほうがいいです。
160仕様書無しさん:01/12/26 00:58
159さん、ありがとうございます。
第一引数にダイアログのIDを指定したところ
コンパイルは通りました。しかし、ツールバーの
ボタンを押しても画面が少しちらつくだけで
ダイアログが立ち上がらないんですよね。
DoModalでやるとあっさり立ち上がるのに。
ShowWindow(SW_SHOW)が必要だったような。
>>160
「モードレスダイアログ」について勉強したほうが。
ShowWindow(SH_SHOW);
でダイアログを表示します。
163デフォルトの名無しさん:01/12/26 10:21
CEditViewに表示した文字列をクリックすると、文字列の一部が選択状態になるプログラムを
作りたいのですが、方法が分からず困ってます。どなたか力を貸してください。
たとえば、
AAA BBB #CCC
と表示されているとき、#CCCの一部をクリックすると、#CCC全体が選択状態になるというものです。
(AAAとBBBは選択状態にならない)

いまのところ、OnLButtonClk上でCEdit::SetSelをしようと考えているのですが、#CCCを判別
できないのです。よろしくお願いします。
164デフォルトの名無しさん:01/12/26 17:49
VisualC++で、MFCでWindowsソケットを使用したプログラムを作る時
最初のスケルトン作成時に、「Windowsソケット」という項目にチェックを
入れないとWindowsソケットのプログラムは書けないのでしょうか?
この項目にチェックを入れることで、何が行われるのかが全く分かりません。
ただsocket関係のヘッダをインクルードするだけじゃ駄目なんでしょうか。
>164
両方ともためしてみてた?
166デフォルトの名無しさん:01/12/26 18:09
MFCで、中が塗りつぶされない円を書きたいのですが・・・
>>164
WSAStartup()/WSACleanup()もよろしく。
168164:01/12/26 18:32
>>165
「Windowsソケット」にチェックを入れないで作った場合は動かないのですが
MFCに不慣れな為に、本当に駄目なのかどうか分からないのです。

>>164
あ、一応Win32API・・・SDKと呼ばれてるやつですか。
APIではソケットプログラムを作った事があるので、ソケットの知識はあると思います。

聞きたいのは、スケルトン作成時の「Windowsソケット」をチェックする事の意味というか
これをチェックしないと動かないのかどうか、そしてチェックすることによって
何が行われるのかといった事なのです。

ちなみに、API(SDK)では、Wsock32.libをプロジェクトに入れて
winsock2.hをインクルードすれば良いだけです。
169168:01/12/26 18:33
あ、上の>>164じゃなくて>>167でした。失礼。
170167:01/12/26 18:40
>>168
「Windows ソケット」をチェックすると、AfxSocketInit()がInitInstance()に
入ったりします。
AfxSocketInit()の詳細はソースを見てもらうとして、要するにアプリケーション
開始時にWSAStartup()、終了時にWSACleanup()を呼び出します。

…というところでオッケー?
171164:01/12/26 18:50
>>170
ありがとうございます。分かりました。
それらの処理を自分で行うならば、チェックしなくても動くのですね。

という事は、今動いていないのは自分のせいか。
MFCでプログラム作るのは初めてなので、こんなものかな。
172デフォルトの名無しさん:01/12/26 18:57
質問します。

CDHTMLEdit をダイアログに貼り付けて、RichEdit のような感じで編集(フォントのサイズや色など)したいと思っています。
この時、何らかのイベントで CDHTMLEdit の選択された範囲を知る事は可能でしょうか?
何バイト目から何バイト目みたいな形が望ましいのですが、範囲さえ取れたら何でもいいです。

また、テキストの何文字目から何文字目がクライアント座標でどの範囲かを知ることは可能でしょうか?

Google でもそれらしい記述の文書が見つからなかったのですが、
何か参考になりそうな文献やサイトでもいいので、どなたか教えて下さい。
>>166
それVC系スレで何回も出てる質問なのでネタとみなします。
174153:01/12/26 19:53
>>158
>>156
 出来ました! どうもありがとうございます
175デフォルトの名無しさん:01/12/26 20:20
>>173
どこに書いてありますか?
>>175
しつこい人なんて嫌いです!(ぷいっ
177デフォルトの名無しさん:01/12/27 08:19
>>160
MFCならCWinAppのInitInstance()の戻り値がFALSEになってると思われます。
m_pMainWndにメインダイアログのポインタを代入してからTRUEを返すようにしてみてください。
178デフォルトの名無しさん:01/12/27 10:25
Visual C++はVisual C++でできていてそのVisual C++からVisual C++ができてそのVisual C++からVisual C++が作成されたんですね?
違います。
Visual C++はVisual Basicでできていて、
Visual BasicはVisual C++でできているのです。
また次のソフトも MFCに頼ってしまいそうで鬱駄。
いいかげんMFCを使わないで開発したいが勉強する
時間がなかなかとれない。愚痴でスマソ
>>179
、、、、、どっちが先?
182デフォルトの名無しさん:01/12/28 01:49
OutlookExpressのメール本文が表示されてるペインは
MFCのどのクラスで実装されてると思いますか?
CScrollViewじゃ役不足ですかね。
やはりCRichEditViewかなあ。
Visual C++はMicrosoft Cが、Visual BasicはQuick Basicが
放射線を浴びて突然変異したものです。
そして、Microsoft CはLattice Cが、放射線を浴びて突然変異したものです。
185デフォルトの名無しさん:01/12/28 14:15
>>182
CScrollViewあたりから派生た毒痔のクラスかも知れん
>>183,184
寒いからやめろ
187デフォルトの名無しさん:01/12/29 13:28
MFCでも凝ったユーザーインターフェースって作れますか?
お薦めの本があれば、教えてください。
>>187
「凝ったユーザーインターフェース」っていったいなんだよ
それを定義しないとはじまらないだろ?
定義なんかいらねーよ
じゃあ宣言すれ
class DecolatedUserInterface;

あとよろしく
192デフォルトの名無しさん:01/12/29 16:35
本格的に冬休みだね
DecoloredUserInterface;
//脱色済みユーザインターフェース
DecoloredUserInterface;
//黒人お断りユーザインターフェース

…ともとれる。
195仕様書無しさん:01/12/30 15:30
CPointで配列ってできますか?
そんでもって配列に対してさらにxだけを呼び出すことってできますか?
>>195
やってみなよ、とりあえず。

> そんでもって配列に対してさらにxだけを呼び出すことってできますか?
日本語が意味不明。x を呼び出すって、どういう意味?
197デフォルトの名無しさん:01/12/30 15:49
C++ビルダーからの移行者なんですが、ピクチャボックス
のサイズをGUIから設定することはできないのでしょうか
198デフォルトの名無しさん:02/01/01 11:13
新年あげ
199デフォルトの名無しさん:02/01/02 19:42
質問です。
最初にCScrollViewをAppWizardで作成し、その後にCTreeViewとCListViewを
追加したのですが、ビルドするとCTreeViewとCListViewが定義されていません
とエラーが出てしまいます。
順番を変えて、最初にAppWizardでCTreeViewを作成すると、ちゃんとビルドできるのです。

最初にCScrollViewを作ると、クラスを追加出来ないのでしょうか?
>>199
どうやって追加したのかが知りたいと思われ
201199:02/01/03 00:40
>>200
自己解決しました。
#include "afxcview.h"をインクルードすることによってビルドできました。
最初にCViewやCScrollViewを作って、後からクラスを追加した場合、このヘッダが
挿入されないようですね。

ちなみに、まず最初に、ワークスペースの新規作成からAppWizardで基底クラスに
CScrollView(CViewでも結果は同じ)を選んでスケルトンを作成をします。
次にClassWizardで新規にクラスを追加でCTreeViewを作成してビルドしました。
これだと自分でヘッダを追加する必要があるみたいです。
最初にAppWizardの基底クラスでCTreeViewを選んで、後からClassWizardで
CViewやCScrollViewを追加すると、問題なくビルドできます。

でももしかしたら、単に私のVC++がVer5.0だからかもしれません・・・。
202デフォルトの名無しさん:02/01/03 00:51
基本的すぎて場違いだと思うんですが、求人の所に
Visual C/C++(VB)経験者ってあるんですけど
なんのことですか?ここに書いてあること見てもさっぱり
わからなくて、良かったらどなたか分かりやすーく
説明していただけませんか?
要はそこではたいした開発はしてなくて、入社してもすぐハケーンされて
運がよければVC,VBが使えて、運が悪いと、何年も型落ちを重ねたツールや
聞いたこともないようなツールで説明書は紛失中みたいなところで
開発させられるって事です。
俺はもうなれた。
>>202
説明も何も、 Visual C++とかVBを使ってことがあるってことだろ。
>>202
いやね。恥ずかしい。
そんなことまで言わせるの。
206202:02/01/03 01:05
恥ずかしいのですがそのVisual C++とかVBてのがわかりません(汗)
>>206
マイクロソフトのサイトに説明があるよ。
>>203
まじ?求人でVCのを探してたけど無駄なのか・・・
そういう会社を避けるコツみたいのを教えて欲しい
209デフォルトの名無しさん:02/01/03 08:00
Iriaなんかにある「クリップボードを監視」するような機能ってどうやってるんでしょう?
タイマーで一定時間ごとにクリップボードを見に行く??
>>209
SetClipboardViewer() すると変更のたびにメッセージが飛んでくるなり。
211デフォルトの名無しさん:02/01/03 13:54
ClassWizardで基本クラスをCWndにしたクラスを作りたいんだけど、どうやったら良いの?
CWndは選択肢に無いので作れないのかな。
>>211
下から2番目にある「generic CWnd」を選択しましょう。
漏れもこのトラップに引っかかったよ(藁
213211:02/01/03 14:14
>>212
あ、本当だ。これなのか(笑)

おかげさまで出来ました。ありがとうございます。
214デフォルトの名無しさん:02/01/04 01:27
CSocketを使ってデータを転送させようとしているのですがどうもうまくいかず、困っています。
CSocketから派生させたCMySocketクラスを作り、CSocketFile、CArchiveと関連付けてデータを送受信しています。
送信データはなんとかまともに動作するようになったのですが
受信データが半角でへへへへへへココココオオオオオオオオオ
のようになってしまい、うまくいきません。
CArchiveのIsBufferEmptyメソッドは絶えず1を返してしまいます。
CMySocketのReceiveを確認してみると
へへへへへへココココオオオオオオオオオ
の後にちゃんと正しいデータが存在していることがわかりました。
うまくデータを受信するにはどうしたらいいのでしょうか?

送信部分のソースは
// CArchive* m_pOut
m_pOut->WriteString("Hello");
(*m_pOut) << (WORD)0;
m_pOut->Flush();

受信部分のソースは
// CArchive* m_pIn
CString string,string2;
while(!m_pIn->IsBufferEmpty())
{
m_pIn->ReadString(string);
string2 += string;
}

お願いします…
215デフォルトの名無しさん:02/01/04 04:41
>>210
さんきゅー
216デフォルトの名無しさん:02/01/05 00:06
SDKとMFCでプログラム組んでる人って、仕事とか関係なくて自分で好きなプログラム作る時
どっち使う?
なんかさあ、今までSDKだけでやってきたんだけど、MFCやらなきゃいけないことになって
勉強中なんだけど、何だかSDKより面倒に思える。
今までウィンドウプロシージャに書いてた処理をどこに置けば良いかよく分からんし
ドキュメント/ビューアーキテクチャが面倒なものにしか思えない。
ついついドキュメントクラス使わずに済ませてしまう。
やはりMFCでファイル入出力する場合、ドキュメントクラスにまとめてシリアライズ関数でってのが
一般的って言うか、ベターなの?

SDKより開発効率悪いMFCのプログラム書いてるの俺くらいだろうか・・・鬱だ。
>>214
まず、そのプログラムは、ふつうの(ソケットではない)CFileの時はきちんと動くのか?
>>216
その気持ち、すごくわかる。

そもそもMFCってのは、Officeを開発するために作ったものを切り出し、
フレームワークと称してWindowsアプリケーション支配の道具としたものだから、
ドキュメント・ビュー・アーキテクチャは当然、
「ファイルを開く」「ファイルに保存する」といった形態のアプリケーションしか
想定していない。

しかし素直にシリアライズでファイル入出力を実装しちゃうと、
アプリケーションのバージョン間でファイルに全く互換性がなくなってしまう。

なぜなら、もし互換性を保とうとするなら、クラスにメンバ変数ひとつ加えることすら
できないことになるからね。

その証拠に、これはつい最近までOfficeの各アプリケーションの決まり文句だったでしょ?

バージョン間の互換性を維持しようとすると、ファイル入出力をシリアライズで手を抜くことは、
途端にできなくなってしまう。それどころか、むしろ、もっと面倒になる。

確かに、MFCはインベント駆動のプログラムをうまく包み込んでいると思うが、
フレームワークという点では、Java や C++Builder などの方が、ずっと進んでいるようだ。
219デフォルトの名無しさん:02/01/05 23:15
MFCを使ってスタティックライブラリを作ったのですが、このライブラリを
プログラム(MFC、ダイアログベース、スケルトンはAppWizard)にリンクして
デバッグビルドすると、
> LINK : warning LNK4098: defaultlib "mfc42.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
> LINK : warning LNK4098: defaultlib "mfcs42.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
> LINK : warning LNK4098: defaultlib "msvcrt.lib" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
という警告が出ます。
これはスタティックライブラリの作り方に問題があると思うのですが、
どのような原因が考えられますか?
それともこれは仕方なく、このライブラリを使うプログラム側で
いちいち /NODEFAULTLIB:library を指定しなければならないのでしょうか?
>>219
そのライブラリを構成するオブジェクトが、おそらく Release ビルドされているから、そうなる。
だからそのライブラリの Debug 版を作ってリンクすれば吉。
>>220
ありがとうございます。
デバッグ版をリンクすることでデバッグビルドでの警告はなくなりました。

ということは、通常はリリース版スタティックライブラリを
プログラムのリリースビルドで使うので、デバッグビルド時にこの警告が出ても
気にしなくて良いのでしょうか?
>>221
それだとデバッグ時にライブラリ内の関数へステップインできなくなるはず。
あと、メモリ管理が Release 版と Debug 版で違うから、場合によっては不安定になる。
デバッグ用のライブラリとリリース用のライブラリを両方作って、
構成ごとに適切なライブラリをリンクするようにしてもよし。

中まで追いかける必要がないなら気にするな。
224219:02/01/05 23:51
>>222-223
ありがとうございます。開発時にはデバッグ用、リリース用の
両方のライブラリを用意してそれぞれリンクすることにします。

ところで仮にこのようにMFCで作ったスタティックライブラリの
リリース版を公開したとして、使用者側がデバッグビルド時に
警告が出たとしてもそれは仕方のないことですよね?
それともデバッグ版、リリース版両方を公開するのでしょうか。
通常はどのようにするのか教えてください。
公開しているわけじゃないけど、たとえば Visual C++ には両方のライブラリが含まれてる。

ってゆーか普通、ソース非公開の「MFC な」ライブラリは、
スタティックライブラリにはしないと思うが。
ヘッダで、#pragmaをつかって相手の環境に合わせてランタイムを指定するとよし。
227219:02/01/06 00:29
> ってゆーか普通、ソース非公開の「MFC な」ライブラリは、
> スタティックライブラリにはしないと思うが。

そうなのですか…
ありがとうございます。すっきりしました。
228デフォルトの名無しさん:02/01/06 01:48
>>226
#pragmaを使うとは、

#ifdef _DEBUG
 #pragma comment(lib, "debug_hoge.lib")
#else
 #pragma comment(lib, "release_hoge.lib")
#endif

ということでしょうか?
229デフォルトの名無しさん:02/01/07 09:13
>>218
VERSIONABLE_SCHEMAは使ってる?
230デフォルトの名無しさん:02/01/07 12:07
質問です。
イメージ付のダイアログで、ボタンを押すとCFrameWndクラスを継承
したウィンドウを表示するプログラムを作りました。
このウィンドウを閉じたときに、ウィンドウとダイアログが重なって
いると、イメージが消えてしまっているのでダイアログの再描画
を行いたいのですが、ウィンドウ側のソースからダイアログの再描画
を行う方法がわかりません。どなたか教えてください。
あと、このような場合にはダイアログに自動的にWM_PAINTメッセージ
は送られないのでしょうか。
>230 なんか 質問です。! なんてやられると そもさん せっぱ みたいだな
232デフォルトの名無しさん:02/01/07 13:34
MFCのクラスウィザードで新たにクラスを追加する時に
基本クラスを選ばなければなりませんが、別にどこクラスからも
派生させる必要の無いオリジナルのクラスを作って追加したい場合
どこクラスを基本クラスに選べば良いのですか?
えらばなきゃいいじゃん
234デフォルトの名無しさん:02/01/07 14:16
CObjectの機能が必要なら、そこから派生させますが、
そうでなければ勝手にcppファイルにクラスを書いて、
プロジェクトに追加します。
>>233
いや、選ばないとクラス追加できないのですが・・・。
必ず選ぶことになるのです。

>>234
その場合、メッセージマップとかは全部自分で記述しなければならないのですか?
メッセージマップの定義とか良く分からないので、全部クラスウィザードに
任せたいのですが、それだと基本クラスを選ばないといけないみたいなので・・・。
メッセージマップが要るなら、親はCWnd(以下派生クラス)に
決まったも同然ではないか?
>いや、選ばないとクラス追加できないのですが・
クラスの種類Genericにしてるか?
「新規ファイルにクラス書いて、.hと.cppをプロジェクトに追加」
よりは、
「genericCWnd で追加して、.hと.cppから不要なとこ削除する」
方が楽だから、俺はそうしている。
勿論ヘッダの class CHoge : public CWnd の ": public CWnd" も削除。
239デフォルトの名無しさん:02/01/08 08:55
>>238
.hは.cppにincludeしてあれば、依存関係で、勝手に
プロジェクトに追加されるはずだよ。
240デフォルトの名無しさん:02/01/08 09:09
CEditに表示される文字の幅を均等にしたいのですが、
なんかいい方法はありますでしょうか?
固定ピッチフォントをCreateFontして、SetFont。
242240:02/01/08 09:44
>>241
ありがとうございます。早速やってみたのですが、nCharSetに
SHIFTJIS_CHARSETを指定すると、英文字の幅が異なってしまいます。
かといって、ANSI_CHARSETだと日本語の文字を認識しません。
これはどうしようもないのでしょうか?
243240:02/01/08 10:09
フォントに"Terminal"を指定したらうまくいきました。ご迷惑おかけしました
244みゆ:02/01/08 10:20
VC++6.0で
新規作成で
MFC AppWizard→ダイアログベース→***App
を選択したもので

始めに出来ているダイアログ画面の
親を適当なもの(ウィンドウクラス名をAとする)
に変更することなんかはできるのでしょうか?

このときダイアログのウィンドウクラス名をBに設定し
親のウィンドウクラス名をAにする方法もおしえてください
>始めに出来ているダイアログ画面の親
意味不明。クラス階層的に親ということか?

>このときダイアログのウィンドウクラス名をBに設定し
>親のウィンドウクラス名をAにする方法もおしえてください
親のウインドウクラス名、が特に意味不明。

ひょっとしてエディタの置換でうまくいくかと思うがどうか?

ついでに、「なぜ、そんなことがしたいのか」も教えてくれ。
>>244
始めは親は居ないと思うけど、最初からチャイルドウィンドウをダイアログで作りたいってこと?
247デフォルトの名無しさん:02/01/09 09:39
age
248みゆ:02/01/09 09:59
うーん、説明不足ですみませんでした.
あるソフトA(自作)で別ソフトB(自作)にメッセージを送る
とき,Bの作成がSDIでCview形式で作成したもので
A側から
///
HWND hWnd = ::FindWindow("Frame", NULL);//Frameのハンドルを取得
HWND ChildWnd;
if(hWnd == NULL){
MessageBox("Not Frame");
}
ChildWnd = ::GetTopWindow(hWnd);//Frameの子のハンドルを取得
char s[64];
CString name;
GetClassName(ChildWnd,s,64);
name = s;
if(name != "View"){
return;
}
::PostMessage(ChildWnd, WM_USER_MESSAGE, (WPARAM)0, (LPARAM)0);
///
上記のように
FindWindowでBのフレームのWindowクラス名を検索し
GetTopWindowでFrameの子のハンドルを取得し
取得した子のハンドルのWindowクラス名
を取得して,それに対してメッセージを送るように
しているのです.

今度はBの変わりに
新規プロジェクトでAppWizard→ダイアログベース→***App
で作ろうかと考えています.
始めに出来ているダイアログのウィンドウクラス名を変更できてます.

先ほど述べた方法で相手にメッセージを送っているため
C側はこのダイアログに親のウィンドウ(フレームのかわりみたなもの)
を用意させそのウィンドウクラスも設定したいのです.

こんなんで理解できますか?
お願いします
249みゆ:02/01/09 11:08
なんとか,自己解決しました(ぉ
新規プロジェクト
SDI→基本クラスCFormViewに
で作成して解決しました.
始めに出来ているダイアログ画面(CXXX_FORM)
のウィンドウクラス名もなんとか変更できました.

おさがわせしました.
250デフォルトの名無しさん:02/01/09 16:56
ダイアログベースでワークスペースを作成したときに
C***App クラスと C***Dlg クラスができますよね。
Appのほう、使い方がよくわからないのでアプリケーションの動作を
記述するコードは Dlgクラスに書いてしまうんだけどこれはやっぱ間違いかな?

たとえば、アプリケーションのいろいろな動作はみんな Dlgクラスのメンバ関数に
なっている。自作クラスなんかは Dlgクラスのメンバ変数として確保する。
つまり Appクラスはまったく手をつけていないです。
一度、自作クラスを Appクラスのメンバにして Dlgクラスから Appクラス経由で
使おうかと思ったけど、Dlgクラスから Appクラスのハンドルは GetParent()
できなかったですし。厨な質問かもしれないが教えてください。
251デフォルトの名無しさん:02/01/09 17:12
>>250
全然、問題無いっスよ。つーか、ダイアログベースってモーダルダイアログ
なんでむしろ他のウィンドウと通信しようなんてほうがオカスィ。
CXXXAppはメンバの初期化とか終了処理に使いなさい。
252250:02/01/09 17:21
>>251 なるほど、どうもありがとう。

ちなみに、DlgからAppのポインタは AfxGetApp()で取得できるんだね。
まったくはずかしいぜ。
>>251
>つーか、ダイアログベースってモーダルダイアログ
>なんでむしろ他のウィンドウと通信しようなんてほうがオカスィ。

ま、そうともいいきれないね。

BOOL CHogeApp::InitInstance()
{
 ・・・
 CHogeDlg* dlg = new CHogeDlg;
 m_pMainWnd = dlg;
 dlg->Create(IDD_HOGE_DIALOG);
 dlg->ShowWindow(SW_SHOW);

 return TRUE;
}

終了するときは、
::AfxGetMainWnd()->PostMessage(WM_CLOSE);
254:02/01/09 19:01
void CHogeDlg::PostNcDestroy() {
 delete this;
}
がないとメモリリークする。
255ビルダーから浮気:02/01/10 03:08
ディレクトリを指定してテキストファイルをCStringListに
設定したいのですが、いまいちよくわかりません。
・ディレクトリを指定する場合の書き方
「ビルダーだと(D\\作業用フォルダ\\a.txt)のようにできたのですが・・」
・複数行の文字列をいっきにCStringListに入れる方法
を教えていただけませんでしょうか?よろしくお願いいたします。
256デフォルトの名無しさん:02/01/10 16:49
CEditから派生して、色を変えられるエディットボックスのクラスを作ったのです。
=WM_CTLCOLOR メッセージの CtlColorをオーバーロードして、そこで
SetBkColor(COLORREF)を実行する方法です。
よくFAQにある奴ですね。

それで一応変えれるんだけど、エディットボックスを「読み取り専用」とか
EnableWindow(FALSE); にするとグレーのままなのです。
入力させたくない場合はどうすればいいのでしょうか。
257デフォルトの名無しさん:02/01/10 17:26
スレちがいかもしれませんけど。
OSで使用している、ブラウザの情報が取りたいのですが
(Mozilla/4.0 (compatible; MSIE 5.0; Win32)ってやつ)
取得方法がわかりません。

JAVAだとGetUserAgentというAPIで取れるらしいのだが・・・。
>256
nCtlColor == CTLCOLOR_EDIT の時だけ処理してない?
使用不可とか読み取り専用の時には CTLCOLOR_STATIC を渡してくるよ。
259デフォルトの名無しさん:02/01/10 17:39
>>257
「OSで使用している」というのは、
「インストールしてある」という意味なのか、
「起動中」という意味なのか?
っと、どっちにしろ方法はしりませんけど・・・
260257:02/01/10 17:59
できれば、標準で使用しているブラウザのUserAgentが取りたいのですが、
最悪、インストールされているIEのUserAgentが取れればいいと思ってます。
261256:02/01/10 19:50
>>258 そのとおりでした!なるほどです。
たしかにデバッグモードで追うと、 nCtlColor の値が
いっこうに CTLCOLOR_EDIT にならないで、if 文の中に
入ってくれなかったですわ。ありがとうございました!
262デフォルトの名無しさん:02/01/10 22:48
エディットボックスコントロールのようなもので文字毎や行毎に文字色や背景色を変えるような事はできませんか?
263みゆ:02/01/11 09:08
2つの異なるプログラム同士の文字列の送信受信なんですが
WM_COPYDATAとなるメッセージで用いるようですが

このほかの方法ってないのでしょうか?
別にWM_COPYDATAを使えばいいんだけど(ぉ
>260
標準で使用しているブラウザ、となると。
・localhost : 40001 とかのポートをlistenするhttp鯖もどきをつくる
・ShellExecute("http://localhost:40001");を実行
・そのhttp鯖にブラウザがGetリクエスト。
・リクエストにはUserAgentも入って(゚д゚)ウマー
という方法しか浮かばないな。
265257:02/01/11 10:04
>>264
なるほど、それは考えつかなかった。
さすがに使用はできないけど、いい案ですね。
UserAgent取る為にそこまでは普通しないよなーw
MDIアプリで、オリジナルのCFrameViewを通常のViewと兄弟で構築するのはどうするの?
丁度、お絵かきソフトのパレットやペンツールみたいな物なんだけど、
DIALOGやツールバーはちょっと。
後ろに隠れたり、MainFrame内で最小化したりさせたいので。
厨房な質問でスマソ
267デフォルトの名無しさん:02/01/11 10:44
>>257
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Internet Settings
にぽいのがあるけど。
268デフォルトの名無しさん:02/01/11 14:13
MFCっていつ親Windowが作成されるんですか?
親Windowのハンドル取得したいんですけど、それらしき部分が無いような。
MFCには
HWND hWnd;
hWnd = CreateWindow・・・
みたいな部分は無いんでしょうか。
269257:02/01/11 14:27
>>267
そこのレジストリなんですけど、
どうも今使っているバージョンではないものが入っているようです。
多分インストール時のIEのバージョンではないかと思うんですが・・・。
>>268
GetParent ?
271デフォルトの名無しさん:02/01/11 15:42
ON_NOTIFY_REFLECT(xxx,onxxx)を呼び出したいのですがどうも
やり方が良くわかりません。だれか教えて下さい。
272デフォルトの名無しさん:02/01/11 16:27
ループ中にボタンをクリックして「緊急停止」などの割り込み処理
をしたいのですがどうすればいいのでしょうか
>268
CWnd::Create で実際にウィンドウが作られ、
HWNDは CWndのメンバ m_hWnd に格納される。

親ウィンドウのハンドルは
 CWnd* pParent = this->GetParent();
 pParent->m_hWnd or pParent->GetSafeHwnd()
で取得。
274デフォルトの名無しさん:02/01/11 17:34
>>272
コンポーネントギャラリからプログレスダイアログを導入するのが簡単。
>272
とりあえず、マルチスレッドにしないと。
276デフォルトの名無しさん:02/01/11 19:09
MDIの子ウィンドウの最大枚数を制限出来ますか?
取りあえず一枚にしたい。
277デフォルトの名無しさん:02/01/12 10:59
CHtmlViewをCFormかダイアログに複数貼り付けて
使うことはできるのでしょうか?
できるとしたらどうやればいいか教えてください。
何か参考のページでもいいです。
よろしくお願いします。
278かるかん ◆TM3.ie9w :02/01/12 11:38
>>276
それじゃ、MDIにする意味ないような…
それはともかく、そういう機能は元々なかったはずだから、
CMDIChildWndのOnCreate()をオーバーライドしてその中で判断するとか。
CMDIFrameWndの方でもChildWndのリストを管理する機能を入れる必要が
ありそうだけど。俺は試す気はないので。
>>276 == >>266 ですんで。UIに一考の余地が有りそうですが、
その方向で色々試してみます。ご教授ありがとー。
280かるかん ◆TM3.ie9w :02/01/12 12:02
>>277
CForm?? CFormViewのことか?
ダイアログにViewは作れないはずだよ。それにViewのなかに
Viewを作るってのも無理な話。

普通はCFrameWnd(の派生クラス)のOnCreateClient()を
オーバーライドしてCSplitterWndをつくり、その各ペイン上に
Viewをつくるんだが。サンプルもMSDNライブラリにあるから。
281277:02/01/12 14:34
かるかんさんレスありがとうです。

すいませんCFormViewのことです。

CSplitterWndを使ってやるのはできたのですが、、
最近よくあるタブブラウザみたく、タブを使って
CHtmlViewを切り替えるにはどうしたらいいので
しょうか。。。

考え方でも結構ですのでご教授ください。
282かるかん ◆TM3.ie9w :02/01/12 17:26
#はぁ、やっと会議が終わったぜ。(今日は出勤日なんだよ)
俺の意見としては、CHtmlViewを使うのはあきらめろ、だな。

手っ取り早いのは、CFormViewの元になるダイアログに
ActiveXコントロール「Microsoft Web Browser」を貼り付ける、かな。
ただ、IE4以降になっちゃうかも。それと、使ったことはないので
これ以上は自分で試してくれ。
283デフォルトの名無しさん:02/01/13 14:11
MainFrameクラスからドキュメントへのポインタを
取得するにはどうすればいいのでしょうか
284デフォルトの名無しさん:02/01/13 17:38
ステータスバーに、現在のマウスポイント位置をが表示されるように
したいのですがどうすればいいですか?
>>284
WM_MOUSEMOVEを拾って自分でステータスバーに書くんじゃないか?
>>283
GetActiveDocument()というのがあるが、本当にMainFrameクラスからドキュメントにアクセスする必要があるかよく考えてね
287デフォルトの名無しさん:02/01/14 02:20
ファイルの移動をする関数ってあるでしょうか?
コピーならあったのですが、、、

それとも、コピーしてから元ファイルを削除するという
方法を取るのでしょうか?
>>287
::MoveFile()じゃだめ?
ワイルドカード使いたいとか進行状況を表示したいとかなら
::SHFileOperation()もいいかも。
290デフォルトの名無しさん:02/01/14 11:07
Visual C++ 6.0で、WindowsXPで動くプログラム
を作成することはできますか??
Windows9x系のプログラムってXPでけっこう動かない
のがあるんですよね?そのへんどうなんでしょうか・・・。
291ひよこ名無しさん:02/01/14 11:59
>>290
ソース互換はあるだろうて。
使えないAPIがあればコンパイル時に怒られるだろ。
292デフォルトの名無しさん:02/01/14 12:58
MFC AppWizard (dll) でオートメーションサーバーを作ろうとしています。
スケルトンにDllRegisterServerはあるのですが、DllUnregisterServerが
ありません。
DllUnregisterServerはどのように実装すれば良いのでしょうか?
それとスケルトンにDllUnregisterServerが無い理由は?
293292:02/01/14 13:54
自己レスです。
書籍を参考にして次のようにしました。

STDAPI DllUnregisterServer(void)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 COleObjectFactory::UpdateRegistryAll(FALSE);
 return S_OK;
}

MSDNライブラリにはUpdateRegistryAllのパラメータが無かったのに…
MFC AppWizard がこれを追加してくれない理由は未だわかりません。
294Apple:02/01/14 19:16
Windows の「アクセサリ」→「ユーザ補助」には「拡大鏡」がありますよね。
あれを画面全体に広げたようなプログラムを作りたいのですが、簡単?
>>294
拡大したビットマップを画面全体に表示するとして…
いったい何を拡大するの?
拡大対象のアプリが操作できなくなる気がする
けど、気のせいか?
297Apple:02/01/14 19:39
目の悪い人にでもパソコンが使えるようにしたいんです。
仮想ディスプレイのようなのが理想です。
マウスを画面の端に持っていくと、画面ごと移動するような・・・
仮想ディスプレイと違うのは、文字や画像がやたらデカイこと。
298デフォルトの名無しさん:02/01/14 19:50
どれくらいC++言語が分かればDIRECTXに手が出せますか?
厨でごめんなさい・・・
C++言語とDIRECTXは関係ない>298
300デフォルトの名無しさん:02/01/15 01:45
ダイアログベースのMFCアプリ作ってますが
ダイアログを非表示のまま起動することが上手くできません(SDKの方は上手くいくのですが・・・
OnInitDialogでShowWindow(SW_HIDE);しても警告でるか無視されて表示されてしまいます。

PreCreateWindowでも上手くいきません
助言お願いします
301300:02/01/15 01:48
ダイアログは起動直後に現れるメインのものです(InitInstance()で生成するもの
302ななしい:02/01/15 02:22
>>300
そうそう、表示されちゃうよね。
でも、MFCのコードをトレースすれば、すぐ分かるかも
(時間がなくて、漏れはやってません)
>>300
ウィンドウサイズを(0,0)にしちまうってのはどぉ?
>>300
アプリケーションクラスの
int nResponse = dlg.DoModal();
あたりを消して,自分でCreateして
ShowWindow(SW_HIDE)
Createを発行するなら、モードレスになるから、
メッセージループを回さないといけないような。
>300, 305
>>253 >>254あたりを参照。
307デフォルトの名無しさん:02/01/15 12:35
ClassWizardでタイプライブラリからクラスを作成し、

// IHogeはClassWizardがタイプライブラリから自動生成したクラス
IHoge hoge;
hoge.CreateDispatch("Hoge.Object");
BOOL bHoge = hoge.IsHoge();  // BOOL値を返すメソッド

としたのですが、実行(F5)すると

Warning: attempt to call Invoke with NULL m_lpDispatch!

という警告が出てしまいます。どうすればよいのでしょうか?
ちなみにVBScriptで

Set oHoge = WScript.CreateObject("Hoge.Object")
bHoge = oHoge.IsHoge()

とした場合はちゃんと予期したBOOL値が返ります。
308デフォルトの名無しさん:02/01/15 12:41
実際DirectXってどれをベースに開発するのがいいんだろう。

VBで学ぶ・・・とかVCで学ぶとか・・・とかいう本がでて
いるけど、どれで学べばいいかわからないんですよね。

VBできないからVCベースでやろうと思っているけど
309307:02/01/15 12:55
AfxOleInit を忘れてただけでした。
しょーもないこと書いてごめんなさいごめんなさいごめんなさいごめんなさい
310デフォルトの名無しさん:02/01/15 15:43
文字の大きさを変えて出力TextOutするにはどうすればいいんですか?
文字の色を変えるときはSetTextColorで変えられるんですけど
サイズの違うfontをアタッチしませう
312デフォルトの名無しさん:02/01/15 16:00
やっぱりフォントの構造体を作ってそっちを選択しないと
だめなんですかね。ありがとうございます。
昨日よりVC++6.0なるものをはじめたのです。
とある書籍にてブラウザが作れるとのことで、その本の通りCHtmlViewを使って
簡易ブラウザなるものができました。
しかし「お気に入り」がないためにどうも使いにくい。
ということで、「お気に入り」を追加しようとMSDNを調べてみたのです。
CHtmlViewの項目に確かに「お気に入りも使えます」みたいなことを書いてある
のですが、いざ内容をみてみると「お気に入り」を扱えそうな関数がないんですが
どなたかご存知でしょうか?
314デフォルトの名無しさん:02/01/15 18:41
VC6でWINキーを無効にする方法を教えてたもれ。
http://www.ryomonet.co.jp/kazenetu/tips/scr.html
この方法で、WINキーも無効にならぬかえ?
>>313
サンプルのMFCIEにあるとおもうけど。
317314:02/01/15 20:10
>315
すまぬ。当方OSがWindows2000ゆえ無効にならんでおじゃる。
Windowsキーのキーコードさえ分からんでおじゃる。
318デフォルトの名無しさん:02/01/15 21:31
LoadImageを使って外部からBMPファイルを読み込んでいるのですが、
2000/NTでちゃんと読みこめません。小さなBMPならいいのですが、非常に大きなサイズになると駄目なようです。
95/98/meは動作しました。

LoadImageで大きなBMPでも表示できる方法、または
他に外部の大きなbmpファイルを表示できる関数があれば教えてください。。
319デフォルトの名無しさん:02/01/15 21:54
CTreeCtrlに表示するアイコンでフルカラーのものを
使うにはどうすればいいのでしょうか?
320デフォルトの名無しさん:02/01/16 00:46
>>319
普通にやっても駄目?
そもそもフルカラーでやる意味が分からない?
256色で十分では?
画像ビューワで使うのかな?
printf
322デフォルトの名無しさん:02/01/16 01:49
解説本を読むと、CDocumentがデータを、CViewが見せ方を扱うって書いてあるんだけど
CEditViewを使ったサンプル読むと、CeditViewの中のCEditってのがデータ持ってるような
気がするんだけど、勘違い?
CeditViewって、CViewの派生で、しかし、中にCEditも持ってるみたいで、
CViewもCEditもCWndの派生で、ほしたらウィンドウ2つできそうな気がするけど1つ?
CEditが入ってくると、CDocumemntとCViewとCEditの関係がぜんぜんわからん。
どねんなってるねん?
CEditみたいなラップクラスには、Document - View
アーキテクチャは適用外なのです。(ウインドウがデータを持つため)
CEditViewは、reinterpret_castでCEditになるんやなかったかな?
だからウインドウは1つ。
324デフォルトの名無しさん:02/01/16 02:03
自分でCEditView相当を作ってDocument-Viewを適用しようとしたら、
CViewの派生クラスにCEditの機能を入れるのと、CEditの派生クラスに
CViewの機能を入れるのと、どっちが正統派?
CEditを使う限りMFC的に正統なDoc-Viewには成り得ないと思うよ。
CEditView(っていうか、CCtrlViewから派生したクラス)は、「独りDocument-View」な感じがするのは俺だけ?
無理にDoc-Viewやるなら、C〜CtrlをDocにして、
オーナードロー用のサブクラス化ウインドウをViewにするかなぁ?
ListViewとTreeViewはオーナーデータスタイルがあるんだけどね。
329292:02/01/16 13:20
>>292-293です。先述のようにDllUnregisterServerを以下のようにし、

> STDAPI DllUnregisterServer(void)
> {
>  AFX_MANAGE_STATE(AfxGetStaticModuleState());
>  COleObjectFactory::UpdateRegistryAll(FALSE);
>  return S_OK;
> }

実際に regsvr32 /u hoge.dll を実行すると、

> DllUnregisterServer in hoge.dll succeeded.

となりますが、レジストリには項目が残ったままとなってしまいます。
レジストリから削除するにはどうすればよいのでしょうか?
※DllRegisterServerはAppWizardが生成したデフォルトのままです。
330 :02/01/16 16:19
新規クラスを作るとき、CWndから派生させて、それを CMyclass1 とします。
そこからさらに派生させた CMyclass2 を作るとき、ClassWizardは使えないんでしょうか?
Serialize が使いたいのです。
もう、直接 CWnd → CMyclass2作ってしまおうかなと考えてます。
どうせ CMyclass1 は使わないですし。しかし、OOPL的には CMyclass1は
あるべきと考えてるのですが・・・
質問です。
エディットボックスで使用するフォントを和文(全角)と欧文(半角)で別のものを使いたいと考えています。
OnInitDialog()内でSetFontを使って全体のフォントを変えることはできたのですが、
ここから、全角と半角を判別してフォントを分けることは可能でしょうか?
何か良い方法がありましたら教えてください。
よろしくお願いします。
332330:02/01/16 16:57
すみません、>>330 で、
CMyclass2 を ClassWizard で扱うことはできないみたいだけど、
自分で直接 Serializeをオーバーライドするコード書いたらちゃんと使えました。
>331
エディットボックスを使っている限りほぼ無理かと思われます。
>>330
そら自分で書けばできるでしょう
>>333
エディットボックスでは無理ですか。ありがとうございます。
リッチエディットで試してみようと思います。
336デフォルトの名無しさん:02/01/16 23:54
>>319
CImageListをMSDNで見てみて
Create()の項目に載ってるよう
337デフォルトの名無しさん:02/01/17 00:02
聞くの恥ずかしいのですが…
バイナリデータから30バイト目から40バイト目までを取得して
文字に変換したいのですが…どうも上手くいきません
教えていただけないでしょうか?
338デフォルトの名無しさん:02/01/17 00:30
>>337
文字に変換って、
 00 10 20 30 ==> ".. 0"
それとも
 00 10 20 30 ==> "00 10 20 30"
339デフォルトの名無しさん:02/01/17 00:36
82 A8 8A E8 82 A2 82 B5 82 DC 82 B7
=お願いしますみたいな感じなんですが…
340デフォルトの名無しさん :02/01/17 00:37
for(i=29;i<40;i++){
 cs.Format("%d",byte[i]);
 csAll=csAll+cs;
}
駄目?
341デフォルトの名無しさん:02/01/17 00:38
cs.Format("%02X",byte[i]);だった。
342デフォルトの名無しさん:02/01/17 00:39
ありがとう御座います!
やってみます。
343弱気な名無しさん:02/01/17 00:39
CEditViewから派生したクラスのOnDraw()は中身からっぽ。
なのにちゃんと表示されてる。誰が書いてるんだ?
Win32のエディットコントロール。
345339:02/01/17 00:50
上手くできませんでした…
346デフォルトの名無しさん :02/01/17 00:55
>>345
もう少し状況を書いてみて
347339:02/01/17 01:10
try{
char gname[12]
file.Read(gname,12);
}
catch(CFileException *e) {
//エラー処理をします
e->Delete();
}
こういう風にしてみたのですが、
file.Seek()で移動もしようかな…と思ったけど
できませんでした。
「何ができないのか」を書けや‥‥
「どうして出来ないと判断してのか」も欲しい。
350339:02/01/17 01:17
すいません…
読込みは単純に終わりました
file.seek(0x30,CFile::begin);
file.read(suimasenn,64);
後はバイナリデータを2バイト文字?
にしたいのですが
82 A8 8A E8 82 A2 82 B5 82 DC 82 B7
=お願いします
こういう変換方を知りたいんです…
CString使うなら(使いたくないが)

CString strBytes;
for(...){
CString strT;
strT.Format(_T("%x%x "),(0xF0 & byte[i])>>4, byte[i] & 0x0F);
strBytes += strT;
}
strBytes.TrimRight();
352339:02/01/17 02:00
ありがとうございました…
感謝です!
353ZERO:02/01/17 04:10
皆さんに質問です。
擬似乱数を発生させるプログラムで、
int main(void)
{
int a[10], i, j, n=7;
unsigned int seed = 582;
srand(seed);
for (i=0;i<10;i++)
a[i] = 100 * rand()/RAND_MAX;
quicksort(a, 0, n-1);
for (j = 0; j < n; j++)
printf("%5d", a[j]);
printf("\n");
return 0;
}
と書いたのですが、unsigned int seed = 582; と書くと、うまくいかないんです。
581や583など、ほかの数字ではうまくいくんですが、582だけはうまくいきません。
どうすればいいか教えてください。
354デフォルトの名無しさん:02/01/17 04:20
意味がわからん。582の時の数列では353のquicksortが
破綻するという意味か?それならquicksortのバグとれ、ちゅうだけの話。
355デフォルト名無しさん(272):02/01/17 16:58
ループ中に割り込み処理ができるようにAfxBeginThreadを使って
マルチスレッドを作ったのですが、今度は、外部出力からの信号を読み取って
もらえなくなってしまいました。
どうすればいいのでしょうか。対処法をお願いします。
356日下部圭子 ◆ib749tYo :02/01/17 17:15
In article >>353, デフォルト名無しさん/353 wrote:
> a[i] = 100 * rand()/RAND_MAX;

RAND_MAXで割ると常に0になりますよ。

----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
357日下部圭子 ◆ib749tYo :02/01/17 17:31
In article >>356, デフォルト名無しさん/356 wrote:

> > a[i] = 100 * rand()/RAND_MAX;
> RAND_MAXで割ると常に0になりますよ。

これは間違いでした。
最初に100をかけているから大丈夫ですね。

----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
TRACE!
TRACE!
>>356-357
……はぁ...
360デフォルトの名無しさん:02/01/18 08:52
>>355
答えようが無い。もっと詳しくかいてくれ。
361デフォルトの名無しさん(355):02/01/18 10:05
>>360
遅くなってすいません。
詳しい内容として、こんな風にマルチスレッドを作ったのですが、
for(time=0;time<10;time++){
Sleep(10);
DioOutputWord( InOut, FBIDIO_OUT1_16,kekka);
AfxBeginThread(ACK,myED2);
}
UINT ACK(void *pParam)
{
CEdit* pED2 = (CEdit*)pParam;
UINT exitCode;
exitCode=0;

DioInputWord( InOut, FBIDIO_IN1_16, &InData);
while(InData == 1)
{
if(stop_flg){
AfxEndThread(exitCode);
break;
}
Sleep(10);
DioInputWord( InOut, FBIDIO_IN1_16, &InData);
if(InData != 1){
AfxEndThread(exitCode);
DioInputWord( InOut,FBIDIO_IN1_16,&InData);
return 1;
}
}

stop_flg = TRUE;
return 0;

原因としては、外部出力側の関数を抜けるとそのままfor関数の中に戻って
しまい、そのままずっとfor関数の処理を行ってしまっているようなのです。
for関数から抜け出すにはどうすればいいのでしょうか。
362名無しさん:02/01/18 10:49
割り込んですまそ。マルチスレッドに関して。
AfxBeginThreadで呼び出す制御関数は、呼び出すクラスと同じ
クラスのメンバ関数ではダメなんですか。
コンパイルが通らないので、試しにメンバ関数じゃなく、
クラス宣言の外に制御関数を出したらコンパイル通ったんですが。
>>361
while(InData == 1) で無限ループしている間に、もう一回この関数に入ってくるのか?
具体的に何をどうしたいのかが分からん。
つーか、物凄く物凄いことをしてるような気がする。
行単位で「何のためにどういうことをしたくてこうしたのか」を書いてくれるとありがたい。
私には理解不能のためパス(笑)

>>362
とりあえず static にしとけー
んでもって基本を勉強しとけー
漏れもやっとくから
364デフォルトの名無しさん:02/01/18 11:43
>>361
>>部出力側の関数を抜けるとそのままfor関数の中に戻って
>>しまい、そのままずっとfor関数の処理を行ってしまっている
単独で出てくる変数などがあってこのプログラムで何をしようとしているのかいまいちわからないです。期待している動作を説明してクレイ
365デフォルトの名無しさん:02/01/18 11:48
>>362
別スレッド立てる時は
1.グローバル関数を作る
2.別クラスを作る      の2通り。
同一クラス内に複数のスレッドをたてるのは×
366362:02/01/18 11:54
>>363 >>365 ありがとう。
やはり、363さんの言ってるとおり、基本をまだしっかり解ってないんでしょうね。
スレッドとかプロセスとか、イメージは掴めてるつもりなんですけど、実際に
コンピュータでどう実現されてるか理解してないってことかな。勉強します。
367デフォルトの名無しさん(355):02/01/18 13:20
>>364
要は簡単にいうと、インターフェースボードからの信号(InData)と
、GUIのコマンドボタンからの動作をマルチスレッドにして両方から
信号を受信できるようにしたいのです。それでこんなプログラムに
なってしまったのです。
そのプログラムを詳しく言うと、for関数の中でインターフェースボードに
信号を送ります。
UINT ACK(void * pParam)関数のところでインターフェースボード
からの信号を受け取り、その信号に対してwhile関数を抜け出し、
なおかつマルチスレッドを使って、GUIからのコマンドでもwhile
関数を抜け出して動作処理を行おうとして行き詰まっています。
 ちなみに、シングルスレッドでは、インターフェースボードか
らの信号のやり取りができるプログラムはできています。

368デフォルトの名無しさん:02/01/18 13:23
>>361
悪い。もうちょっと詳しく。
まず、「外部出力」とはなんなのか。制御関数の事か?
あとfor文の中のsleep(10)はなんのためにやっているのか。
DioXXXWord(...)(ライブラリにある関数だったらゴメン)とはなんなのか。
このプログラムだとワーカスレッドがたくさん生成されるが、これは意図した事なのか?

>ループ中に割り込み処理ができるようにAfxBeginThreadを使って
そのループをワーカスレッドでやってはだめなのか?
369368:02/01/18 13:34
しつこいが、if(stop_flg){
AfxEndThread(exitCode);
break;
}
のbreakもよくわからん。
370デフォルトの名無しさん:02/01/18 13:55
>>368
「外部出力」ていうのは、インターフェースボードでの信号のやりとりで、
DioxxxWord()はip5000のライブラリにある関数です。(こうしないと信号のやり取りができません。)
また、インターフェースに信号を送信,DioInputWord()でコンピュータが信号を受信する関数となっています。
あと、sleep(10)ですが、単なる時間稼ぎみたいなものです。(本当は、for文使わずsleepだけでいいのかも。
く(^^;))
371デフォルトの名無しさん:02/01/18 13:59
>>370
ちょい付けたし、breakはGUIのコマンドがきたら、関数を抜け出すというコマンドです。
372暇人:02/01/18 14:54
こういうことでしょう。多分。

UINT ACK(void *pParam)
{
 ...
 do {
  Sleep(10);
  DioInputWord( InOut, FBIDIO_IN1_16, &InData);
 } while(InData == 1 && !stop_flg)

 if(stop_flg) {
  stop_flg = TRUE;
  return 0;
 }
 return 1;
}

作ったスレッドの終了を検知したかったら、WM_USER_XXXを定義して、
それを returnの前にでも PostMessageする。GUIの関数(ダイアログ?)に。
GUI関数側の WindowProcでそのメッセージを捕まえるんだ!
373暇人:02/01/18 14:58
あ、stop_flgのとこおかしいね。
 if(stop_flg)
  return 0;
 
 stop_flg=TRUE;
 return 1;
}
374デフォルトの名無しさん:02/01/18 15:20
stop_flgはvolatileなの?
375デフォルトの名無しさん:02/01/18 15:22
>>372さん
ありがとうございます。それでやってみようと思います。
376デフォルトの名無しさん:02/01/18 15:40
プログラムをWin32 Debugモードで動かすと、
あるポインタ変数の中身が勝手に
"0xfeeefeee"
というふざけた値になっています。どうしてでしょう?

377デフォルトの名無しさん:02/01/18 15:47
>>371
369の「breakが解らん」はAfxEndThread(exitCode);の後にあったからですよ。
>>376
それは、キミが初期化を忘れてる兆候だ。
0xbacabaca じゃなくてよかったね。
380デフォルト:02/01/19 03:21
MFC+VCで質問です。
ダイアログボックスベースのプログラムで
自分で作ったほかのクラスから
一番上のウインドウハンドル
m_hWndを得るにはどうしたら良いでしょう?
CxxDlg::GetSafeHandle
したり
CxxDlg::m_hWnd
したり
よくわからないままいろいろしてるのですが、どれもうまくいきません。
初心者カキコです。すまんです。
GetParentOwner()->GetSafeHwnd()
したり
GetParentOwner()->m_hWnd
したり?
382380:02/01/19 08:51
>381
ありがとうございます。でも
それだと
CWndの下のクラスでしか使えないみたいです。
たとえば
自分でソケットを扱うクラスを別に作ってその中でウインドウハンドラをつかいたいばあい
class mySocket{
SOCKET socket

mySocket(){
//たとえばここでメインダイアログのハンドルを手にいれたい
//WSASYNCSELECTをつかったりするときに。
}
}

といった感じです。
いろんな場面でそれにぶち当たるのです・・
>>382
AfxGetMainWnd()->GetSafeHwnd() とかなんとかそんなの。
継承できるなら、ATL式に、
template<class T>
class CMySocket : public class T{
... GetSafeHwnd(),
}
class CUseSocketWnd : public CMySocket< CWnd > {};
とか、
template<class T>
class CMySocket{
... static_cast<T*>(this)->GetSafeHwnd()...
}
class CUseSocketWnd : public CWnd , public CMySocket< CUseSocketWnd > {};
するとかどうよ?
385380:02/01/19 09:33
CListBox * UserList = (CListBox*)GetDlgItem
(AfxGetMainWnd()->GetSafeHwnd(),IDC_USERLIST);
UserList->InsertString(-1,"test");

リストボックスのテキストを
こんなかんじで書いてみたらコンパイラはとおりました。
でも"text"が表示されないです。

メインダイアログのクラスの中で
CListBox * UserList = (CListBox*)GetDlgItem(IDC_USERLIST);
UserList->InsertString(-1,"test");
こうするとちゃんと表示されます。うーーーーーむ
> AfxGetMainWnd
> アプリケーションが OLE サーバーではない場合は、アプリケーション オブジェクトの m_pMainWnd を返します。
387デフォルトの名無しさん:02/01/19 10:44
超初心者です、教えてください。
 「これから始めるVC++ 6.0」 で独学しています。アプリケーションウィザード
を使って作る「時計の制作」の例で、時計のオブジェクトIDに対するメンバー関
数をCMainFrameに書くようになっています。
 他の例ではViewクラスに記述する例が多く書かれていたのでいので、そちらに
書いてみると動作しました。オブジェクトに対するハンドラをCMainFrame に割
り当てるのと、Viewクラスに割り当てることの違いは何なのでしょうか?
>>380
> 一番上のウインドウハンドル
> m_hWndを得るにはどうしたら良いでしょう?
> CxxDlg::GetSafeHandle
> したり
> CxxDlg::m_hWnd
> したり

一番上かはともかく、取得したいダイアログのクラスがCxxDlgってわかってるなら
CxxDlg dlg;
HWND hwnd = dlg.m_hWnd;
でいいのでは?
ビューとドキュメントの分離をして
わかりやすく
>>387
本の内容は知らないけど、メッセージはView、Doc、FrameWnd、App
それぞれのクラスに順番にルーティングされるから、どっちのクラスに
書いても動いたのでしょう。著者が書く場所を変えたのは、メッセージの
種類を分別してわかりやすくしようとしたからでしょう。
391デフォルトの名無しさん:02/01/19 12:08
387 です。
 390さん有り難うございます。
 メッセージが順番にルーティングされるということは、メッセージ
ハンドラをどこに置いてもよいような感じなのでしょうか。
 確かにクラスウィザードを見てみると、クラス名を変えてもオブジェ
クトIDの内容はほとんどそのままなので、メッセージハンドラはどの
クラスに書いてもOKということなのですね?


392380:02/01/19 18:34
>388
レスありがとうございます。
ずっと一生懸命
extern CxxDlg dlg;
してました。

CxxDlg dlg;
だとdlg.したときに補完機能がちゃんと働きますね!

CListBox * UserList = (CListBox*)GetDlgItem
(dlg.m_hWnd,IDC_USERLIST);
でもこれでリストボックスのハンドルを得てから

UserList->InsertString(-1,"test");
こうして項目を追加すると落ちてしまいます・・・

〜の命令が〜のメモリを参照しました。メモリがreadになることはできませんでした
のエラーです。
リストボックスの使い方もいろいろ見てみたのですが、う〜〜ん。
つか、GetDlgItemの戻り値くらいチェックしろよ。
>392
落ちるのは当たり前ですよ。
::GetDlgItem(HWND hWnd, int nID)の戻り値は、CWnd* ではなく、HWND。

こういうことだろうか?
CListBox* UserList = (CListBox*)CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd, IDC_USERLIST));

っていうか、これで良いと思う。
CListBox* UserList = (CListBox*)(AfxGetMainWnd()->GetDlgItem(IDC_USERLIST));
実際可能かどうかは分からないけど。
395380:02/01/19 21:18
>394
ありがとうございます。!
できました。まだMFCクラスの木構造を把握してないので、
正直わかったようなわからんようなですが、
勉強します。
396デフォルトの名無しさん:02/01/19 21:45
CListBox UserList( ::GetDlgItem(dlg.m_hWnd,IDC_USERLIST) );
では?
>396
新しいインスタンス作ってどーすんのよ?
それに CListBoxのコンストラクタに HWNDを渡すのなんて無いよん。
スマソ。WTLにはあったもんやから‥‥
399デフォルトの名無しさん :02/01/20 01:24
VCで作ったもののインストーラーを作りたいんですが、
VBで選んでいくだけで、できるような機能はありますか。
検索ワードでも良いので教えてください。お願いします。
Visual Studio® Installer
401___:02/01/20 22:03
すみません。すれ違い怒られてこっちきました
猫でもわかるhttp://www.kumei.ne.jp/c_lang/mfc/mfc_01.htm
でMFCの勉強をしようと思って
第一回のソースをそのまま打ち込んでみたのですが、
#include "afxwin.h"

class CMyWindow : public CFrameWnd
{
public:
CMyWindow();
};

CMyWindow::CMyWindow()
{
Create(NULL,"猫でもわかる",WS_OVERLAPPEDWINDOW);
}

class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMyWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMyApp myApp;

コンパイルはできるが実行時にリンカが
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__endthreadex" は未解決です
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__beginthreadex" は未解決です
Debug/SDKTOMFC.exe : fatal error LNK1120: 外部参照 2 が未解決です。

この3つのエラーを出してしまいます。
VCのバージョンのせい(使っているのはVC6)
かもと思っているのですが、解決策ありましたら教えてください。
/MTかな
>>401
それって典型的なMFCしてないエラーじゃないか
プロジェクト作成でMFC APPウィザード(exe)で作った?
もしかしてWin32 applicationで作ってやってない?

俺も前にCStringをWin32 applicationで使おうとしたらそんなエラーでた
404でふぉるとのななし:02/01/21 04:20
リストボックスのある行をダブルクリックするとダイアログが出て
そこのエディットボックスにリストボックスの内容が入っているという
コードを書こうとしています。
IRCやなんかのインスタントメッセージを想像してもらえるとよいかと思います)
IM ImDialog;
ImDialog.DoModal();
でダイアログを出して
その中のIDC_IMTARGET
のエディットボックスのハンドラをてにいれようとこんな
コードを書きましたが、エラーが出ます。なぜでしょうか?
CEdit* EditBoxIm = (CEdit*)ImDialog.GetDlgItem(IDC_IMTARGET);//ここでエラー
EditBoxIm->SetWindowText(ss);

>エラーが出ます。なぜでしょうか?
詳しくエラーの種類の書かずに対処法を求める
あなたの態度が原因ではないでしょうかね?
406デフォルトの名無しさん:02/01/21 04:35
VS.NETが出たらMFCの運命は如何に・・・
407でふぉるとのななし:02/01/21 04:40
>405
失礼致しました。
Debug Assertion Failed

Program C*〜〜
File:winocc.cpp
Line:76

といったエラーです。
さらにもう一つ関連する部分で疑問が出たのですが
ダイアログが最初にDoModalされた後に
初期化処理をする方法って
どうやるのでしょうか?
アプリケーションならばInitInstance
ウインドウならばOnPaintに初期化の処理を書けばいいのだと思いますが、
みようみまねで、OnInitDialog()
関数を作って書いてみたのですが、それも上記と同様のエラーが出てしまいました。
Winocc.cpp (76) : ASSERT( ::IsWindow(m_hWnd ) );
これの意味がわかりませんか?
ImDialogがウインドウではない、ということです。

まさか、
ImDialog.DoModal();
CEdit* EditBoxIm = (CEdit*)ImDialog.GetDlgItem(IDC_IMTARGET);
EditBoxIm->SetWindowText(ss);
と続いているのでしょうか?なら、制御がDoModalから帰ってきた時点で、
ImDialogは破棄されているはずですが。
409でふぉるとのななし:02/01/21 04:58
>408
ありがとうございます。
DoModalを勘違いしていたようです。
Winocc.cppを見てみました。

ならば、と思い順番を入れ替えてこんな感じにしてみましたが
やはり同じエラーが出てしまいました。
IM ImDialog;
CEdit* EditBoxIm = (CEdit*)ImDialog.GetDlgItem(IDC_IMTARGET);
EditBoxIm->SetWindowText(name);
ImDialog.DoModal();

やはりImDialogがWindowじゃないとの
ことなのですが・・・この場合は定義してDoModalの前だから
ウインドウではないかと思ってしまうのですが・・・・


ちゃんとモーダルダイアログとモードレスダイアログの
処理方式の違いについて勉強しる!

DoModalを発行した時点でダイアログが作られ、そのなかで
メッセージループが廻る。制御が戻るのは、ダイアログ
プロシージャでEndDialogを発行して、ダイアログが破棄されてから。
だから、SetWindowTextをDoModalとおなじ文脈で書くのは間違い。
つーかだね、その機能をモーダルダイアログで実現
するのは、そもそも設計からして大間違いなんだが。
CFileDialog って、
CFileDialog(TRUE, _T(".txt"), NULL,
OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
lstrFileExt, NULL);
で問題ないよね?
VS.NET だと複数選択して開くと IDCANCEL が返って
くるんだけど…
なんか馬鹿やってるのかなぁ
413でふぉるとのななし:02/01/21 07:03
>410.411
なるほど。
うんと考えてこんな感じでできました。
IM *ImDialog = new IM(this);
ImDialog->Create(IDD_IM);
ImDialog->ShowWindow(SW_SHOW);
CEdit* EditBoxIm = (CEdit*)ImDialog->GetDlgItem(IDC_IMTARGET);
EditBoxIm->SetWindowText(name);
でもなんか試行錯誤してて
すごくわかった気がします。
単純にIMダイアログクラスのエディットボックスにClassWizardで
CStringメンバ変数を割り当てておいて、
IM ImDialog;
ImDialog.m_strImtarget = name;
ImDialog.DoModal();
とでもすればいいような気もするけどなぁ。
IRC使ったことないからわからないけど、DoModalじゃだめらしいんで
流してくれていいけどさ。
>>401
メニューの[プロジェクト]→[設定]→[一般]タブ
で、[共有DLLでMFCを使用]を選択するとどう?

>>403
いや、AppWizard使ったらスクラッチで書く必要ないやろ...
>>406
も、も、漏れもそろそろManagedも勉強するよ・・・
417デフォルトの名無しさん:02/01/21 10:10
CD-TEXTのテキストデータって
どうやって取得するんでしょうか?
418デフォルトの名無しさん:02/01/21 11:49
>>416
今さらMFCを勉強してる俺って・・・
こう次から次へと
新しいのを出されると
困るわぁ
仕事でやるならともかく個人で使ってるだけなら、ManagedC++が
浸透して「CLR(・∀・)ii!!」ってなるまでMFCやってるべ。
421デフォルトの名無しさん:02/01/21 12:35
・・・オラはあきらめてC#にするだ。ManagedC++なんてどこまで保証してくれるか
わからんし。
422デフォルトの名無しさん:02/01/21 13:36
まだよく勉強してないんだけど、Managed C++とMFCって別物だよね?
だったら、C#でWindows Formsやった方が・・・
423デフォルトの名無しさん:02/01/21 14:39
ボタン配置して、それが押されたときに
背景の色変えるのってどうしたらいいですか?

424た。:02/01/21 14:41
>>423
ボタンの背景?ウインドウの背景?
ボタンの背景だったらオーナードローで書き換えて上げるしかないか?
>>423
もしかして、いやそんなはずは無いと思うが、万が一、何かの間違いかもしれないが



HTMLじゃないよね?
426423:02/01/21 15:13
ボタンが配置されてるウィンドウの背景です。
背景色を変えれる関数ってないんですかね?

MSDNとかで調べたつもりなんですけど
初心者なもんでわからなかった…
Googleで「背景色 変更 MFC」を検索すれば一番最初に出たんだが・・・
SetDialogBkColorとかOnCtlColor。
428423:02/01/21 15:40
>>427
それってボタン押したときに使えなくないですか?
ウィンドウの初期化に使うって書いてあったんですけど。
>>428
どこに書いてあったのよ
430デフォルトの名無しさん:02/01/21 16:00
OnCtlColor
431423:02/01/21 16:13
SetDialogBkColorの解説にそんなようなことが書いてあったような…
でもOnCtlColorの方で出来そうなんで調べてみます。
ありがとうございます
>>428
書いてあったとかじゃなくてまず試せよ。
>>428の発言はなんかフワフワしてるな。
今度からもうちょい詳しく書いてくれないと答えにくい。
>432
私は428ではありませんが、VCの別の問題にテンパッて居り、
解決策を求め スレを読んでいました。御助言によって開眼し
早速 試行錯誤を繰り返し、さっき 問題の原因を発見できました。

唐突な電波じみたカキコで 恐縮ですが、
お礼を言いたく・・・ありがとうございました!
435デフォルトの名無しさん:02/01/22 14:44
Editボックスに変数の中身を表示させたいのですがどうすればいいのでしょうか。
ちなみにプログラムは

ss1 = "[%2d]X=%3d Y=%3d R=%4.2f \r\n",j+1,X,Y,R;
m_Status = m_Status + ss1;
myED1->SetWindowText(m_Status);

という風になっています。
どうすればいいのでしょうか。
436デフォルトの名無しさん:02/01/22 15:13
>>435
>ちなみにプログラムは ......という風になっています。

?何?自分で書いたプログラムじゃないってこと?
それとも、コンパイル通らないからナントカしてくれってコト?
>> 435
変数の型がわからんけど、

char ss1[100];

だとしたら、

sprintf( ss1, "[%2d]X=%3d Y=%3d R=%4.2f \r\n",j+1,X,Y,R );

こうかな。

438デフォルトの名無しさん:02/01/22 15:20
>>437
いや、'+'のオーバーロードつかってるから、
CStringだろう。
439438:02/01/22 15:24
SetWindowTextの引数でLPCTSTRキャストしてないところからみても・・・
しかし、どうして欲しいのかが解らん。
ss1.Format( "[%2d]X=%3d Y=%3d R=%4.2f \r\n",j+1,X,Y,R);
じゃねーの?
>>438
> いや、'+'のオーバーロードつかってるから、
> CStringだろう。

m_StatusがCStringだったら、ss1はchar*でもCStringでもOKじゃん。
(m_StatusはCStringだけど)
442438:02/01/22 15:34
>>441
たしかに。・・・で肝心の435は?
>>442
437か440でOKなんじゃないの。
なにか不足でも?
>>435がいないが解決、と。
何がしたくて何ができなかったのかを書かないで
質問する人が最近多い気がする。
446435:02/01/22 15:51
ありがとうございました。
>>446
ワラタ
448446:02/01/22 18:42
>>447
ありがとうございました。
449デフォルトの名無しさん:02/01/22 22:29
CString name;
name = "御前 藻名";
SetWindowText(CString("私の名前は") + name + CString("です。"));

上記のようなプログラムがあって、変数nameに名前を入れた後、
SetWindowTextで名前の前後に文字を入れて+演算子で結合して実行したのですが、

実行結果
私の名前は
で終わってしまい、正しく表示されません。
何がおかしいのでしょうか?
450デフォルトの名無しさん:02/01/22 22:35
あ、エディットボックスに表示したいんです。
451仕様書無しさん:02/01/22 22:57
SetWindowText("私の名前は" + name + "です。?");
452449:02/01/22 23:34
>>451
うまくできないー。
CE用のアプリケーションを開発しているんだけど、
eVCじゃ無理なのかな?
CEってUNICODEじゃなかった?
name = L"御前 藻名";
とかしなくても自動で変換してくれるの?
454449:02/01/23 00:12
>>453
nameの部分は本来レジストリから取得しています。
引数に使っている(LPByte)(LPCTSTR)を流用して、

name2=(LPByte)(LPCTSTR)name;
とし、SetWindowTextしてみたところ、最初の一文字'a'だけ表示されるようになりました。
もうちょっとって感じなんですが、後はどうすればよいのかわかりません。(涙
教えて厨で申し訳ありませんが、ご教授よろしくお願いします。

455デフォルトの名無しさん:02/01/23 01:34
>>449
…ちゃんとレジストリ読めてる?
RegQueryValueEx()を呼び出してるなら、最後の引数“LPDWORD lpcbData”は
受け取る最大文字数を指定しとかないといけないんだけど。
あと、引数に name を直接指定してないよね?
456デフォルトの名無しさん:02/01/23 01:39
CDec ってMFC?
これに相当するAPI関数はないですか?
>456 それはVB。
Cだったらキャストするかstrto系で変換するかのどっちかだろう。
CListView(CListCtrl)で特定の項目だけ色を変える、とかはどうやれば良いんでしょう?
459デフォルトの名無しさん :02/01/24 11:51
MFCを使い出して2週間くらいの初心者です。
とりあえずダイアログベースのアプリケーションは組めるようになりました。
そしてSDIに挑戦しようと思ったのですが、
テキストを普通に表示する方法がわかりません
TextOut関数みたいに場所を選択するのではなく
コンソール画面のように改行を含めたテキストを簡単にばーっと
表示する部分が欲しいのです。
ダイアログベースならば、EditBoxを使えば簡単に出来るのですが、
SDIの場合どのようにしたらいいのでしょう?
とりあえずドキュメントクラスにCString型の変数を作って
そこにデータをいれてViewクラスのOnDraw関数で表示すればよいの
だろうと思っているのですが・・・・。
なにやら本をみてもフォントの高さを測って
位置を計算して、出力みたいに書いてありますが、
そうするしかないのでしょうか?
Visual C入門ビギナー編、シニア編どちらも買ったのですが、書いてないのです。
ひょっとしてあまりにも簡単すぎて情報がないのでしょうか・・?


460( ・∀・)つ旦:02/01/24 12:22
すみません、ちょっとご教授願えないでしょうか。
CButton等コントロールを自分でCreateするときに、
渡すIDってどうすればいいのでしょうか?

このIDはどのように使われるもので、
どういう制約があるのか等がわからないのですが…
>458 CustomDraw
>459 AllocConsoleして、WriteConsole (w
   エディットビューかなんか使えば?
>460 コントロールが親にWM_COMMANDとしてメッセージ飛ばすときに使う。
462デフォルトの名無しさん:02/01/24 13:00
>461
なるほどエディットビューを使うのですね。試してみます。
またちょっと話が変わるのですが、
Docクラスの外部からDocumentクラスのメンバにアクセスするにはどのようにするのでしょうか?
ViewクラスではCXXDoc pDoc = GetDocument();
でpDocを手に入れていますが、自分で作った外部の関数からはGetDocument画使えませんよね。
WinAppクラスならば extern CXXApp theApp;
してメンバにアクセスできますが、Documentクラスの場合うまくいかないようです
464VB厨房:02/01/24 13:48
VBでいうコントロール配列みたいな事はどうやったら出来るんでしょか・・・
465デフォルトの名無しさん:02/01/24 13:52
>>464
コントロール配列って何?
どんな機能があんの?
>>465
コントロールが規則正しく並んだら面白いな。
467( ・∀・)つ旦:02/01/24 14:25
>コントロールが親にWM_COMMANDとしてメッセージ飛ばすときに使う。

ありがとうございます。
しかし、そうするとWM_COMMANDを発行する気のないコントロールは
適当な値を渡して(・∀・)イイ!!という事なのでしょうか?

>464
ClassWizardで各コントロールにメンバ変数を割り当てた後、ソースを検索して
手作業で配列に書き直すのが楽。
書き換えた部分は //{{ …… //}} のブロックの外に出しておくのを忘れずにな。
メッセージハンドラは、IDを連番にしておいて ON_COMMAND_RANGE とかで対処。
469VB厨房:02/01/24 14:34
ヤパーリvectorとかいうやつを使うのでしか?
470VB厨房:02/01/24 14:40
>>468サンクス!
けどこの方法で動的に配列増やすことはできるのでしか?
コード中でコントロールをゴリゴリ増やしたいのでし。

>>469は気にしないで・・・
>>467
WM_COMMANDを呼びだそうが、呼び出すまいが、かぶったら駄目だし
かぶらねければ良い。

心配だったらresource.hでも覗けばよろし。
>471
static controlはどうなる?
473VB厨房:02/01/24 14:57
>>465>>467スマソ
説明できん。。。
Googleあたりで「vb コントロール配列」で探せば山ほど当たるからそっち見て
>>472
その辺は常識範囲内だろ。・・・・多分。
>470
動的にコントロールを増やす場合は、ON_COMMAND_RANGEとか、
ClassWizardとかを使わずに、WindowProc(仮想関数)を
オーバーライドし、WM_COMMANDを直接処理するのが良いと思う。
476( ・∀・)つ旦:02/01/24 16:30
>>471
了解しました。ありがとうございます。
重複しないように気をつけるです。

私は、いままでストリングテーブルとかでダミーをつくって
それのIDを使うようにしてたんですけど…
コーディングの時に何かリソースエディタが作るIDとかと
かぶならいための方法とか
あるんでしょうか?
477VB厨房:02/01/24 16:45
>>475ありがとう。
意味がほとんど分からなかったので、
自分にはまだ無理だということが分かったょ

ぅTo the see 脳
>>476
ID作るなら[表示]→[シンボルブラウザ]で新規作成したほうが楽では。
連番でID作ってくれるからかぶらないし。
479学習中:02/01/24 17:19
ドローイングソフトを試作中です。
現在、マウスで線は書けるのですがちょっと発展させてプルダウンメニューを
追加し、「始点を固定する」、「X軸を固定する」「Y軸を固定する」の3通りの
変化を付けられるように、メニューを作成してやってみましたが、
c:\documents and settings\public\デスクトップ\draw2\draw2.cpp(12) : fatal error C1083: インクルード ファイルがオープンできません。'resource.h': No such file or directory
cl.exe の実行エラー
プルダウンメニューと元のソースの連携が出来ていないのか起動しません。どう対処したらよろしいでしょうか?
>VBのコントロール配列っていうやつ
CArrayでコントロールの配列クラスを作るとか。
やったことないので詳しくはわからんけど。

>>479
コメント見る限りだとresource.hが無いらしいけど、そのファイルはちゃんと
あって、インクルードされてる?
481デフォルトの名無しさん:02/01/24 17:45
>>479
プロジェクトに入ってないんじゃねえの?わかんねえけど・・。
482( ・∀・)つ旦:02/01/24 17:57
>ID作るなら[表示]→[シンボルブラウザ]で新規作成したほうが楽では。
おお、こんなものがあるとは、ありがとうございます。
気づけ、自分。
>>479
MFC でも VC++ でもない、それ以前…
対処も何も、同じディレクトリにあるべき resource.h がないって
出てるじゃん。
どこに捨てたの?
484デフォルトの名無しさん:02/01/24 19:49
あるソフトをつくりたいのですが、二つexeがあるのです。
片方の方で、最初動かして、あるボタンをおしたらもうひとつの方が起動するってのを
やりたいのですが、どういうほうほうがありますでしょうか?
>484
ShellExecute , CreateProcessなんか。
>>484
ShellExecute
487デフォルトの名無しさん:02/01/24 20:29
ありがとう
>485
488デフォルトの名無しさん:02/01/24 20:42
もうひとつ質問なんですが、リソースに他のexeファイルを埋め込む
ってことはできるのでしょうか?
あと、その他のexeファイルを隠したいです。
なんでexeを二つにしたですか
490デフォルトの名無しさん:02/01/24 21:27
統合するのがめんどうだったのでw
笑えませんが。
492超初心者:02/01/25 01:01
あるディレクトリ内にある、特定の文字列を含んだファイルを
全て自動的にロードする、というプログラムはどう組んだらよろしいのでしょうか?
例えば、
abc000.dat、abc001.dat,abc002.dat…
などのファイルが存在し、ディレクトリ内の
abc●●●.datを全てロードすると言う感じで。
よろしくお願いします。

↑↑
他スレに書いたんですが、レスがついてないので
こちらでお願いすることにしました。
やはり、一つ一つロードしてみるしかないんですかね?
493デフォルトの名無しさん:02/01/25 01:28
検索かなり粘って
やっとlibpngとlibjpeg組み込んでPNGとJPEGファイル
表示できるようになりました

それにしてもPNGはとにかくJPEGって
ビットマップ並に使われてるのにソースなんかを
紹介してるプログラムの本って
ほとんどないですね(私が見落としてるだけ?

つーかSDK標準で組み込んでないのがそもそも疑問
なんでだろう(w
>>492
MSDNで
FindFirstFile
を検索してみて
>>492
※ p はフォルダのパス(c:\windows など
abc●●●.datを検索したいなら

void hoge(LPCTSTR p)
{
CString cstr;
WIN32_FIND_DATA ffd;
HANDLE hFindFile;

cstr.MakeLower();
cstr.Format("%s\\abc*.dat", path);
hFindFile = ::FindFirstFile(cstr, &ffd);
if(hFindFile != INVALID_HANDLE_VALUE){
do{
cstr = ffd.cFileName; // ここのcstrにファイル名一覧がくる
}
while(::FindNextFile(hFindFile, &ffd));

::FindClose(hFindFile[0]);
}
}
496誤爆:02/01/25 01:41
あ、p == pathね
497超初心者:02/01/25 02:08
>>494-496
ありがとうございました。早速明日試してみます。
498デフォルトの名無しさん:02/01/25 12:31
visual C++で「共有DLLでMFCを使用」というプロジェクト設定で
コーディングしていて、エラーもなくVisual C++からでもバイナリ(exe)単体でも
起動するのですが、「MFCのスタティックライブラリを使用」に設定を変えてビルドし直して
起動するとアプリケーションエラーになって起動しません。
要因としては何が考えられるでしょうか。
(Debugモードでビルドしていますが、Releaseでも同じ結果になりました。)
499かるかん ◆TM3.ie9w :02/01/25 13:15
>498
スタンダードエディションではできない。
500かるかん ◆TM3.ie9w :02/01/25 13:17
って、ビルドは出来てるってこと?なら違った。
大概は変数の初期化忘れとかなんだけどね。
mallocして初期化しないでそのまま使ってるとか。
501498:02/01/25 13:58
>500
ビルドはできます。
その線で洗ってみますね。
>>498
なんで、どういうアプリケーションエラーが出てるかを書かないかなー
どっかに技術ML用質問テンプレみたいのなかったっけ…
あれみたいにかしこまって書かなくてもいいけど…
505デフォルトの7子:02/01/27 15:49
CViewで作っていたアプリのViewの部分を
CEditViewに変更する必要がでましたので、
CEditViewを継承して新しくクラスをつくり
アプリケーションクラスのInitInstanceの

pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CKunekuneDoc),
RUNTIME_CLASS(CMainFrame), // メイン SDI フレーム ウィンドウ
RUNTIME_CLASS(XXXNewView));
                   ↑
 この部分をXXXNewViewに変更しました。
するとウインドウの部分にカーソルが出て確かにEditViewクラスにはなっているようですが、
OnDraw関数に何か書き込んでも、表示することが出来ません。なぜでしょうか?
506デフォルトの7子:02/01/27 16:00
505です。
すみません。
それ以前の問題のようでした。

CEdit *ED1 = &GetEditCtrl();
ED1->SetWindowText("test");

のこのコードをスケルトンがまっさらの状態から試してみたのですが
なにも表示されませんでした・・・。
コンパイラもとおるので何が間違っているのでしょう?・・?
GetEditCtrl()->SetWindowText("test");
ならどうですか
>>506
CEdit &ED1 = GetEditCtrl();
509デフォルトの名無しさん:02/01/28 00:37
ビットマップを切り取りたいんだけどどうすればいいの?
StretchDIBits だと矩形でしょ。
それを三角形とか五角形とかでやりたい
510デフォルトの7子:02/01/28 01:01
>507,508
ありがとうございます。お二方の方法を両方ともやってみました。
ところがどちらも何も表示されませんでした。

状況はMFCアプリケーション,SDI,使用クラスはEditViewを
選択し、まっさらのスケルトン状態で
OnDraw関数に書きこんでいます。
ただ最初の状況で文字を表示したいだけなのですが、
こんなにややこしいとは・・・・・
511507:02/01/28 01:15
>>510
失敬、GetEditCtrl().SetWindowText("test"); です。
あと書く場所はOnInitialUpdateあたりで。
512デフォルトの名無しさん:02/01/28 07:40
現在VC++でDIBを使い画像を表示しているのですが、
その画面上にシールみたいな奴
(周囲を四角で囲って中に情報を書き込む)を作りたいのですが、
どのようにしたらよろしいでしょうか?
四角を作るだけなら簡単ですが、中に文字をかくとなると…?
>>510
たぶん、CEditView派生のクラスだとOnDraw呼ばないよ。
514デフォルトの名無しさん:02/01/28 15:11
コードからフォルダを開きたい。
フォルダをダブルクリックしたとき見たく開くにはどうすればいいですか?
パスでも指定して開けば?
_っていうかフォルダ開いて何したいかが問題。
ShellExecuteとか言って欲しいんだと思われ。
>>515-516
レスありがとうございます。試してみます。では。
518デフォルトの名無し(435):02/01/28 16:00
"教えてクン"ですいませんが、またまた、Editのところでつっかえたのですが、
コンソール(MS-DOS)のようにすぐに(X,Y)座標の位置を表示しようとしたのですが、
すべての座標を読み取ってから(X,Y)座標を表示してしまいます。
どうすればいいのでしょうか。

ちなみに、プログラムは
CString ss1,m_Status;

ss1.Format("[%2d]X=%3d Y=%3d R=%4.2f \r\n",j+1,X,Y,R);
m_Status = m_Status + ss1;
myED1->SetWindowText(m_Status);
というプログラムで、

このプログラムがだいたい100回ぐらい繰り返されます(だいたいというのはwhile関数で行っているため)。
多分文字数が多くなってこうなったのだと思うのですが、
何か解決策でもあればいいのですが教えてください。
ふつうそういうのは、ステータスバーに表示したりします。
>493
SDKに入ってるけど、表示するだけなら、
IPicture->render();
とかいう関数でjpgもだけど、色んなのをその関数だけで表示できるよ。
COMだけどAPIみたいなもんだYO.
キーワードはOleLoadPibture(),(API)
CreateStreamOnHGlobal(),(API)
だYO
>>518
> while関数で行っているため

whileは関数ではありません。
>518
とりあえず SetWindowText の後で UpdateWindow してみる。
チカチカしてまともに読めたものじゃないと思うが。
こういう場合は SetSel でEditの末尾を選択して ReplaceSel で
追加分だけ足していくのが定跡。
523デフォルトの名無し(435):02/01/28 16:36
>>521
すいません。while関数ではなくwhile文でしたね。(^^;)
>>518
CString ss1;
for(int i=0; i<100; i++){
ss1.Format("%d\r\n", i);
int nLen = myED1->GetWindowTextLength();
myED1->SetFocus();
myED1->SetSel(nLen, nLen);
myED1->ReplaceSel(str);
}

みたいな感じかなぁ。
でもループで100個くらい回したところで表示経過はたいして見えないよ。
525524:02/01/28 16:42
> myED1->ReplaceSel(str);
myED1->ReplaceSel(ss1);
でしたん。そして522とかぶってたん。
edit_setsel(-1)とかはちゃんと機能しない時があるから
ちゃんとgetwindowtextlengthしろよな!
527デフォルトの名無し(435):02/01/28 17:03
>>522,524さん
ありがとうございます。

528デフォルトの名無し:02/01/29 14:19
ボタンをクリックしてプログラムを処理した後、もう一度ボタンをクリックすると
ダイアログが消えてしまうのですが、ダイアログを消えないようにするにはどうす
ればいいのでしょうか。
モードレスダイアログ使えば?
>>528
きみはそう言うけどもだね、それがどんなボタンでどういう処理をして
どんなダイアログが消えるのかなんて、聞いてる方にはわからないんだよぅ。
531デフォルトの名無し:02/01/29 14:49
>>530
すいませんでした。
ボタンの処理は「原点復帰」と「スタート」ボタンというボタンで
最初「原点復帰」を行ってから「スタート」ボタンをクリックする
とダイアログが消えてしまうのです。
意味不明(w
>>531
それは処理じゃなくてボタンの名前ちゃうんかと。
プッシュボタンの名前を言っただけちゃうんかと問い詰めたい。
でもボタンが2つあることがわかったからちょっと前進。
プログラムもきっとダイアログベースなんだろう。(AppWizard+MFC)
そのダイアログが消えてしまうってことなんだろう。


もしかして、い、いや、そんなことはないと思うが、
そのスタートボタンというやつ、[OK]ボタンのキャプションを[スタート]
に変えた、、、ってことはないよね。
534デフォルトの名無し:02/01/29 15:33
>>531
[OK]ボタンのキャプションを[スタート]にし、
もちろんIDもIDOKからIDCSTARTに変えましたが・・・。
俺の経験ではコードが変なときがあったなぁ。
case :break;のbreakが抜けてるとかない?
case WM_COMMAND:
....
....
....←ここのbreak;がぬけてんの。
case WM_CLOSE:
break;

なまじ動いちゃうからたちわりーんだよな
CDialog::OnOK();

//CDialog::OnOK();
とでもしてください。
>>535
ここMFC限定だし…
>>536
あはははは。笑えるね、それ。
・・・しかし>>534見てる限りだと可能性は大だ。
539デフォルトの名無し:02/01/29 16:52
>>536
一応ONOK探しましたがありませんでした。(w
モードレスダイアログを作成してやったのですが、やっぱりボタンを押してプログラム処理
した後、もう一回ボタンを押すとダイアログが消えてしまいました。
ほかになにかいい方法はないでしょうか。

>>539
とりあえずデバックで追っかけてみてよ
だからもっと詳しく書けって。
ボタンを押すと
どういう処理が行われるか
ちゃんと理解してつくってるのか?
>>531
「原点復帰」を押さずに「スタート」を押した場合はどうなる?
消えるとしたら「スタート」がそういう処理になってる。
消えないとしたら「原点復帰」の処理でどこかをぶち壊してる。
「原点復帰」しないと「スタート」押せない仕様だとしたら、そういうことは最初に言う。
>>531が推理クイズを出しているというスレはここですか?
>>544
はい。今、「原点復帰」と「スタート」の実装をみんなで推理してるところです。
ヒントはいろいろ出てくるんですけどね…
じっちゃんのナニかけて〜
仮説1: 「スタート」の処理に意味もわからずEndDialogを入れた
仮説2: IDCSTARTの値が1とか2
548デフォルトの名無し(531):02/01/29 17:56
皆さんお騒がせしてすいませんでした。
デバッグした所、1回初期化する関数を何回も呼び出して
いたのが原因でした。
2回目以降そのプログラムを実行すると強制終了されるのをすっかり忘れていました。
強制終了かよ(´Д`;)
しょーもな
結局、僕らの推理は徒労に終わりましたとさ・・・。

・・・・・・。
552:02/01/29 18:05
ワラタ
このナゾはコナソにもとけんよ
一番の謎は、なぜデバッグもせずにふわふわした質問をしたのか、だ。
まえに一緒に仕事したやつに、「まず、コンパイラのバグと言う」クンがいたけど、
それに比べればかわいいヤツだとおもう也。
>「まず、コンパイラのバグと言う」クン
名言だな。今後、厨問した後「コンパイラのバグだと思うのですが...」って
付け加えるネタが流行る。
しかし実際にコンパイラのバグということもありうるので
うかつにそれを言うと後で恥を書くこともあるという諸刃の剣。

そういればVC++.NETβ2でテンプレートクラスを明示的に特殊化したときに
コンストラクタが呼ばれなくて強制終了しまくって苦労したなぁ。
再現方法わからんけど。

これってコンパイラのバグですか?
まあβなら
なにがあっても。
559デフォルトの名無しさん:02/01/29 23:44
DIBを表示するのに使っている256色以外の色をつかって、
別のBMPを表示したいのです。
例えば、背景の絵の上に赤ベタや黒ベタ(色は任意)のシルエットみたいな
BMPを表示したいのですが、やはり256色ではダメなのでしょうか?
ディスプレイ解像度が256色じゃない限りは普通に出来るだろ?
561559:02/01/30 00:04
>>560
現在、256色の画像ファイルをDIBで表示しています。
やはり256色のBMPをDIBで表示しようとすると、
同じパレットを参照してしまいます。
背景のパレットの256色はフルに使われているので
空きがありません。

プログラムはできれば256色でやれと指示されたのですが。
実は昨年末からVC始めたのでよく分からないのです…
ゲームですか?
563559:02/01/30 00:13
そのへんはあまり聞かないで下さいませ…(;´Д`)
そもそも”どこに”表示しようとしてるのか書かれてない。
256色DIB上にほかのDIBを重ねるんだったら256色以上出せないのは当たり前。
ディスプレイ上に2つのDIBを重ねるんだったらディスプレイが256色じゃない限り何の問題もない。
565559:02/01/30 00:36
>>564
>そもそも”どこに”表示しようとしてるのか書かれてない
あ、これは失敬。
>256色DIB上にほかのDIBを重ねるんだったら256色以上出せないのは当たり前。
うーむ、やはりそうでしたか…。出直してきます。
566デフォルトの名無しさん:02/01/30 11:26
質問があります。
AppWizardで生成されたスケルトンコードで、ファイルの「開く」とか選ぶと、
ファイルパスを指定するダイアログがでますよね。あれってどういった関数で
呼び出してるのでしょうか??
OnFileOpen()よびだして
その中でDoModalしてんだろ
>>566
おいおい、頼むよ・・・。
そんなのAPI辞典か何かで調べてくれって。質問する内容じゃないだろ。
そもそも、それを調べられない時点でプログラマとしての資質が
限りなく0に近いと思うのだが。
>>566
本代ケチって時間を無駄にしてるパターンなのかなぁ。
コモンダイアログの説明なんて、たいていの入門書に載ってると思うけど。
570デフォルトの名無し(531):02/01/30 12:29
また、質問なのですが。
Editボックスの垂直スクロールバーを常にスクロールする(常につまみを下にする)
にはどうすればいいのでしょうか。
>>566は、スケルトンの中にDoModalしてるコードが無いから
どこで呼び出してるのか、を聞きたかったんじゃないか?
まぁ、>>567の通りでたいていの書籍に載ってることも間違いないんだが。
俺も最初は悩んだ。
>>570
「Editボックスに何か追加した時、一番下の行が見えるようにスクロール
させたい」ってことか? それなら >>524-526 あたりを参照。
574デフォルトの名無し(531):02/01/30 15:26
>>573
ありがとうございます。
>>524を参照にやったらできたのですが、
いざ実行すると

原点復帰します。
原点復帰します。
原点復帰します。
原点復帰 

となってしまい。
そこから先表示されなくなってしまいました。
オーバーフローになってしまったのでしょうか。

プログラムは、
void CGUI::OnCgenten()
{
CEdit* myED1=(CEdit*)GetDlgItem(IDC_STATUS);
CString ss;
int nLen;
ss="原点復帰します。\r\n";
ss.Format("%s",ss);
nLen=myED1->GetWindowTextLength();
myED1->SetFocus();
myED1->SetSel(nLen,nLen);
myED1->ReplaceSel(ss);
}
となっています。どうすればいいのでしょうか。
> CString ss;
> ss="原点復帰します。\r\n";
> ss.Format("%s",ss);

感動した。
あ?また推理クイズか?>>573はよく解けたな。
>>574
きっとコンパイラのバグです。
また他の場所で変なことしてんじゃないのか
ここまでくるとネタだと思えてくる
すでに文字列がEditBoxに入ってるならGetLineCountとLineScrollとか。
金田一もビクーリ
581デフォルトの名無し(531):02/01/30 17:55
>>579
GetLineCount関数もLineScroll関数も使いました。
が、うまくいきませんでした。
>>581
どううまくいかなかったのか教えて!
せめてヒント、最初の1文字は?
犯人は・・・お前だ!>>580
CListCtrlを使って、リストビューのアイコン(イメージ部分)のみを書き換えようと思うのですがうまくいきません。
具体的には、下記のようにSetItemでイメージのインデックスを指定しましたが、反映されず、同じアイコンが表示されたままです。

CListCtrl& list = GetListCtrl();
...
if ( ... )
{
icon = 1;
list.SetItem(nItem, 0, LVIF_STATE, lpszItem, icon, 0, 0, 0);
}

良い方法がありましたら、ご教授お願いします。
なんでLVIF_STATEなの?
586854:02/01/30 23:55
>>585
LVIF_STATE → LVIF_IMAGE でできました。
私の勘違いでした。ありがとうございました。
587デフォルトの名無しさん:02/01/31 00:43
かちゅーしゃのようにIEコンポーネント(CHtmlView?)を使って
リンクをクリックされたらポップアップメニューを出したり、
いろいろな処理をさせたりしたいのですが、どうやっていいか
わかりません。CHtmlViewにはリンクをクリックされた時に処理
されるメッセージハンドラもないですし、親クラスのCViewのマウス
クリックイベントは定義しても、なぜか使用できないです。

そんで、いろいろ調べたところ、どうやらCOMという技術を使わない
と、そういったことは難しいらしいのですが、COMを使ったIEコンポー
ネントの制御方法について詳しいサイトや本があったら、教えてほしい
のですが、、、

よろしくお願いします。
そういえばATLとかMFCでCOMスレって無いよな。
俺も以前ここでMFC+COM系の質問したんだけど放置されたよ…

ちなみにラップされてないCOMのスレもあるけど、あまり動いてない。
589デフォルトの名無しさん:02/01/31 01:23
あれ?
CHtmlViewってVC++6.0じゃないと使えないの?
VC++5.0じゃ駄目なのか・・・鬱だ。
やはりCOMは鬼門なのか・・・
591デフォルトの名無し(531):02/01/31 10:21
やっとEditボックスに文字がかけない不具合を直しました。
Editボックスの表示を前のプログラム
m_Status = m_Status + ss1;
myDL1->SetWindowText(m_Status);
に直し、
その後に
int line = myED1->GetLineCount();
myED1->LineScroll(line);
上手く行きました。
LineScrollでうまくいってんじゃん(;´Д`)
なんなのこいつ(;´Д`)
593デフォルトの名無しさん:02/01/31 15:11
すみません、間違えて旧スレのほうに投げてしまいました。
再度こちらに書きます。

あるスレッドを使ったプログラムをCOM化すると、
WaitForSingleObjectのところで応答が返ってきません。
どうやらスレッドが終了していないようなのですが、原因不明です。
COM化してない場合は問題なく動くのですが、
なにかご存知の方、いらっしゃいますでしょうか?
>587
君の求めているものが全てある。
http://kalx.tripod.co.jp/2chsrc_20020127.zip
リストビュー内の複数アイテムを削除するにはどうすればいい?
596デフォルトの名無しさん:02/01/31 23:32
>593
COMの要求を処理しないと駄目なので
WaitForSingleObjectはよんじゃ駄目
GetMessageのループにする。

MFCプロジェクトでSDIにして
その時(プログラムが立ち上がったとき)
勝手に空のドキュメントが生成されないようにするにはどうすればいいの?
例えばデータソースを指定するダイアログ(メインフレームの中に)
とかを出したい
597デフォルトの名無しさん:02/01/31 23:47
>593
COMの要求を処理しないと駄目なので
WaitForSingleObjectはよんじゃ駄目
GetMessageのループにする。

MFCプロジェクトでSDIにして
その時(プログラムが立ち上がったとき)
勝手に空のドキュメントが生成されないようにするにはどうすればいいの?
例えばデータソースを指定するダイアログ(メインフレームの中に)
とかを出したい
598デフォルトの名無しさん:02/01/31 23:47
二重にかいちゃった。ごめん
599587:02/01/31 23:48
>>594
おーー、これです。これを求めていました。
サンキュです。

ところで、参考書籍はどんなの読んだらいいんでしょう?

key入力を鈍くするに如何すれば良いでしょうか?
601デフォルトの名無しさん:02/02/01 01:27
>>600
ギプス



>>600
ゆっくり押す。
>>601>>602
詳しく。
>>603
ワロタ
605デフォルトの名無しさん:02/02/01 07:56
マルチスレッドでタイマー呼んでも別に問題ないよな?

UINT itteyoshi(LPVOID a){
/*


*/
((CGikoView*)a)->SetTimer(100,1000,zusaaa_1000get);
return 0;
}
void CGikoView::func{
AfxBeginThread(itteyoshi,this);
}
>>600
SystemParametersInfo で SPI_SETKEYBOARDSPEED あたりをいじる。
>605
// In general, CWnd objects should be passed by HWND from
// one thread to another. The receiving thread can wrap
// the HWND with a CWnd object by using CWnd::FromHandle.
//
// It is dangerous to pass C++ objects from one thread to
// another, unless the objects are designed to be used in
// such a manner.

これ、大丈夫? 俺も昔はまった。
(CGikoView*)a が、もう無効なポインタになってるんだよ。
リストビュー(CListCtrl)に、16*16アイコン付きのファイル名をレポート表示
したいのですが、このとき各ファイルのアイコンはどこからもってくれば
よいのでしょうか?
>>608
リソースに持っておくのが一般的かな。
>>609
んー、他のアイテムならそれでもいいんですが、ファイル名を表示するので
ファイルのアイコンを表示したいんですよねぇ…
exeファイルならファイルからアイコンを取得するのかとも思ったのですが、
データファイル(テキスト、画像など)のアイコンはどこから持ってくれば
いいのかなぁと。
611デフォルトの名無しさん:02/02/01 16:12
関連付けられてるexeからもってくるんじゃないの?
あ、でも複数アイコンはいってるexeもあるからなあ。
エクスプローラーに表示するアイコンは
レジストリに保存されてるのだろうか。
612麻人:02/02/01 16:22
DLL 内の関数に CWnd へのポインタを渡して、DLL 側でウィンドウ作るのは
どうするのがスジなんでしょうか?
そのまま作ると CWnd::AssertValid() の

  // should also be in the permanent or temporary handle map
  CHandleMap* pMap = afxMapHWND();
  ASSERT(pMap != NULL);

ってところで引っかかるんです。
CWndではなく、HWNDで渡せば良いのでわ?
>611
SHFILEINFO info;
::SHGetFileInfo(fileName, 0, &info, sizeof(SHFILEINFO), SHGFI_ICON )

HICON hIcon = info.hIcon;

で取れる yo!
615デフォルトの名無しさん:02/02/02 01:23
CBrushを使って円や四角に色を付けています。
CBrushを使えば横線などで塗りつぶせることはわかっているのですが、
白地に指定した色の線になります。
例えば赤地に青の線といったようなことはどうすればできるのでしょうか?
SetBkMode(TRANSPARENT)かな
617615:02/02/02 02:02
ありがとうございます。うまくできました。
SetBkMode(OPAQUE)の方もやりたいことに使えそうでとても参考になりました。
>>614
ありがとう!アイコン取得&リストに表示できたよ!
619デフォルトの名無しさん:02/02/02 09:33
同一ドキュメントの読み直しをする際、修正済みの場合だけダイアログを表示したいと思ってるます。

CWinApp::OnFileOpen()からCDocManager::OnFileOpen()が呼び出され
その中のCDocManager::OpenDocumentFile()で同一ファイルの検査を行っていることは分かりました。

OpenDocumentFile()に手を加えて実装するにはどうするのが良いのでしょうか。
620 :02/02/02 12:51
MFC6.0で印刷をしたんですが参考になるお奨めのHPはありますか。
このままだと印刷部だけVBで作ってVCからexecするしかないよ トホホ。
プロジェクトウィザードで印刷機能にチェック入れる
管理者権限でしか起動できないようにするにはどうすれば良いのでしょうか?
例えば「何か」のsetup.exeのようなものです。
>620
CPrintViewは駄目か?
MFCのコントロールの使い方をサンプル突きでやさしく教えてくれる
書籍orサイトきぼ〜ん
DelからVC6.0に移行してるんだけど、
タブコントロールの使い方ワッカンネ〜
すいません。どなたか下記のエラーの原因、わかりますか?

"0x6ab282a9"の命令が0x00000000のメモリを参照しました。
メモリがreadになることはありませんでした。
626625:02/02/04 13:11
しまった。さげちゃった。
NULLが入ったままのポインタをどっかで使ってるんではないでしょーか。
628625:02/02/04 13:32
>>627
ありがとうございます。それっぽいです。
ところで、これリリース版でのみ起るのですが、ポインタの初期値の
関係でしょうか?
629625:02/02/04 14:00
たった今、詳細な理由が判明しました。
自分定義のメッセージハンドラが原因でした。
afx_msg void Onhoge();ってなってたのですが、
afx_msg LRESULT Onhoge(WPARAM wParam, LPARAM lParam);
としたらうまくいきました。

・・・なんじゃ、そりゃー!!!知るかボケー!!!!
つーか、デバックで落とせよな・・・・。
そういえば、ON_CONTROL_RANGEで指定したハンドラで、
 void OnHoge(UINT nID)
とせずに、引数を省略して
 void OnHoge()
にした場合。このハンドラ呼ばれたとき、デバックビルとだと普通に動作するのに、
リリースビルド版だと落ちない?
631デフォルトの名無しさん:02/02/04 16:23
みなさん教えてください。

1.AppWizardでCFormViewを使うSDIアプリケーションを
作りました。(以下、CMyAppとします)
2.CMyViewの上にCRichEditCtrlから派生したCMyRichEditを乗せて、
ClassWizardでメンバ変数m_richと関連づけました。
3.メニューに「太字」項目を追加し、ID_MENU_BOLDとして、
ClassWizardでCMyRichEditクラスにOnMenuBold()メッセージハンドラ
を追加しました。

しかし、実行してもメニュー「太字」は淡色表示のままで、
CMyRichEdit::OnMenuBold()のブレイクポイントはかすりもしません。

CMyView::OnMenuBold()
{
m_rich.OnMenuBold();
}
以上のようにすれば動くのですが、OnMenuBold()と同様の関数が
他に40近くあり、CMyViewに重複してメッセージハンドラを追加するのは
避けたいのです。
さらにCMyRichEditは独立したコンポーネントとして
他のプロジェクトに追加したいので、
CMyViewに書くコードは最小限にしたいのです。
どなたか助けてください。

>>631
よくわからんが、
CMyRichEditのメッセージマップにOnMenuBold()はある?
633デフォルトの名無しさん:02/02/04 17:39
>>632
あります。

簡単に言うと、
自分で作ったクラスでメニューのクリックを
キャッチしたいんですけど、
CViewとかCDocument以外のクラスでも出来ますか?
>633
CMyRichEditが自分でWM_COMMANDを処理してるのか?
それじゃ「独立したコンポーネント」にならない。
たとえばフォームにCMyRichEditを二つ載せてメニューコマンドを
選択したら、それはどっちのコンポーネントに行くんだ?
コマンドIDに依存してるから、「他のプロジェクトに追加する」のも
そのままじゃ無理だし。
>>631
CMyViewにON_COMMAND_RANGEハンドラを追加
そこからm_richにメッセージを丸投げ
636631:02/02/05 00:00
>> 634
>CMyRichEditが自分でWM_COMMANDを処理してるのか?
>それじゃ「独立したコンポーネント」にならない。
まったくそのとおりです。
この仕事では、IBMホームページビルダーの「htmlソース」タグ
の部分だけ独立して作っている感じなんで、
コマンドIDは変えればいいんですが、
ダイアログまで呼んでるんで、リソースの引っ越しが
手に負えなくなりつつあります。

完璧独立コンポーネントにするにはどうすればいいんですか?

>>635
>CMyViewにON_COMMAND_RANGEハンドラを追加
ON_COMMAND_RANGE(ID_MENU_BOLD, ID_MENU_XXX, OnSendAllMessages)
ここまではおっけーです。

>そこからm_richにメッセージを丸投げ
丸投げってどうやるんですか?
OnSendAllMessages(something) // うろ覚えすまん
{
m_rich.SendMessage(something);
}
でいいんですか?
637デフォルトの名無しさん:02/02/05 02:27
グローバル変数バリバリの汚い描画ルーチン(C言語)を
DLL化して動的に呼び出すとします。

描画は、psetやline、色設定などを連続的にコマンドを与えて実行する
タイプです。
そのときに、複数のプレーン(DCなど)で同時にこの描画ルーチンを
「独立して」呼び出したいばあいどうすればよいですか?

問題はグローバル変数を用いているので、変数がごっちゃになるということです。
別にDLLでなくてもよいのですが、解決方法があれば教えてください。
638デフォルトの名無しさん:02/02/05 02:47
>>637
使いたいプレーンだけ、LoadLibraryなどすればよいのでは?
639デフォルトの名無しさん:02/02/05 13:27
char hoge[10];とかに、
hoge[0]=0x01,hoge[1]=0x00,...
という風にバイナリデータを格納してあるとき、これをCStringに移そうとしたら、問題がおきました。

まず、CString::CString(LPCTSTR lpch, int nLength );を使って格納した場合、
終端と認識するのか、(いくらnLengthを指定しても)0x01しかコピーされません。
strncpyなどをつかっても同じ。
次に、memcpyを使った場合、うまくはいくのですが、リリース版でエラーが出ます。

これらの問題をうまく解決する方法はないでしょうか?
\0含める文字列クラスってどこかになかったっけか?
見たことある気がするんだけど忘れちゃったよ。
641631:02/02/05 13:38
>>634
>>635
>CMyViewにON_COMMAND_RANGEハンドラを追加
>そこからm_richにメッセージを丸投げ
でできました。どうもありがとう。

とりあえず解決したんですが、
完璧独立コンポーネントにする方法も
教えてもらえたら超嬉しいです。


642デフォルトの名無しさん:02/02/05 13:43
>>640
CStringでもできないことないよ。
CString s;
s = "あいう";
s += '\0';
s += "えお";
s.GetLength();
GetLengthの戻りは11。
>>636
普通はWM_COMMANDなんか投げずに、コンポーネント専用の
メッセージ(WM_USER+何とか)を定義して使う。

>>639
バイナリデータを文字列に入れちゃイカン。CByteArrayとか使え。
644631:02/02/05 14:53
>>643
m_rich.SendMessages(WM_COMMAND, nID, 0);
じゃだめなの?
const UINT WM_RICH_COMMAND = WM_USER+DEFERENCE;
にしなきゃいけないってこと? なぜ?
>644
コマンドIDはアプリケーションで付けるものだから、
コンポーネントがコマンドIDに依存するように作ると
そのアプリケーションから切り離せなくなる。

標準コントロールを見れば分かると思うけど、
コントロールに何か仕事をしてもらいたい時には
コントロール専用のメッセージ(たとえばEDITなら
EM_SETSEL とか EM_UNDO とか)を送る。
逆に、コントロールから親ウィンドウへ通知するときに
WM_COMMAND とか WM_NOTIFY が使われる。
コントロールにWM_COMMANDを送るっていうのは使い方が逆だよ。
646困った637:02/02/05 15:49
>>638
>>使いたいプレーンだけ、LoadLibraryなどすればよいのでは?


いや、同じDLLに対して何度、LoadLibrary、Getなんとかしても
得られるアドレスは一緒です
俺も考えたんですが、デバッガで追ってみたので。

うーんどうすればいいのか
つーかそんなDLL使うなと、言いたい。
648639:02/02/05 16:18
>>642
入る事は、入るのですが、'\0'が含まれた配列から格納する事ができないのです。

それで、>>643さんの話も踏まえて、
CStringでやってた処理をすべてchar[]に直すことにしました〜。

・・・。
・・やってられるか、ヴォケー!!!MFCなんてだいっきらいだー!!!
CStringなんて糞使うやつの気が知れん
プレーンの数だけDLLをコピーして、ダイナミックにロードする、
って案はどうなった?foo.dll -> foo1.dll, foo2.dll, foo3.dll....
651デフォルトの名無しさん:02/02/05 16:48
>>648
これでどうよ?
CString str;
LPCTSTR sz = "abc\0def";
memcpy( str.GetBufferSetLength( 7 ), sz, 7 );
str += '\0';
str += "def";

MFCじゃなくても、文字列として処理しようとしたら苦労はおんなじだよ。
652631:02/02/05 17:03
>>645
ありがとう。すごく参考になったyo
でもWM_USER+DEFERENCEでメッセージを登録していったら、
誰かの定義したメッセージと重なる可能性が、
でてくると思うんだけど、そのへんはみんなどうしてるの?
そもそも639は何のためにバイナリを文字列に入れようとしてるんだろう……。
>>651 後ろ2行は不要じゃない? あと、ReleaseBuffer すれ。
654デフォルトの名無しさん:02/02/05 17:22
>>653 ReleaseBuffer
正直、そこまで面倒見てられなかった。
つか、CByteArrayかcharのCArrayで解決すんのが筋だし。
>>639
そこで、なぜ、CMyStringクラスを作ろうと思わなかった?
656639:02/02/05 17:36
>>651
それ、私もやったんすけど・・・、なぜかリソース版で落ちるんですよ。
誰かみたいに「コンパイラのバグか」と言いたくなる。その時は「CStringでは駄目なんだ、きっと」
という結論にしましたけど。あ、もちろんReleaseBufferはしましたよ。

>>653
いろいろ事情がありまして。

>>655
めんどかったからです。でもchar[]はもっと手間取った・・・。鬱
657639:02/02/05 17:38
しまった!

>>656
誤)リソース版

正)リリース版
GetBufferした後はReleaseBufferって自動で呼ばれるんじゃなかったっけ?
そもそもGetBufferSetLengthの後はReleaseBufferする必要ないし。
>>658
まじで?
>>658
そんなことないって。

よそで「CStringはバグってるから使わない」ってヤツなんどか
みたことあるけど、使い方間違ってるだけなんじゃねーの?

ReleaseBuffer()しなくていいって、なにを根拠にいってるんだ?
662658:02/02/05 17:49
ん?1行目はかなりあいまい。
ReleaseBufferって単に長さを計算してるだけじゃないの?
2行目はMSDNに書いてあるけど。
>>656
ReleaseBuffer する時にも長さを指定しないと '\0' の所で切られるよ。
まあ、リリース版で落ちるのは、それとは無関係にどこか壊しているせいだと思うが。

そもそも、CStringは文字列を扱うために設計されたクラスなんだから、
バイナリがうまく扱えないからって文句言うのはお門違い。
電子レンジでパンが焼けないと言って怒るようなものだな。
664639:02/02/05 17:56
>>663

>そもそも、CStringは文字列を扱うために設計されたクラスなんだから、
そうっすね。結局、今後もお世話になると思います。>CString
GetBufferは扱いがめんどう。
美しくない。
バグの元。

ほとんどの局面で使わなくてもすむんだから、あえて使うことは
ないでしょう。
>>662
MFCのソース嫁。長さをただ「計算してる」だけじゃなくて再設定してるから、
呼ばないとおかしなことになる。
そもそも自動的に呼ばれるんだったらReleaseBufferの存在意義ないだろ。

> 2行目はMSDNに書いてあるけど。
GetBufferSetLength の説明には、GetBuffer の説明からコピペしてきて
関数名だけ直し忘れてる箇所があるな。ひょっとしてこれを見て
「GetBuffer では必要だけど GetBufferSetLength では必要ない」って思った?
667658:02/02/05 18:13
1行目はやっぱりまずいね。
SetAtあたりが長さの再計算をしてくれてるかと思ったけど、してくれてなかった。
668658:02/02/05 18:15
>>666
ms-help://MS.VSCC/MS.MSDNVS.1041/vclib/html/vclrfCSimpleStringTGetBufferSetLength.htm

// No need for trailing zero or call to ReleaseBuffer( )
// because GetBufferSetLength( ) set it for us.
669658:02/02/05 18:17
あ、追加。
>>666
長さの計算ってのはそういう意味(再設定)で使った。
670デフォルトの名無しさん:02/02/05 18:28
CStringにバグがあるのは本当。
「あったのは」、かもしれないけど。
なんか、Delete関数かなんかで、特殊な場合の処理が
ソースから見てバグってんのが一目瞭然だった。
知らずに使ってひどい目合ってる人もいるんだろうか?
>>670
Replaceにもある(た?)らしいな。
最近のVC++MLによると。
672かるかん ◆TM3.ie9w :02/02/05 18:38
確かにMFCのソース見ればわかる話なんだけど。
結論から言うとするべき。内部的に「長さ」のパラがあって、
一部のメンバー関数がそれを見てるから。ReleaseBufferする
ときに長さを渡すと、それをセットするようになってる。
>>653
>そもそも639は何のためにバイナリを文字列に入れようとしてるんだろう……。
ももも、もしかして、
 CString a;
 a.Format("%x",0x01);
みたいなことをしたいとか?
>>653
・・・なんでだろうなぁ。
CByteArrayじゃなくてchar[]を使うことにしたってあたりもよくわからん。
675666:02/02/05 19:11
>>668
たしかに書いてあるね。疑ってスマソ。
長さが最初から分かっている場合は GetBufferSetLength 一発でOKってことか。
676かるかん ◆TM3.ie9w :02/02/05 20:02
サンプルソースのコメントだったのね。納得。
>>652
同じウィンドウクラスの中で重複しなければ問題ない。
つまり、メッセージを受ける側でちゃんと区別できればいいってこと。

CRichEditCtrl から継承してるんだったら、richedit.h の中を見て、
現在使われていなくていなくて将来も使われそうにない範囲を
適当にチョイスすればいいよ。
MFCのソース見てたらさ、
#ifndef _IA64_
...
#else
...
#endif

とかあったんだけどさ。
よく判らないんだけど、これっていずれLinuxに移植するつもりって事?
>678
拡張性を考えて設計するのは、勝手だろう。
使いもんになるんだったら、売るのも勝手だろう。
NT系列は昔っからIA64を視野に入れてただろ。
winnt.h
>>678
別にWindowsだってIA64で走ってもいいだろう。

漏れも
#ifdef _MAC
とかの中でMac用のソースがあるのは確かに気になっているんだが…。
Mac版Office用じゃないの?コンパイラは何なんだろう……
684デフォルトの名無しさん:02/02/06 15:14
メニューから選択して、プロパティシートを表示させたいのですが
ClassWizardから自分で作ったクラス(基底クラスはCPropatySheet)に
処理を書いても、メニューが薄灰色のままで、メニューを選択できません。
初めから存在するViewクラスに処理を書くとちゃんとメニューから選択して表示されます。
どうしたら自分で作ったクラスで処理できるようになりますか?
Viewに自作クラスをもたせてしまえ
>>685
そうきたか。
687684:02/02/06 16:13
>>685
それって、CViewにメニュー選択時のメッセージハンドラを書くって事ですか?
確かにそれでプロパティシートは表示されるんですけど、プロパティシートは別クラスにしたいんです。
Viewにあまりごちゃごちゃ書きたくないし。

メニューが薄灰色って事は、メッセージルーティングでメッセージが伝わってないって事なんだろうか。
でも、CPropatySheetはCCmdTargetクラスの派生クラスだから、メッセージは伝わっていると思うのですが。
688666:02/02/06 16:23
>687
えーと、そのメニューコマンドを選ぶと、プロパティシートが
表示されるわけだよね?
ということは、メニュー項目を選ぼうとしている時点では
プロパティシートは表示されていないわけだよね?
まだ存在しないものがどうやってメッセージを受け取れるの?
>>688
その言い方だと誤解を招く恐れがあるとおもわれ。

まあ要は、
>まだ存在しないものがどうやってメッセージを受け取れるの?
ってことすよ。>>684クン
690684:02/02/06 16:29
>>688
なるほど!それですね。
え、じゃあプロパティシートを別クラスにして、そこにメッセージハンドラを
書くのは不可能って事ですか?
やはり、初期に存在しているViewやDocに書くしかないのでしょうか?
>>690
ちゃうっちゅうに(違いますよ)!
どっかでそのクラスを宣言(構築?)せいってことです。
ViewだってDocだって最初から実体があるわけじゃ無いのでげすよ。

それが、どこだかは自分で考えなさい。
692684:02/02/06 17:24
>>691
えーと、色々と見てみたんですけどスケルトンで作成されたヘルプのダイアログが
Cプロジェクト名.cppにあったので、ここに書くと思うんですけど上手くいきません。
ダイアログは、クラス自体が全てここに書かれてるから表示されてるのかな。
>>692
CXXXApp::InitInstance()とか見てみ
メニュー項目作ってそのメニュ−ハンドラでDoModalするだけじゃダメなんか?
695684:02/02/06 18:30
色々とやってみたのですが、駄目でした。
検索しても、ほとんどがViewかDocに
CUserSheet sheet("プロパティシート");
sheet.DoModal();
というメッセージハンドラの処理の書いているものばかりで
自分で追加したクラスにかいてあるサンプルはありませんでしたし。

>>693
見てみましたけど、よく分かりませんでした。
クラスの宣言をここに書けば良いんですか?
具体的に何を書けばいいのかが、全く分かりませんでした。

>>694
その通りなんですけど、上にも書いたとおり、DoModalをViewかDocに書けば表示されます。
自分で追加したクラスCUserSheet(基底クラス:CPropatySheet)に書くと、上手くいきません。
そのクラスが実行時に存在しないと言うのは、教えて頂いて分かったのですが
初期にこのクラスを認識させるために、どこに何を書けば良いのかが分からないのです。
なぜCUserSheetの中でDoModalする必要があるの?
もうDoModalの時点でプロパティシートは表示されてるのに
さらにDoModalして何を表示させようとしてるの?
697666:02/02/06 18:45
684は自分で自分を作れる魔法のクラスが欲しいそうです。
どうも>>684が何をしたいのかがわからないんだけど、
> プロパティシートは別クラスにしたいんです。
> Viewにあまりごちゃごちゃ書きたくないし。
って言うなら初めから問題無いじゃない?
プロパティシートはCPropertySheetから派生してるらしいから別クラスになってるし、
Viewがごちゃごちゃするのが嫌ならDocやMainFrmにでも書けばいいし。

なんかプロパティシートの中でDoModalしたいって言ってるけど、
じゃあアプリケーションはいつプロパティシートを表示する機会を与えられるんだろうか。
>>684がやりたいのはたぶん、フレームウィンドウで特定の
メニュー項目が選択されたら、プロパティシートのクラスが
それを検知して、自分で自分を表示するってことなんだろう。
実現不可能ではないかもしれないが、素直にViewにDoModalと
1行書くのとは比べものにならないほどの手間がかかるぞ。
それでもやるか?
   いいえ  >いいえ
つーか素朴な疑問なんだけど、メニューハンドラってどこに書いてる?
ViewがごちゃごちゃするからMainFrm.cppに書いてるんだけど。
701デフォルトの名無しさん:02/02/06 23:38
ステータスバーにアイコンを表示させたいのですが、
なんかアイコンが32×32の大きさになってしまいます。
16×16の大きさを指定するにはどうしたらいいでしょうか?

こんな感じでやったのですが、、、
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
CStatusBarCtrl& stb = m_wndStatusBar.GetStatusBarCtrl();
stb.SetIcon(1, hIcon);
>>701
MSDN読め
703デフォルトの名無しさん:02/02/06 23:47
>>702
みましたけど、載ってないですよ。
お願いします。教えてください。
>>703
> みましたけど、載ってないですよ。

こんなことゆーやつには教えてやんない:p
見つからなかったってんなら話は別だったんだけどねぇ。
MSDNだけが情報源じゃないしな。LoadIcon 16 とかでぐぐってみれ。
LoadImageだったり
>>705
漏れの環境では16は大きすぎるよ。(w
12じゃ無いとはみ出る。
でもMSDNでLoadIconみればもろに解決策書いてあった気がしたけど、
漏れの目の錯覚だよね、>>703は載って無いって言ってるし。
いかん。漏れも錯覚が見えるYO!
709デフォルトの名無しさん:02/02/07 15:34
>>684
MyView.cpp
ON_COMMAND_RANGE(ID_MENU_FIRST, ID_MENU_LAST, OnAllMenu)

OnAllMenu(UINT nID)
{
m_prop.SendMessage(WM_COMMAND, nID, 0);
}
MyPropertySheet.cpp
ON_COMMAND(ID_MENU_FIRST)
...
ON_COMMAND(ID_MENU_LAST)

とやれば、メニューのイベントは受け取れるし、
CMyViewのコードは最小限だ。
>631で既出。
シンボルブラウザでID定義するのと
ストリングテーブルでID定義するのは
なにかちがうのでしょうか?
リストビュー内でアイテムを右クリックしたときに、ポップアップメニューを表示するため、OnRButtonDownに下記のコードを書きました。

CMenu cMenu;

mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);

VERIFY(cMenu.LoadMenu(IDR_POPUPMENU));
CMenu* pPopup = cMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);

ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());

CListView::OnRButtonDown(nFlags, point);

右クリックでアイテムを選択状態した後、ポップアップメニューを表示したいのですが、先にポップアップメニューが開いてしまい困っています。
みなさんの知恵を貸していただけないでしょうか。よろしくお願いします。
>711
OnContextMenu に書いてみたら?
713デフォルトの名無しさん:02/02/07 18:20
クライアント領域から、矩形を引っこ抜いて加工したいんです。
例えばフォトレタッチソフトで、画面の一部矩形にフィルタをかけるみたいなノリ。
一発で引っこ抜ける方法、有りませんか?
bitblt。
良く考えたら
CDC::BitBlt の逆はどうすればいいんですか?
って聞いた方がわかりやすかった。
716711:02/02/07 18:43
>>712さん
あさっりできました。
ただ、同じコードをそのまま書くと、ポップアップの表示座標がマウスポインタの位置から激しくずれます。
point.x-400 などして調整すれば問題ないんですが、ちょっと気になったりならなかったり。

どうもありがとうございました。
717デフォルトの名無しさん:02/02/07 18:43
DDXでコントロールに対応させたメンバ変数って
そのコントロールを持ってるダイアログのクラスからしか参照できないの?
他のクラスから参照しようとすると、定義されてないってなるんだけど。
718デフォルトの名無しさん:02/02/07 18:51
>>716
OnRButtonDownではClientToScreen(&point)が必要で、
OnContextMenuでは不要って点はチェック済み?
お前ら!すいません、即答ください。
切り捨て関数なんだっけ?
BASICのfixみたいな。
ハァ?キャストノコト?
cast?
そんなんだっけ?ありがとスマソ
722デフォルトの名無しさん:02/02/07 19:04
int a = (int) 5.1234;
みたいな事?(藁 >切り捨て
あっ、キャスティングかYO!
じゃなくて

mathへっだのヤツ
>717
普通に作ればpublicになるから見えますが。
変数ではなくて、コントロールの型が未定義だって言ってない?
もしそうだったら、参照する側で適切なヘッダファイルをインクルードしる。

>715
BitBltの逆とは何か定義して下ちい。
転送元と転送先を入れ替えるってだけの話じゃないよな。

>723
floorか? floor が欲しいのか?
725デフォルトの名無しさん:02/02/07 19:12
つーかマジ言うと
変数が8の倍数のときに真を返すif文を作ろうとしてて。
三年もプログラミングやってなかったらポインタすら忘れてたよ…
やりたいことがわからん。
BASICのFIXと同じことがやりたいんなら722でいいと思うが?
if(a & 7)
return false;
else
return true;

とか?
728719:02/02/07 19:18
ああぁ、ビット演算子とかあったっけ…
末期だ…

すんまそん。
マジメに勉強し直してきます。
729デフォルトの名無しさん:02/02/07 19:25
>>725 >>727 >> 728
if( n % 8 == 0)
が一番自然。実行速度はともかく。2の乗数でなくても使えるし。
if(((int)(n/8))*8==n)
実行速度はともかく。2の乗数でなくても使えるし。ワラ
731711:02/02/07 19:30
>>718さん
チェックしてませんでした。とても勉強になりました。(゚д゚)ウマー
732717:02/02/07 19:31
>>724
マジっすか。
ちゃんとインクルードしてるけど、「定義されていない識別子です。」って出ます。
何がイカンのだろう。
>>730
お前の書いたソースは死んでも読みたくありません。許してくだちい。
>733
あなたに指図される筋合いはありません。
何の権限があってそのような事を言うのですか?
>>732
その識別子って何よ。
>>727
-1が8の倍数になりましたが。
736デフォルトの名無しさん:02/02/07 20:51
>>713ですが、BitBltいぢりまくって何とかなりました。ヒントくれた>>714に感謝。

漏れは>>733じゃないけど、素直に日本語読めば指図はしてないと思うぞ>>734
そして>>733に激しく同意。
737727:02/02/07 20:53
>>735
2行上に
unsigned int a;
って書いてあるの見えないか?w
>>735
> -1が8の倍数になりましたが。
2の補数じゃない負数表現でも使ってるんでしょうか?
739717:02/02/07 20:56
>>735
エディットボックスにDDXで対応させてるCString変数m_nameです。
これをMainFrmから参照しようとすると、そのエラーが出ます。
ダイアログクラスのヘッダはちゃんとインクルードしてます。
>>738
思いっきり勘違いしてたよ。鬱だ吊ってくる。
741710:02/02/07 21:15
>シンボルブラウザでID定義するのと
>ストリングテーブルでID定義するのは
>なにがちがうのでしょうか?
わかります?
>741
違いはない。以上
743デフォルトの7子さん:02/02/08 12:51
CEditViewで
ドキュメントが変更されたことを検知するにはどうしたらいいでしょうか?
ネットワークからデータを受け取るとそれをDocクラスの変数に
しまうところまでは出来たのですが、それを表示させる方法がわかりません。
CEditViewだとOnDrawは呼ばれないようですし。
どなたか教えてください。
UpdateAllViews(Doc)でOnUpdate(EditView)
745デフォルトの名無しさん:02/02/08 13:22
CFormViewがそのメンバである、CRichEditCtrlのNM_RDBCLKを受け取ってくれません。
「メッセージハンドラの追加」で追加したので、メッセージマップとかもしっかり書かれています。

どんな原因が考えられるでしょうか?ご教授おねがいします。

サーバー側でCRecordSetを使ってAccessデータベースの読みこみ、更新(追加はなし)
をしているのですが、Updateしたあと他のクライアントが全部のデータを表示しようとすると
うまくいきません。調べてみたのですが読みこみ時のMoveFirstが働いていないようです。
つまり、カレントレコードが編集行から移動していないのです。
どなたかご教授いただけますか?
747デフォルトの名無しさん:02/02/09 08:10
リバーの中にあるバンドの位置を固定することって
可能でしょうか?
常に同じ位置に表示させたいのですが、、
748デフォルトの名無しさん:02/02/09 08:54
厨房な質問ですいませんが、GetParent()->SendMessage周りが
デバッグビルドでは普通に動くのに、リリースビルドでは例外で終了したりします。
どんな原因が考えられるのでしょうか?
>>748
ありがちなのが、ポインタを初期化せずに使ってるとか。。。
750デフォルトの名無しさん :02/02/09 11:43
たとえばCSplitterWndで横2つにフレーム分割されたアプリケーションを扱うとき

CRightDoc
CRightView
CLeftDoc
CLeftView
を作ってそれぞれ扱うと言うのはなんとなくわかるのですが、
CRightDocとCRightViewを
CLeftDocとCLeftViewを
それぞれ結びつけるのはどこで定義するのでしょう?
定義し場所がわからないため
CRightViewでぼGetDocument()の戻り値がCRightDocにならないです。
751デフォルトの名無しさん:02/02/09 12:38
初心者です教えてください。
 モードレスダイアログの表示位置をメインフレームのサイズに関連して
変えたいと思います。そこで
−−−−−−−−−−−−−−−−
(1)モードレスダイアログとして表示するクラスに位置を保存する変数を用意する。
(2)CMainFrameのOnCreate関数でモードレスダイアログをCreateしたとき、メイ
  ンフレームの四隅の座標を(1)で用意した変数に入れる。
(3)モードレスダイアログのクラスのOnInitDialog関数でMoveWindow関数の引数
 で(2)で代入した値を使う。
−−−−−−−−−−−−−−−−−−
 としましたが、(2)では値が確かに値が代入されているのに、(3)では
値が変になってしまい、考えたように動作しません。
なぜこのようになってしまうのでしょうか、解決法を教えてください。
 
>>750
Viewが複数あっても、普通ドキュメントは1つじゃないの?
2つに分ける理由は、なんかあるの?
>>752
MFCのビュークラスは不完全な気がする。
自身のクローンが作れないから、新しいウィンドウで表示したりするとビューに関する情報が初期化されてしまう。
しようがないからビューごとにその情報を保持する新しいCDocumentを作ったよ。
750の話とは無関係だけどさ。
754デフォルトの名無しさん:02/02/09 13:16
>752
いやそれがわかっていませんでした。
なるほど、一つにすればよかったのですね。
IRC CHATクライアントみたいなものを作ろうと思ってたので
なんとなく右側の参加ユーザー一覧と
左側のメインウインドウのメッセージを
別のDOCに保存するものだと思っていました。
>>754
それが理由なら、ドキュメントは1つで全然おっけーだよ。
756755:02/02/09 15:20
>754
なるほど勉強になります。

しかしDOCが一つだとするとViewをどう使い分けるのでしょうか?
UpdateAllViews(*pSender)命令を使用するときに
Viewへのポインタが必要になると思うのですが、
左右にViewがあるときにどちらかのViewへのポインタを手に入れる方法はありますか?


NULLでいいじゃん
>>756
ここでも読んで勉強したまえ。
http://techtips.belution.com/ja/vc/0055/
759754:02/02/09 15:32
>757
Nullだと両方のViewがアップデートされてしまうので・・・
どちらか片側だけアップデートしたいのです。
>>759
何がしたいのかよくわからんが・・・
普通そういうのはlHintかpHintで更新情報を渡す。
>>759
つーか普通pSenderはthis。
そうでなかったらNULL。
だって送り主だもん。
外部のオブジェクトが勝手にViewの名を騙ってイベントを起こすのはおかしい。
762754:02/02/09 16:04
>760,759
いえ左フレームにCEditView右フレームにCListViewの派生クラスを指定して

w1.CreateView(0,0,RUNTIME_CLASS(myEditView),CSize(400,lpcs->cy),pContext);
w1.CreateView(0,1,RUNTIME_CLASS(myListView),CSize(0,lpcs->cy),pContext);

実行したところ左側の途中でフリーズしてしまい、
問題はUpdateAllView()にあると思ったので、問題を切り分けるために
左フレームだけ更新したかったのです。
しかし今右のVIEWだけCViewにすると問題は出ませんでした。
CListViewを使用すると不具合が起きるようです・・・
なんでだろう???
CEditViewっていつから分割ビューに対応したんだっけ?
764754:02/02/09 16:10
>764
え?分割ウインドウに対応していないViewなんてあるのですが?
とりあえず左フレームにCEditView右フレームにCViewでは成功するようですが・・
左フレームにCEditView右フレームにCListViewだと
CEditViewの動作が止まってしまいます。
765763:02/02/09 16:16
ん〜〜いまVC6無くて忘れたけど。
いくつかのViewは分割できなかったような記憶が・・・。
766754:02/02/09 17:49
>765
結局いろいろ試行錯誤してみましたが
CListView CEditView CViewは分割は可能みたいです。
CEditViewのOnInitialUpdateで
CButton * CB = new CButton();
CB->Create("送信",BS_PUSHBUTTON|WS_VISIBLE,
CRect(myRect.Width() - 100,0,myRect.Width(),40),this,IDC_MYBUTTON);
してビューの右上隅にボタンを貼り付けているのですが、
これってウインドウのサイズが変わるたびにボタンが隠れてしまったり
右側に空白が出来てしまったりするのですよね。
ウインドウサイズの変更がOnSizeで捕まえられるのは知っているのですが、
ここで動的にボタンを書き直すと言うことは出来ないもんでしょうか?
それとも最初のCreateで常にウインドウの右端にボタンを設置しておくことが出来ますか?
左端なら簡単なのですが・・。

林晴比古の新VC++6.0入門ビギナー編、シニア編をひっくり返してやっているのですが、
なかなかVCってやりたいことの項目が多すぎて難しいですね。
CBをメンバ変数にするとか
768デフォルトの名無しさん:02/02/10 02:49
リバーの中にあるバンドって固定にできるのでしょうか。
教えてください。
769754:02/02/10 07:12
>767
ええとつまり具体的にはどういうことでしょうか?
メンバ変数にすると移動が可能になる方法がちょっとわからないです。
WinMXやIRCのチャットであるような一行のエディットボックスと
それを送信するボタンをその右端につけたいのです。
最初はフォームビューにエディットボックスとボタンで・・
と思ったのですがこれだとウインドウサイズに合わせて
エディットボックスを伸び縮みさせることが出来ないですよね。
そこで
エディットビューにボタンを配置してみたのですが、
右端にボタンを固定しておく方法がわからず、さらに、
エディットビューは複数行を許可してしまうし、
右端と下端にバーが出てしまいます。しかもボタンをおいてもその上にまで書きこみ
カーソルが移動してしまう始末。
いったいどうやるのが正解なのでしょうか・・・??
>>769
OnSizeでSetWindowPos
追記
>>770をフォームビューで。
772デフォルトの名無しさん:02/02/10 22:16
CToolBarの仕様についてお伺いしたいのですが、
ボタンの淡色表示はどうするのでしょう?
773while(name == sage):02/02/10 23:13
 リストビューのレポートビューで、サブアイテムの単一の選択、もしく
は、サブアイテムのテキストのインプレイス編集ってできますか?できる
ならやり方を教えていただけませんか。かなり初心者なのですがよろしく
お願いします
774754:02/02/10 23:41
>771
フォームビューで出来るんですか。
というわけで早速・・・
フォームビューにエディットボックスとボタンをつけて
連動して動かすようにすると・・・

CButton *CB = (CButton*)GetDlgItem(IDC_BUTTON1);
CEdit *CE = (CEdit*)GetDlgItem(IDC_EDIT1);
SetWindowPos(CB,cx-100,cy - 100,cx,cy,SWP_SHOWWINDOW);
SetWindowPos(CE,0,0,cx-100,cy -100,SWP_SHOWWINDOW);

む・・・・・動かないです・・・・
かといってエラーも出ないのですが・・

しかし、わからんことが多すぎますね・・・。
「MFCによるWindowsプログラミング」
注文してしまいました。
775デフォルトの名無しさん:02/02/11 00:27
こんにちは簡単なCADのようなもの作ってます
さて、CScrollViewから派生したビュークラスで任意倍率を扱う事は
出来るのでしょうか?
表示もとの対象物の縮尺(大きさ)は変えずに視点倍率のみ変更する
ことで実装したいのですがどなたか知りませんか?
CB->SetWindowPos(NULL,cx-100,cy - 100,cx,cy,SWP_SHOWWINDOW|SWP_NOZORDER);
>>772
EnableButtonかな
>>773
普通のインプレイス編集はアイテムしかできないんでしたっけ?
サブアイテムの場所でエディットボックスをCreateする方法もあるみたいですが...
>>773
う〜〜〜〜ん
つい最近見た記憶があるんだけど。
どこだっけ?!
思い出せなくてなんか気持ち悪いなぁ。
codeguruにあった。
781779:02/02/11 01:45
782754:02/02/11 07:59
CB->SetWindowPos(NULL,100,100,200,200,SWP_SHOWWINDOW);
としてみたら
****の命令が******のメモリを参照しましたメモリがreadになることが出来ませんでした。
がでました。

CB->SetWindowPos(&wndTop,100,100,200,200,SWP_SHOWWINDOW);
そこでこのようにしても同様のエラーになります。

デバッガで追ってみると
CWnd::SetWindowPosの
ASSERT(::IsWindow(m_hWnd));
m_hWndの確認のところでエラーが起きてる模様
これはつまりCButton型ポインタCBのさすオブジェクトがm_hWndを
所持していないと言うことですよね?
m_Wndとは明示的に所持を宣言しないといけないものなんでしょうか?

783デフォルトの名無しさん:02/02/11 08:44
772ですが、失礼、よそで教えてもらいました(ぉ
CToolBarCtrl &ctrl = sqToolBar.GetToolBarCtrl();
ctrl.SetState(ID_XXXX, TBSTATE_ENABLED);
役に立つ人も居ないとも限らないから一応貼り。MFCややこしい('_`)
784デフォルトの名無しさん:02/02/11 08:46
ごめん。sqToolBarって内のシンボルだ。
吊って来る。
>782
GetDlgItemが失敗してるに1モナー。
OnSizeってウィンドウ作成直後に一回飛んでくる。いま試せないけど、
ひょっとするとOnInitialUpdateより先に呼ばれてるのかもしれない。
だとしたらまだコントロールが作られていないよ。
いずれにせよエラーチェックしなされ。
786デフォルトの名無しさん:02/02/11 13:04
ActiveXをVC++のコンポーネント及びコントロール挿入ではなく、
ソース書きで挿入する方法はありますか?
787デフォルトの名無しさん:02/02/11 13:16
特定条件下であるCButtonが押された時に、そのボタンを消去したいんですが、
そのボタンのOnLButtonDownで
getParent()->PostMessage(EVENT, index, (LPARAM)this); として、
親の受信部でdelete((CButton *)lparam)とかしちゃってOKなんでしょうか?
一応動いてますが、余りに不気味です。つか、ボタンのOnDestroy呼ばれてないし。
お行儀のいい方法が有りましたら一つ御指南を。
Post使ったところはgoodだけれど、ウィンドウ消すにはDestroyWindowが定説。
789デフォルトの名無しさん:02/02/11 14:00
おお、OnDestoryがコールされた(;゜Д゜)
ボケボケでした。どうも(笑)>>788
んで、それからdeleteですなφ(.. )
790デフォルトの名無しさん:02/02/11 14:03
通常のリストボックスは1行1項目で縦に項目を
羅列すると思いますが列を持たせ
て1行複数項目にすることは出来ますか?
>790
素直にリストビュー使え。
>>785
俺もそう思う。
つーか俺はエラーチェックしてコントロールが存在したら
SetWindowPosでちゃんと移動できてる。
793754:02/02/11 16:38
>785,792そのとおりでした。

CButton *CB = (CButton*)GetDlgItem(IDC_BUTTON1);
CEdit *CE = (CEdit*)GetDlgItem(IDC_EDIT1);
if (CB != NULL){
CB->SetWindowPos(&wndTop,cx-100,0,100,cy,SWP_SHOWWINDOW|SWP_NOZORDER);
}

if (CE != NULL){
CE->SetWindowPos(&wndTop,0,0,cx-100,cy,SWP_SHOWWINDOW|SWP_NOZORDER);
}


こうしたらできました。
慣れてくるとこういうのもすぐ気づけるようになるんでしょうが
最初はなかなかしんどいですね。
794デフォルトの名無しさん:02/02/11 16:44
CFileDialogを使わずにファイルの拡張子を取得したいんですが
要はD&D時に、拡張子が.xxxなら処理を続行したいんですが。
どうでしょうか?お願いします
IDropTargetの実装で拡張子.xxx以外を弾けばいいんでないかい?
796デフォルトの名無しさん:02/02/11 17:27
ExtractFileExtを使おうかと思ってました
なんか色々な事を考慮しなければならない
ようなことを聞いてて…ある文字(漢字)が
含まれてると、うまく処理できない ということなのですが
やってみます、有難うございました。
797デフォルトの名無しさん:02/02/11 18:02
MFCよりWTLのほうがすきだにゃー
798デフォルトの名無しさん:02/02/11 18:18
EditView内で文字列
http://www.2ch.net/
みたいなURLがあった場合
それをクリックするとブラウザが開くようにしたいのですが、
どのようにしたらよいでしょうか?
>>798
せめてRichEditじゃないと無理じゃないかな。
サブクラス化して、WM_*CLCKを捕まえて、
カーソルにあるURLを取得して、ブラウザに渡す
ようなコードを書けば、いいとおもうけど。
801デフォルトの名無しさん:02/02/11 20:15
CMenu *CM = (CMenu *)((CMainFrame*)AfxGetMainWnd()->GetMenu());
CM->EnableMenuItem(ID_MENU1,MF_ENABLED);

外部のクラスから
CMainFrameへのポインタを手に入れるにはどうしたらよいのでしょうか?
CMainFrameのポインタからGetMenu()して
Menuの項目を操作したいのです。

上記のようなコードを書いたのですが、
エラーにはなりませんでしたが、
動作しませんでした。
CMenu *CM = (CMenu *)(((CMainFrame*)AfxGetMainWnd())->GetMenu());
だろ。
803801:02/02/11 21:09
>802

そのようにしても結果は同じでした。
今のところAfxGetMainWnd()を(CMainFrame*)
でキャストしたものがはたしてメインフレームへのポインタなのか
どうか・・??・というところが怪しい気がしてはいますが・・
単にメインメニューにID_MENU1が無いだけとみた。
なぜ素直にON_UPDSTE_COMMAND_UIを使わないのか…
>>801 >802
CMenu *CM = AfxGetMainWnd()->GetMenu();
キャスト不要でない?

メニューの操作は、処理本体は CMainFrameに書いて、
CMainFrameにメッセージ送って操作するな。俺なら。
807while(name == sage):02/02/11 23:51
>>778〜781
 ありがとうございました。レス遅くてすみませんです
808801:02/02/12 07:35
>804
そうだとするとコンパイル時にエラーになりませんか?

>806
キャスト無しでもコンパイラは通りましたが、
結果は同じ・・

処理本体はCMainFrameに書いてメッセージを送ると言うのを遣ってみたいのですが、
CMainFrameにメッセージを送るにはポインタが必要じゃないですか?

それはCMainFrameに何か適当な関数(EditMenu())を作って
それをCMainFrame*へのポインタから CM->EditMenu();
するという意味ですか?

それともWM_USER+100
とかのメッセージを定義してそれをCMainFrameへ送るということでしょうか?
メッセージを特定のクラスに送る方法が・・・わからないです・・。
>>808
別にメニュー内にID_MENU1が無くてもエラーにはならんだろ。
サブメニューにある可能性もあるだろうしな。
ってか俺も805と同意見だが。
810デフォルトの名無しさん:02/02/12 09:08
age
811デフォルトの名無しさん:02/02/12 10:37
質問です。
ACCESSデータベースにビットマップを保存しています。
これがCLongbinaryの値として取得できるのですが、
この値をどうすれば表示できるようになるのでしょうか?
ご存知の方がいましたら宜しくお願いします。

812デフォルトの名無しさん:02/02/12 10:55
>>811
ビットマップと言うのは画像のBMPのこと?
813413:02/02/12 11:40
モードレスダイアログボックスの
表示方法についてなのですが、
ImDlg *im = new ImDlg(this);
im->Create(IDD_IMDLG);
im->ShowWindow(SW_SHOW);
このようにポインタをつかって表示すると表示できるのですが、

ImDlg im;
im.Create(IDD_IMDLG);
im.ShowWindow(SW_SHOW);
このようにインスタンスを直接使うと
なぜか表示できないのです。

とりあえず上のを使うとプログラムは作れるのですが、
下のがなぜ動かないのか気になってしまっています。
理由のわかる方是非教えてください。
814デフォルトの名無しさん:02/02/12 11:45
上と同じにするなら
ImDlg im(this);
じゃないの?知らんが。

815811:02/02/12 11:47
>>812
はい。bmpの画像を表示したいのですが、CLongbinaryとしてしか
値を取得できないんです。
>>811
その中身を見ればファイルイメージとかBITMAP構造体とかが入ってるんでない?
817デフォルトの名無しさん:02/02/12 12:11
>>816
そうなのですが・・・・中身の見方がわからないんです。
調べてもほとんどCLongbinaryに関して書いてるものもなくて。
818デフォルトの名無しさん:02/02/12 12:41
CLongBinaryの中身をファイルに落とすならこんなかんじ。
表示は面倒だから自分で考えて。

CLongBinary bin;

BYTE *p = (BYTE*)GlobalLock(bin.m_hData);

FILE *fp = fopen("xxx.bmp", "wb");
fwrite(p, 1, bin.m_dwDataLength, fp);
fclose(fp);

GlobalUnlock(bin.m_hData);
>>813
関数を抜けるとimが消滅するからだべさ。オブジェクトのスコープについて勉強。
820デフォルトの名無しさん:02/02/12 12:56
Editコントロールを作成中です。
コントロールがフォーカスを失った時にNullチェックをして
Nullだった場合はフォーカスを元のコントロールに戻したいのですが、
どうやったらいいですか。

// CEditCtrl メッセージ ハンドラ

void CEditCtrl::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
COleControl::OnActivate(nState, pWndOther, bMinimized);

// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
if(bMinimized==0)
{
int ret=MessageBox("","",MB_OK);
}
}
821811:02/02/12 12:57
>>818
ありがとうございます。
早速試してみます。
822デフォルトの名無しさん:02/02/12 12:57
エディットビューの背景色は

HBRUSH KuneMainView::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: この位置で DC のアトリビュートを変更してください
return (HBRUSH)GetStockObject(WHITE_BRUSH);
}

CtlColor(CDC* pDC, UINT nCtlColor)関数のオーバーライドで変更可能ですが、
この方法などWHITE_BRUSH、BRACK_BRUSHなど、数通りしか出来ないですよね?
これをもっと自由な色合いにする方法はありますか?
エディットビューの背景色をRGBで表現したいのです。
CreateSolidBrush使う。
戻り値はメンバにしといて後で開放する。
824822:02/02/12 13:10
すみません追伸です。
遣り方を替えてみようと思って
ObInitialUpdateで(onDrawは呼ばれないようなので)
CDC *pDC = GetDC();
pDC->SetTextColor(0xffdddd);
pDC->SetBkColor(0x000000);
以下のようにしてみたのですが、

これでも色はかわらないようです・・・。
>>820
なんでOnActivateのコードがくっついてるのかよくわからんが、
EditならOnKillFocusでSetFocusする方向で。
>>820
っていうか、フォーカスを失ったウインドウ(コントロール)が
フォーカスを取り返すのって禁じ手なんじゃないの?
827デフォルトの名無しさん:02/02/12 14:33
>>825
OnKillFocusだったのですか。
何か勘違いをしていたようです。ありがとうございます。
この引数にNullを入れれば処理がキャンセルしてくれる?かな。

>>826
>フォーカスを取り返すのって禁じ手なんじゃないの?

マジっすか。じゃあどうやってNullチェックをしたらいいですか
>>827
「フォーカスを失ったらSetFocus()して取り戻す」って
動作をするウインドウが二つあったら、フォーカスの取り合いに
になって無限ループになるから禁止、ってどこかで読んだような
記憶があるんだけど...
いま検索しても見つからなかった。ちと自信がなくなった。
>>828
「SetFocus() 無限ループ」でぐぐったらわんさかでてきたぞ。
>>824
>>823を無視かい
831デフォルトの名無しさん:02/02/12 15:20
>>827
null入れたらエラーになるよ
>>827
そもそもNullチェックってのは何?
「エディットボックスが空だったらエラー」ってのだったら、
OKボタン押した時にでもチェックすればいいと思うけど。
833デフォルトの名無しさん:02/02/12 15:42
MDIの子ウィンドウにメニューを付けるのはどうするのでしょう。
CMDIChildWndを派生してPreCreateWindowオーバーライドして中でWS_SYSMENUを付けて
ChildFrameのOnCreateでLoadMenu→SetMenuじゃ駄目でした。しくしく。
834823:02/02/12 16:11
>>830
俺やっぱ無視されちゃったの?
悲しいなぁ。
835デフォルトの名無しさん:02/02/12 16:20
エディットビューで横スクロールのバーを出さずに
テキストを折り返さす方法ってありますか?
>>835
横スクロールバーを出さない=テキストを折り返す
では?
837827:02/02/12 16:35
>>832
クライアントの要求に「Nullチェックはフォーカスを離れた直後」
ってのがあるらしいです。

あ、ちなみに今の仕事は汎用機の移行作業です。

キー部1〜8くらいまであって、遷移中に入力項目に抜けや間違いが
あったらエラー。みたいな。
>>837
フォーカスを離れたときに空だったらエディットボックスの右に赤い*を表示したりステータスバーにメッセージを表示ってのはどう?
フォーカスは問題なく移るけどエラーは知らせる。
ダイアログで表示すると目障りだし作業効率落ちるから。
もちろん*が1つでもあるうちは確定ボタンは押せない。
839デフォルトの名無しさん:02/02/12 17:32
>>838
丁寧なレスありがとうございます。
自分もそのような感じの処理が最善だと思います。
でも何とかしてフォーカスを戻さないとならないのです。


ちなみにクライアントはN●●データです。
しすてむもーだるだいあろぐ。
>>839
すべてのロストフォーカスイベントに対してフォーカスを要求し直すのはあんまりよくないと思うから、
入力が不完全な間はTABを無効にしてしまう、などがいいと思う。
いっそVBにしてしまえ。Validateイベントでスッキリ解決だ。
843デフォルトの名無しさん:02/02/12 18:17
MFCって、親Windowが作られた時に無条件でm_hWndにウィンドウハンドルが入るんでしょうか?
それとも、自分で取得する必要があるのでしょうか?
844827:02/02/12 18:29
>>841
そうですね。TABを制御してしまえヴぁ何かいい解決方法が
ありそうですね。ちょっと試してみます。

>>842
Validateですか。今見た感じだと自分がやりたかった事に
ピッタリな気がします。
これをVCのイベントで定義できれば最高だったのに...
>>843
MSDN読め
>>833
MDI子ウィンドウのメニューは、フレームウィンドウのメニューと
置き替わる形で表示される。これはMDIの仕様だからしかたがない。
どうしてもMDI子ウィンドウ自体にメニューを表示したかったら、
ツールバー等で代用品を作ってそれっぽく見せるしかないんじゃないかな。

>>835
EditコントロールのスタイルからWS_AUTOHSCROLLを外す。
MFCのSUPERPADサンプルあたりにそのまんまの例があったと思うが。
847デフォルトの名無しさん:02/02/12 20:45
>>846
>>833ですが、どうもありがとう。「無理」と解ったのは大きな前進です。
つかやっと前進出来ます、コーディング(笑)。勉強になりました。
848デフォルトの名無しさん:02/02/12 21:43
エディットビューで 
テキストが横の長さをはみ出すと
下側にスクロールバーが自動に出てしまいますが、
これを出さなくして、強制的に折り返さすことは出来ますでしょうか?
それともエディットビュー以外のクラスを使う必要があるのでしょうか?
訂正。>846の WS は ES_AUTOHSCROLL の間違いね。
ところで、>848は>835と同じ人ですか?
850848:02/02/12 23:05
>849
あ、いえ違います。
横スクロールバーを出さないためには文字幅を調べて
強制改行をする必要があるのですね。
むずかしそうだなあ。チャレンジしてみます。
>>850
?・・・え?そうなの?
852デフォルトの名無しさん:02/02/13 09:19
プロパティ参照を省略したい時はどうしたらいいですか。

MessageBox( NULL,EDIT1,EDIT2,MB_OK );
みたいな感じで、EDITを直接参照したらTextプロパティ。みたいな
>852
そもそもCEditにTextなんてメンバないだろ(藁
MFCの場合、DDXでコントロールとメンバ変数を結びつけておいて、
 UpdateData();
 MessageBox(m_Text1, m_Text2);
のようにするのが正道。

CEditを継承して型変換演算子をオーバーライドすれば、
いわゆるデフォルトプロパティに近いことはできると思うけど、
C++の勉強以外の目的でそんなことをするのはおすすめできないな。
854デフォルトの名無しさん:02/02/13 11:42
VCでときどきファイルが
がなくなってしまうことがあります。
コーディングしならが半ば無意識にCTRL+Sを押す癖があるのですが、
ときどきファイルが使用中です、などと表示されて
ごくたまにですが*.hはあるのに*.cppファイルがなくなっている
などの現象が起きます。
このような現象に見舞われてる方他にいますか?
あなたのPCに何者かが侵入しています
>>854-855

ワラタ
857デフォルトの名無しさん:02/02/13 12:35
すっごい基本的な質問です。
ウインドウがかわった時に
CMainFrameでCSplitterWndをつかって
いくつかにフレームをくぎって
それにC**View1 C**View2
などを割り当てているときに右隅のドラッグなどで
ウインドウサイズを変えると
どこに通知が行くのでしょうか?
CMainFrameのなかのOnSize関数は呼ばれているようですが、
C**Viewの中のOnSize関数は呼ばれないようです。

OnSize
858デフォルトの名無しさん:02/02/13 12:56
>>854
ファイルが使用されていますエラーは出るが、ファイル自体は消えないな。
SP5当ててる?
859おいくそども:02/02/13 13:00
210.175.13.57
俺のIPだ。ハックノ練習してごらんよ。できねーだろうけどw
>>859
荒らし依頼だ。タイーホタイーホ
>>859
その前にそれはほんとにおまえのIPかと問いたい。
862デフォルトの名無しさん:02/02/13 14:15
 CMainFrameのOnCreateでGetWindowRectを使って領域サイズを得、
その位置情報を使って、モードレスダイアログボックスをMoveWindow
で表示させると、表示位置が一定にならないのはなぜ?
 教えてくだされ!!!
>>862
座標変換してないとか
>862
やりたいことがよくわからないけど、
(a) ダイアログがメインウィンドウの子ウィンドウ(WS_CHILD付き)なら
 GetClientRect で得られた座標を変換せずに使う
(b) ダイアログがポップアップウィンドウ(WS_CHILDなし)だったら
 1. GetWindowRect で得られた座標を変換せずに使う
 2. GetClientRect で得られた座標をClientToScreenで変換して使う
のどちらかが正解。どっち使うかは目的によって違う。

いずれにしても、OnCreate じゃなくて OnSize とか OnMove で
やった方がよさそうな気はするな。
865デフォルトの名無しさん:02/02/13 22:42
Д`)アプリケーションのタイトルバーの文字を変えるにはどうするのでしょうか・・?
最初は「無題」- ****ってなってるところです。
866デフォルトの名無しさん:02/02/13 23:03
シリアル通信を行うプログラムを作成しようとしてるんですけど、
あるデータファイルを読み込んで、分割して送る仕様で、
ようは、ハイパーターミナルとか、テラタームの様なプログラムを作りたいのですが、
なぜか、転送時間が理論値とかけ離れて遅いのです。
問題は、プロセスのsystem idle processなんかが、
動いてるからだと思います。
ハイパーターミナルで転送中はこれらのプロセスは止まってるのですが、
プログラムで、プロセスを止める方法はあるのでしょうか?
867あゆ:02/02/14 00:15
イベント・ハンドラって何ですか?
868デフォルトの名無しさん:02/02/14 00:24
>>862
状況が良く解りませんが、少なくともChildFrameの方では、
OnCreateでGetWindow/ClientRectしても駄目だったり。>>864さんも言っておられますが。
MainFrameではどうだったかなー。
原因がこれなら取り合えずOnCreateでは目的のオブジェクトをCreateだけして、
OnSizeで改めて
GetWindow/ClientRect→MoveWindow→return
で解決する。意外にも構築時にOnSizeも呼ばれるのだ。まあ試してみて。
>>862
MSDNでClientToScreenもしくはScreenToClientを参照してねん
>867
屋上に昇ってイベント・ハンドラ、イベント・ハンドラと唱えるとUFOが降りてくる。
871デフォルトの名無しさん:02/02/14 00:58
NAPSTERプロトコルによるチャットアプリケーションを作っているのですが、
「talkへのアクセス中に不明なエラーが発生しました。」
となってしまい
リソースファイルの中を見ると
IDC_MYBUTTON "talk"
となっておりこれをコメントアウトするとエラーはでないのですが、
今度はウインドウ右上の最大化、最小化、破棄のボタンが効かなくなってしまいます。

デバッガで追ってみると
CFile exception: generic, File Unknown, OS error information = 10054.
例外処理 (初回) は chat.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception
というエラーが出ているのですが、
これの原因はどこにあるのでしょうか?

通信にはCSocketFileおよびCArchiveクラスを使用しています。
割り込み・ハンドラって何ですか?
873デフォルトの名無しさん:02/02/14 01:02
>>866
[スタート]→[シャットダウン]
874デフォルトの名無しさん:02/02/14 11:20
Windowsで、10キーのEnterと普通の(という表現はあれですが・・)Enterを区別したいのですが
OnKeyDownだと両方でVK_RETURNが帰ってきてしまいます。何かよいほうほうは
ないでしょうか?

CALLBACKで、SetWindowsHookExでHOOKして、
例えば10キー側だったら、別のコードを::PostMessageする。。
ってのは反則ですか?(例えばUnassignになってる0xE7とか)

875デフォルトの名無しさん:02/02/14 11:49
フォントの変更や色付けは
CEditViewでは出来ないのでしょうか?
CRichEditViewなら出来るようですが・・・。
>>874
nFlagsの8ビット目を見てもダメ?
877デフォルトの名無しさん:02/02/14 12:21
862です
 863, 864 レス有り難うございました。
カメお礼申し訳ありません。
878874:02/02/14 12:37
>>876
うお。(^^;;;;
失礼しました。できそうです。

ついでなので。。ALTキーとの同時押下はnFlagsの13ビット目でよさげですが、
SHIFTとCTRLは別に状態取得しなきゃ駄目なんでしょうかね。
>>875
文字のフォントなら変えられるぞ。
CWnd:SetFont()
880デフォルトの名無しさん:02/02/14 13:41
>879
ありがとうございます。
CWndクラスにもいくつかそういった関数があるのですね。
CEditViewクラスばかり見ていました。

例えばCEditViewに、文章を表示する場合
CStringの配列などに文字列を複数しまって
表示するときにはそれを連結し
SetWindowText()で表示するかと思うんですが、
この方法だと、テキストを一行づつフォントを変えたいとかいった
用途のときに途中でフォントの変更が出来ないと思います。
それに途中がURL(http://〜)であったならば色を変えて
マウスクリックでブラウザが開くようにしたいのです。
このようなようとの時はどのクラスを使用するのが
一番適切でしょうか?
881 :02/02/14 14:08
>>880

CHTMLViewつかっちゃだめ?
・・・やっぱりだめだよなぁ。
882876:02/02/14 14:11
>>878
GetAsyncKeyStateで関数呼び出し時のキー状態を見るとか。
883874:02/02/14 14:47
>>882
やっぱそれしかないですよね。(^^;
ありがとうございましたぁ。
>882
OnKeyDown で見てるなら GetKeyState の方が良いと思われ。
885デフォルトの名無しさん:02/02/14 18:21
CAsyncSocketクラスをつかってソケット通信プログラムを作っているのですが
Connectするとどうしても戻り値が0になってしまいます。
CTcpSocketはCAsyncSocketの派生クラスです。
AfxSocketInit()は正常終了しています。
以下はConnectの部分のコードです。
エラーコードはConnect後に10035(WSANOTINITIALISED)が返ってきます。
//////////////////////////////////////////////////////////////
CTcpSocket *m_Socket;
m_Socket = new CTcpSocket();
m_Socket->SetpWnd(this);
if(!m_Socket->Create())
{
 delete m_Socket;
 AfxMessageBox("create error");
 return;
}
if(!m_Socket->Connect((LPCTSTR)m_TrasmitterIp, (UINT)m_TransmitterPort))
{
 error = GetLastError();
 delete m_Socket;
 AfxMessageBox("connect error");
 return;
}
////////////////////////////////////////////////////////////////////
どなたか、原因が思い当たる方はいませんでしょうか。
886885:02/02/14 18:32
あ、ちなみに
Connectが0を返したときに正常終了時の処理を行うと
接続されました。
887885:02/02/14 18:41
上のWSANOTINITIALISEDはWSAEWOULDBLOCKのまちがいでした。
>887
なんだ、それだったら正常じゃん。
非ブロッキングモードだから、Connectからは接続の完了を待たずに帰ってくる。
WSAEWOULDBLOCKは「まだ終わってないけど戻ってきたよ」って意味。
ちゃんと接続できたかどうかは後からメッセージで通知されるよ。
889885:02/02/14 19:04
あれ、MSDNによると
Connectは正常終了した場合0以外が返るとなっていますが。
非ブロッキングの場合は0が戻るのですか???
>889
そうだよ。CAsyncSocket::Connect の説明だとその辺わかりにくいけど、
WSAConnect とか WSAEWOULDBLOCK を調べると、非ブロッキング
ソケットではエラーが返るとちゃんと書いてある。
891885:02/02/14 20:22
>890
わかりました。ありがとうございます。
892880:02/02/14 22:31
>>881
>CHTMLViewつかっちゃだめ?

できたらそれは無しの方向で・・・・´Д`)

>>880
一番近いのはRichEditViewだと思うけど。
894865:02/02/15 00:06
アプリケーションのタイトルバーの文字
の替え方について質問したものです。
CWnd::Createの第二引数のlpszWindowNameに名前を指定したらいいのだと
思っているのですが、
スケルトンから作った直後の単純なSDIアプリケーションで、
いろいろやってみましたがどれもダメでした。

具体的には、

CMainFrame::OnCreateで
lpCreateStruct->lpszName = "アプリの名前";//追加
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

Create関数をオーバーライドして
BOOL CMainFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
return CWnd::Create(lpszClassName,"アプリの名前", dwStyle, rect, pParentWnd, nID, pContext);
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszName = "アプリの名前";//追加
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;


>>894
AfxGetMainWnd()->SetWindowText(_T("アプリの名前"));
896デフォルトの名無しさん:02/02/15 17:46
メインフレームウィンドウの形を知るために、
   CRect rct:
   HWND hd;
   hd = AfxGetApp()->m_pMainWnd->m_hWnd;
   ::GetWindowRect(hd,rct);
を実行しましたが、rct.rightで得られる値が、
画面解像度の値と違うのはなぜでしょうか?
スクリーン座標系の値と画面解像度のサイズとは
違うのですか?
もし一致させるとしたらどうしたらよいのでしょうか?
 初心者です。
>896
いちいちウィンドウハンドルをとらなくても m_pMainWnd->GetWindowRect で十分。
というのは置いといて、画面解像度の値とは何のこと?
普通、ウィンドウを画面の右端にぴったりくっつけない限り
rct.right == GetSystemMetrics(SM_CXSCREEN) とはならないと思うが。
898デフォルトの名無しさん:02/02/15 18:05
 896です
897さん有り難うございます。
 画面解像度とはディスプレーの解像度の意味で書きました。
モニターの解像度は人によって異なるので、それに対応する
プログラムを書きたいのですが...。
899デフォルトの名無しさん:02/02/15 18:07
 896です
897さん有り難うございます。
画面解像度とはモニターに解像度のつもりで書きました。
人によって解像度が異なるので、それらに対応したプロ
グラムを書きたいのです...。
>898
?? 目的は何だ?
画面の大きさが知りたい → GetSystemMetrics もしくは GetMonitorInfo
メインウィンドウを画面と同じサイズにしたい → 最大化する、MoveWindow、
PreCreateWindowをオーバーライドしていじる のいずれか。
右端にぴったりくっつけるなら最大化させたほうが楽だし、
ウィンドウを解像度に合わせるならGetSystemMetricsで取った値を
SetWindowPosしたり、、、

902デフォルトの名無しさん:02/02/15 18:30
898さん
 多謝
897=900さんと思いますが、897で解決しました。
もーVC++って関数ありすぎです。
感謝、感謝
お馬鹿な初心者でした。
903デフォルトの名無しさん:02/02/16 21:10
リストビュー(CListView)で、アイテムのチェックマークをつけたときに
そのアイテムのインデックスを取得したいのですが、どうすればよいのでしょうか?
904デフォルトの名無しさん:02/02/17 00:53
>>903
チェックしたときにHitItem()やってもだめだったっけ
多しか俺もそれで悩んだような気がする・・・
チェックされたとき引数にインデックスどうして渡すようにしてないんでしょうね、MFC(ワラ
905デフォルトの名無しさん:02/02/17 02:28
質問です。
CLongbinaryクラスの値もCStringと同じように先頭から何バイト削除とか
できるのでしょうか??
できるのならどのような方法でしょうか?
どなたかわかる方よろしくおねがいします。
906デフォルトの名無しさん:02/02/17 13:00
タブブラウザみたいに、
タブによってビューの
内容を切り替えるのってどうしたらいいんでしょう?
ビューを複数用意して切り替えるのかな?
それともドキュメントを複数用意するんでしょうか。

でもタブブラウザみたいなものならビューは統一だから一つで良いとして、
ドキュメントも一つにしてドキュメントの中の読み込むデータだけ替えるべきなんでしょうか?

あれはMDIの応用です。
ATLってどういうときに使う状況
になるのですか?
MFCで嫌なときにつかえばよろしいかと。
910デフォルトの名無しさん:02/02/17 17:04
LVS_EX_CHECKBOXESスタイルのリストビューに、初めからチェックを入れて
表示しようと思って以下のようなコードを書いたのですが、チェックが入ってくれません。
どうすれば初めからチェックが入った状態で表示できるでしょうか?
LVITEM item;
item.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
item.iItem = nIndex;
item.iSubItem = 0;
item.state = INDEXTOSTATEIMAGEMASK(2);
item.stateMask = LVIS_STATEIMAGEMASK;
item.pszText = LPSTR_TEXTCALLBACK;
item.iImage = I_IMAGECALLBACK;
item.lParam = (LPARAM)pItem;
GetListCtrl().InsertItem(&item);
911デフォルトの名無しさん:02/02/17 20:09
リストビューを使用したプログラムを作っています。
しまいたいデータの構造体へのポインタをpItemに入れ

LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.lParam = (LPARAM)pItem;
lvi.pszText = LPSTR_TEXTCALLBACK;
if (GetListCtrl().InsertItem(&lvi) == -1)return FALSE;

LPSTR_TEXTCALLBACKを使用して

void MyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) {
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
を呼び出しています。

すると本来個々のpDispInfo->item.lParamにはしまいたいデータの構造体が
入っているはずだと思うのですが、null値になってしまっています。
どのような原因が考えられるでしょうか?

>>911
そのpItemはどこにあるのかな?newで作ってる?
913デフォルトの名無しさん:02/02/17 22:07
>912
その直上でnewで作っています。
ドキュメントにデータを保存しておいてドキュメントへのポインタ
pDoc->***でデータを出してきてそこにしまってからLV_ITEM構造体を呼んでいます。
参考文献は「MFCによるWINDOWS プログラミング改訂新版 MicrosoftPress」
です。
struct member_st *pItem;
try {
pItem = new struct member_st;
}
catch (CMemoryException* e){
e->Delete();
return FALSE;
}
pItem->name = pDoc->name;
pItem->date = pDoc->date;
LV_ITEM lvi;

>>911
LV_ITEMをゼロクリアするか、すべてのメンバに適切な値を入れてる?
915913:02/02/17 23:42
自己レスです。
いろいろサンプルソースコードとにらめっこして
考えているのですが結局どこがいけないのかわからないです。
これはCSplitterWndを使用してるのでその関係なんでしょうか・・・・。
メッセージからOnGetDispInfo関数を呼び出すときに
メッセージがどこか回り道してその間にpNMHDRの中身が失われてるとか・・・・・
916913:02/02/17 23:54
知恵熱出るまで悩んで答えがわかりました。
Llvi.mask = LVIF_TEXT|LVIF_PARAM;
のLVIF_PARAMをいれないとlParamが有効にならないんですね・・
うーん。すっきりしたーーー
でもこのmaskって何の意味があるんだろう・・
917デフォルトの名無しさん:02/02/18 00:03
AppWizardで ファイルの拡張子 を空白(初期状態)のままスケルトンを作成したプロジェクトに
拡張子だのファイルタイプだの追加するにはどうすればいいのでしょう?(;´Д`)
>>917
StringTableリソースのIDR_MAINFRAMEを編集すればいい。
書式は適当に検索して探して。
919 :02/02/18 01:18
>>916
(MFCの)バージョンによってメンバが増えることがあるから、
maskで明示的に「このメンバに入れた値を使え」と指示されたものだけ
使うようにできているのだ。
920デフォルトの名無しさん:02/02/18 01:19
>>918
おお、出来た。
ありがとう。助かりましたヽ(´Д`)ノ (Д`ノ) ヽ(   )ノ (ヽ´Д)。
921910:02/02/18 01:36
>>910
誰か・・・手がかりはないか・・・
922デフォルトの名無しさん:02/02/18 03:33
>>921
対症療法しか知らんが、
GetListCtrl().InsertItem(&item); の後で
GetListCtrl().SetCheck(nIndex); すればきっとチェックされるだろう。
>>922
一応それでやってたんだけど、なんかもっと綺麗にできないかなと思って。
 独自のメッセージの処理の仕方がわかりません。
 具体的には、リストビューの上にエディットボックスをCreateして、そのエディッ
トボックスがフォーカスを失ったらそれをリストコントロールにメッセージを送って
処理をしたいんです。エディットボックスの方でOnKillFocusでメッセージ送信させ
てる(つもり)なのですが、PreTranslateMessageとかで受信するんでしょうか?
なにかほかに準備が要るっぽいんですが、どうしたらいいのでしょう??
 レベルの低いしつもんでスマソ
925デフォルトの名無しさん:02/02/18 11:14
CEditCtrlでEnterを押した時に何かさせたいんだけど、どーすれう゛ぁ・・・。
>>925
キー操作Msg受け取るハンドラなかったけ?
927デフォルトの名無しさん:02/02/18 12:42
コンボボックスの候補表示したときに(右の逆三角マークを押す)
候補が1項目分しか表示されないんだけど
これを5項目表示とかにするにはどうするのですか?
928デフォルトの名無しさん:02/02/18 12:51
>>926
サブクラス化すればそこらへんどーとでもなりますけど配置めんどいんで('_`)。

>>927
候補はちゃんと複数登録してる? ダイアログエディタで配置するなら、
各項目を入力した後にctrl+Enterして、データを複数行にしないと駄目だYO!
もし「びろ〜ん」のサイズが絶対的に足りないと言う理由なら、同様に配置画面で
▽ をクリックすると、びろ〜ん時サイズ編集モードになるから。
適当に下方向に伸ばしてみるが吉。

コードで構築してるなら対処法が全然変わってくるから、又質問してみて〜。
929927:02/02/18 14:30
>>928
動的に(コンボボックスに)項目追加しております。
(CComboBox::AddString)
930デフォルトの名無しさん:02/02/18 18:33
CFormViewの派生クラスにRichEditコントロールを貼り付けると、コントロール内で
右クリックしたというメッセージNM_RCLICKのハンドラを追加できるのですが、なぜか
右クリックしてもそこへハンドリングされません。どんな原因が考えられますか?
>>929
>>928も書いてるけど、リソースエディタでコンボボックスの▼を
クリックするとサイズを広げられる。

>>930
RichEditのバージョンだったかが原因だったような・・・
RichEditの派生クラスを作ってWM_RBUTTON〜を処理した方が早いかも
932929:02/02/19 00:26
>>928,931
失礼しました。
リソースエディタ上でやるのでしたか。
たしかにできました。ありがとうございました。

じゃついでに、
プログラム内であのサイズって変更できないのですか?
>>932
Createの第二引数で。
934932:02/02/19 00:49
>>933
つまり一回きり、もしくはcreateしなおしって事ですか?
>>934
SetWindowPos。
これくらい自分で試してみようよ。
9361:02/02/19 03:41
そろそろなんで新スレ作りました。

■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/test/read.cgi/tech/1014057520/
937930:02/02/19 09:09
>>931
ありがとうございます。
バージョンですか・・・どうしようもないっぽいですねぇ。
その方向でやってみます。
938デフォルトの名無しさん:02/03/14 15:32
ファイルのドラッグ&ドロップを受け取るMFC ActiveX Controlを作成しようとしています。
通常のウインドウと同じ方式、(DragAcceptFiles()して、OnDropFiles())(COleDropTargetを持たせる方法)
でうまく動かないのですが、何か特別な手続き方法が必要なのですか?
939デフォルトの名無しさん:02/04/24 23:21
const_castってアセンブラではどのようになってるのでしょうか?
アセンブラではというより、内部ではどのようにconst属性をはずしてるのでしょうか?
また、これは絶対にはずせるものではないですよね?はずせるものと
そうでないものの違いは?
単にコンパイラのシンボルテーブルのフラグを制御するだけだろ。
殆どのコンパイラは、文法上の書きこみチェックをするだけ。
941デフォルトの名無しさん:02/04/25 10:31
検索サイトとかのURLエンコード(日本語が%21%5A%C2とかになるやつ)を
楽にやる方法ありませんか?
あのーageないでもらえますか。

■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/test/read.cgi/tech/1014057520/
ごめ