■MFC相談室 mfc19d.dll■at TECH
■MFC相談室 mfc19d.dll■ - 暇つぶし2ch159:デフォルトの名無しさん
08/06/12 18:36:16
>>157
m_timerIDって解放しなくてよかったっけ。
時計の電池を抜いて止めても時計の本体は残っている状態のような。

160:デフォルトの名無しさん
08/06/12 18:43:37
>159はキチガイだから無視で

161:デフォルトの名無しさん
08/06/12 22:29:14
CStaticにCBitmapの画像を貼り付けたいのですが、リソースからは上手くいっても
メモリ上からは失敗(何も描画されない)します。
どうするのが適切なのか、教えてください。


//// リソース読み込み
CBitmap m_bmp; // メンバ変数

m_bmp.LoadBitmap(IDB_BITMAP);

CStatic *pPicture = (CStatic *)GetDlgItem(IDC_STATIC_IMAGE);
pPicture->SetBitmap((HBITMAP)m_bmp);


//// メモリ読み込み
CBitmap m_bmp; // メンバ変数
BYTE m_buf[300]; // メンバ変数 bmpの各ピクセルの色データ配列

m_bmp.CreateBitmap(10, 10, 1, 24, m_buf);

CStatic *pPicture = (CStatic *)GetDlgItem(IDC_STATIC_IMAGE);
pPicture->SetBitmap((HBITMAP)m_bmp);

162:デフォルトの名無しさん
08/06/12 22:51:05
水平方向のバイト数が4の倍数じゃないから?
m_buf[(10*24/8+7)&~3*10];


163:デフォルトの名無しさん
08/06/12 22:56:00
>>162
元のは横240*縦240*3バイトだったのを編集したときに4バイトアライメントを失念してました。
すみません。
CreateBitmapでいけることはいけるんでしょうか?

164:デフォルトの名無しさん
08/06/13 00:02:12
m_bmpのデストラクタで破棄されたらそれまで。描画されなくて当然。
Windowsのハンドルは参照カウンタで管理されているわけではないので注意しる。

165:デフォルトの名無しさん
08/06/13 00:03:10
その辺まともに理解してないと、メモリリークとかもやらかしそうだな

166:161
08/06/13 19:45:30
自己解決。
リソース読みのm_bmpを使い回して、32bppに変換したデータをSetBitmapBitsすることで表示されるようになった。

167:デフォルトの名無しさん
08/06/13 21:36:42
どのへんが自己?w

168:デフォルトの名無しさん
08/06/13 22:22:12
あえてWin16時代の名残りであるSetBitmapBitsを使うところが渋いな。
まあ、直接イメージを弄るなら普通はCreateDIBSectionを使う。
MFCならCImageだな。

169:デフォルトの名無しさん
08/06/14 12:20:40
MFC に CImage なんかあるかよ


170:デフォルトの名無しさん
08/06/14 12:28:42
あるある

171:デフォルトの名無しさん
08/06/14 12:57:23
VC++6.0で時間が止まってる人なんだろうな

172:デフォルトの名無しさん
08/06/14 13:15:25
MFC じゃなくて ATL だろが

173:デフォルトの名無しさん
08/06/14 13:29:08
CImage の中身は GDI+


174:デフォルトの名無しさん
08/06/14 13:35:47
GDI の BitBlt はハードウェアを使うので早い
GDI+ の BitBlt はソフトウェアのみで処理するので遅い



175:デフォルトの名無しさん
08/06/14 16:29:18
Vistaではどちらもソフトウェアになるけどな

176:デフォルトの名無しさん
08/06/14 16:31:13
そういえばGDI専用のスレってないんだな
この手の話するならここかWin32になるのか?

177:デフォルトの名無しさん
08/06/15 12:48:15
FTP転送経過情報(転送サイズ)がわかるFTPクライアントを作成したいです。
FTP転送状況を取得するにはOnStatusCallbackをオーバーライド
する、とのことだったのでマニュアルを見たのですが、
▼▼▼
OnStatusCallback
 (DWORD dwContext,
  DWORD dwInternetStatus,
  LPVOID lpvStatusInformation,
  DWORD dwStatusInformationLength)

dwInternetStatus
コールバックの理由を示すステータス コード。指定できる値については、後の「解説」を参照してください。

lpvStatusInformation
このコールバックに関する情報を格納しているバッファへのポインタ。

▲▲▲

上記の引数によりファイルの転送済みサイズとかが取得できるように
なるのかなと思ったのですが、マニュアルにはそれらしき記述はありません
でした。

OnStatusCallbackの中でどのような処理をすれば転送済みファイルサイズとか
取得できるのでしょうか。

ご教示のほど、よろしくお願いします。

178:デフォルトの名無しさん
08/06/15 14:01:26
>上記の引数によりファイルの転送済みサイズとかが取得できるように
>なるのかなと思ったのですが

なんでそんなこと思ったの?

179:デフォルトの名無しさん
08/06/15 15:03:42
FTP転送状況を取得するには、
OnStatusCallbackをオーバーライドして、FTP転送状況を提供
してやるってことじゃねえの?

でなきゃ、オーバーライドする意味ないし。


180:デフォルトの名無しさん
08/06/15 15:21:41
転送状況を取得したいのは判る。MSDNにも取得できると書いてある。
しかし、転送済みサイズが取得できるとはどこにも書いてないし、そもそもなんでそんな発想できるのかと。
# 要は、私もOnStatusCallbackで転送済みサイズが取得*できない*とは確認していないのだけどね。

181:デフォルトの名無しさん
08/06/15 16:21:11
転送状況のステータスはとれても転送済みサイズは取れないってことですかね。
FTPコマンドとかフリーのFTPソフトで転送経過(%)が表示されているのってどうやってるんでしょうね。

182:デフォルトの名無しさん
08/06/15 16:32:10
適当なバイト単位で読む

183:デフォルトの名無しさん
08/06/15 17:12:09
>>181
そりゃぁあんた、FTPクライアントがMFCを使う義理なんてないからねぇ。

184:デフォルトの名無しさん
08/06/18 21:08:44
ダイアログについて質問です。
ダイアログの中のstatic textを変更したいのですが、SetDlgItemTextを呼ぶとassertで止まります。
assertはm_hWnd=NULLが原因です。
しかしCDialogの中のCWnd周りは勝手にやっているので、nullは仕様かと思われます。
m_hWndを必要としない、static text変更の命令はどれに当たるのでしょうか?
またはMFCはそういうことが出来ない仕様なのでしょうか?

185:デフォルトの名無しさん
08/06/18 21:19:31
いつもは GetDlgItem(hoge)->SetWindowText() でやってるな
ちなみに、それを呼び出しているタイミングは?
OnInitDialog()とか?

186:デフォルトの名無しさん
08/06/18 21:42:29
とりあえずメンバ変数に入れておき、OnInitDialogかDoDataExchange辺りで
生成されたウィンドウに対して設定するというのが一般的なやり方。

187:デフォルトの名無しさん
08/06/18 22:33:08
VC7のプログレスバーでマーキースタイルを実装する方法は有りませんか?
VC8と9は重すぎて使用に耐えません。。。

188:デフォルトの名無しさん
08/06/18 22:38:00
VC2008SP1ってリリース予定っていつくらいになるか発表してましたっけ?
夏くらいとも聞いた気もするけど自信がない

189:デフォルトの名無しさん
08/06/19 00:41:07
>>187
CProgressCtrl::Createで直接スタイル指定して作れないか?
リソーススクリプトを直接編集してもいいけど、IDEで弄ったらたぶん消える。

190:デフォルトの名無しさん
08/06/19 02:41:15
ダイアログベースで終了時の処理を行いたいのですが、
OnDestroy()が自動生成されないのですが、これって自分で作らないとだめなんですか?
ためしに自分で
virtural void OnDestroy()でオーバーライドしてみたんですが、
OnDestory()内にコード書いても動作してくれません。

191:デフォルトの名無しさん
08/06/19 06:08:33
OnDestoryはちゃんと呼ばれる

192:184
08/06/19 15:45:20
>>185
試してみたのですが、GetDlgItemも内部でm_hWndがnullだとassertにヒットするので出来ませんでした。
呼び出すタイミングはOnInitDialogでやっています。
もうちょっとしたら別のとこでもやる予定ですが、今は初期値を入れているだけです。

>>186
設定をしようとすると、m_hWndがnullのため設定出来なくて困っています。
自前でダイアログを呼んで返り値のハンドルを保存しているならいいのですが、MFC側で隠蔽され何故か保存されていないため、どうしたらm_hWndに値を入れられるかというのが一番悩んでいるところです。

193:デフォルトの名無しさん
08/06/19 16:12:44
GetDlgItemで存在しないものを呼んでるんだろ

194:デフォルトの名無しさん
08/06/19 16:13:28
>>192
普通はちゃんと入っているよ
そもそもWM_INITDIALOGメッセージを送るのにもウィンドウハンドルは必要だろ?

195:デフォルトの名無しさん
08/06/19 16:40:33
土地を買う → 家を立てる → 家具を買う

いきなり家具を買われても困るだろ

196:デフォルトの名無しさん
08/06/19 17:25:59
>>192
>呼び出すタイミングはOnInitDialogでやっています。
が、CDialog::OnInitDialog を呼ぶ前でした、というオチを想像した。

197:デフォルトの名無しさん
08/06/19 18:53:57
たしかにそのタイミングだと、コントロールにメンバ変数を割り当ててあっても、
CDialog::OnInitDialog → UpdateData → DoDataExchange
が呼ばれる前だから、まだNULLの状態になるな。

198:デフォルトの名無しさん
08/06/19 19:37:07
OnInitDialog()でWM_APP_XXXメッセージを自分にポストして遅延処理する。

199:192
08/06/19 20:24:32
CDialog::OnInitDialogを呼ぶ前でした><
皆さんありがとうございます。

200:デフォルトの名無しさん
08/06/19 20:51:02
あほ

201:デフォルトの名無しさん
08/06/19 20:52:45
大体そんなことだろうとは思ってたw

202:デフォルトの名無しさん
08/06/20 00:03:25
>>190
message_mapにon_wm_destroy定義してある?
自分で記述しないで、どのバージョンか知らんがVSにまかせたら?

203:デフォルトの名無しさん
08/06/22 15:55:10
ドキュメント・ビューアーキテクチャを利用して常駐型アプリを作成したいと考えています。
内容を簡単に説明すると、一つのデータベース(自作)を参照する複数のビューがあり、
それらは同時に表示可能であるといったものです。

ただ、常駐型なのでタスクバーに表示されないようにしたいのと、外見上メインフレームの
みを非常時にしていのですが、メインフレームを非表示にすると、それのビューまでが非表
示になってしまいます。

メインフレームとビューの表示・非表示を個別で制御することはできないでしょうか?


204:デフォルトの名無しさん
08/06/22 16:29:29
>>203
メインフレーム以外のフレームつくればいいんでねえの?

205:デフォルトの名無しさん
08/06/22 17:15:03
子ウインドウは親にひっついてるから
独立したウインドウにして切り離すしかない

206:デフォルトの名無しさん
08/06/22 18:30:31
複数のダイアログで同じ内容のコントロールを使うときはどうすればいいんでしょうか?


207:デフォルトの名無しさん
08/06/22 19:13:16
>>206
複数のダイアログに同じ内容のコントロールを使うことで、何が問題となるのかわからん。

208:デフォルトの名無しさん
08/06/22 19:31:14
>>207

ダイアログを作るたびにコントロールの初期設定とかで同じ処理を何度もコピペして書いて、
修正するときは同じ部分を全部書き直すのが無駄な気がして、もっと楽にできる方法がないかと思って。

209:デフォルトの名無しさん
08/06/22 19:34:58
コモンダイアログ

210:デフォルトの名無しさん
08/06/22 19:53:38
>>208
"同じ内容のコントロール"を持ったダイアログを基底クラスとしてつくって、
そっから派生させたらどうだ?

211:デフォルトの名無しさん
08/06/22 20:24:30
VC8でマウスの右ボタンを押しながらツールバーのボタンを左クリックすると落ちるのですが解決方法はあるのでしょうか。
プロジェクトを作った直後にビルドし、ツールバーにある印刷ボタンなどを押すと落ちました。
自分で置いたツールバー(CToolBar)も同じ状態です。
今までのバージョンでは確認出来ないのですが、VC8では何か処理を噛まさないといけないのでしょうか。

212:デフォルトの名無しさん
08/06/22 20:52:25
プログラムに問題があったのに今まで偶然に動いてただけかもしれないけど
VC側のバグを疑ってるならサポートに聞くしかない

213:デフォルトの名無しさん
08/06/22 21:28:55
>>212
なるほど、そちらで聞いてみます。

214:デフォルトの名無しさん
08/06/22 22:25:38
>>210

その場合MESSAGE_MAP・DoDataExchangeのリソースIDはどうすれば良いでしょうか?


215:デフォルトの名無しさん
08/06/22 22:41:02
>>214
何を問題としているかわからん。

216:デフォルトの名無しさん
08/06/23 00:04:30
> 205
ということはCMDIFrameWndをそのまま使用して実現することは出来ないということでしょうか?


217:デフォルトの名無しさん
08/06/23 07:45:17
みんな結構SP1Beta入れてるのか
正式版待った方がいいと思って粘ってるんだけど、なんか羨ましいな

218:デフォルトの名無しさん
08/06/23 10:06:02
>>211
URLリンク(rararahp.cool.ne.jp)
これと同じ問題だとしたら、VC2003から直っていないバグかも。

自分でも試してみた限りでは、デバッグ時のASSERTに引っかかって落ちるだけで、
リリース版では落ちることは無く、他のウィンドウをクリックすると回復したけど、
MFCのソースも結構いい加減だな。

219:デフォルトの名無しさん
08/06/24 16:44:08
Picture Controlで
Type四角形にした時の
プログラムでの
色の変更ってどうすればいいですか?

220:デフォルトの名無しさん
08/06/24 17:22:12
四角形のまま色変えるにはサブクラス化するしかないんじゃないかな。
オーナードローにするか、テキストのスタティックにしてOnCtlColor使うかするといいかも。

221:デフォルトの名無しさん
08/06/24 17:36:59
ってもしかして白黒灰の範囲内の話?

222:デフォルトの名無しさん
08/06/24 18:22:58
直接描画したほうが早い予感

223:デフォルトの名無しさん
08/06/26 01:30:08
MFCでアプリケーションハンガリアン記法使うときって、どんな感じにしてますか?
APIがシステムハンガリアン記法なんで、色々書きづらいと思うけど

224:デフォルトの名無しさん
08/06/27 18:24:55
コンボボックスからユーザーが入力した値を取得するにはどうしたらいいでしょうか?
m_Combo.GetLBText(m_Combo.GetCurSel(),str);
だと取得できませんでした。

225:デフォルトの名無しさん
08/06/27 18:34:40
コンボボックスのスタイルにもよるんだけど、通常のエディットコントロールが乗ってる
ドロップダウンスタイルのエディットコントロール部分が欲しいの?
もしそれなら、GetWindowtext()で。

226:デフォルトの名無しさん
08/06/27 18:55:29
>>225
できましたー。ありがとうございます!

227:デフォルトの名無しさん
08/06/27 21:24:00
sp1 にある MFC FeaturePack はなかなかのもんだ
大幅なバージョンアップだな


228:デフォルトの名無しさん
08/06/27 21:48:46
んで、sp1 はいつよ?

229:デフォルトの名無しさん
08/06/27 22:35:58
βはもうでてる

230:デフォルトの名無しさん
08/06/28 00:16:00
むしろSP1入れて始めて2008の意味があるだろう
VCにとっては

231:デフォルトの名無しさん
08/06/28 17:16:44
シングルウィンドウについて、親を指定せずに作ったウィンドウやダイアログからCMainFrmは取得できるのですが、
C~Viewは取得できないのでしょうか。
CMainFrmのメンバクラスかと思ってたのですがそうではないですよね。

232:デフォルトの名無しさん
08/06/28 17:18:10
ViewはChildFrmの子供じゃなかったっけ

233:デフォルトの名無しさん
08/06/28 19:02:20
viewを取得するメンバ関数があるだろ

234:デフォルトの名無しさん
08/06/28 20:54:22
MFCのソースを読んでみようと思ったんだが、
どれから手をつけていいのかわからん。

どれがいい?

235:デフォルトの名無しさん
08/06/28 21:18:56
必要になった部分だけ拾い読みするから愛読してる部分はない

236:デフォルトの名無しさん
08/07/01 14:16:59
MFCのリッチエディット2.0について質問させていただきます。

MFCのダイアログベースでプロジェクトを作成

プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更

エディットボックスとリッチエディット2.0を適当に配置

エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加

InitInstance()内に AfxInitRichEdit2(); を追加

あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。


すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。
例えば“ÄÅÆ”を入力すると、エディットボックスではそのまま“ÄÅÆ”なのに、リッチエディット2.0では“AAA”になります。

※入力している段階では“ÄÅÆ”と表示されています。GetWindowText関数で取得すると“AAA”になってしまいます。


リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

237:236
08/07/01 14:48:29
書き忘れてました
環境は Visual Studio .NET 2003 です。

238:デフォルトの名無しさん
08/07/01 15:03:11
設定フォントはUnicode表示できるの?

239:デフォルトの名無しさん
08/07/01 15:12:41
>>238
できます。
それも含め、エディットボックスでならすべてうまくいっています。
ただ、リッチエディットだとうまくいかないんです・・・

240:デフォルトの名無しさん
08/07/01 15:58:18
>>236の通りにやってみたが、すべて問題なく動作した。
VS2008だけど。2003もあるんでちょっとやってみる。

241:デフォルトの名無しさん
08/07/01 16:37:13
ご苦労

242:デフォルトの名無しさん
08/07/01 16:55:07
2003だとたしかにそうなるな。
文字エンコーディングの指定かとも思ったが、
URLリンク(oshiete1.goo.ne.jp)
マルチみたいだからもうやめた。

243:236
08/07/01 17:06:44
>>242
回答ありがとうございます。
やっぱり2003のリッチエディットはUnicodeに対応してないんですかねぇ・・・

あ、その添付のURLは私が上げた質問ですw
OKWaveで質問しても回答が得られなかったのでこっちに来た次第です。

244:デフォルトの名無しさん
08/07/01 17:25:21
とりあえず、これやったらうまく取れた。
ちょっと変更必要だったけど、まあわかるっしょ。
URLリンク(d.hatena.ne.jp)

245:デフォルトの名無しさん
08/07/01 17:33:38
よくやった

246:236
08/07/01 18:20:59
>>244
ありがとうございます、さっそく試してみます。

247:デフォルトの名無しさん
08/07/01 18:54:28
>>244さんの紹介ページの通りやってみたらうまくいきました。
・・・とはいっても、>ex と書くべきところを >ex と書いてあったり、TCHAR*型のポインタを渡すべきところにCString型変数を渡してたりと、なかなか誤字の多いページでしたけど。

248:デフォルトの名無しさん
08/07/01 18:56:28
そこは const のTCHAR*渡すようにすれば CString のまま渡せるんだけどね。
オレはそこはLPCTSTRにした。

結局、コードページ1200にしてEM_GETTEXTEXが必要ってことみたいだな。

249:247
08/07/01 18:57:17
あ、誤字ってる・・・

> とはいっても、>ex と書くべきところを >ex と書いてあったり
「&gtex」を半角で打つと「>ex」になってしまうようですね。前者の「>ex」は「&gtex」のつもりで書きました。

250:デフォルトの名無しさん
08/07/01 19:29:57
MFCはマルチコアなど気にする必要は無いのでしょうか。
現在P4 2.8Gを使っているのですが、処理によってはCPU使用率が80%を超える場合があります。
もしC2Dなどのマルチコアで実行した場合、
何も気にせず組むと1つしか使っていない(=現状より処理が重い)という状況になるかと思ったのですがどうなのでしょうか。

251:デフォルトの名無しさん
08/07/01 19:54:07
MFCじゃなくてスレッドの話だろ

252:デフォルトの名無しさん
08/07/01 20:03:33
内容次第としか言いようがないな
今でもまともにマルチコアを使いこなしてるソフトなんて、エンコーダくらいしかないし

253:デフォルトの名無しさん
08/07/01 20:10:27
コンパイルそのものは速くなるよ
複数のファイル平行してコンパイルするからね

254:デフォルトの名無しさん
08/07/01 20:13:11
あと、C2Dの1コアだけで同クロックのPen4より
かなり速いぞ
クロックだけで判断しないほうがいい

255:デフォルトの名無しさん
08/07/01 20:15:04
マルチコアって響きはプログラマとしてトキメクものがあるが
現状1つのアプリ内で有効に活用できる機会はあまり無いわな。

256:デフォルトの名無しさん
08/07/01 20:16:31
というか複数アプリ起動時にパフォーマンスが高いから、もう十分

257:250
08/07/01 20:39:43
レスありがとうございます。
特殊なことをしない限りMFCでマルチコア云々を特に考える必要は無いのですね。

258:デフォルトの名無しさん
08/07/02 16:19:51
いま、EXEにあるクラスのヘッダーをincludeしてDLLを作ろうとしてます。
構造体ならうまくいくのですが、クラスだと
fatal error LNK1120: 外部参照 1 が未解決です。
になってしまいます。解決方法ご存じでしょうか?

259:デフォルトの名無しさん
08/07/02 16:24:16
何言ってるのかわかりにくいが、、、
その外部参照1の名前から推測できないの?

260:デフォルトの名無しさん
08/07/02 17:32:40
__declspecをつけてないとか

261:デフォルトの名無しさん
08/07/02 17:42:14
__declspecも付けてみましたがうまくいきません。
error LNK2019: 未解決の外部シンボル "public: class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >
__thiscall CNode::getAll(void)" (?getAll@CNode@@QAE?AV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@XZ) が関数
"public: virtual void __thiscall CMindPlug::LoadProperty(struct DataObj,class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)"
(?LoadProperty@CMindPlug@@UAEXUDataObj@@V?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) で参照されました。
というエラーが弊出します

262:デフォルトの名無しさん
08/07/02 17:48:29
unicodeとか、シングルスレッド/マルチスレッドとかの設定は合ってるか?
最初に競合してるとかのエラーは出てない?

263:デフォルトの名無しさん
08/07/03 01:06:37
そのクラスがDLLの外から呼び出せるようになってるか確認した?
あと、構造体ならうまくいくって、どううまくいくんだ?

264:デフォルトの名無しさん
08/07/05 04:47:27
いつも使っているUpdateData(FALSE);を
マルチスレッドで作った別スレッドの中で実行するとエラーが出るんですが、どういう問題が考えられますか?

265:デフォルトの名無しさん
08/07/05 10:04:58
別スレッドの中で実行してるという問題が考えられる

266:デフォルトの名無しさん
08/07/05 13:28:30
やはりそうですか、別スレッドの中で実行するにはどうすればいいですか?

267:デフォルトの名無しさん
08/07/05 16:18:23
だから別スレッドの中で実行したらだめ

268:デフォルトの名無しさん
08/07/05 16:21:58
MFCやってて、マルチスレッドなんてプログレスバー処理やるときくらいだな

269:デフォルトの名無しさん
08/07/05 19:12:01
↑あほ確定

270:デフォルトの名無しさん
08/07/05 20:59:03
うむ

271:デフォルトの名無しさん
08/07/06 00:22:36
マルチスレッドって何ですか?

272:デフォルトの名無しさん
08/07/06 00:35:35
スレリンク(leaf板)

273:デフォルトの名無しさん
08/07/07 10:50:58
親子関係を持たないシングルウィンドウとダイアログについての質問です。
メインフレームをクリックするとダイアログも並び順はそのままで他のアプリケーションの上にウィンドウが来るように組もうとしています。
例えば以下のようにウィンドウが並んでいる場合
  デスクトップ)  ダイアログ1 ダイアログ2 メインフレーム 他のアプリケーション  (最前面
このメインフレームをクリックすると
  デスクトップ)  他のアプリケーション ダイアログ1 ダイアログ2 メインフレーム  (最前面
このように重なりを替えたいです。
しかしダイアログ1と2の前後関係が分からないため
  デスクトップ)  他のアプリケーション ダイアログ2 ダイアログ1 メインフレーム  (最前面
このようになってしまいます。
メインフレームを親にしてダイアログを生成するとダイアログの前面にメインフレームが持ってこれず躓きました。
重なり順をそのままに他のアプリケーションの前面に移動させるのは無理なのでしょうか。

274:デフォルトの名無しさん
08/07/08 03:55:36
CPenで点を打つとき座標が必要ですが、コントロール上の座標を調べる方法はないんですか?
適当に座標を入れて、もう少し上だ、とかでずらしてコンパイルするしかないんですか?

275:デフォルトの名無しさん
08/07/08 14:41:53
もう少し上、てのは何を基準に?
その基準を利用してみては。

見た目でなんとなく、というのならキミがやるしかないでしょ。

276:デフォルトの名無しさん
08/07/08 15:22:57
マウス持ってけばわかるけど
ダイアログ上の座標は実行環境で可変だから
計算じゃなくて見た目で決めると実行時にずれる

277:デフォルトの名無しさん
08/07/08 16:03:04
解決しました。付属のspyツールでマウスイベントのX,Y座標がとれました。

278:デフォルトの名無しさん
08/07/08 20:45:58
座標関連のことやってるなら、PC用語ではないが黄金比くらいは知っておいた方がいい
役に立つかどうかは別だが

279:デフォルトの名無しさん
08/07/08 21:25:24
ダメな方法を教えてやったのに

280:デフォルトの名無しさん
08/07/13 18:29:59
ビットマップをピクチャコントロールの大きさに合わせて表示したり、
ボタンの横幅を文字数にあわせたりするのはどうしたら良いでしょうか?

281:デフォルトの名無しさん
08/07/13 18:47:52
ピクチャコントロールの大きさを調べて合わせる
文字数から横幅を計算して合わせる

282:デフォルトの名無しさん
08/07/13 19:26:06
文字数はDrawTextでパラメータにCALCっぽいやつつけろ

283:デフォルトの名無しさん
08/07/13 23:32:56
素人質問ですいません。
MFCでダイアログを表示させる時に作成したボタンを
クリックしている状態にするのにはどうすれば良いでしょうか?


284:デフォルトの名無しさん
08/07/13 23:50:13
見た目だけでよかったらへこんだ状態にすればいい

285:デフォルトの名無しさん
08/07/13 23:52:59
チェックボックスのボタンスタイルか?

286:デフォルトの名無しさん
08/07/14 01:07:13
ダイアログエディタなら、チェックボックスを貼ってPushLikeをtrueに。
それ以外なら、、3ステートボタンとか2ステートボタンで探してみて

287:デフォルトの名無しさん
08/07/15 02:50:21
ON_BN_CLICKED で ピクチャーコントロールの上をクリックされたときによばれるコールバックを設定したんだけど、
このとき、クリックされた座標が知りたい。どうすればいい?

288:デフォルトの名無しさん
08/07/15 09:50:52
>>287
CPoint pt = GetMessagePos();

289:デフォルトの名無しさん
08/07/15 09:53:04
GetCursorPos使えばいいよ

290:デフォルトの名無しさん
08/07/15 09:58:09
STNじゃないの?
CLICKEDはボタンを押して離した後に来るからマウス座標の概念は無いかもな。
サブクラス化してLBUTTONDOWNやUPを見たほうがいいかも?

291:デフォルトの名無しさん
08/07/15 10:00:16
GetCursorPos や GetMessagePos にはタイムラグあるんじゃない?
CLICKEDが最後のメッセージであると決まってればGetMessagePosでいいのかもしれん

292:デフォルトの名無しさん
08/07/15 10:04:48
GetCursorPosはその瞬間のカーソル位置であって、
イベント発生時の座標はGetMessagePos。
URLリンク(msdn.microsoft.com)(VS.80).aspx

293:デフォルトの名無しさん
08/07/15 11:52:42
>>292
GetMessagePosも、
イベント発生時の座標=クリックされた座標では無いのが曲者だな

クリックされた座標を拾えるAPIは、もしかして無いんじゃね?


294:デフォルトの名無しさん
08/07/15 12:15:27
実際にやってみて、ずれなきゃそれでいいしずれるなら自前で取るのがいいかもね。

295:デフォルトの名無しさん
08/07/15 23:06:45
287 です。
みなさん、回答ありがとう。GetMessagePos() を使用して要望がかないました。
実際、実装したかったモノはCStaticにカラーグラデーションを配置して、簡易なカラーピッカを実現することでした。
実装してみるとクリック時よりもリリース時の座標の方が使い勝手がいいことが分かりましたが、
助言をヒントにこれも実現できそうです。

296:デフォルトの名無しさん
08/07/16 13:01:17
VC.netでUnicode環境の場合に、
char a[10]; CString s;
strcpy(a,s);
_tcscpy(a, s);
_tcscpy_s(a, s);
とか、CStringからcharへのコピーがうまくいきません。
誰かご教授くださいm(_._)m



297:デフォルトの名無しさん
08/07/16 13:29:26
いったい何がやりたいのか理解できない

298:デフォルトの名無しさん
08/07/16 13:33:19
>>296
char a[10]; CString s;
strcpy(a, CT2A(s));

とか

USES_CONVERSION;
char a[10]; CString s;
strcpy(a, T2A(s));

とやれば動くだろうけど、そもそもaがchar配列なのは何故?

299:デフォルトの名無しさん
08/07/16 13:45:16
CStringA

300:デフォルトの名無しさん
08/07/16 13:55:01
コピーじゃなくて変換なのか?

301:デフォルトの名無しさん
08/07/16 18:05:29
Visual Studio 2005で、WindowsMobile6用のダイアログベースアプリを作っています。
ダイアログにメニューをつけたいのですが、やり方がわかりません。

下記URLのやり方をやってみようと思ったのですが、2箇所やり方がわからず、詰まってしまいました。
URLリンク(www.g-ishihara.com)

1.メニューのIDが設定できない
リソースの追加でMenuを作成したときに、リソースビューには「IDR_MENU1」というのができるのですが、
メニューのプロパティでは「IDの編集ができません」と書かれて、IDが編集できません(サブメニューは編集できました)。
でも、とりあえず、メニューリソースの作成方法はわかったつもりです。
また、下記2.で使うのは「IDR_MENU1」という名前だと考えたので、
ここでIDの編集ができないことは、メニューをつけられないこととは関係ないと思っています。

2.ダイアログにメニューを関連付けられない
>> ダイアログのプロパティで、「Menu」に作成したメニューのIDを指定
という手順で、ダイアログのプロパティに、「Menu」という項目がありませんでした。。。。
もしMenuという項目があれば、「IDR_MENU1」を記入すればよいと思っています。


ダイアログにメニューをつける方法を教えていただけませんでしょうか。
足りない情報があれば、ご指摘ください。
よろしくお願いいたします。

302:デフォルトの名無しさん
08/07/16 18:21:05
>>301
1.リソースビューの「IDR_MENU1」をシングルクリック

2.リソースビューの該当ダイアログIDをダブルクリック

(※VS2003だけど)



303:デフォルトの名無しさん
08/07/16 18:22:25
>>301
1. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ
2. でも、モバイルでダイアログにメニュー持たせられたっけ

304:301
08/07/16 18:35:44
レスありがとうございます。

>>302
その通りにやってみましたが、ダイアログの編集が開くだけでした。
また、実行してみても、画面的に変化はありませんでした。


>>303
>> 1. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ
これはできました!リソースのプロパティでのIDの編集なのですね。

>> 2. でも、モバイルでダイアログにメニュー持たせられたっけ
ガーン。
もし無理ならばSDIで作り直して、メニューを編集することにします。
モバイルで可能かどうかって、何を調べればわかりますでしょうか?


305:デフォルトの名無しさん
08/07/16 18:54:01
どうだろ、そういうアプリ見たこと無いしなぁ
やっぱMSDN探すしかないか?

306:301
08/07/16 18:54:25
書き忘れました。。。

>>302
1.については、リソースのプロパティが表示され、IDが編集できました。
(303さんと同じ結果でした)


307:301
08/07/16 19:05:41
>>305
MSDNでの探し方ってよくわからないんです。
モバイルで可能かどうかっていうのの情報が、どう書いてあるのかわからなくて。。。
.NET Compact Frameworkのどのバージョンに対応とか
そういうのは書いてある気がするんですけど、これはまた別の話ですよね?

# 当方MFCとかCompactFrameworkとかが何を指しているのかわかっていません。
 言葉の意味はわかるのですが、具体的に何を指しているのかわからないのです。。。
 たとえばCStringってクラスはMFCっぽい?とかそんなくらいの認識です。。。

308:デフォルトの名無しさん
08/07/16 22:42:12
>>284
>>285
>>286

返信遅くなりすみません。
無事解決しました。ありがとうございました。


309:301
08/07/17 13:07:04
WindowsMobile用のスレを見つけたので、そっちで聞いてみます。
お邪魔しました。

310:デフォルトの名無しさん
08/07/17 23:00:15
VC6、VC7.1ともにダイアログベースのスケルトンにボタン貼り付けて、
クリックしたらMessageBox表示するだけのアプリで、
何回かボタンクリックしてるとメモリ使用量が4K増えるんですけど、こういうもんなんですか?



311:デフォルトの名無しさん
08/07/17 23:09:05
一応、そのボタンクリック時の関数の中身貼ってみて

312:デフォルトの名無しさん
08/07/18 00:38:13
>>310
そんなもんだろう。
ページングがおこって4kが確保されたんだろうが、それ以上その動作で確保されることはない(とは断定できないが)。

313:デフォルトの名無しさん
08/07/18 05:34:53
CFileDialogのファイル選択ダイアログのことなんですが
JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg|All Files (*.*)|*.*||
と設定していて最初はJPEG Filesの拡張子が表示されるんですがJPEG FilesからAll Filesに変えると何も表示されなくなります(JPEG Filesに戻しても表示されない)
あとXPですが左側にあるマイコンピュータを押してもCドライブなどが表示されず真っ白の状態(上と同じ)になります
これをちゃんと表示させる方法ありませんか?

314:デフォルトの名無しさん
08/07/18 06:56:50
ほかのアプリで同様の現象が起きるなら、MFCは関係ないな。
再インストールでもした方が良い。

315:デフォルトの名無しさん
08/07/18 16:28:22
VS2005でピクチャーボックスのサイズが知りたくてGetWindowRectを使おうと思ったんだけど
void C・・・Dlg::OnBnClickedButton1(){}
こんな形の場所だとhwndの指定がうまくできないんですがどうすればいいんですか?

316:デフォルトの名無しさん
08/07/18 16:44:21
欲しいのはこれかね?
つGetDlgItem

317:デフォルトの名無しさん
08/07/18 16:59:32
>>316
それ使いたいんですがGetWindowRectの引数が1個しか指定できなくて使えないんです

318:デフォルトの名無しさん
08/07/18 17:09:35
RECT rc;
GetDlgItem(IDC_XX)->GetWindowRect(&rc);

こういう事?

319:デフォルトの名無しさん
08/07/18 17:18:40
そんなやり方があったんですか
ずっとGetWindowRect(GetDlgItem(hwnd,IDC_XX),&rc);こんな感じでしかできないものと思ってました
どうもです

320:デフォルトの名無しさん
08/07/18 17:20:59
>>319
GetWindowRect()は、this->GetWindowRect()
のthisが省略された書き方だと言う事を意識した方が良い

321:デフォルトの名無しさん
08/07/18 19:25:16
Win32と入り混じってそうだな

322:デフォルトの名無しさん
08/07/18 19:39:36
GetDlgItem(IDC_XX)->
これ一番最初の方で習うだろ
別のやり方もあるけど、MFCでその方法教えない本はないと思う

323:デフォルトの名無しさん
08/07/19 09:48:03
>>322
MFCなら変数化して使うのが一般的じゃないかな。
IDを変数に置きなおして直感的に触れるようにするのがMFCの特徴の1つでもあるし。

324:310
08/07/19 14:11:23
>>311
亀で申し訳ないです。
void CmessageboxDlg::OnBnClickedButton1()
{
  // TODO : ここにコントロール通知ハンドラ コードを追加します。
  MessageBox("Message", "Title", MB_OK | MB_ICONWARNING);
}

で、張り付けたボタン→メッセージボックスのボタン
の順にクリックし続けると何回かに1回4K増えます。

ボタンにフォーカス当ててエンター押しっぱなしだとより
顕著に増加します。

それ以外の部分はダイアログベースのスケルトンです。


325:デフォルトの名無しさん
08/07/19 21:07:10
CWnd一時オブジェクトが増えるのが原因じゃないかなあ。
放っておけば適当な間隔で解放されるから、あまり気にしなくても良いと思うけど。

326:デフォルトの名無しさん
08/07/19 21:21:25
だろうな
環境によって違うけど、ある程度時間を待てば解放されると思う

327:デフォルトの名無しさん
08/07/19 23:57:52
まあ、多分聞きたいことはみなさんの環境でも同じことやって同じ現象おきませんか?
ってことだと思うけど俺は腰が重くてとても動く気になれないなw

328:デフォルトの名無しさん
08/07/20 08:36:39
>>327
もしそうなら、同じOS・同じMFCバージョンでやらないと意味無いかもな。

さすがにメッセージボックス表示させるだけのコードなら大丈夫だと思うぜ。
MFCのバグの可能性を疑うのなら別だけど、それを言い出したらキリが無い。

329:デフォルトの名無しさん
08/07/20 09:51:32
MFCもapi呼んでるだけだし、
呼んだ人のハンドル渡すぐらいのことしかやってないから
特にメモリ使ってるようには見えないな
メモリ使ってるとしたらapiだろ

330:デフォルトの名無しさん
08/07/20 09:59:07
所詮CWnd::MessageBox()がAfxMessageBoxを呼んで、そいつがAPIのMessageBox呼んでるだけだよなw

331:デフォルトの名無しさん
08/07/22 07:32:41
ちょいとスレ違いだけど
EmeditorってMFC使ってないらしいけど
どうやって作ってるんですか

332:デフォルトの名無しさん
08/07/22 08:51:20
MFCを使わずに作ればいい

333:デフォルトの名無しさん
08/07/22 19:34:18
MFCの仕組み分かってないのか・・・

334:デフォルトの名無しさん
08/07/23 17:24:12
ウィンドウが作られる前はPreCreateWindowっぽいのですが、
ウィンドウが作られた後のイベントは何でしょうか?


335:デフォルトの名無しさん
08/07/23 17:49:44
OnCreate の話?

336:デフォルトの名無しさん
08/07/23 20:01:25
CHogeWnd::OnCreate()
{
  CWnd::OnCreate();
  // ここに書け

}

337:デフォルトの名無しさん
08/07/23 20:51:34
CHogeDialog::OnInitDialog()
{
  CDialog::OnInitDialog();

  // TODO: ダイアログならこれの方がいい
  // TODO: でもなんでダイアログだとこれの方がいいんだろう???
}

338:デフォルトの名無しさん
08/07/23 20:55:25
子コントロールも初期化終わってるからじゃない?

339:デフォルトの名無しさん
08/07/23 21:46:18
リストコントロールの行の高さを変えるにはどうすりゃいいでしょうか?


340:デフォルトの名無しさん
08/07/23 22:18:37
リソースで書き換えとけ

341:デフォルトの名無しさん
08/07/23 22:28:34
これかも
リストビュー(レポート)でアイテムの高さを変更する
URLリンク(www.rainylain.jp)


342:デフォルトの名無しさん
08/07/28 11:35:16
MFC初心者です

ダイアログ内の状態に応じて、×ボタンなのでダイアログを閉じさせたくないのですが
どのイベントを拾ってどういう処理をすればいいのでしょうか?

343:デフォルトの名無しさん
08/07/28 11:41:44
×ボタン→WM_SYSCOMMAND(SC_CLOSE)→WM_CLOSE
どっか(OnSyscommand等)で捕まえるのがいいかと。

×ボタン自体はSYSMENUのSC_CLOSEを消すと消える。

344:デフォルトの名無しさん
08/07/28 11:57:41
即レスどうもです!

ためしにOnCloseをオーバーライドしてみたんですが、終了時に呼ばれない。
ためしにOnOkとOnCancelも作ってみたけど・・・呼ばれないorz

何が悪いんでしょうか

345:デフォルトの名無しさん
08/07/28 12:05:52
×ボタンのキャンセルじゃないの?

void Cmfc005Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == SC_CLOSE)
{
// ×ボタン
}
}

とか

346:デフォルトの名無しさん
08/07/28 13:56:57
いろいろやってみてるんですがやっぱり継承したOn~が全然呼ばれていないようです
メッセージマップの設定もしているはずなんですが…

唯一呼ばれるのはOnInitDialogくらいです

エスパー助けて >o<

347:デフォルトの名無しさん
08/07/28 14:27:47
virtual になって無いとか・・・



348:デフォルトの名無しさん
08/07/28 14:36:34
メッセージマップの設定もなにも、、、
クラス選択してプロパティ出して、上のイベントボタン押して
そこから追加してる?手でやってるならどれとどれ書いた?

349:デフォルトの名無しさん
08/07/28 14:37:38
イベントじゃないや、メッセージね

350:デフォルトの名無しさん
08/07/28 23:39:08
>>346
「On~が全然呼ばれていないようです」
「メッセージマップの設定もしているはずなんですが」

どちらかが嘘だと思う。

351:デフォルトの名無しさん
08/07/29 10:05:31
OnCancel が呼ばれるんだよ
ID は IDCANCEL


352:デフォルトの名無しさん
08/07/29 12:22:44
>>351
クローズボックスで閉じたときの話をしてるんだが。
>ID は IDCANCEL
そう。OnCancel が呼ばれるのは、IDがIDCANCELのダイアログの子ボタンが
NOTIFY投げてきたとき&ダイアログがESCキー検出したとき。
けど今それ関係ないから。

>>346
>継承したOn~が全然呼ばれていないようです
仮想関数でもない OnClose に継承とか関係ない。
メッセージマップに ON_WM_CLOSE があれば、ディスパッチされるハズ。

353:デフォルトの名無しさん
08/07/29 12:34:05
そういえばエスケープで閉じない処理を入れると
閉じるボタンでも閉じなくなってしまうから
閉じるボタンだったら閉じる処理を入れたのを思い出した

354:デフォルトの名無しさん
08/07/29 12:40:34
エスケープはOnCancel()でいいべ。

355:デフォルトの名無しさん
08/07/29 12:51:24
たぶん閉じるボタンでOnCancelが呼ばれて
そこでEndDialogしてるんだろ

void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}

356:デフォルトの名無しさん
08/07/29 12:57:18
URLリンク(m--takahashi.com)
「閉じる」ボタンのメッセージハンドラについて

357:デフォルトの名無しさん
08/07/29 21:34:16
>>341

ありがとうございます。
その方法で行の高さはかえれるようになりましたが、ヘッダの高さが変えられません。
どうすればいいでしょうか?

358:337
08/08/02 00:30:06
>>338
OnCreate内でも子コントロールを操作して問題無いからどちらも子コントロール初期化終わってる希ガス

359:デフォルトの名無しさん
08/08/02 14:06:49
>>357
ヘッダは別コントロールだから、そっちで何とかするしかないかも

360:デフォルトの名無しさん
08/08/02 20:22:34
>>358
DDXとか初期化されて無いでしょ?

361:337
08/08/03 23:56:56
>>360
DDXと言うとコントロールとコントロール変数を関連付けるアレかな?
あっちは初期化終わってなかったのか

362:デフォルトの名無しさん
08/08/04 00:11:31
CDialog::OnInitDialog -> UpdateData -> DoDataExchange
こんな感じになってるからね。
大体、WM_CREATEの時点だと子ウィンドウはまだ存在しないと思うし。

363:デフォルトの名無しさん
08/08/04 23:01:35
質問お願いします。
edit controlを2個
OKボタンを1個
作成しました。edit controlが共に値が入っていないと
OKボタンが非表示になるようにしたのですが
非表示の場合でも、Enterキーを入力するとOKが適用されてしまいます。
非表示の場合、Enterキーの無効化または常に無効化する方法を
ご存じの方はご教示ください。

364:デフォルトの名無しさん
08/08/04 23:05:57
>>363
OnOkをオーバーライドしてそこにエディットコントロールの中身を調べるプログラムを書く。
もし空白など適切なものではない場合はreturnでそのまま返してやるだけ。

365:デフォルトの名無しさん
08/08/04 23:25:42
で、SP1まだ?w

366:デフォルトの名無しさん
08/08/05 10:20:15
>>363
同時にDisableにしておけばよいかと。

367:デフォルトの名無しさん
08/08/05 10:37:01
Disableにしても消しても無理

368:デフォルトの名無しさん
08/08/05 11:46:45
OnOkはシステム定義のメッセージだろ
OKボタンじゃなくて自分で作ったボタンにすればいい

369:デフォルトの名無しさん
08/08/05 13:32:40
>>368
>OnOkはシステム定義のメッセージだろ
何を言っているのか解らんが、
1. IDがIDOKである、ダイアログの子ボタンからのBN_CLICKED を受け取ったとき
2. ダイアログ自身がキー入力を見て Enter だったとき
に、ダイアログから呼び出される仮想メンバ関数。

370:デフォルトの名無しさん
08/08/05 13:58:56
win32で定義してるのを知らんのか

WINUSER.H(7537): #define IDOK 1

/*
* Dialog Box Command IDs
*/
#define IDOK 1
#define IDCANCEL 2
#define IDABORT 3
#define IDRETRY 4
#define IDIGNORE 5
#define IDYES 6
#define IDNO 7
#if(WINVER >= 0x0400)
#define IDCLOSE 8
#define IDHELP 9
#endif /* WINVER >= 0x0400 */


371:デフォルトの名無しさん
08/08/05 14:16:02
また意味不明なことを言ってるよ。
話をどこにもっていきたいのかわからん。

372:デフォルトの名無しさん
08/08/05 14:32:05
>OKボタンじゃなくて自分で作ったボタンにすればいい

リターンキーでIDOKを回避するにはこれだけじゃだめで、
その自分で作ったボタンをデフォルトボタンにする必要がある。
まあOnOK()捕まえたほうが確実だね。

373:デフォルトの名無しさん
08/08/05 15:53:18
>>367
なんでDisableが無理?
Disableにすればエディットボックス上でEnter押しても効かなくなるけど。

>>369
> 2. ダイアログ自身がキー入力を見て Enter だったとき
> に、ダイアログから呼び出される仮想メンバ関数。
これは違う。
Enterキーはデフォルトボタンを押す操作。
キャンセルボタン上でEnterキーを押せばOnCancelがコールされるし、
自分で用意したボタン上ならそのハンドラがコールされる。

374:デフォルトの名無しさん
08/08/05 21:17:56
OKボタン削除してもOnOK呼ばれる

375:デフォルトの名無しさん
08/08/05 21:21:23
MFCやってるんなら、始めにぶつかって覚えてそうなことなのになw

376:デフォルトの名無しさん
08/08/05 22:40:24
>>374
OKボタンを削除してもOnOKが呼ばれるのは、IsDialogMessage()が、
デフォルトボタンが存在しないときにIDOKを発行しているからであって、
直接OnOKが呼ばれているのではないのでは?

OKボタン削除だけしておいて代わりのデフォルトボタンを用意しなかったり、
DM_GETDEFIDメッセージを処理しなかったりしているからそうなるだけ。

377:デフォルトの名無しさん
08/08/08 20:02:47
シングルウィンドウでexeのアイコンにファイルをドロップしたり、その実行ファイルに関連付けされているファイルを開いた場合
どの部分でドロップしたファイルや開いたファイルのパスを取得するのでしょうか。

378:デフォルトの名無しさん
08/08/08 20:50:07
>>377
取得しなくとも__argv or __wargvに保持されています。
DialogベースのアプリでないならCYourApp::InitInstanceのParseCommandLineでコマンドラインの解析が行われます。
argvなんて単語初めて聞いた!!という場合はParseCommandLineの利用をお勧めします。

379:デフォルトの名無しさん
08/08/12 14:27:14
VisualStudio2005で、WindowsMobile6用にSDIで作っています。

リストボックスのフォントを等幅フォントにしたいと思って、次のように書いたのですけど、反映されません。

CFont nfont;
nfont.CreateFont(
 0,                          // nHeight
 0,                          // nWidth
 0,                          // nEscapement
 0,                          // nOrientation
 FW_BOLD,                    // nWeight
 FALSE,                      // bItalic
 FALSE,                      // bUnderline
 0,                          // cStrikeOut
 SHIFTJIS_CHARSET,           // nCharSet
 OUT_DEFAULT_PRECIS,         // nOutPrecision
 CLIP_DEFAULT_PRECIS,        // nClipPrecision
 DEFAULT_QUALITY,            // nQuality
 FIXED_PITCH | FF_DONTCARE,  // nPitchAndFamily
 _T("MS ゴシック")         // lpszFacename
);

GetDlgItem(IDC_LIST1)->SetFont(&nfont);


ちなみにHeightの設定だけ微妙に反映される状態です。
リストの1行の高さだけが変化し、フォントの大きさは変わらないという微妙さ加減です。
BOLD指定しても太字にならないし、何がなにやらよくわからないです・・・。

リストボックスの文字を等幅フォントに設定する方法を教えてください~

380:デフォルトの名無しさん
08/08/12 14:37:12
そのフォントがスコープ抜けて無効になってるというオチじゃなかろうね?

381:379
08/08/12 15:55:41
>>380

スコープ!?
あわわわわ。まさにそのオチでしたorz
ありがとうございました(泣)

382:デフォルトの名無しさん
08/08/18 06:32:06
sp1出てたのか
いろんなニュースに紛れてて気付かなかった

383:デフォルトの名無しさん
08/08/19 14:20:46
あれ?
ファイルのフルパスからファイル名を省いたフォルダパスを取得するのってどうするんでしたっけ?



384:デフォルトの名無しさん
08/08/19 14:41:01
>>383
PathRemoveFileSpec()

385:383
08/08/19 14:41:34
_tsplitpath
でしたね。。。
すまそ。

386:383
08/08/19 14:43:06
>>384
そんなのあったんですね!!
ありがとうございます!!!

387:デフォルトの名無しさん
08/08/19 21:19:42
Path系はIE5のライブラリのAPIだっけか

388:デフォルトの名無しさん
08/08/19 23:09:10
shlwapiの4.71以降だからIE4.0かな
splitpathなんてDOSの頃使ったっきりで、すっかり忘れてたよ

389:デフォルトの名無しさん
08/08/22 00:07:23
エディットボックスにctrl+vで文字を貼り付けたときに
10文字以上になった場合にメッセージボックスを表示させるにはどうしたら良いでしょうか?


390:名無し募集中。。。
08/08/22 00:29:00
DDV_MaxChars

391:デフォルトの名無しさん
08/08/31 01:07:17
MFCスレって、いつの間にか過疎ってるのな。
皆どこ行っちゃったんだろう?

392:デフォルトの名無しさん
08/08/31 01:42:32
ATL/WTL, .NETなどなど

393:デフォルトの名無しさん
08/08/31 03:16:54
残業でカンヅメ状態だから書き込めない

394:デフォルトの名無しさん
08/08/31 11:28:58
SP1でいろいろ追加されたが、なかなか触る暇が無い

395:デフォルトの名無しさん
08/09/02 14:28:56
MFCで印刷関係のサンプルコード検索しようとすると、
ブラザーのレーザープリンタが、ちょいちょいヒットするの
なんとかしてくれませんか?

396:名無し募集中。。。
08/09/02 14:49:17
ブラザーの新型で印刷どうぞ!
URLリンク(pc.watch.impress.co.jp)

397:デフォルトの名無しさん
08/09/02 19:22:38
印刷といえば、.NET Framework 3.0 で Microsoft XPS Document Writer が
インストールされるようになったけど、あれはいいな。手軽に試せて。

398:名無し募集中。。。
08/09/02 21:06:18
つPrimoPDF

399:デフォルトの名無しさん
08/09/04 23:22:19
SP1のタブMDI(呼び方あってる?)って、デフォルトでマウスイベントとかなさ気だな・・・
まだちゃんと仕様見てないが・・・ていうかテーマで挙動かわりやがる

400:デフォルトの名無しさん
08/09/05 09:17:49
すみません、ひとつ質問というか相談させてください

現在、VC6でMFCを用いて開発しています。
昨日、取引先から、過去に弊社が納品したソフトを、
「Google Chrome」みたいなマルチタスク方式を組み込んで
バージョンアップして欲しいという要求が来ました。
過去に納品したソフトにはタブで画面を切り替える部分がありますが、シングルタスクです。
この部分をマルチタスクにして欲しいという内容でした。
要求の理由は目新しさや安定性が売りになるからとのです。

まず、実現可能性の調査をすることが決定し、
私がその調査をすることになったのですが、
いろいろ検索したりして情報を探しても、
なかなか適した情報がヒットしない状況です。

で、質問なのですが、VC6で実現できるのでしょうか?
場合によっては最新の開発環境(VS2008だったかな)へ移行することも考えています。

よろしくお願いします


401:デフォルトの名無しさん
08/09/05 10:15:38
できます。
たぶん、きっと

402:デフォルトの名無しさん
08/09/05 10:27:08
マルチタスク、マルチスレッド、マルチタブを混同してないか?
まずはその違いを理解してから質問しろよ


403:デフォルトの名無しさん
08/09/05 11:26:07
ちなみに「Google Chrome」は VS2005 でビルドします。
MFC は使用されていないみたいです。

VC6, VS2003, VS2008 を持っているおいらは負け組み? orz

404:名無し募集中。。。
08/09/05 16:52:12
2005をskipするのはありがちだと思う
VISTAで開発するなら2008になるよなぁ

405:デフォルトの名無しさん
08/09/05 17:39:24
chromeはvs2008でもビルドできたよ

406:デフォルトの名無しさん
08/09/05 18:07:34
VC6でchromeをビルドできるようにして納品しちゃえば?

407:デフォルトの名無しさん
08/09/05 19:16:02
まじ?>405

釣りじゃないよね?
今から試してみよう


408:デフォルトの名無しさん
08/09/05 19:28:10
ソリューションを変換してビルド中だけど
warning C4396 が山のように出てるぞ
(Chome をビルド・改造するってスレはある?あれば移動します)


409:デフォルトの名無しさん
08/09/10 09:29:12
CListCtrl上にデータを表示し入ってくるデータで更新しているのですが、一定時間がたつと画面表示がおかしくなります。
フォントキャッシュが壊れた時のようにコンボボックスの右側の▽ボタンに6と表示されたり、画面全体(Windows含)が残像を残すようになったり。
データの受信を中止してもそのままで、またメモリ使用量を調べても特に増えてはいません。
InValidate関数等も試しましたが同じ現象が起こります。
最小化する、別の画面を最前面に表示する等で他の画面は正常に戻るのですが、再度リストを表示するとその瞬間に同じ症状が出ます。
どのような対策方法があるか教えていただけないでしょうか。

410:デフォルトの名無しさん
08/09/10 10:57:58
そうなんだ

411:デフォルトの名無しさん
08/09/10 12:02:52
どのような対策って、バグをつぶすしかねーだろ

412:デフォルトの名無しさん
08/09/10 13:12:05
>>409 の訳:「ソース出さないけど誰かデバッグして下さい」

413:デフォルトの名無しさん
08/09/10 13:46:39
よくあるケースみたいだから対策方法教えてくれと言ってるのかもしれんが、
普通無いケースだからなあ

414:デフォルトの名無しさん
08/09/10 15:23:51
「入ってくるデータで更新」がちょっと気になるな。
別スレッドでなんかやってるとか、
逆にシングルスレッドで表示の更新が止まってるとか。

415:デフォルトの名無しさん
08/09/10 15:46:55
リソース食いつぶしてるようにも見えるなあ

416:デフォルトの名無しさん
08/09/10 17:24:26
MFCと関係ないだろ

417:デフォルトの名無しさん
08/09/10 19:20:41
スタッティク領域に書かれたテキスト文字だけ拡大できる
のか

418:デフォルトの名無しさん
08/09/10 19:23:34
ひとりごとです

419:デフォルトの名無しさん
08/09/10 21:56:10
>>409
メモリーじゃないとすればGDIオブジェクトの数確認してみ。
タスクマネージャで表示メニューいじれば確認できる。
ひとつのアプリで使用できるGDIオブジェには上限があり
開放し忘れ関数が何度も呼ばれると409のような状態になる。

420:デフォルトの名無しさん
08/09/11 09:59:09
>>419
タスクマネージャにそんな機能があるとは、知らなかった
これは便利


421:409
08/09/11 11:12:54
ソースも出さず失礼しました。
単純なプログラムでも同じ状態になるので、何か単純な回避方法があるのではないかと思ったのです。
とりあえずGDIオブジェクトを調べてみようと思います。
ありがとうございました。

422:名無し募集中。。。
08/09/11 13:03:56
>>419
便利な事を教えてくれてありがとう

423:デフォルトの名無しさん
08/09/15 23:52:27
質問です。
現在VS2008でダイアログベースのプログラムを作成しています。
多重起動を禁止するため、以下の手順でウィンドウクラス名を変更しました。

1.ダイアログのClassNameをAAAAに変更
2.C***App::InitInstanceでClassNameをAAAAに設定
BOOL C***App::InitInstance(){
/*
 MFCによる処理
*/
WNDCLASS wc;
HINSTANCE hInst = ::AfxGetInstanceHandle();
if(!::GetClassInfo(hInst, CLASS_NAME, &wc)) {
ASSERT(::GetClassInfo(hInst, "#32770", &wc));
wc.lpszClassName = CLASS_NAME;
wc.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
ASSERT(::AfxRegisterClass(&wc));
}
ASSERT(CWinApp::InitInstance());
/*
 残りの処理
*/
C***Dlg dlg;
dlg.DoModal
return FALSE;
}

Debug版ではDoModalでちゃんとウィンドウが表示されるのですが、Release版ではDoModalが-1を返し異常終了してしまいます。
Release版でやらなければいけない処理などがあるでしょうか?
また、間違ってる処理などがあれば教えてください。

424:デフォルトの名無しさん
08/09/16 00:04:30
ASSERTがいかんのじゃね? 誤解してんじゃね? よくみてねーけどさ。

425:デフォルトの名無しさん
08/09/16 00:17:59
うん、俺もちゃんと見てないがInitInstance()なんてものをASSERTの中で呼んでることが怖い

426:423
08/09/16 00:55:56
>>424-425
ありがとうございます!解決しました!

ASSERTを誤解してました。これからは変数値の評価だけに使うことにします。

427:名無し募集中。。。
08/09/16 00:57:28
多重起動防止はCreateMutexを使うのが普通だぜ
m_hMutex = ::CreateMutex( NULL, 0, "__HogeAppMutex__" ) ;
if ( ::GetLastError() == ERROR_ALREADY_EXISTS ) {
 ::CloseHandle( m_hMutex ) ;
 m_hMutex = NULL ;
 return( FALSE ) ;
}


428:デフォルトの名無しさん
08/09/16 13:22:56
>>426
Releaseビルド時にも式の評価だけはしてくれるVERIFYマクロがあるよ

429:デフォルトの名無しさん
08/09/16 20:16:49
>>427
共有メモリでもいいかも知れない。
共有メモリに最初に起動したウィンドウの
ハンドルを格納しておいて、
多重起動された時に最初に起動したウィンドウ
を最前面に表示させるとか・・・


430:デフォルトの名無しさん
08/09/17 00:00:23
>>429
実はその方針では破綻する。

431:デフォルトの名無しさん
08/09/17 10:51:59
>>429
>最初に起動したウィンドウの
>ハンドルを格納
する前に、二番目に起動したプロセスのウィンドウハンドルが
格納されてしまうかも知れないわけよ。

432:423
08/09/17 11:52:16
返信遅くなってすいません。

>>427
これからはこれを多重起動の確認に使ってみようと思います。
ありがとうございます!

>>428
こんなマクロもあったんですね。
これからはASSERTの代わりに使ってみます。

433:名無し募集中。。。
08/09/17 16:24:05
>>429
>多重起動された時に最初に起動したウィンドウ
>を最前面に表示させるとか・・・
>>427のreturn前にコレだな

 CString strWndTitle ;
 strWndTitle.LoadString( IDR_MAINFRAME ) ;
 ::SetForegroundWindow( ::FindWindow( NULL, (LPCTSTR)strWndTitle )) ;

434:デフォルトの名無しさん
08/09/21 14:03:32
MFCをマクラって略してんの俺だけ?

435:デフォルトの名無しさん
08/09/21 15:03:10
ファンデーションはどこに行ったんだ

436:デフォルトの名無しさん
08/09/21 15:26:38
どっかにふっとんだ。

437:名無し募集中。。。
08/09/21 15:46:46
ファウンデーションでしょ

438:デフォルトの名無しさん
08/09/21 16:36:40
はげしく、どっちでもいいw

439:デフォルトの名無しさん
08/09/21 16:57:36
どっちでもいいぐらいだからどっか行ったんじゃね?w
マクラいいなw

440:デフォルトの名無しさん
08/09/21 19:24:06
ダイアログコントロールの種類(ボタンかエディットかなど) を判別する関数とかありますか?


441:名無し募集中。。。
08/09/21 20:13:57
IsKindOfかなぁ

442:デフォルトの名無しさん
08/09/21 21:14:15
関数は知らないけどapiならある

443:デフォルトの名無しさん
08/09/29 21:53:50
質問です。
タスクトレイにアイコンを格納しようと思っているんですが、タスクトレイに表示されるアイコンが32ピクセルのアイコンになってしまいます。
タスクトレイに表示されるアイコンを16ピクセルのアイコンにするにはどうすればいいんでしょうか?

//SetIcon(m_hIcon, TRUE); ← タスクバーのアイコンが16ピクセル、タスクトレイのアイコンが32ピクセルになる
//SetIcon(m_hIcon, FALSE); ← タスクバーのアイコンが32ピクセル、タスクトレイのアイコンが32ピクセルになる
m_iconData.cbSize = sizeof(NOTIFYICONDATA);
m_iconData.uID = TRY_ID;
m_iconData.hWnd = m_hWnd;
m_iconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_iconData.hIcon = m_hIcon;
m_iconData.uCallbackMessage = TRY_MESSAGE;
lstrcpy( m_iconData.szTip, "***" );
::Shell_NotifyIcon( NIM_ADD, &m_iconData );

444:デフォルトの名無しさん
08/09/29 22:13:32
いまいちよく判らんけど、LoadImageで取り出す大きさを明示的に指定すれば良いんじゃね?

445:443
08/09/30 03:00:33
>444
LoadIconで2種類のサイズのアイコンを取得していると思っていたんですが、LoadImageで取得する必要があるのでしょうか?
今はこうやってアイコンを取得しています。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


446:デフォルトの名無しさん
08/09/30 08:07:47
あまり関係ないかもしれないけどLoadIcon()って非推奨じゃなかったっけ

447:デフォルトの名無しさん
08/09/30 09:44:39
LoadIcon()は昔からある固定サイズの1種類しかとれないよ。

448:デフォルトの名無しさん
08/09/30 20:42:14
MFCのウィザードが吐き出すコードで
SetIcon(m_hIcon, FALSE)
ってあるけど、32x32のアイコンを16x16に縮小して表示するだけで、
16x16のアイコンを読み出して表示しているわけでは無かったりする。
DestoryIcon呼ぶの('A`)マンドクセ、ってのが理由だろうな。

449:デフォルトの名無しさん
08/10/01 22:44:16
LoadIcon非推奨ってことは16×16のビットマップで描画したほうがよかったりするんだろうか?
アイコン使うメリットってなんだろ?

450:デフォルトの名無しさん
08/10/02 14:45:03
メンバのCArrayを戻り値として返したいんですけど

CArray<~*, ~*>& GetData()
{
return( m_arrData );
}

だと、コンパイル時にprivateにアクセスしています。みたいなメッセージが表示されます。
(他のクラスからアクセスしてる)
どのように書くのが正しいのでしょうか…


451:デフォルトの名無しさん
08/10/02 14:49:35
自己解決しました…

452:443
08/10/03 00:29:16
返信が遅くなってすみません。

>446-449
ということは16x16と32x32のアイコンをそれぞれロードする必要があるということでしょうか?
また、16,32,48ピクセルのアイコンをそれぞれ出力するにはどうすればいいんでしょうか?

453:デフォルトの名無しさん
08/10/03 07:56:31
自分でLoadImage使うって書いてるじゃない

454:デフォルトの名無しさん
08/10/03 09:55:19
>m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
これと同じように、
m_hSmallIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
とかやればよし。

455:デフォルトの名無しさん
08/10/04 13:28:01
>>440
GetClassName API

456:デフォルトの名無しさん
08/10/05 12:31:57
age

457:443
08/10/05 14:32:49
>453-454
無事アイコンの使い分けが出来るようになりました。
ありがとうございました!

458:デフォルトの名無しさん
08/10/11 21:06:35
iniファイルをexeのところに作ろうとしてますがうまくいきません。なぜ。。。
App::InitInstance()
{
WCHAR dir[MAX_PATH];
::GetModuleFileName(NULL, dir, MAX_PATH);
wchar_t* pdest = wcsrchr(dir, _T('\\'));
pdest[1] = '\0';
::SetCurrentDirectory((LPCTSTR )dir);
wcscat_s(dir, _T("XXX.ini"));
free((void*)m_pszProfileName);
m_pszProfileName = _tcsdup(dir);
}

459:デフォルトの名無しさん
08/10/11 21:30:40
何がうまく行ってないか不明だし、
そこまでできてたらデバッガで調べるだろ

460:デフォルトの名無しさん
08/10/11 21:42:49
CWinApp::SetRegistryKeyを後で呼び出していたら笑う。
デバッガでステップ実行すれば、正しいパスが渡せているかどうかは一発だな。

461:デフォルトの名無しさん
08/10/11 21:43:13
ところで、これはMFCになんか関係あるのか?

462:デフォルトの名無しさん
08/10/11 21:49:12
m_pszProfileName m_pszProfileName がMFC

463:デフォルトの名無しさん
08/10/11 21:59:13
CStringって普通のStringじゃだめなのか?

464:デフォルトの名無しさん
08/10/11 22:04:39
CStringを使うのが普通

465:デフォルトの名無しさん
08/10/11 22:04:55
デバッガ上では dir にexeまでのパスが入っておりxxx.iniもセットされてますが
実際、ファイルは出来上がっていない。しかし、GetProfileStringでデータは取れるという状態

466:デフォルトの名無しさん
08/10/11 22:31:21
レジストリ使ってるわけじゃなくて?

467:デフォルトの名無しさん
08/10/11 22:52:14
簡単に変更でききるようにiniついたかったんですが

468:デフォルトの名無しさん
08/10/11 22:56:44
>>466
コードに書いてるのは、GetProfileStringなのか? 
ぐぐり直したほうがいんじゃねーのか?

469:468
08/10/11 22:57:47
>>466でなくて>>465の間違い。 すまねぇ。

470:デフォルトの名無しさん
08/10/11 23:31:17
Win32APIの同名APIを呼んでいる可能性があるかも。
WriteProfileStringなんか引数が全く同じだし。

471:463
08/10/11 23:34:38
>>464
ありがとう><;まだ、MFCはじめたばかりなので、習ってCString使っていこうと思います><;
ただ単に慣習的なもののような気がしますが。

472:デフォルトの名無しさん
08/10/11 23:58:42
>470 愛してる
そのまま使うとレジストリ保存だった。
正しくはWritePrivateProfileString() で最後に保存先指定でいけた

473:472
08/10/12 00:36:16
>468 も愛してるよ~

474:デフォルトの名無しさん
08/10/12 02:17:50
>>472
愛は要らんから、CWinApp側のメソッドを使ってやろうぜ。
MFCだと、普通はCWinApp派生クラスがtheAppとしてグローバルで宣言されているはず。

475:デフォルトの名無しさん
08/10/12 04:27:45
ダイアログの中のCStaticコントロール上のOnMouseMoveイベントを取得したいのだけど、どうすればいいのだろうか?
だれか教えてください。

476:デフォルトの名無しさん
08/10/12 04:30:12
そのCStaticをクラス化して、その中で受け取るか
ダイアログ側のクラスで、CStaticのハンドルを指定してOnMouseMoveを受け取ればいい

どっちが綺麗かと言われると、ときと場合によるけど、前者の方がいいかな

477:デフォルトの名無しさん
08/10/12 05:43:56
たぶんコントロールがIDC_STATICのままなんだろ

478:デフォルトの名無しさん
08/10/12 12:12:43
なるほどIDC_STATICじゃ出来ないな
固有の名前をつけないと

479:デフォルトの名無しさん
08/10/13 08:06:30
>ダイアログ側のクラスで、CStaticのハンドルを指定してOnMouseMoveを受け取ればいい

こちらの方法をもう少し詳しく教えてもらえないだろうか。
ON_WM_MOUSEMOVE() と void CFooDlg::OnMouseMove(UINT nFlags, CPoint point)
のセットで間に合うモノなんだろうか?

コントロールのIDはもちろんユニークなモノを付けている。



480:デフォルトの名無しさん
08/10/13 10:14:38
PreTranslateMessageかなぁ

481:デフォルトの名無しさん
08/10/13 11:24:09
479です。
ごめんなさい。問題解決しました。
今までクリックを検出するためにnotifyをtrueにしていたため、OnMouseMoveでは
コントロール領域のMouseMoveが取得できなかっただけでした。

482:デフォルトの名無しさん
08/10/15 20:11:56
ID_FILE_OPENなどが選択された際、
それがメニューからか、ツールバーからか、アクセラレータからか
などをコマンドハンドラ内で調べられませんか?
MFC内の隠し関数とかでも構わないのですけど。
コマンドハンドラまで来てしまったら絶対に区別できないですか?

483:デフォルトの名無しさん
08/10/15 21:09:11
区別する必要があったら区別できるように作ればいい。

484:デフォルトの名無しさん
08/10/15 21:12:19
ID_FILE_OPEN_1とかID_FILE_OPEN_2とか作って、ラッパー経由とか?w

485:デフォルトの名無しさん
08/10/15 21:43:28
>>482
WM_COMMANDにそういうパラメータあったはずだから調べてみなさい。

486:デフォルトの名無しさん
08/10/16 21:01:29
>>483-485
CWnd::GetCurrentMessage()を使って
WM_COMMANDの付加情報からコマンド発生元を取れました。
ありがとうございます。

487:デフォルトの名無しさん
08/10/17 17:54:12
CListCtrlレポート形式で
たくさん表示させると重いです

何か回避方法はありますか?

488:デフォルトの名無しさん
08/10/17 17:57:51
仮想リストビューとか

489:デフォルトの名無しさん
08/10/17 17:59:14
こういうやつね
仮想リストコントロール
URLリンク(msdn.microsoft.com)(VS.80).aspx

490:デフォルトの名無しさん
08/10/17 18:34:18
>>488-489
ありがとうございます。

心持ち軽くなったような気がするけどやっぱり重いです

これって
LVS_OWNERDATA で作成して
描画する文字列の部分を自分で割り当てるってことでいいんですよね。

仮想リストビュー
URLリンク(www.hokuriku.ne.jp)
ここも参考にしました。


やりかたまちがえてるのかな^^;

491:デフォルトの名無しさん
08/10/17 18:39:04
>>490
更新すべき場所だけ更新すればOK
普通のリストだと表示部分全てに更新がかかるから重いだけ。

492:デフォルトの名無しさん
08/10/17 23:49:31
ダイアログAに
ラジオボタン1
ラジオボタン2
が設置されていて、この二つのラジオボタンがグループで、
2を押したら1のチェックが外れるとします(逆もあり)。

今、2を押して、1のチェックが外れました。
ダイアログAのWindowProcにはラジオボタン1のコントロールIDで何かしらのメッセージが
飛んでくるのでしょうか?
ちなみに自分で試してみたところだとどうも飛んでこないようなのです。
ではラジオボタン1のチェックが外れた!というイベントをダイアログA上でキャッチすることはできないのでしょうか?

493:デフォルトの名無しさん
08/10/18 10:21:36
(コントロール変数).GetCheck(); で調べればよろし。
チェックのON/OFFを手動にすれば、チェックをつけなおす前に以前の状態を調べればチェックが外れたかどうか調べれる。

494:デフォルトの名無しさん
08/10/18 10:22:25
>>492
「ラジオボタン2が押された」→「ラジオボタン1のチェックが外れた」
でいいじゃん。

495:デフォルトの名無しさん
08/10/18 11:24:17
メッセージは飛んでるよ
WindowProc使った方法は知らん

496:デフォルトの名無しさん
08/10/18 13:10:47
>>493
>>494
説明が足りませんでしたが事情によりチェックが外れた瞬間のイベント駆動の処理が必要なんです
まだチェックオンの瞬間は、オンクリックで拾うことはできますが、
ラジオボタンの場合、他のボタンを押したときに勝手に外れるので、オンクリックでは拾えず
また、SetCheck関数などで変更されたときもオンクリックでは拾えませんし悩んでます。
クリックから、関数から、などの入力方法に関わらず、とにかく「チェックが切り替わったとき」の
イベントが欲しいのです…
例えばエディットボックスなら内容を変更されたときのイベントを取れるとおもうんですが、
考えてるのは「今変わった!」というのがわかる、そんなイメージです…

>>495
どういったメッセージか、もしわかればヒントだけでも教えてください><
できるだけ自分で調べるつもりですので

497:デフォルトの名無しさん
08/10/18 13:16:17
オンクリック→正確にはBN_CLICKEDです

498:デフォルトの名無しさん
08/10/18 17:36:14
>>496
URLリンク(msdn.microsoft.com)

499:デフォルトの名無しさん
08/10/18 18:11:09
>>496
>ラジオボタンの場合、他のボタンを押したときに勝手に外れるので
ラジオボタンのプロパティでそういう風に設定しているからだろ。
リソースでラジオボタンをダブルクリックしたときに作られる関数で、
SetCheckする前にチェックの状態が変わったかどうか自分で調べれば解決。

500:デフォルトの名無しさん
08/10/18 20:45:55
>>494と似た考え方だが


とりあえずそのグループのラジオボタンのイベントを一箇所で捕まえて
今回選択されたラジオボタンと前回で選択されたラジオボタンが異なっていたら、
「前回選択されたラジオボタンのチェックが外れた」
と考えればいいと思う。

なんとなく>>496はWindowProcとか言ってるからMFCじゃない気もするが、
MFCならON_COMMAND_RANGE使って10行も必要ないから
とりあえずダメ元で試してみたら?

501:名無し募集中。。。
08/10/18 23:14:23
話それるけどON_COMMAND_RANGEで扱うために
リソースIDを連続させるためにresource.hを編集しちゃう俺はヘタレですか?

502:デフォルトの名無しさん
08/10/19 03:21:49
いいんじゃない?
ID指定するとき、=つけて数値指定できるけど、面倒だもんね。

503:デフォルトの名無しさん
08/10/19 22:43:58
ON_COMMAND_EXを使えば、IDを引数にとるハンドラを作れるから、
リソースIDが飛び飛びでも一つのハンドラにまとめられるけど、
こっちはあまり使われないのかな。

504:デフォルトの名無しさん
08/10/21 11:17:02
MFCを使う標準DLLを作成すると
CWinAppを派生したアプリケーションクラスが用意されますが、
これはDLL内の単独のスレッドというわけではないのでしょうか?
OnIdle()をオーバーライドしてもコールされないのですが。

505:デフォルトの名無しさん
08/10/21 18:20:07
んー、そのままだと自分のメッセージループは使わないからな。

506:デフォルトの名無しさん
08/10/21 19:20:58
すみません。他で聞いても返事が無いのでここできかせてください。

VC6で本の通りにブラウザとかつくりました。VC6の生成するブラウザだから
いまどきのWebページは開けないだろうと思っていたんですが、普通にうまくひらけました。Flushとかもです。

これは、VC6とはいえ、ブラウザエンジン?はいまどきのPCの最新のを(要するにIE7のを)
作成してくれるのでしょうか?

よろしく教えてください。

507:506
08/10/21 19:34:59
元のスレを今見たら、今日の夕方に返答がきてました。
解決したので、>>506はスルーしてください。

508:デフォルトの名無しさん
08/10/23 02:18:54
SDIでグラフ描画するソフトを作ろうとしてるんですが
ViewのOnDrawで縦軸横軸を引いて
その上にグラフを描画する方法がわかりません。
どなたか、わかる人教えてください。


509:デフォルトの名無しさん
08/10/23 06:44:33
どこまでわかっててどこからわからないの?

510:デフォルトの名無しさん
08/10/23 15:16:36
VC6で、_MBCSを使い、日本語と英語のプログラムを作っています。
一つのEXEで問題なく、
日本語Win上では、日本語のダイアログ、
英語Win上では、追加した英語のダイアログが表示されたのですが、

現在選択しているリソースが日本語か英語か知りたいのですが、
プログラム実行時、
英語日本語のリソース切り替え選択はどの値を見て読み替えてるのでしょうか?

GetSystemDefaultLangID() 辺りは、コントロールパネルによって変化しているのは確認したのですが、
リソース読み替えとは関係ない様でした。
GetACP() , GetVersionEx()でも取得はできませんでした。
ご存知の方、ヒントだけでも御教授下さい。
よろしくお願いします。

511:デフォルトの名無しさん
08/10/23 15:32:35
GetSystemDefaultUILanguageとかGetUserDefaultUILanguageあたりかね?
でも自分でFindResourceExする必要はある気がする。

512:デフォルトの名無しさん
08/10/23 15:44:51
って動的に切り替えるのが目的じゃないのか

513:デフォルトの名無しさん
08/10/23 16:21:45
ありがとうございます。
GetSystemDefaultUILanguage
も調べていたのですが、これはVC7以降のAPIの様です。
多分ですが、
GetSystemDefaultLangIDと同様、コントロールパネルのロケールIDを返すのではないかと思います。
コントロールパネルからロケールIDは変更できるのですが、
実行時に使用されるリソースは変化ありませんでした。

現在の状態が知りたいだけですので、動的に読み替える必要は今のところありません。

どうしても・・・となれば、リソースに番号振って、プログラム中から判定するという方法もあるのですが、
Kernel32あたりで、どう判断しているのかが知れればと思った次第です。

514:デフォルトの名無しさん
08/10/23 16:26:19
winnls.h インクルードして使えないか?

515:デフォルトの名無しさん
08/10/23 16:29:43
そもそもAPIなのにVC7以降、とか関係ないでしょ。
インポートライブラリにもヘッダーにもないのなら作ればいいし。

516:513
08/10/23 18:13:02
>>515
karnel32.libに無いので、呼べないのかと思ってました。


karnel32.dll をLoadLibraryして呼び出すことができました。
結果、

・日本語Win
GetSystemDefaultUILanguage() = 1041
GetUserDefaultUILanguage() = 1041
・英語Win (XP-Pro SPなし)
GetSystemDefaultUILanguage() = 2011628553
GetUserDefaultUILanguage() = 1033
と、
コントロールパネルに影響されないGetSystemDefaultLangID()と同じ値が取得できました。
ただ、リソース読み替えに使われているのかは不明なのと、
英語Winで、GetSystemDefaultUILanguageが不思議な値を返してくるのですが、
とりあえずは目的を果たせそうです。
助かりました。ありがとうございました。


517:デフォルトの名無しさん
08/10/23 18:18:39
その不思議な値、16進で0x77E70409だね。
下16ビット、0x0409は10進で1033だから上と下で別々に意味もってるのかも。

518:デフォルトの名無しさん
08/10/23 19:16:01
GDI系のAPIの基本の話か?w

519:513
08/10/23 19:27:20
>>517
LANGIDFROMLCIDマクロを使ったところ、下位だけ抜けました。
言われるとおりのHEXで見るべきでした。
WINNT.H には、上位16bitは、Reserved、SortIDとコメントがありましたから、
Reservedは不明ですが、何か意味はありそうですね。

520:デフォルトの名無しさん
08/10/24 00:46:43

CMyDialog mydlg;

if ( dlg.doModal() ){


521:名無し募集中。。。
08/10/24 13:39:41
DoModal()じゃねぇのか?
返り値はIDOKじゃないのか?
そもそもmydlgじゃないdlgって何者?

522:デフォルトの名無しさん
08/10/28 16:49:40
CheckBoxの表示手法について教えて下さい。
通常はプロパティのCaptionで設定されている文字を表示させておいて
途中で文字の代わりにアイコンを表示させたいと思ってます。
最初からCheckBoxにアイコンを表示させる事はできてるのですが、途中で
テキストからアイコンへの変更ができません。
途中から変える事は無理なのでしょうか?

HINSTANCE hInst = AfxGetInstanceHandle();
HICON h_Icon1 = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,128,128,LR_DEFAULTCOLOR);
m_Check1.SetButtonStyle(m_Check1.GetButtonStyle() | BS_ICON);
m_Check1.SetIcon(h_Icon1);

523:デフォルトの名無しさん
08/10/28 17:48:42
ボタンスタイルは | でつなげても意味ないぞ。
m_Check1.SetButtonStyle(BS_ICON);
でもウィンドウサイズも変えないとアイコンの大きさにはならないかもな。

524:デフォルトの名無しさん
08/10/28 17:53:27
つーか、チェックボックスでかつアイコンというのが無いのか

525:デフォルトの名無しさん
08/10/28 19:36:32
ボタンみたいに動くものじゃないんだから
絵や文字と一体化してる必要ないし、
隣に自分で絵や文字書いても何の問題もない。

526:デフォルトの名無しさん
08/10/28 19:42:59
そんなにチェックボックスにアイコン使いたいなら擬似的に実現したクラス作ればいいじゃん

527:デフォルトの名無しさん
08/10/31 18:07:01
子ウィンドウとしてダイアログを利用しているのですが、
起動時、非表示にしたいのです。


CDialog dlg;
dlg.Create( IDD , this );
dlg.ShowWindow( SW_HIDE );

とやっているのですが、
一瞬表示されるのです。

OnInitdialogで
ShowWindow( SW_HIDE );
と記入しても。
回避できませんでした。

他に方法はありますか?




528:デフォルトの名無しさん
08/10/31 18:26:03
子ウィンドウってメインじゃないってこと?
ダイアログエディタでVisibleの初期値をfalseにしてもだめかな?

529:デフォルトの名無しさん
08/10/31 18:35:43
>>528
いけました
ありがとうございます><

530:デフォルトの名無しさん
08/11/01 19:08:11
MFC 9.0って、どこでダウンロードできますか?

531:デフォルトの名無しさん
08/11/01 19:48:43
できません。
standard以上を買ってください。

532:デフォルトの名無しさん
08/11/01 20:08:26
>>531
ありがとうございました。
しつこい質問で申し訳ないですが、今少し困っていることがあります。
当方

Visual C++ Express 2008

OS XP SP2

を使用していて、C++によってSQL Serverへの接続を試みています。
しかし、CDatabase db; のところで躓いてしまっています。
よく調べたところ、#include "afxdb.h" を使用する必要など
があるようで、更に調べたところ、MFCが関係していると知りました。

そこで、このスレの本質に従う質問をしたいと思います。
MFC9.0が使用できないことは分かりました。
MFCのシリーズで無料で(違法ではなく、公式な方法で)使用が可能な
方法はありませんか?
また、MFCがない場合
#include "afxdb.h" や CDatabase db;
などは、自分で1から記述しなければならないのでしょうか?
(初心者のため、バカなことかもしれませんが、ライブラリ
にはないため、自分で定義しなくてはならないのでしょうか?)

長文の上、稚拙な文になってしまいましたが、躓いてしまっている
ので、ご助力を加えて下されば幸いです。
よろしくお願いします。

533:デフォルトの名無しさん
08/11/01 20:25:42
CDatabaseを使用しないでDBにアクセスしなきゃなんないよ。

CDatabaseは C++ からODBCを介してSQL-Serverにアクセスするもので、
CDatabaseはMFCのクラスで、あなたは利用できないから、
ほかの手段を探すことになる。

ODBCの代わりにOLE-DBを使うこともできるし、
今からDBの勉強はじめるならこちらをお勧めする人が多いと思う。
"C++ OLE-DB SQL-SERVER アクセス"あたりのキーワードでぐぐればいいんじゃないかな。

というわけで、さようなら。

534:デフォルトの名無しさん
08/11/01 20:36:51
>>533
ご教授ありがとうございました。
貴重なお時間を割いていただき、申し訳ございませんでした。

535:デフォルトの名無しさん
08/11/02 02:30:04
質問しつれいします。

vc 2005
MFCを使ってGETやPOSTでデータを送信するプログラムを作成しようと思います。
勉強になるサイトなどありませんか?

検索のヒントでもいいので宜しくお願いしまっす

536:デフォルトの名無しさん
08/11/02 05:29:15
つWinInet

537:デフォルトの名無しさん
08/11/02 18:18:14
>>535
WebProg板

538:535
08/11/02 18:19:43
>>536
ありがとうございます
そのキーワードを頼りに自分なりに調べてやってみます

>>537
すいません板違いでしたかー


539:デフォルトの名無しさん
08/11/02 18:22:36
検索のヒントを提示しただけ。鼬害かどうかは白根。

540:デフォルトの名無しさん
08/11/02 19:04:18
MFCのクラスを使うんなら、使えそうなクラスぐらいすぐ見つかると思うが
MFCのクラスを使わずにやるんならスレ違い

541:デフォルトの名無しさん
08/11/02 19:16:10
>>540
いやぁMFCのクラスを使いたいのですが・・・
んー検討つかないんです
検索ワードだけでもヒントをぉぉぉぉぉ・・・orz

542:デフォルトの名無しさん
08/11/02 19:31:30
URLリンク(msdn.microsoft.com)
MFC ライブラリ リファレンス
インターネット クライアント アプリケーションの作成用の MFC クラス
更新 : 2007 年 11 月
MFC には、インターネット クライアント アプリケーションを作成するための以下のクラスとグローバル関数があります。

543:デフォルトの名無しさん
08/11/02 19:44:46
>>542
ありがとうございます!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

544:デフォルトの名無しさん
08/11/02 20:44:58
とりあえず、この辺一通り眺めといた方がいいかもね。

MFC > 階層図
URLリンク(msdn.microsoft.com)

545:デフォルトの名無しさん
08/11/03 02:18:47
>>544
本当にありがとうございます・・・
階層図・・・目から鱗です・・・


546:デフォルトの名無しさん
08/11/11 10:30:14
xp sp2 VS2005

CString GetString(void)
{
  CString strTemp;
  strTemp = "1234";
  return strTemp;
}

void Main(void)
{
  CString strHoge;
  CString strValue;

  strValue = GetString();
  strHoge.Format("%08s", (LPCTSTR)strValue);

  strValue = GetString();
  strHoge.Format("%s%08s", (LPCTSTR)strHoge, (LPCTSTR)strValue);

  // 以下略
}

という感じの処理をするとFormatで落ちてしまうのですが、
何故なのでしょうか?


あと CString でイメージ検索するとエr

547:デフォルトの名無しさん
08/11/11 10:51:26
>>546
CStringT::Format
--------
文字列オブジェクト自体をパラメータとして Format に渡すと、呼び出しは失敗します。たとえば、次のコードの結果は保証されません。
CAtlString str = "Some Data";
str.Format("%s%d", str, 123);
--------

548:デフォルトの名無しさん
08/11/11 11:08:54
>>547
その下に
----------
オプションの引数として文字列を渡すときは、LPCTSTR に明示的にキャストしてください。
書式は、printf 関数の書式引数と同じ機能を持っています。(書式や引数の説明は、
『ランタイム ライブラリ リファレンス』の「printf」を参照してください)。
書き込まれる文字列の終わりには NULL 文字が追加されます。
----------

とあったのですが、これはそもそも>>546の中でいう strValue のことであって、
自身を引数に指定するのはキャストしようが何しようがダメってことなんですよね?

549:デフォルトの名無しさん
08/11/11 11:36:26
>>548
URLリンク(msdn.microsoft.com)(VS.80).aspx
のほうには書いてないけど、
その説明は「キャストすれば自分自身を渡せるよ」ということでは無いと思う。

CStringTに書いてないということは昔はそういう制限でもあったのか、
それとも「CString::operator intなどを追加するかもしれないから、
LPCTSTRも明示的にキャストして渡しておけ」という意味じゃないだろうか。

550:デフォルトの名無しさん
08/11/11 12:52:46
const char*へのキャストは、operatorで内部のバッファ返してるだけ。
Format中に元のバッファが変わったら長さがかわるからバッファ足りなくなる。

551:デフォルトの名無しさん
08/11/11 14:19:28
>>547>>549>>550
なるほど、ありがとうございました。

ちなみに>>548の文は
URLリンク(msdn.microsoft.com)(VS.80).aspx
では無くなっちゃってるみたいですが、
VC6付属のMSDNに書かれていた文章です。

552:デフォルトの名無しさん
08/11/11 20:41:35
C#やった後にこれやると、
GUI画面作成、メッセージ処理、メモリ管理、例外処理とか泣けてくるな…

まあでも刺激はあるからいいか…

553:デフォルトの名無しさん
08/11/13 13:07:49
質問いいかな?
以下のようなプログラムでスレッド起動してスレッド終了を見ようとしているんだが、
WaitForSingleObject関数で毎回タイムアウト発生…理由分かる人いる?

void CMainClass::Start()
{
g_pThread = AfxBeginThread(Test, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
g_pThread->m_bAutoDelete = FALSE;
}

UINT Test(LPVOID pParam)
{
while(!g_Flg){ // ここで処理 //
}

return 0;
}

void CMainClass::Stop()
{
g_Flg = TRUE;

ULONG ret = WaitForSingleObject(g_pThread[0]->m_hThread, 10000);
delete g_pThread;
}

554:デフォルトの名無しさん
08/11/13 13:09:15
ULONG ret = WaitForSingleObject(g_pThread->m_hThread, 10000);
の間違い。配列はなしね。

なお「g_」をつけているのはグローバル変数

555:デフォルトの名無しさん
08/11/13 14:12:14
Test関数でちゃんと動いてる?
サスペンド中だったりしない?

556:デフォルトの名無しさん
08/11/13 14:38:07
>>555
いま調べているんだけど、タイムアウトの10000ms以内には
絶対に終わるはずなんだけどなー。
でもそれが疑わしいか…
回答してくれてありがとん。


557:デフォルトの名無しさん
08/11/13 14:46:42
とりあえず>>553のまんま動かしてみたけど、WAIT_OBJECT_0でした。
原因はそこ以外にある?

558:デフォルトの名無しさん
08/11/13 14:57:53
>>557
自分でもやってみたら確かに動いたんだよね。
Test()の処理部分に原因がありそうなのは間違いない。
(ここで10秒かかるってのは考えにくかったからここで質問させてもらったけど)

お騒がせさせてすまんかった。
>>557もありがとん

559:名無し募集中。。。
08/11/13 15:24:33
threadのreturn 0にブレイクポイントを置いてみるとか

560:デフォルトの名無しさん
08/11/13 16:11:23
>>553-554だが、新たな発見。
Test()の処理部分に処理回数をカウントアップして、
Editボックスに毎回その値を表示する処理として
SetWindowTextを使っているんだけど、
Stop関数をコールした後、どうもそこで固まるらしい。
(SetWindowTextをコメント化したら問題がでなくなった)

…意味分からん。なんで最後の1回のSetWindowTextで固まる!?

561:デフォルトの名無しさん
08/11/13 16:17:20
具体的には

ULONG num; //処理回数
CString str;
str.Format("%d", num);
EditBox->SetWindowText(str);
とこんな感じ。

もちろん、メインウィンドウのハンドルはもらってきて、
使っている(その部分は省略しているけど)

562:デフォルトの名無しさん
08/11/13 16:50:11
そりゃあそのSetWindowTextで呼んでるスレッドはもうWaitForしてるからだろ。

563:デフォルトの名無しさん
08/11/13 16:53:40
SetWindowTextはSendMessageを呼んでる。
メインスレッドのメッセージループでそれを受け取らない以上、SetWindowTextからは返ってこないよ。

564:デフォルトの名無しさん
08/11/13 17:00:11
あ、そういうことか!言われてみれば激しく納得w
>>562-563ありがとん

565:デフォルトの名無しさん
08/11/14 06:39:27
SDKを使わないでMFCアプリケーション作る方法を解説してるサイトはないでしょうか?

566:デフォルトの名無しさん
08/11/14 06:41:17
SDKじゃんくてIDEでした

567:デフォルトの名無しさん
08/11/14 08:09:46
リソースエディタとコマンドラインからコンパイラを動かすってことかな?

568:デフォルトの名無しさん
08/11/14 08:39:36
>>567
そうです。
ウィザードの吐き出すコードの解説と、リソースエディタの使い方が解説してあるサイトや本なんかが
あればいいなあ、と。

569:デフォルトの名無しさん
08/11/14 08:56:25
というかMFC詳しい人ってAFX*.Hに宣言されてるクラスを全部覚えてるのか・・・
ウィザードの吐き出すコードの前に、ここを熟読して出直してきます

570:デフォルトの名無しさん
08/11/14 23:08:06
>>569
覚えてないよ。ただ、よく使うクラスは限られるし、自分で使い勝手の
よいMFC派生クラスのライブラリを用意してあるので、それをプロジェ
クトに読み込んで使うことの方が多いな。

慣れてくると、ウィザードがどんなコードを吐き出すか判るので、既存の
テキトーなクラスの.cpp/.hをコピー&リネーム&文字列置換して、新しい
クラスの雛型にして、あとは全部手で書いている。

VC++ 6.0は、クラスウィザードがコード挿入位置を知るために使う特別な
書式のコメントがあるけど、これもクラスウィザードがコード生成したのと
同じように書いている。 その後、一度.clwファイルを消してからクラス
ウィザードを起動して.clwを再構築させれば、手で書いたクラスもちゃんと
クラスウィザードで認識させられる。

571:デフォルトの名無しさん
08/11/15 12:42:17
>>561

こういうの見るとSetDlgItemInt使えといいたくなる。


572:デフォルトの名無しさん
08/11/15 14:36:25
VS2008SP1のFeature Packで機能増えたけど、
新機能使うとレジストリでなくてiniファイルに保存・読み込みできないのだが(´ω`)・・トホー

573:デフォルトの名無しさん
08/11/15 15:56:10
>>571
素人さんですかw

574:デフォルトの名無しさん
08/11/15 17:45:43
>>573

玄人がSetDlgItemInt使わない理由とかあるの?

575:デフォルトの名無しさん
08/11/15 19:25:39
ダイアログを操作したいわけじゃないのに
ダイアログに委託しているところ

576:デフォルトの名無しさん
08/11/15 23:01:11
素人・玄人の話ではなくて、
今回の場合、ワーカースレッド側からだとSetDlgItemIntを使いようが無いってだけだな。
コントロール変数とかで持っていても、値をテキストとして設定したい時は、
地味に便利なメソッドだったりする。

577:デフォルトの名無しさん
08/11/16 01:34:50
また変なのがわいてきたな
ひっこんでろタコ

578:デフォルトの名無しさん
08/11/16 01:59:29
>>576
素人さんですかw

579:576
08/11/16 14:52:37
>>577 タコでさ~せんwwww
>>578 素人さんですかの人、こんにちはだお

580:デフォルトの名無しさん
08/11/17 02:50:44
CWnd::SetWindowText()も、CWnd::SetDlgItemText()も、CWnd::SetDlg
ItemInt()も、単純にAPIのラッパだし、ワーカスレッドからでもなんら
問題なく呼べるだろ。

ダイアログのポインタが嫌なら、ハンドルとAPI直接呼び出し使え。

::SetDlgItemText(this->m_hWnd,IDC_EDIT1,...);
::SetDlgItemInt(this->m_hWnd,IDC_EDIT1,...);



581:デフォルトの名無しさん
08/11/17 22:09:37
MFCスレでAPI直接呼び出し薦める奴って何なの?

582:デフォルトの名無しさん
08/11/17 22:22:44
と言われても、割と普通の事だしなあ。

というか、おまいら今回の話はUIスレッドがスレッド終了待機に入った所為で、
UIスレッドへのSendMessageがデッドロックした、っていう事完全に忘れてるだろ。

583:デフォルトの名無しさん
08/11/18 00:00:19
というより、スレッドとか、ハンドルがクラスで継承されていかないところでは、
Win32APIを直接叩く以外無いよな。
脱線すまん

584:デフォルトの名無しさん
08/11/18 00:09:04
隠ぺいしている部分は出来るだけ利用するな
でもGDIだけはベタ書きしてしまう俺

それ自体をクラス化するんだけどな

585:デフォルトの名無しさん
08/11/18 21:59:29
>>583
MSDNにはHANDLE渡して該当するFromHandleを呼び出す、とあるから
オブジェクトは渡せないけどMFCで行けるんじゃない?
個人的にはしないけどね。

586:名無し募集中。。。
08/11/18 22:07:02
都合のいい時だけMFCを使うってスタンスなのでWin32APiは普通に呼ぶ

587:デフォルトの名無しさん
08/11/19 13:37:26
モーダレスダイアログでボタンを押すと
m_cdlg = new CDlg(this);
m_cdlg->ShowWindow(SW_SHOW);
みたいな感じで表示するとボタンを押せばいくつでもダイアログが出てしまいます。
1つしか出さないにはどうしたらいいでしょうか?
あと、親クラスの関数でモーダレスダイアログを扱うことはできますか?
XP+VC.netです。

588:デフォルトの名無しさん
08/11/19 13:53:44
>>587
その2行を通るたびに new で作ってんだから、そりゃいくつでも出るでしょう。
そのボタン貼ったウィンドウの初期化部分で一回だけ作って、
ボタン押したときに ShowWindow すればいいんじゃね?

>親クラスの関数でモーダレスダイアログを扱うことはできますか?
ちょっと意味が解らんかった。

589:デフォルトの名無しさん
08/11/19 14:10:21
delete thisをモーダレス内でしているので、親ウィンドウではモーダレスの終了を検知出来ないですよね?
モーダレスが終了した後なら、もう一度ボタンを押したときはモーダレスを表示したいのですが・・・。

モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。

590:デフォルトの名無しさん
08/11/19 14:18:24
クラスメンバ
private:
CUnkoDlg m_dlg;

Initidialog
m_dlg.Create( CUnkoDlg::IDD , this )

OnButton
m_dlg.ShowWindow( SW_SHOW )


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch