[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 03/01 12:35 / Filesize : 186 KB / Number-of Response : 746
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

■MFC相談室 mfc19d.dll■



1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ]
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc18d.dll■
pc11.2ch.net/test/read.cgi/tech/1185917008/

351 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:05:31 ]
OnCancel が呼ばれるんだよ
ID は IDCANCEL


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

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

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

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

355 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 12:51:24 ]
たぶん閉じるボタンでOnCancelが呼ばれて
そこでEndDialogしてるんだろ

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

356 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 12:57:18 ]
m--takahashi.com/bbs/pastlog/A0100/A0071.html
「閉じる」ボタンのメッセージハンドラについて

357 名前:デフォルトの名無しさん [2008/07/29(火) 21:34:16 ]
>>341

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

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

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



360 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 20:22:34 ]
>>358
DDXとか初期化されて無いでしょ?

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

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

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

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

365 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 23:25:42 ]
で、SP1まだ?w

366 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 10:20:15 ]
>>363
同時にDisableにしておけばよいかと。

367 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 10:37:01 ]
Disableにしても消しても無理

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

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



370 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 14:16:02 ]
また意味不明なことを言ってるよ。
話をどこにもっていきたいのかわからん。

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

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

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

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

374 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:17:56 ]
OKボタン削除してもOnOK呼ばれる

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

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

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

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

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

379 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 14:37:12 ]
そのフォントがスコープ抜けて無効になってるというオチじゃなかろうね?

381 名前:379 mailto:sage [2008/08/12(火) 15:55:41 ]
>>380

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

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

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



384 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 14:41:01 ]
>>383
PathRemoveFileSpec()

385 名前:383 mailto:sage [2008/08/19(火) 14:41:34 ]
_tsplitpath
でしたね。。。
すまそ。

386 名前:383 mailto:sage [2008/08/19(火) 14:43:06 ]
>>384
そんなのあったんですね!!
ありがとうございます!!!

387 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:19:42 ]
Path系はIE5のライブラリのAPIだっけか

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

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




390 名前:名無し募集中。。。 mailto:sage [2008/08/22(金) 00:29:00 ]
DDV_MaxChars

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

392 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 01:42:32 ]
ATL/WTL, .NETなどなど

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

394 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 11:28:58 ]
SP1でいろいろ追加されたが、なかなか触る暇が無い

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

396 名前:名無し募集中。。。 mailto:sage [2008/09/02(火) 14:49:17 ]
ブラザーの新型で印刷どうぞ!
pc.watch.impress.co.jp/docs/2008/0902/brother.htm

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

398 名前:名無し募集中。。。 mailto:sage [2008/09/02(火) 21:06:18 ]
つPrimoPDF

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



400 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 09:17:49 ]
すみません、ひとつ質問というか相談させてください

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

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

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

よろしくお願いします


401 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 10:15:38 ]
できます。
たぶん、きっと

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


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

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

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

405 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 17:39:24 ]
chromeはvs2008でもビルドできたよ

406 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 18:07:34 ]
VC6でchromeをビルドできるようにして納品しちゃえば?

407 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 19:16:02 ]
まじ?>405

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


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


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



410 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 10:57:58 ]
そうなんだ

411 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 12:02:52 ]
どのような対策って、バグをつぶすしかねーだろ

412 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 13:12:05 ]
>>409 の訳:「ソース出さないけど誰かデバッグして下さい」

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

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

415 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:46:55 ]
リソース食いつぶしてるようにも見えるなあ

416 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:24:26 ]
MFCと関係ないだろ

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

418 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 19:23:34 ]
ひとりごとです

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



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


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

422 名前:名無し募集中。。。 mailto:sage [2008/09/11(木) 13:03:56 ]
>>419
便利な事を教えてくれてありがとう

423 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:04:30 ]
ASSERTがいかんのじゃね? 誤解してんじゃね? よくみてねーけどさ。

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

426 名前:423 mailto:sage [2008/09/16(火) 00:55:56 ]
>>424-425
ありがとうございます!解決しました!

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

427 名前:名無し募集中。。。 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 13:22:56 ]
>>426
Releaseビルド時にも式の評価だけはしてくれるVERIFYマクロがあるよ

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




430 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:00:23 ]
>>429
実はその方針では破綻する。

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

432 名前:423 mailto:sage [2008/09/17(水) 11:52:16 ]
返信遅くなってすいません。

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

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

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

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

434 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 14:03:32 ]
MFCをマクラって略してんの俺だけ?

435 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:03:10 ]
ファンデーションはどこに行ったんだ

436 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:26:38 ]
どっかにふっとんだ。

437 名前:名無し募集中。。。 mailto:sage [2008/09/21(日) 15:46:46 ]
ファウンデーションでしょ

438 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:36:40 ]
はげしく、どっちでもいいw

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



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


441 名前:名無し募集中。。。 mailto:sage [2008/09/21(日) 20:13:57 ]
IsKindOfかなぁ

442 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 21:14:15 ]
関数は知らないけどapiならある

443 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 22:13:32 ]
いまいちよく判らんけど、LoadImageで取り出す大きさを明示的に指定すれば良いんじゃね?

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


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

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

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

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



450 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:45:03 ]
メンバのCArrayを戻り値として返したいんですけど

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

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


451 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:49:35 ]
自己解決しました…

452 名前:443 [2008/10/03(金) 00:29:16 ]
返信が遅くなってすみません。

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

453 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:56:31 ]
自分でLoadImage使うって書いてるじゃない

454 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:28:01 ]
>>440
GetClassName API

456 名前:デフォルトの名無しさん [2008/10/05(日) 12:31:57 ]
age

457 名前:443 mailto:sage [2008/10/05(日) 14:32:49 ]
>453-454
無事アイコンの使い分けが出来るようになりました。
ありがとうございました!

458 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:30:40 ]
何がうまく行ってないか不明だし、
そこまでできてたらデバッガで調べるだろ



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

461 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:43:13 ]
ところで、これはMFCになんか関係あるのか?

462 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:49:12 ]
m_pszProfileName m_pszProfileName がMFC

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

464 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:04:39 ]
CStringを使うのが普通

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

466 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:31:21 ]
レジストリ使ってるわけじゃなくて?

467 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:52:14 ]
簡単に変更でききるようにiniついたかったんですが

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

469 名前:468 mailto:sage [2008/10/11(土) 22:57:47 ]
>>466でなくて>>465の間違い。 すまねぇ。



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

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

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

473 名前:472 mailto:sage [2008/10/12(日) 00:36:16 ]
>468 も愛してるよ〜

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

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

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

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

477 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 05:43:56 ]
たぶんコントロールがIDC_STATICのままなんだろ

478 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 12:12:43 ]
なるほどIDC_STATICじゃ出来ないな
固有の名前をつけないと

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

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

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





480 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 10:14:38 ]
PreTranslateMessageかなぁ

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

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

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

484 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:12:19 ]
ID_FILE_OPEN_1とかID_FILE_OPEN_2とか作って、ラッパー経由とか?w

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

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

487 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:54:12 ]
CListCtrlレポート形式で
たくさん表示させると重いです

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

488 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:57:51 ]
仮想リストビューとか

489 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:59:14 ]
こういうやつね
仮想リストコントロール
ttp://msdn.microsoft.com/ja-jp/library/ye4z8x58(VS.80).aspx



490 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:34:18 ]
>>488-489
ありがとうございます。

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

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

仮想リストビュー
www.hokuriku.ne.jp/ymyamada/mfc/VirtualList.htm
ここも参考にしました。


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

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

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

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

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

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

495 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 11:24:17 ]
メッセージは飛んでるよ
WindowProc使った方法は知らん

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

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

497 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 13:16:17 ]
オンクリック→正確にはBN_CLICKEDです

498 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 17:36:14 ]
>>496
ttp://msdn.microsoft.com/en-us/library/cc678956.aspx

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



500 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 20:45:55 ]
>>494と似た考え方だが


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

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

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

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

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

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

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

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

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

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

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

507 名前:506 mailto:sage [2008/10/21(火) 19:34:59 ]
元のスレを今見たら、今日の夕方に返答がきてました。
解決したので、>>506はスルーしてください。

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


509 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 06:44:33 ]
どこまでわかっててどこからわからないの?



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

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

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

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

512 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 15:44:51 ]
って動的に切り替えるのが目的じゃないのか

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

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

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

514 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:26:19 ]
winnls.h インクルードして使えないか?

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

516 名前:513 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 18:18:39 ]
その不思議な値、16進で0x77E70409だね。
下16ビット、0x0409は10進で1033だから上と下で別々に意味もってるのかも。

518 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:16:01 ]
GDI系のAPIの基本の話か?w

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



520 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 00:46:43 ]

CMyDialog mydlg;

if ( dlg.doModal() ){


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

522 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:48:42 ]
ボタンスタイルは | でつなげても意味ないぞ。
m_Check1.SetButtonStyle(BS_ICON);
でもウィンドウサイズも変えないとアイコンの大きさにはならないかもな。

524 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:53:27 ]
つーか、チェックボックスでかつアイコンというのが無いのか

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

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

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


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

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

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

他に方法はありますか?




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

529 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:35:43 ]
>>528
いけました
ありがとうございます><



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

531 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:48:43 ]
できません。
standard以上を買ってください。

532 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:25:42 ]
CDatabaseを使用しないでDBにアクセスしなきゃなんないよ。

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

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

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

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

535 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 02:30:04 ]
質問しつれいします。

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

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

536 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:29:15 ]
つWinInet

537 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:18:14 ]
>>535
WebProg板

538 名前:535 mailto:sage [2008/11/02(日) 18:19:43 ]
>>536
ありがとうございます
そのキーワードを頼りに自分なりに調べてやってみます

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


539 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:22:36 ]
検索のヒントを提示しただけ。鼬害かどうかは白根。



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

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

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

543 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:44:46 ]
>>542
ありがとうございます!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

544 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:44:58 ]
とりあえず、この辺一通り眺めといた方がいいかもね。

MFC > 階層図
msdn.microsoft.com/ja-jp/library/ws8s10w4.aspx

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


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

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

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

549 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 11:36:26 ]
>>548
ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx
のほうには書いてないけど、
その説明は「キャストすれば自分自身を渡せるよ」ということでは無いと思う。

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



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

551 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 14:19:28 ]
>>547>>549>>550
なるほど、ありがとうございました。

ちなみに>>548の文は
ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx
では無くなっちゃってるみたいですが、
VC6付属のMSDNに書かれていた文章です。

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

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

553 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 13:09:15 ]
ULONG ret = WaitForSingleObject(g_pThread->m_hThread, 10000);
の間違い。配列はなしね。

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

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

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


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

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

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

559 名前:名無し募集中。。。 mailto:sage [2008/11/13(木) 15:24:33 ]
threadのreturn 0にブレイクポイントを置いてみるとか



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

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

561 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:17:20 ]
具体的には

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

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

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

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

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

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

566 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 06:41:17 ]
SDKじゃんくてIDEでした

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

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

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



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

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

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

571 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 12:42:17 ]
>>561

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


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

573 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 15:56:10 ]
>>571
素人さんですかw

574 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 17:45:43 ]
>>573

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

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

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

577 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:34:50 ]
また変なのがわいてきたな
ひっこんでろタコ

578 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:59:29 ]
>>576
素人さんですかw

579 名前:576 mailto:sage [2008/11/16(日) 14:52:37 ]
>>577 タコでさ〜せんwwww
>>578 素人さんですかの人、こんにちはだお



580 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:09:37 ]
MFCスレでAPI直接呼び出し薦める奴って何なの?

582 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:22:44 ]
と言われても、割と普通の事だしなあ。

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

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

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

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

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

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

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

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

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

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

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



590 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:18:24 ]
クラスメンバ
private:
CUnkoDlg m_dlg;

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

OnButton
m_dlg.ShowWindow( SW_SHOW )

591 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:29:49 ]
モーダレスではなくモードレスですよ。

592 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:30:44 ]
モーダルに対してなのか、モーダレスと言う人は非常に多い

593 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:14:06 ]
青信号に対してなのか、赤信号で渡る人は非常に多い

594 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:40:22 ]
>>589
自分でWM_NOTIFYして親に通知して、実処理は通知先で


595 名前:名無し募集中。。。 mailto:sage [2008/11/19(水) 17:12:27 ]
>>589
モードレスダイアログに親のthisを渡してpublicな操作をしてもらう事はたまにやる
終了時には 『m_cdlg = new CDlg(this); 』のm_cdlgもNULLにして終わらせる
たぶんあんまり行儀が良くないと思う

596 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 17:23:38 ]
子ダイアログで親クラスのヘッダをincludeしてもいいならそれもアリだがそこでしか使えなくなる
俺もやったことあるけど

597 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:07:31 ]
モードレスダイアログなら、
一旦Createした後は、ShowとHideしかしないという作り方もある。
で、ダイアログ自体はポインタでなくメンバ変数としてそのまま持っておく、と。

598 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:08:33 ]
って >>590 そのものだった。すまそ。

599 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:37:13 ]
シングルトンならそれでいいな



600 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:28:13 ]
>>599
はぁ?何言ってんの?

601 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:32:38 ]
>>586
アプリケーションフレームワーク使ってないの?

602 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:38:21 ]
>>589
delete thisってどういう挙動になるのかな?

603 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 13:47:14 ]
delete this; // ハラキリ

604 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:42:17 ]
delete this; // さようなら

なら実際に見たことがある。

605 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 20:03:19 ]
>>600
きもw

606 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:05:35 ]
俺も >>599 が何を言ってるのか解らん。
親と子ダイアログ、どっちを指してるのかも不明だが、それが
シングルトンであるかどうかが今の話にどう関係してくるってんだ。

607 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:44:49 ]
> モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。

ライブラリ化などして、後々まで利用するなら、親ウィンドウなり、
オーナーウィンドウに対して、ユーザー定義メッセージを投げるのが、
一番汎用性があるのでは?

WPARAM,LPARAMで、操作したい内容(処理を特定するためのボタンのID等)
を渡す。 DWORD値2個で足りなければ、他のメッセージと同様に、構造体
やクラスオブジェクトのポインタを渡す。

処理は、ユーザー定義メッセージを貰う親ウィンドウなり、オーナーウィン
ドウ側にON_MESSAGE()のハンドラとして記述することになる。

608 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:08:54 ]
>>595-596
いいかどうかは別にして、自分もやるし、何度もやったことある。

>>597-598
1回だけCreateして、Show/Hideで使い回す場合、2回目以降表示する際
には、モーダレスダイアログ側のOnInitDialog()が呼ばれないことを
ちゃんと理解していれば、それで問題ないと思う。

ダイアログが、親ウィンドウが持つパラメータや状態を表示したり、変更
する機能を持つ場合、同じ実体をリサイクルしてもいいけど、親ウィン
ドウ側にはダイアログのポインタをメンバに持たせて、表示時は、newした
後でダイアログのメンバ変数をセットしてCreateを呼び、非表示時は、
DestroyWindow()してdeleteしてしまうのが良いかと。


609 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:14:44 ]
要約して書くと、こんなかんじ?

ON_BN_CLICKED(IDC_BUTTONxx,OnShowHideDlg)
CxxxxWnd::CxxxxWnd() {   m_pDlg=NULL; }
CxxxxWnd::~CxxxxWnd() /* virtual */
{
  if(m_pDlg)    // 親が死ぬとき、子も道連れに死ぬ
  {
    m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可
    delete m_pDlg;
    m_pDlg=NULL;       // どうせ死ぬので省略可
  }
}
CxxxxWnd::OnShowHideDlg()
{
  if(!m_pDlg)    // 非表示→表示
  {
    m_pDlg=new CMyDlg;
    m_pDlg->m_numParam1=1;
    m_pDlg->m_strEditParam=_T("テスト");
    m_pDlg->Create(this); // 表示時に毎回CMyDlg::OnInitDialog()が呼ばれる
    m_pDlg->ShowWindow(SW_SHOW);
  }
  else    // 表示→非表示
  {
    m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可
    delete m_pDlg;
    m_pDlg=NULL;
  }
}



610 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:21:05 ]
CWnd::ShowWindow()で表示切替したほうが動作が軽いよ
前回開いてた状態で再表示されたほうが使い勝手も良さそう

611 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:20:56 ]
まぁ、それも用途次第じゃないか
中身初期化しないならそれがベストだろし

612 名前:デフォルトの名無しさん [2008/11/21(金) 15:07:35 ]
ダイアログベースのMFCアプリです。(VS2005)
親ダイアログにタブコントロールを付けて、タブに更に子ダイアログがくっついている形です。

ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後なのは仕様ですか?
CWnd::OnInitDialogが呼び出されるよりも前にOnSizeが来てしまうので、
サイズを一緒に調整したい子ウィンドウ全てに対してGetSafeHwnd()関数でチェックしてから
サイズを変更しているのですが、もうちょっと効率的な方法はないですか?

それと、なぜかウィンドウでエンターを押すとShowWindow(SW_HIDE)が渡されるのか、
子ダイアログは消えてしまうし、親ダイアログではアプリ自体が終了してしまいます。
何か対処法はありますか?

613 名前:名無し募集中。。。 mailto:sage [2008/11/21(金) 15:09:41 ]
> なぜかウィンドウでエンターを押すと
OnOKに飛んでいる

614 名前:デフォルトの名無しさん [2008/11/21(金) 15:25:15 ]
>>613
OnOKって自分で呼ばなくても勝手に呼び出されちゃうんですか…
てっきりIDOKボタンを押した(又はDefault Buttonに設定した上でエンターした)時だけだと思っていました。

これは自分でOnOKを空の関数にオーバーライドして、CDialog::OnOK呼ばないようにせざるを得ないと言うことですか?

615 名前:名無し募集中。。。 mailto:sage [2008/11/21(金) 16:40:38 ]
> OnOKって自分で呼ばなくても勝手に
その通り
ESCを押すとOnCancelが呼ばれるのも同じ仕組み

616 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:13:49 ]
>>599

617 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:28:43 ]
>>614
>>376

618 名前:612 mailto:sage [2008/11/21(金) 17:48:04 ]
>>617
なるほど。よくわかりました。
っていうか、このスレのレスすらも確認しなくてスンマセン。

619 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:57:18 ]
>>612
ダイアログ内に子ダイアログを置くのであれば、
子ダイアログの「Control」をTrueにしておいたほうがよいですよ。
子ダイアログだけ消えるということも無くなるはず。



620 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:12:31 ]
612を見てなんでCPropertySheet&Pageを使わないのかと思ってしまったが言わない方がいいのか?

621 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:19:05 ]
うん。言ったら恥かくよ。

622 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:19:28 ]
と思ったらトップレベルウィンドウがダイアログなのか( ´ω`) ごめんよ

623 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:40:45 ]
CodeGuruかどっかのサンプルを参考に、トップレベルのダイアログに、
>>620-622
位置決め用にスタティックコントロールを置いて、そのスタティック
コントロールに重ねて、動的にプロパティシート(CPropertySheet)を
貼り付けて、そのシートに、さらにCPropertyPageをAddPage()する
というコードを実際に書いたことあるけど?


624 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:50:21 ]
>>612
> ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後
> なのは仕様ですか?

DoModal()を呼んだ場合、OnInitDialog()より前、OnCreate()の後に
OnSize()が呼ばれていると思うけど?

ダイアログリソースに貼り付けたコントロールではなくて、自分でコント
ロールを動的にCreate()しているのなら、コントロール作成より前には
呼ばれないでしょ。 そういうことではなくて?

625 名前:デフォルトの名無しさん [2008/11/21(金) 22:37:42 ]
>>624
あ、いや、ダイアログリソースで貼り付けて、DDXで関連づけたコントロールをOnSizeで調整しようとしているので、
DoDataExchangeで関連づけられる前にOnSizeが呼び出されるのが気にくわなかっただけでして…
(OnInitDialogはそれよりもあと)
あれ、UpdateDataを勝手に呼び出しちゃえば問題なかったですかね? もしかして。

626 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 03:20:48 ]
今日からVC++を使い始めたCプログラマです。

IPAddressクラスからIPv4アドレスをDWORD値で取り出したいのですが
どうすればいいのでしょう?

CString hostName = Host;
String ^strHost = gcnew String(hostName);
IPHostEntry^ ipInfo = Dns::GetHostEntry(strHost);
IPAddress^ ipAddr;
for each (ipAddr in ipInfo->AddressList)
{
 if (ipAddr->AddressFamily == System::Net::Sockets::AddressFamily::InterNetwork) break;
}
if (!ipAddr) /* この判定は超怪しい */
{
 /* とれなければLoopBackに強制 */
 dwSvAddr = 0x7F000001UL;
}
else
{
 /* dwSvaddr = *(DWORD *)ipAddr->getAddressBytes(); みたいなキャストがしたい */


627 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:53:01 ]
.NETスレで聞きなさい
たぶん.NETのデータ型をアンボクシングしてからキャストすればよさそうだが

628 名前:624 mailto:sage [2008/11/22(土) 09:32:53 ]
>>625
やりたいことがイマイチわからんのですが?

DoDataExchange()内のDDX_Control()で関連付けせずに、OnInitDialog()
内で、SubclassDlgItem()で動的に関連付け(サブクラス化)することも
できますが、コントロールの初期サイズはリソースで指定したサイズに
なるので、特定コントロールのみ例外扱い(リソース指定と異なるサイズ
にしたい)場合、そのコードはどこかに書く必要があると思います。

そもそも、OnSize()って、ダイアログのスタイルを「ダイアログ枠」で
なくて「サイズ変更枠」にすると、ダイアログをドラッグしてサイズ変更
したら、表示中はいつでも何回でも呼ばれる可能性がありますよ?

codeguru.comあたりの「CResizeDialog」を参考にしては?

629 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:11:26 ]
みんなMFCでアプリケーションハンガリアン使うとき、どんな感じにしてるの?



630 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:24:08 ]
>>628
DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
if (2回目以降のOnSizeだったら) {
  コントロールのサイズ変更;
}
のような判定が必要になるのが気にくわないということでは?

631 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 03:30:09 ]
>>630
本筋とそれる話で申し訳ない。
"2回目以降"でなくて、コントロールのhWndがIsWindow通るとかでいいんじゃね?

632 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 07:07:43 ]
まぁOnSizeはwin32のWM_SIZEのままで、ddxはmfcの後付なんだからしょうがない

633 名前:624 mailto:sage [2008/11/23(日) 11:35:19 ]
>>630
> DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、

DoDataExchangeとの順番は関係なく、最小化のタイミング等でもWM_SIZEは
飛んでくるから、何らかの判定は必要だと思うけど?

codeguru.comの「CResizeDialog」だと、ダイアログにCRect型のメンバ変数
を追加して、コンストラクタでCRect::Empyt()しといて、一発目のOnSize
で、CRect::IsRectEmpty()がTRUEなら、現在のダイアログサイズを変数に
取り込み、FALSEなら、直前のOnSize()時に取り込んだダイアログサイズと、
新しいサイズの差を計算して、子コントロールのダイアログ内での移動や、
サイズ変更をやっていたかと。

OnCreate()⇔OnDestroy()のように、明らかに逆で呼ばれることはないメッ
セージを除いて、安易にフレームワークが呼び出す順番に依存するような
造りにはしない方がいいのでは?

アイコンやビットマップを貼り付けるスタティックコントロールとか、貼り
付けたイメージのサイズに合わせて、コントロールのみ単独でOnSize()が
呼び出されることもあるし。

634 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:28:51 ]
>>633
なんかかみ合ってないような。
一発目のOnSizeではDDXメンバがまだ設定されていないということですよ?
そのCResizeDialogというのは、派生用のダイアログクラスなんだろうから、
内部で子コントロールのDDXメンバを持ってるわけではないでしょう?

昔のソースを掘り返してみたら、
if (IsWindow(m_buttonOK)) {
  m_buttonOK.MoveWindow(〜);
}
と自分もIsWindowを使っていた。

635 名前:624 mailto:sage [2008/11/23(日) 12:36:46 ]
>>634


636 名前:624 mailto:sage [2008/11/23(日) 12:41:26 ]
間違ってENTER押してもうた。(w

>>634
> なんかかみ合ってないような。

そもそも、なんでサイズ変更に際して、DDX_Control()での関連付けが
必要なのか全く説明がないし、自分が設計するとしても、その必要性を
まったく感じないんですが?

637 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:24 ]
IsWindowか 俺はGetSafeHwnd派だ( ´ω`)

638 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:27:16 ]
::IsWindow()とCWnd::GetSafeHwnd()なら普通は後者を使うでしょ?

639 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:37:32 ]
HWNDキャスト派は異端ですか?



640 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 21:27:30 ]
それもCWndメンバだからいいんじゃね?
グローバルスコープなのを呼び出すなって話だろ

641 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:00:14 ]
CWnd::GetSafeHwnd()って、m_hWndを返すだけであって、
そのウィンドウが存在しているかどうかはわからないのでは?

642 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:02:48 ]
Create()が正常終了してないとm_hWndはNULL
CWndの実体ができる時点でウィンドウが作られてるわけじゃないぞ

643 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:12:18 ]
>>642
それはどこかで明記されてたっけ?
初期化していないポインタのようにゴミが入っている可能性は常に無い?

あとそれが大丈夫だとしても、>>634のようにDDXメンバの実体に対するものには
GetSafeHwnd()ではなくm_hWndで十分だと思うけど。

644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 00:54:26 ]
SDKで組んだこと無いのかよ

645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 01:32:23 ]
m_hWndの指すウィンドウが存在しないとか言い出したら、
そのハンドルが、実は他プロセスのウィンドウを指してしまっている状態すら、
考慮しないといけなくなるんじゃないか?

646 名前:名無し募集中。。。 mailto:sage [2008/11/24(月) 02:08:50 ]
俺はm_hWnd派だったんだけどGetSafeHwnd()の方が安全そうだから乗り換えるわ
でも、たぶんどっちでも良くて気分の問題

647 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 07:43:46 ]
>>643
> それはどこかで明記されてたっけ?
> 初期化していないポインタのようにゴミが入っている可能性は常に無い?

挙動はMFCのソース見れば判るだろ。 というより、C++やクラスの本質
を理解しているのかと?

その理屈なら、CFileクラスのm_hFileメンバ変数や、CGdiObjectクラス
(CPen,CBrush等の基底クラス)のm_hObjectメンバ変数の値も信用できん
とな?(w

> あとそれが大丈夫だとしても...

『大丈夫だとしても』ぢゃなく『大丈夫でなければ』、どんな場面であって
も(m_hWndの値を返す)GetSafeHwnd()も、m_hWndの直接参照も使えない。


648 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 07:44:54 ]
>>646
> たぶんどっちでも良くて気分の問題

んなことぁない。

直接参照する場合、thisポインタのチェックが入らないのに対して、Get
SafeHwnd()は、(CWndを指す)thisポインタが有効かどうかチェックした後
でthisポインタがNULLの時m_hWndの値を参照せずNULLを返し、thisポインタ
が有効な時のみメンバ変数m_hWndの値を返す。

クラスメンバとして実体が存在するオブジェクトに対して使う場合は、
>>643 氏の言うとおり。

問題はGetParent()などのようにCWndのポインタとしてNULLを返す可能性が
ある場合、戻り値をチェックせず、m_hWndを直接参照すると「0xXXXXXXXXが
無効なポインタを参照うんぬん」というエラーで落ちることになる。

自前のコードでチェックしてm_hWndを参照してもいいけど、どうせなら
そういう場合はGetSafeHwnd()を使った方がスマート。

同様に、CGdiObject::m_hObjectも、CGdiObject::GetSafeHandle()を
使った方がいい。

649 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 10:56:07 ]
CWndの関数はm_hWndに対してそのままAPIを呼ぶようなものが多いから、
自分もNULLチェックではなくAPIのIsWindowに渡してチェックすることが多いな。



650 名前:デフォルトの名無しさん [2008/11/24(月) 11:41:00 ]
もしかして、冷蔵庫内のランプが消えたかどうか、冷蔵庫のドアを何回も
開け閉めして確認しちゃう人?

IsWindow()呼んで戻り値をチェックした後で、APIを呼び出すまでの間に
ウィンドウが消滅しているかもしれないという心配はしないの?(w

651 名前:デフォルトの名無しさん [2008/11/24(月) 13:18:36 ]
お取り込み中すみませんが、質問です。
ドキュメントビューアーキテクチャのSDIプログラムを作っているのですが、
メニューのハンドラってxxxDocment.cppに作成するのが良いのでしょうか?
あと、設定データとかファイル入出力のデータの実態もxxxDocment.cppに
作成した方がよいのでしょうか?

652 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 14:40:44 ]
>>650
それは別問題では?
IsWindow()でチェックしようがm_hWnd!=NULLでチェックしようが、
その後APIを呼び出すまでの間にウィンドウが消滅しているかもしれないのは同じ。

>>651
「表示倍率を拡大」なんていうコマンドならビューやアプリケーションだろうし、
コマンドの内容に依りますよ。

653 名前:デフォルトの名無しさん [2008/11/24(月) 16:47:20 ]
質問です、ダイアログのタイトルとかを表示している部分の
高さなどを知る方法ってあるのでしょうか?

┌──────────────┐
│たいとる .│←この高さが知りたい
├──────────────┤

654 名前:デフォルトの名無しさん [2008/11/24(月) 16:52:38 ]
>>653

::GetSystemMetrics(SM_CYCAPTION);

でいけると思うが、未確認。

655 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 17:25:35 ]
既存ソフトのバージョンアップ開発で、そういうの生値でやっててキレそうになったことあるわ
上にもあるようにGetSystemMetrics()でOK
というか、GetSystemMetrics()からとれるやつは全部こっからとらないと、ちょっとしたWindowsのデザイン設定の違いでカオスになるからな

656 名前:名無し募集中。。。 mailto:sage [2008/11/24(月) 17:57:06 ]
>>651
データにまつわる事ならDoc
見せ方(表示)にまつわる事ならView
アプリ全体(データ全体)にまつわる事ならMainFrame

657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 03:57:20 ]
本当にMainFrameなの?

658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 09:02:09 ]
自分は、アプリケーション全体や、全てのドキュメントに共通の設定は、
CWinApp派生クラスのメンバに登録しているなぁ。 一応、データ本体は、
protectedで、設定をGet/Setするヘルパ関数を用意している。

あと、メッセージハンドラはともかく、ドキュメントの表示方法(例えば
色やスタイルなどの見せ方)に関する設定値は、ViewではなくDocクラスに
持たせているなぁ。

これらの一部をViewに持たせると、ファイルに保存する際にViewクラスに
アクセスしなければならないし、Viewが生成されてドキュメントに関連
付けされる前に、ファイルから初期値を読み込む時等に実装に困る。

CListViewクラスのLVS_REPORT等、ウィンドウが存在する時は、実質的に
Viewもウィンドウ属性という形でそうしたデータを持っているけど、最初
にCreate()する際に、どの初期値でスタイルを指定するという場合に困る。

659 名前:名無し募集中。。。 mailto:sage [2008/11/25(火) 13:46:17 ]
ドキュメントに保存するパラメータなら見せ方や色にしてもDocが持つべきだろうけど
たとえば表示倍率とかViewごとに変化する(保存する必要のない)データはViewが持って良いだろう
アプリ全体(複数のデータ)は、Appが持つのも良いと思う。
でもCWnd派生のMainFrameだとSetTimerとかPostMessageが使えるから
シーケンシャルな処理が入った時に便利なんで、MainFrameを使ってる
でも>>651の質問ってSDIだよな。1つのDocにViewが複数あるわけじゃないから神経質にならなくてもいいな



660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:05:52 ]
>>659
SDIはドキュメントが1つであって、ビューが1つではないですよ。
実際、エクスプローラスタイルで作成されたSDIはビューが2つあるし、
標準のスタイルでも任意にビューを増やせる。

661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:06:39 ]
Doc と View が 1:1 なら、分ける意味も薄いしな。

662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:36:10 ]
Viewが分割サポートする場合は1:1でもDocは必要だぜ

663 名前:名無し募集中。。。 mailto:sage [2008/11/25(火) 18:54:48 ]
そっかSDIはDocが1つなだけでViewは1つとは限らないか

664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:27:45 ]
SDIの単純なエディタでも、CSplitterWndでViewを分割して、離れた場所の
テキストを表示したりできるからね。

665 名前:デフォルトの名無しさん [2008/11/26(水) 17:34:11 ]
C**Doc::Serializeを使っているのですが、ファイルの保存や開くときのファイル形式を
する方法はありますか?

666 名前:デフォルトの名無しさん [2008/11/26(水) 17:35:42 ]
訂正>>
C**Doc::Serializeを使っているのですが、ファイルの保存や開くときのファイル形式を
指定する方法はありますか?

667 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 17:52:53 ]
自分でSerializeを書けばいい

668 名前:名無し募集中。。。 mailto:sage [2008/11/26(水) 18:10:15 ]
拡張子という意味ならリソースのString Tableで"IDR_アプリ名TYPE"の定義で指定
\nで区切られた何番目がどんな意味かはヘルプ参照
"IDR_アプリ名TYPE"は、InitInstance()の中でnewするCMultiDocTemplate()の第1パラメータ

669 名前:デフォルトの名無しさん [2008/11/26(水) 18:32:50 ]
助かりました!!



670 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 23:18:28 ]
Win7では2D描画はDirect2Dがメインになるって聞いたが、旧Windowsをサポートするなら結局GDIの方がいいのかな

671 名前:651 [2008/11/26(水) 23:35:46 ]
皆さんお返事ありがとうございます。651です。
SDIといってもCFormViewをベースに、複数のダイアログを切り替えて表示するような
プログラムを作っています。データの所在がそれぞれのダイアログに散らばってしまうと
管理が面倒なので今はDocumentクラスにすべて実体を持たせ、メニューのハンドラも
そこにおいています。
みなさんの説明を要約すると基本的なセオリーとしては、

・GUI等の画面表示に関係するデータ、ハンドラ: View(ダイアログ)に持たせる
・ファイル入出力に関するデータ、ハンドラ: Docに持たせる
・アプリ全体に関する設定: CWinAppとかMainFrameに持たせる

と言ったところでしょうか。

データの中にはコンストラクタでデータ設定したりオブジェクト生成したりしていて
その順番が問題になる事もありますので、その辺も考慮して決めたいと思います。



672 名前:デフォルトの名無しさん [2008/11/27(木) 01:01:54 ]
ボタンは、BM_SETSTATE で凹ませることができますが、
スピンコントロールの上ボタンや下ボタンを凹ませるには、
どのようなメッセージを送れば良いのでしょうか?


673 名前:名無し募集中。。。 mailto:sage [2008/11/27(木) 01:15:56 ]
>>670
> Win7では2D描画はDirect2Dがメインになるって聞いたが
VistaではGDI ハードウェアアクセラレーションが効かなかったが
Windows7では有効になる
d.hatena.ne.jp/NyaRuRu/20081126/p1

674 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:36:16 ]
テクスチャサイズ8K×8Kって結構厳しいな。
家の7600GSじゃ4K×4Kが最大だから対応できないのか。

675 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 04:56:15 ]
今更MFCの勉強したいんですがどの本読めばいいですか?
ずーっと昔に買ってそのまま放置しておいたプログラミングVisualC++.NET基礎編があるのですが
やっぱり新しい本を購入してやったほうがいいですか?

676 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 07:23:12 ]
ソースコード読むのが一番遠回りで一番近道な気がしてきた
適当になんか作りたいだけならサンプル眺めてるだけでいいし

677 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:00:03 ]
>>675
基本VS6時代の本でおK
というかあの頃の本が一番詳しく書いてある
VSが.NETになってからだとVC本がしょっぱい現実


678 名前:名無し募集中。。。 mailto:sage [2008/11/27(木) 13:07:56 ]
MFCの勉強なら「Scribble サンプル : MDI 描画アプリケーション」
のチュートリアルを一通りやるといいよ
VC6の時はSTEP1〜7までていねいに解説してあった

679 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 22:41:01 ]
それMFCの最初のテーマとしては最悪だよ
何人がそれであきらめてやめたことか
悪いことは言わん
最初は、ダイアログアプリからやるべし




680 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 22:54:16 ]
慣れてくれば、あのサンプルの意図するところも解るのだけどね。
最初にあれに手を出すと、確実に拒絶反応起こすこと請け合い。
ダイアログアプリ以外だと、Document-Viewを切ったSDIとかも練習には良いな。

681 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 23:04:43 ]
とりあえずダイアログを使いこなせないとSDIは厳しいだろ
SDIやるなら、適当にGDIの勉強とか、Doc-View-Frameとかの関係を理解するとか・・・良いサンプルないかな

682 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 02:55:52 ]
MFCサンプル
ttp://msdn.microsoft.com/ja-jp/library/482ck6x8.aspx
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=01AE159F-08CD-495B-8BF4-A48CC395AD7B&displaylang=ja

683 名前:名無し募集中。。。 mailto:sage [2008/11/28(金) 12:58:34 ]
薦めておいて何だが、そういえばScribbleは途中で投げ出した記憶があるな
でもリソースエディタの使い方とかVSの操作は役に立ったような・・・

684 名前:デフォルトの名無しさん [2008/11/28(金) 19:39:24 ]
ダイアログベースのアプリからモードレスウィンドウを表示しているのですが
ウィンドウを破棄する時に警告がでてしまいます
警告の内容はデストロイウィンドウが呼ばれてないといった内容で
ダイアログを破棄するときに実際にデストロイウィンドウを呼んでみると
例外エラーが発生してアプリケーションが落ちてしまいます

685 名前:デフォルトの名無しさん [2008/11/28(金) 19:40:28 ]
質問はどうしたらうまくいくのでしょうか?ということです

686 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:46:39 ]
CWnd::DestroyWindow()のかわりにCWnd::PostMessage()を使ってみては?

687 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:26:55 ]
モードレスウィンドウのインスタンス生成やデータの持たせ方等で方法は
一つではないが、留意しなければいけないのは、モードレスウィンドウの
表示/非表示の繰り返しでメモリリークしないことと、「閉じる」操作など
で親ウィンドウが消滅した際に、モードレスウィンドウが開かれていれば
終了前に閉じれること。

ダイアログベースでメインウィンドウをモードレスに変更したのか、別に
モーダレスウィンドウを開くのか不明だが、後者と仮定しての一例...。

モードレスウィンドウ(Exp:CMyModalessDlg)を、ベースダイアログ(Exp:
CMyMainDlg)のメンバ変数(Exp:m_wndModalessDlg)にする。

App終了時にモーダレスを自動で閉じるため、CMyMainDlg::OnDestroy()に、

  if(m_wndModalessDlg.m_hWnd)
    m_wndModalessDlg.DestroyWindow();

を追加。 モーダレスの表示/非表示のハンドラは...

void CMyMainDlg::OnShowHideModaless() /* afx_msg */
{
  if(m_wndModalessDlg.m_hWnd==NULL)
    m_wndModalessDlg.Create(this);
  m_wndModalessDlg.ShowWindow(m_wndModalessDlg.IsWindowVisible() ? SW_HIDE:SW_SHOW);
}

モードレスウィンドウのインスタンスをnewで生成していないので、
CMyModalessDlg::PostNcDestroy()で「delete this」やっていたら
削除。 >>587- あたりも参照のこと。

688 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:32:49 ]
ていうか、CDialogを上手く隠ぺいしたら、モーダレスダイアログの抽象クラスくらい作れそうな気がするな
IDDあたりも工夫して・・・

689 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:52:05 ]
抽象クラスって意味判って言ってるのか?



690 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:57:20 ]
何もおかしくないと思うぞ
CDialogのような使い方は出来ないと思うけど

691 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 02:40:06 ]
>>686-687
レスありがとうございます
このサイトのコードを参考にしていたのですがこれがなんかまずかったみたいです
athomejp.com/goldfish/mfc/dialog/modeless.asp

CWaitDlg *pWait = new CWaitDlg();
pWait->Create(this);

//処理

pWait->DestroyWindow();
delete pWait;

で普通に消せました
ご迷惑おかけしました

692 名前:デフォルトの名無しさん [2008/11/29(土) 03:03:13 ]
Viewの中でCEditをcreateで生成して用いているのでPreTranslateMessageで
キー入力を認識しているのですが、ctrl+Cなどコピペや複合の入力を検知する方法はありますでしょうか。
XP+VC2005です。

693 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:11:57 ]
>>691
なんでnew使うの?
{
CWaitDlg wait;
wait.Create(this);
// 処理
wait.DestroyWindow();
}
でいいと思うのだけど。
破棄のタイミングに拘らなければブロック化({})すら要らない。

694 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:32:55 ]
>>693
あんまり意味ないです
貼り付けたサンプルがたまたまそうだったからという理由だけですw

695 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:43:50 ]
>>691
CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの?

>>692
リソースに記述してCOMMAND_UIあたりで処理するのではなかったっけ?

696 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 04:13:03 ]
>>695
>CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの?
いや、なんかよくわかりませんでした
とりあえず、モードレス側に書く処理はCreate関数だけで
削除は親に全部まかせるのがいい気がします

697 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 17:15:04 ]
>>693>>694
モードレスの場合はダイアログの作成と破棄のタイミングが違うのでメンバに抱えてnewを使う

698 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 18:14:42 ]
>>697
モードレスとモーダルを同じダイアログで使いまわす状況なんてないんじゃね?

699 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 18:30:38 ]
何れにしても、わざわざnew/deleteして使わなくてもいいだろ。
ダイアログが閉じられたからといって、
クラスのインスタンスを即座に破棄しなければならない理由は無い。
別々の派生クラスを時と場合に応じて使い分ける、とかいうなら話は解るけど。



700 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 20:37:50 ]
>>699
じゃあモードレスの場合にダイアログが作成されてるか破棄されてるかはどうやって判別すんの?

701 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:03:49 ]
画面に線だけを書きたいときは領域を塗りつぶしてから書いたほうがいいですか?それともなんかコントロールを置いてそれに書いたほうがいいですか?

702 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:08:11 ]
領域を塗りつぶしてから書いたほうがいい

703 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:17:29 ]
>>700
用語が曖昧だからなんとも言えないけれど、モードレスダイアログが実際に表示されているのかされていないのか、
そのダイアログ自身以外に一体全体誰が気にしなければいけないというの?
そのダイアログのインスタンスを持っている側にとっては、出ていて欲しいときに出せと要求するだけで充分でしょ。

704 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:17:48 ]
塗りつぶして線を引いた、領域と同じサイズの絵を描画した方がいい

705 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:18:19 ]
>>701
用途と状況と目的によりけりかと。

706 名前:!699 mailto:sage [2008/11/29(土) 21:22:14 ]
>>700
質問元のモードレスダイアログは、処理中ダイアログみたいだから、
判別する必要ねえんじゃね?

ユーザーによるオペレーションで表示/非表示するようなやつの場合、
俺は(複数表示する必要なかったので)シングルトン的なものにして対応したんで、
作成されている/いないを判別するは必要なかった。

707 名前:706 mailto:sage [2008/11/29(土) 21:24:28 ]
リロードせずにレスした。 反省した。 次はリロードする。

708 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:06:13 ]
>>706
処理中ダイアログって考えはなかったわ
でも1ハンドラ内に>>691の記述でモードレス中ダイアログを表示できたっけ?

709 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:07:10 ]
>>703
表示/非表示じゃなくダイアログの作成/破棄な CDialog::Create()とCWnd::DestroyWindow()
インスタンスの生成/破棄(new/delete)とも別だよ



710 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:20:51 ]
>>708
PeekMessageでもはさむんじゃね?

711 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:48:54 ]
>>709
事情は変わらんだろ。ダイアログ自身が管理していれば、利用者はそれを意識する必要はない。

712 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:52:27 ]
俺はそもそも
モードレスとモーダルをいっしょのクラスで分岐させる無意味な汎用性と
Createされてる状況でCreate関数を再び呼ぶ必要を考慮してるクラスの仕様のが
気持ち悪くていまの話題についていけないけどね

713 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:56:54 ]
いっそのこと新しいC++向けのMS製フレームワークを提供してほしいわ
.NETは相性悪すぎる

せっかくDirect2DとDirectWriteもC++向けに提供するんだし、アプリケーションハンガリアンでエレガントなクラス群を是非

714 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:01:17 ]
>>711
モードレスダイアログのサンプル書いてみてよ

715 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:03:47 ]
>>714
CWaitDlg wait;
wait.Create(this);
// 処理
wait.DestroyWindow();

716 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:14:20 ]
>>715
処理中ダイアログじゃなくてOKボタン押すまで表示されてるモードレスダイアログのサンプル書いてみてよ

717 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:15:52 ]
>>716
意味がわかんない

718 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:18:19 ]
>>716
CWaitDlg wait;
wait.Create(this);

while(1){
PeekMessage
GetMessage
TranslateMessage
DispatchMessage

if(ボタンが押されたら)break;

//処理

}

wait.DestroyWindow();

719 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:32:06 ]
>>718
モードレスのサンプルになってないよ
その用途ならモーダル使うのが普通じゃん



720 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:36:43 ]
>>719
プログレスバーが表示できるじゃん
質問元が思いっきりそういう意図じゃん

普通だったらモードレスなんてつかわねぇよ
正直いってバグりやすいもん
大部分がこんな感じで済むんだよ

721 名前:706 mailto:sage [2008/11/29(土) 23:49:45 ]
>>708
1ハンドラでの処理は考えてなかった。 てか忘れてた。
new/deleteの話いらないって話なんだから、1ハンドラだね。
そういうわけで、>>706はなかったことに。
>>710の通りやればできそうだけど、確認したくないという事情によります)

まったく持ってごめん。 反省した。 次は、、次も、、とり頭だからやってしまうかもしれん。

722 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:58:54 ]
>>718>>711のようにするにはどうすればいいの?

723 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:00:13 ]
>>722
何がやりたいのか具体的にいいたまへ

724 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:13:23 ]
>>716

どっかのクラス
{
  CWaitDlg m_wait;
};

どっかのクラス::モーダレス表示するハンドラ()
{
  wait.Create(AfxGetMainWnd());
}

これで、親クラスが消滅するかダイアログの「×」ボタン「OK」または
「Cancel」ボタンがクリックされるまで表示されたままになる。

>>719
モードレスだが?

>>722
スレッドを起こせばいい。


725 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:15:04 ]
>>724
>  wait.Create(AfxGetMainWnd()); ... 誤

  m_wait.Create(AfxGetMainWnd()); ... 正


726 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:30:19 ]
>>723
ダイアログ自身が管理する形で書かれていないので
CWaitDlgが管理するようにしたいんだけど

727 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:38:36 ]
>>724
m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない?
m_wait.DestroyWindow();は必要ないの?

728 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:39:43 ]
>>726
何を管理する?ちゃんと日本語で書けよバカSEよ。それとも低級な魔法
使い気取りか?

729 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:51:56 ]
>>727
> m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない?

概念の説明だけでなく、エラー処理まで手取り足取り見なきゃならん
のか?

if(m_wait.m_hWnd=NULL)
  m_wait.Create(AfxGetMainWnd());

とでもしておけばいい。

> m_wait.DestroyWindow();は必要ないの?

MFCの場合、明示的に呼ばなくても、m_waitのデストラクタ内で
DestroyWindow()が呼び出される仕様。

CFile::Close()等も同様。



730 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 01:12:45 ]
>>729
呼ばれなくね?
とりあえず俺の環境では

Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.

って警告がでちゃうよ

731 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 01:27:56 ]
だよね。質問元の>>684にもそう書いてあるし

732 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 02:18:51 ]
>>730-731

MFCのソースも読めないし、トレースの仕方も知らんと恥を晒している
ようだな。 まさに宝の持ち腐れ。 豚に真珠ってヤツだ。

その警告メッセージは、MFC(デバッグ版ライブラリ)が出している。

CDialog::~CDialog()
{
  if (m_hWnd != NULL)
  {
    TRACE0("Warning: calling DestroyWindow in CDialog::~CDialog --\n");
    TRACE0("\tOnDestroy or PostNcDestroy in derived class will not be called.\n");
DestroyWindow(); // ← ここで呼んでるだろうが、ボケ!!!
  }
}

ついでに、英語も理解できないおまえらに、低学歴の漏れが警告メッ
セージの意味を解説してやると、

『テメェが忘れてるから、デストラクタ内(CDialog::~CDialog())で
ケツ拭きでDestroyWindow()呼んでやるが、今からじゃ手遅れで派生
クラスのOnDestroy()やPostNcDestroy()は呼ばれねぇけど、間違っても
Windowsのバグとか、ゲイツ様のせいにすんじゃねぇぞ、ゴルァ!』

ってこった。

733 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 02:49:47 ]
そんなことは、皆了解済みの上で話していると思うのだがどうか。
わざわざトレース文が入っているようなお情け処理を、
正式な仕様として扱う勇気は俺には無いな。

734 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 05:34:25 ]
>>688>>716
今までの話を整理したらこうなった

void CPropertyDialogSampleView::OnEditProperty()
{
  m_propertyDlg.Show();
}

CModelessDialogBase::~CModelessDialogBase()
{
  if (CWnd::GetSafeHwnd() != NULL)
    CWnd::DestroyWindow();
}

void CModelessDialogBase::Show(CWnd* pParentWnd = NULL)
{
  if (CWnd::GetSafeHwnd() == NULL)
    CDialog::Create(GetTemplateID(), pParentWnd);
  CWnd::ShowWindow(SW_SHOW);
  CWnd::BringWindowToTop();
}

void CModelessDialogBase::OnOK()
{
  CWnd::ShowWindow(SW_HIDE);
}

void CModelessDialogBase::OnCancel()
{
  CWnd::ShowWindow(SW_HIDE);
}

735 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 07:02:30 ]
>>733
でもそこなんでトレースいれるんだろうね
少なくとも俺の感覚としちゃそこでDestroyWindowを呼ぶのは当然の処理で
警告なんて出す意味がわからないんだけど

736 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 07:11:07 ]
CreateとDestroyWindowが対だからじゃね?
コンストラクタでCreateしないからデストラクタでもDestroyWindowしない方針

737 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 08:00:16 ]
>>736
しろよな
しない方針にすることでなにかいいことあるのか?って感じ

Create関数のヘルプにもそんなこと書いてねーし
DestroyWindow関数のヘルプには
MFC側で呼んだり呼ばなかったりするからユーザー側でうまくやれよマジで
とかかなりむかつく仕様だしで作った奴マジ嫌な感じだな

738 名前:732 mailto:sage [2008/11/30(日) 10:06:48 ]
>>733
> そんなことは、皆了解済みの上で話していると思うのだがどうか。

理解したり、(実際に呼ばれていることを)知っていたら『呼ばれなくね?』
なんて発言は、マヂでありえなくね。(w

C++の基本を理解し、警告メッセージの意味を正しく理解していれば、

> わざわざトレース文が入っているようなお情け処理を、
> 正式な仕様として扱う勇気は俺には無いな。

なんて発言も出てこないハズ。


739 名前:732 mailto:sage [2008/11/30(日) 10:08:09 ]
>>735
CDialogクラスのデストラクタで呼び出しているので、(この時点では
派生クラスのメッセージマップや仮想関数テーブルを参照できない、
もしくは存在自体を知りえないため)派生クラスのOnDestroy()やPost
NcDestroy()は呼ばれないだけ。 当然ながら、CDialog::OnDestroy()
やCDialog::PostNcDestroy()の呼び出しは行われる。

派生クラスのOnDestroy()やPostNcDestroy()で独自の実装(例:閉じた
時のウィンドウサイズを取得してレジストリやINIファイルに保存する
等)を呼び出していなければ、デストラクタに処理を任せてもなんら
問題ない。

だからこそ「Error:」じゃなく、あくまで「Warning:」ってなってる。

CFileクラスのデストラクタや、CGdiObjectクラス(CPen,CBrush等の基本
クラス)のデストラクタでも同様のことをやっているけど、これらはメッセ
ージループを廻す必要がないので、TRACE記述はない。



740 名前:732 mailto:sage [2008/11/30(日) 10:13:43 ]
>>736-737
こういう文句を言う連中は、MFCはおろかC++の基本的な仕様(派生クラスと
基本クラスのコンストラクタ/デストラクタが呼び出される順序や、仮想
関数など)さえロクに理解していないんだろうナァ。

方針なんて関係ない。強いて言えばデザインパターンってやつか?

コンストラクタでデフォルト値を代入してメンバ変数の初期化忘れを防ぐ
とか、デストラクタでメモリやハンドルの解放忘れを防ぐというのは、
基本中の基本。

インスタンスの消滅で確実にウィンドウを破棄し、なおかつ派生クラス
のOnDestroy()やPostNcDestroy()も呼び出されるようにしたければ、MFC
内部の実装に関係なく、派生クラスのオブジェクトが消滅するタイミング
でDestroyWindow()を呼び出せばいいだけ。

すなわち、自分が作るCDialog派生クラスで、デストラクタ関数を定義し、
m_hWndが有効ならDestroyWindow()を呼び出してやればいい。

class CMyDialog : public CDialog
{
  virtual ~CMyDialog();
};

CMyDialog::~CMyDialog()
{
  if(m_hWnd!=NULL)
    DestroyWindow();
}

ただそれだけのことだ。

741 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 10:14:42 ]
>>738
俺とそいつは別人だ
ちなみに「よばれてなくね?」は俺

>>739
警告の必要なくね?

742 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 10:18:33 ]
>>740
でもヘルプでだってどういうときに
DestroyWindowを呼ばなきゃいけないのか書いてないわけだし
当然MFCの中身の都合なんてこっちはしったこっちゃないわけで
もし、自分でこういうもんを作るとしたら解放はフレームワークのほうで自動でやってほしいかな?

743 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 11:15:41 ]
>>740のコードがまずいというのもわかりにくいしな

744 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:54:00 ]
何この流れ
どうせお互いまったく譲り合わないんだから、これ以上書いても無駄だよ

745 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:51:38 ]
Win7ってペイントとかワードパッドにリボン採用してるよな
今後作るソフトはリボンで作った方が惹きやすいのだろうか・・・2008SP1は持ってるが






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<186KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef