1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ] Microsoft Foundation Classライブラリ専用スレです。 前スレ ■MFC相談室 mfc18d.dll■ pc11.2ch.net/test/read.cgi/tech/1185917008/
5 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 19:05:54 ] リソースビューでダイアログにボタンを配置した場合、プログラム中でボタンの初期設定をするのはどこで行えば宜しいのでしょうか。 リソースビュー上で初期設定はできますが、マクロや使用者のスペックに合わせて内容を変更したい時に対応できず困っています。 ダイアログはクラス化され、初期窓クラスにメンバとして保有しています。 そのため自動的にダイアログが生成されるのですが、ダイアログのコンストラクタでボタンのテキストを変えようとするとエラーが出ます。
6 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 19:26:09 ] ダイアログ ボックスを初期化するときに特別な処理が必要な場合は、この関数をオーバーライドします。
7 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 19:29:52 ] >>5 ダイアログアイテム(ウィンドウハンドルを持つデータ)の初期化はコンストラクタではなくOnInitDialogでやるようにする。 コンストラクタの時点ではまだm_hWndが生成されていない。
8 名前:5 mailto:sage [2008/04/05(土) 19:38:53 ] ありがとうございます。 いつもダイアログを生成した後に自前で初期化関数を呼んでいたのでソースがすっきりしそうです。
9 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 19:53:18 ] CSliderCtrlのSetSelectionで範囲を選択すると小さな点のようなものが表示されるだけで分かりにくいのですがもっと大きくならないのでしょうか。 プロパティを触っていると何故か中心の棒は太くなったのですが選択マークは目盛りに埋まって視認し難いままどうにもなりませんでした。 VC8を使っています。
10 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 19:03:01 ] >>9 亀レスだが msdn2より >作成時に TBS_ENABLESELRANGE スタイルを指定した場合にだけ、スライダ コントロールに選択範囲を表示できます。 >スライダ コントロールにこのスタイルが設定されていると、選択範囲の開始位置と終了位置の目盛りが >垂直のダッシュではなく三角形で表示され、選択範囲が強調表示されます。 TBS_ENABLESELRANGEを設定するとスライダーバーは広がるのはVC8では何の意味もない。 以前はそこが強調表示されたがVC8では上記の通り三角形が強調表示。 VC8でも出来たらいいんだけど、俺も色々試したが無理だった。
11 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:10:20 ] 質問しに来たら真上に答えがある幸せ。 しかしMSは何を考えて仕様を変えたのかさっぱりわからん。
12 名前:デフォルトの名無しさん [2008/04/14(月) 23:00:47 ] Visual C++ 2008 Feature Pack Releaseが出たのに全然話題になってないねー まだ英語版だけだし・・・でも誰か感想よろ
13 名前:hori [2008/04/16(水) 10:09:39 ] 画像を表示するプログラムを作成していますが、、、。 ダイアログにピクチャーBOXを入れ APPWizardでメンバー変数追加しょうとしましたが 一覧にPICT1 が無いのです。( プロパテイではIDC_PICT1は入っているのですが) 。なぜなのでせうか?。。。m(__)m
14 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 23:18:58 ] よくわかんないけど ダイアログエディタの当該コントロール上で右クリックしてからメンバ変数として追加じゃダメなん?
15 名前:hori [2008/04/17(木) 06:00:03 ] >プロパテイではIDC_PICT1は入っているのですが 見間違いしていました、、、、(-_-;) デフオルテでIDC_STATICをIDC_PICT1と見間違いしていました。。。m(__)m
16 名前:hori [2008/04/17(木) 06:13:11 ] 問題解決。。。ヨーソロー。。。^^
17 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:28:46 ] char str[100]="ABC"; CString cstr=(CString)str; テンパってるときに書いたコードなんだけど エラーにならないのはなんで?一時のCStringインスタンスが生成されて cstrにコピーされたっていう解釈でいいの?
18 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:43:27 ] >>17 ん。型変換コンストラクタ (CString::CString(LPCTSTR)) が呼ばれてる。
19 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:46:10 ] コピーコンストラクタだねぇ
20 名前:デフォルトの名無しさん [2008/04/19(土) 01:11:25 ] VB6から移ってきたんだけどさ、MFCアプリのメモリ使用量ってバカでかくね? 一行もコード書かずにコンパイルしたプログラムが、6.3MBもメモリ食ってるし。 VBより酷い。なんかいきなり嫌になってきた。 MFC使わずにしこしこCreateWindowとかやった方がいいのか?
21 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:25:27 ] リリースビルドして出来た.exeを走らせてみればいい
22 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:28:03 ] >>21 リリースビルドしてもexeファイルサイズが小さくなるだけで、メモリ使用量はほとんど変わらないよ。
23 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:32:34 ] debug newじゃなくなる分多少はましにならないかな?
24 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:36:26 ] デバッグ版はメモリの前後にバッファオーバーフロー検出用の領域仕込んだりするが、 まあ微量っちゃ微量だな。 どうせ動的に確保できるメモリってあるブロック単位になっちゃうし。 スタック使用量は明らかに増えるが、 どうせスタックサイズはリリースかどうかで変える訳でもないし。
25 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:50:25 ] MFCは作成時点で既にいくつも機能を取り込むからなあ。 実装していくうちに、VB6もMFCも殆ど変わらなくなるんじゃね? てか、.NETでなくてわざわざMFCに来たんだか。 既存のC/C++のライブラリでどうこうしたいなら非常にお勧めだが、 逆に、そうでないなら全くやる理由がない。
26 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:19:12 ] >>25 .netは金取る製品を作るための開発環境じゃないから。 あれはサンデープログラマのお勉強用。 作るのは楽だけど、起動が遅くて動作もモッサリしてるのでダメ。
27 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:34:54 ] それは作り方が悪いだけだと思います
28 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:17:40 ] よく知らないけど起動ごとに機械語解釈通してしまう可能性があるから遅い、らしいけど どうにかなりそうなのにね ダメなんかな
29 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 01:55:44 ] x86のMFCをWOW64上で動かすときと、 CPU対象がAnyでJITコンパイル済みの.NET(WinFormあるいはWPF) どっちが速いんだろ。 もっとも構造や機能がまるで違うものを単純比較しても意味ないけど。
30 名前:hori [2008/04/21(月) 14:05:54 ] OS XPに”Visual C++ 6.0 Professional”をインストールしたら まずい、、、でしょうか? ^^;
31 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 18:06:27 ] ^^;
32 名前:hori [2008/04/22(火) 00:55:35 ] ぐぐって見ました。 、、、、やはり、、。。^^;
33 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 02:19:41 ] はいはい
34 名前:デフォルトの名無しさん [2008/05/04(日) 21:57:35 ] ダイアログベースのアプリを作成しています。 リソースエディタにて複数のダイアログの画面を作成し、 任意のタイミングで表示されるダイアログを切り替える機能を実装したいです。 具体的には、IDD_DIALOG1とIDD_DIALOG2という画面を作成し、 アプリ起動時はIDD_DIALOG1が表示されるのですが 指定したチェックボックスの状態を有効にすると 画面がIDD_DIALOG1からIDD_DIALOG2に切り替わる、 といった動作を想定しています。 何か方法はありませんでしょうか。 ちなみに開発環境はVC++6.0@Win2kです。
35 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 22:04:39 ] チェックボックスイベントでDialog1を通常終了させて呼び出し元(WinApp派生のやつあたり)がDialog2を呼び出せばよいのでは。 Dialog1の状態パラメータ等を取りたいならDoModalオーバーライドの引数として&参照で構造体バッファ渡すなり 単純な数値だけ欲しいならDoModalの返値としてIDOK等ではないものを返せばいいし。 とりあえずフレーム+ビューにしろダイアログにしろWinApp派生から呼ばれてるから そいつに管理させればカンタンである
36 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 22:31:54 ] >>35 レスありがとうございます。 つまり、イメージ的にはDialog1とDialog2それぞれ別のプログラムを作って、 プログラム終了時にお互いを呼び出す、というイメージでしょうか。
37 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 23:01:19 ] お互い、だと
38 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 23:02:32 ] お互い、だとDialog1と2が相互に呼び出し合うみたいに聞こえるけど Dialogオブジェクトを生成してDoModalするのはあくまでAppのメインさんね
39 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 00:06:43 ] タブコントロールを使ってページを切り替えるようにした方が良いんじゃないかなあ。 チェックボックスでダイアログ自体が入れ替わるUIは、一寸前衛的すぎる気がする。
40 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 09:13:27 ] しょちゅう切り替えるんならタブが便利かもしれないけど 初心者モード、エキスパートモードみたいに たまにしか切り替えない場合はタブは邪魔なだけ
41 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 09:44:24 ] >>39 自分もチェックボックスで画面が変わるというのは標準的ではないと思う。 やりたいことがよく分からないけど、チェックボックスの代わりにボタンじゃあかんの? その方が標準的と思う。
42 名前:41 mailto:sage [2008/05/05(月) 09:54:03 ] あっ、もちろんタブで問題なければタブの方がいいと思うけど。 >>36 別のプログラムではないよ。 35、38は1つのプログラム内でWinApp(アプリ管理クラス)が切り替えをする案。
43 名前:41 mailto:sage [2008/05/05(月) 10:15:22 ] ちょっと訂正 ×WinApp(アプリ管理クラス)が ○CWinAppクラスの派生クラス(C+プロジェクト名+Appクラス) C+プロジェクト名+App.cppの下のほうにあるDoModalの辺りで処理するという話っす
44 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:10:43 ] コントロールの無い親ダイアログ(DoModal)に、 子ダイアログDialog1,Dialog2(Create)を貼り付ける
45 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 15:52:44 ] タブコントロール部分無しプロパティシート(&リソース定義済みページ複数)という荒技もある
46 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 10:40:27 ] AfxBeginThreadで作成したワーカースレッドから別のプログラムを呼び出しています。 このプログラムにはハンドルリークが有ることが分かっていますが、その場合呼び出し 元のプログラム(スレッドを作成したプログラム)でハンドルが増加し続けたりするのでしょうか。
47 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 10:48:05 ] >>46 いいえ、それだけなら「別のプログラム」のハンドルがリークするだけで「元のプログラム」のハンドルはリークしません。 勿論、適切なプログラムであるとの前提ですが。 # ありがちなのは、スレッドハンドルをクローズし忘れているケースですが…… ## そもそもなんでCreateProcessを使わないのかとか、TaskManagerでハンドルの数を観測しろとか。
48 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 00:28:01 ] 複数のダイアログを作成し、お互いのクラスが保持しているメンバ変数や関数を 使いたい場合は「〜App」のメンバ変数にクラスのオブジェクトを作成するのが普通ですか? 例えば、CDialog1、CDialog2と言うダイアログとクラスを作成し、 CDialog2からCDialog1のメンバ変数と関数を使いたいのですが。
49 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 02:57:24 ] Appのメンバ変数としてDialog派生クラスのオブジェクト、あるいは動的にnewしたものを保持するためのポインタを持っておいて Appのインラインメンバ関数として「Dialog派生クラスのポインタ(あるいは参照)だけくれる関数」を作ればよいのでは。
50 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:29:14 ] publicじゃだめなの?
51 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:47:10 ] そもそも自分ならそういう設計は避ける。
52 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:08:09 ] MFCでMDIアプリを作っております。 そこで困ったことがあり質問させていただきました。 あるアクティブな一つのウィンドウをViewクラスに属しているメニューコマンドで メニューを選択したらアクティブMDIの子ウィンドウを最大化したいのです。 メニューコマンドを選択したら自動的にアクティブなウィンドウに対してコマンドが 実行されると思っています。 コマンドを追加した関数から「ShowWindow( SW_SHOWMAXIMIZED );」を 呼んだのですが最大化しそうな動きが一瞬するのですが、子ウィンドウが最大化表示しません。 最大化の方法が間違っているのでしょうか? 実現方法をよろしくお願いいたします。
53 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 03:03:29 ] つ CMDIChildWnd::MDIMaximize
54 名前:52 mailto:sage [2008/05/11(日) 03:37:32 ] >>53 ありがとうございます。解決しました。 CMDIChildWndをヘルプを見ましたらクラスメンバでvoid MDIMaximize();を見付けました。 ヘルプでのMDI子ウィンドウフレーム派生クラスの親クラスを見ていませんでした。 今回の件で解決方法を調べるのにネットの方ばかり探していました。 「MDIMaximize」でググると検索で欲しかった情報が出てきました。 Viewクラスからの呼び出しているコマンド内では、以下の通りでMDIMaximize()を呼びました。 CChildFrame *pChildFrameWnd = (CChildFrame *)GetParentFrame(); pChildFrameWnd->MDIMaximize(); この処理を追加しましたらMDI子ウィンドウのタイトルバーの最大化ボタンをクリックしないで MDI子ウィンドウを最大化する事ができました。 重ねてありがとうございます。
55 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:59:37 ] リソースビューでタブを作った場合、その中に表示するコントロールは自分で用意(Create等)しなければならないのでしょうか。 全てリソースビューでやろうとすると、全てのタブに表示されるべきコントロールが同じ場所に表示されてしますので扱い辛く・・
56 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:37:55 ] プロパティシートかな
57 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:49:32 ] リソースビュー使わずに直接.rcファイルいじるとか、 リソースビュー上はバラバラだけどプログラム上の初期処理で位置変えるとかもある
58 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:26:28 ] 別ウィンドウに作っておいてタブを切り替えたときにウィンドウごと張り替える。 # それやるくらいならプロパティシートかな。
59 名前:55 mailto:sage [2008/05/11(日) 19:35:03 ] レスありがとうございます。 色々なアプローチの仕方があるのですね。
60 名前:デフォルトの名無しさん [2008/05/14(水) 16:46:33 ] VC6で印刷処理を作っています。 印刷ダイアログを表示せずにデフォルトのプリンタで印刷するときの前後処理は こんな感じのやり方でよろしいのでしょうか CPrintDialog dlgPrint(FALSE); VERIFY(dlgPrint.GetDefaults()); CDC dc; VERIFY(dc.Attach(dlgPrint.CreatePrinterDC())); (印刷処理) dc.DeleteDC(); GlobalFree(dlgPrint.m_pd.hDevMode); GlobalFree(dlgPrint.m_pd.hDevNames);
61 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 18:37:51 ] 実行出来たらそれていんじゃね?
62 名前:デフォルトの名無しさん [2008/05/15(木) 13:48:03 ] >>61 メモリを解放しないといけないかと思いまして
63 名前:デフォルトの名無しさん [2008/05/15(木) 16:22:21 ] 別にどっちでもいいんですが。。 当方、6年位前に貧乏でして、VisualC++スタンダード版を何とか買いました。 その後、JavaやPHPで食いつないできたんですが、今になって当時買った本とか読んで WindowsAPIやらMFCやら勉強したら面白くてだいぶ身についたんですが、 今は.NETFrameWorkで動くCLRというのがもっぱららしいんですが、私はぜんぜん知らないし 大体環境をもってません。まあ無料でダウンロードできるらしいんですが。 私みたいのでも就職口ありますかね?別にJavaやPHPでくっていけるんでいいんですが 一度仕事でもVC++やってみたいですし。 よろしくお願いしますm(_ _)m
64 名前:「んですが」なくても読める罠 mailto:sage [2008/05/15(木) 16:29:21 ] >>63 -- 別にどっちでもいい んですが。。 当方、6年位前に貧乏でして、VisualC++スタンダード版を何とか買いました。 その後、JavaやPHPで食いつないできた んですが、 今になって当時買った本とか読んで WindowsAPIやらMFCやら勉強したら面白くてだいぶ身についた んですが、 今は.NETFrameWorkで動くCLRというのがもっぱららしい んですが、 私はぜんぜん知らないし 大体環境をもってません。まあ無料でダウンロードできるらしい んですが。 私みたいのでも就職口ありますかね?別にJavaやPHPでくっていけるんでいい んですが 一度仕事でもVC++やってみたいですし。 よろしくお願いしますm(_ _)m -- そもそも鼬害だし、望み薄だと思う んですがw
65 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:30:34 ] >>63 結局、訊きたいのは >私みたいのでも就職口ありますかね? これか? ここ、そゆこと訊くスレに見える?
66 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:36:25 ] >>65 どうでもいいそうだから、質問にさえなってないと思われ。
67 名前:デフォルトの名無しさん [2008/05/15(木) 18:25:12 ] うんこ♥
68 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:57:00 ] >>63 そういうのはマ板で聞け
69 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:01:58 ] シングルウィンドウの×ボタン(閉じる)を押したとき『終了しますか?』といったダイアログを出したいのですが、どこに記述すれば宜しいのでしょうか。 〜ViewのOnDestroyやメッセージでWM_Destroyを関知したときにwhile(1)で無限ループさせても終了してしまいます。 OnDestroyを通った後にOnCloseは通らず、×ボタンを押したときウィンドウを閉じさせないという選択肢をどこで作ればいいのか・・。
70 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:25:26 ] OnClose
71 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:59:03 ] >>69 MainFrameでOnClose
72 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 18:01:48 ] ありがとうございます。 なるほど、Viewで無限ループさせてもFrameが閉じられるのでアプリケーション自体が終了していたのですね。
73 名前:あは〜ん mailto:sage [2008/05/19(月) 18:54:12 ] あは〜ん
74 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:49:58 ] MFCでアプリケーションを作っています。 質問なのですが、 エクセルなんかのカラー選択のコンボボックスの動きを実現させたいのですが、 コンボボックスの内容をオーナードローで描画するのは出来るのですが、 あの色サンプル(コンボボックス押すと出てくるリスト)はどのように作るべきでしょうか。 CColorDialogとかではなく、あの30色ぐらいのパレットがほしいのですが。
75 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:10:48 ] >>74 このへん? CMFCColorButton
76 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 23:57:24 ] >>75 レスありがとうございます。MFCと書いてあるということはVS2008版ですよね。 残念ながら、当方VS2003なのです。 エクセルのパレットがそのままの形ででもあれば・・・。
77 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 08:32:41 ] >>74 これでよい? www.kumei.ne.jp/c_lang/sdk2/sdk_139.htm
78 名前:77 mailto:sage [2008/05/25(日) 08:36:46 ] >>76 MFC→VS2008じゃないよ。2008EEにはついてないし。 逆にVS2003には必ずついていると思われ。 「CColorDialogとかではなく」ってことは77はNGか orz
79 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 10:52:10 ] >>77 >>78 レスありがとうございます。 MFCと書いたのはCMFCColorButtonのことでした。略して分かりにくしてすいません。 up.cgi.jp/mek3 ↑作りたいのはコレなんです。これをチョコチョコ改変して作りたいのです。 やはりダイアログを作成して、CBitmapButtonでサンプル色ボタンを作って貼り付けて、 テキストリンクのところはCButtonの枠線なしとかで対応するのでしょうか。
80 名前:77 mailto:sage [2008/05/25(日) 14:22:21 ] 失礼。CMFCColorButton は2008にしかないってことでしたか。 う〜ん。やっぱり79のような感じなんですかね。
81 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 16:58:27 ] エクセルのはただのツールバーだろ
82 名前:74 mailto:sage [2008/05/25(日) 19:22:25 ] >>77 レスありがとうございます。 形状的にはそうするのが一番形になるような気がします。 >>81 レスありがとうございます。 えっ?!コンボボックスの中身をツールバーにするのですか? ちょっとイメージがつきません…。
83 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 19:31:31 ] ttp://www.codeproject.com/KB/miscctrl/colour_picker.aspx これ参考にすれば?
84 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 20:14:33 ] >>82 ツールバーの中にコンボボックスがあるんだろ。
85 名前:74 mailto:sage [2008/05/25(日) 20:22:12 ] >>83 レスありがとうございます。 おお、これです。コレがしたかったんです。ありがとうございます。 英語ばかりですが、サンプルコード読みながら何とか紐解いてみます。 サンプルプロジェクトコンパイルしたらエラーしますがorz...
86 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 20:24:42 ] このサイト、Japanizeでちゃんと自動翻訳してくれるんだな・・・メニューくらいだけだけど
87 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:33:51 ] JapanizeじゃなくJapaneseだろ! …って書き込もうと思ったんだが、ググったらそういうソフトがあるのな。自動翻訳の。
88 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 14:13:22 ] デバッグモードだと _DEBUGが定義されてるように MFCだと 定義されてるやつってありますか?
89 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 19:08:44 ] _MFC_VER
90 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 01:54:21 ] VC6、MFC、ダイアログベース ダイアログ上にCStaticを配置して、そこにJPG画像を表示しています。 JPG表示領域に別のWindowが重なったりした場合に、それをどかしても 重なっていた部分だけ表示が消えた状態となってしまいます。 自分自身が最上位に来たときに再描画するようにすれば良いと思うのですが 何のMessageを捕まえればよいのでしょう?
91 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 06:43:05 ] 画像を設定した後、さっさとハンドルを破棄してしまっている予感。
92 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 08:44:12 ] ダイアログベースならデフォルトで再描画あるじゃないか
93 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 11:00:31 ] OnPaint を理解してないと思われ
94 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:33:46 ] 2008SP1が出たら購入を考えているのですが、 タブMDIやリボンバーを実現するクラスの仕様や構成をご存じの方いますか?
95 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 09:35:55 ] >>94 ttp://msdn.microsoft.com/en-us/library/bb982354.aspx ふつーにMSDNライブラリでどーぞ
96 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 11:13:03 ] Dialog::WindowProcがダイアログが非アクティブだと呼ばれないのですが、 非アクティブ時も処理したい場合、どのように書けばよいですか?
97 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 11:58:38 ] メッセージが来てないだけだろ
98 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:19:42 ] メッセージが来るようにしたい場合、どのように書けばよいですか?
99 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:26:08 ] そもそもどんなイベントが欲しいんだ?
100 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:39:15 ] DIJOYSTATE2.rgbButtons[]の状態を常に監視して、 ボタンが押されたら任意に設定したキーイベントを発生させたいんです。
101 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:27:22 ] 普通は非アクティブウインドウにキーイベントは来ない できないこともないけどMFCとは関係ない
102 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:45:44 ] MFCやWin32APIに関して初心者なんだけど、だれか助けてくれたりしないかな。 MFCでSDIアプリを作っている。CMainFrameのメンバにCDialog m_toolDlgを保持して、 モードレスで実体化させている。 やりたいことは、モードレスダイアログ m_toolDlg のあるボタンが押されたときに、CHogeViewの向けて メッセージ(?)を飛ばしたいのだけど、どういう枠組みを用意してやって、どういうメソッドを使ってやればいいのか わからない。 どうも体系的に知識が不十分なのは分かっているのだけど、今時MFCの資料が無くて困っている。 だれかアドバイスをくれないだろうか。
103 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:58:58 ] CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd); CView * pView = pFrame->GetActiveView(); あとはSendMessageするなりキャストして直接関数呼ぶなり好きにしろ。
104 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 16:12:07 ] >>103 早速ありがとう。示してもらったとおりに SendMessage(WM_COMMAND, ID_XXX, 0) としたら、 Viewがうまく反応した。 感謝
105 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 16:14:05 ] メッセージの受け方は、自動生成される他の関数を参考にしてみろ WM_PAINTならOnPaint()みたいな感じで
106 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 16:20:19 ] ユーザー定義メッセージ あたりでググるとよい。
107 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 21:40:12 ] afx_msg LRESULT OnXXXXX(WPARAM wParam, LPARAM lParam); ON_MESSAGE(WM_APP+n,OnXXXXX) とかだね OnCommandとか直に呼ぶと、まずい場合もあるから↑書き方も覚えておくと良いかも
108 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:48:11 ] アクションゲームの様な物を想定して、毎秒30フレームの画面更新を行いたいのだけど、MFCで書くにはどうすればいいのだろう? もちろん、一番手軽なのはWM_TIMERで処理することだと思うけど、精度が低いので保留。 OnIdleをハンドリングして、中でtimeGetTime()を使って適切な時間をカウントしてやる方法も試してみたんだけど、こちらは常にCPUを100%使い切ってしまうのが厳しい。 実行している処理内容は大した負荷ではないはずなのに、CPUを使い切ってしまうとユーザがいやがるし、美しくない。 できれば、この両者の間ぐらいが方法が欲しい。つまり、まずまず精度が高くて、CPU使用率がむやみに100%に振り切らない方法。 自分はMFCやWin32APIの初心者なんだけど、何かいい企てや情報はないだろうか?
109 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 19:07:10 ] OnIdle()でハンドリングして、時間を待っている間にSleep(1)を入れたらCPUが100%になることが無くなった。これで解決かも。 参考 ttp://orangeknowledge.jpn.org/tips/game002.html
110 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 19:08:32 ] 別スレッドでSleepやWaitableTimerで1/30毎にSendMessageするとか。
111 名前:デフォルトの名無しさん [2008/06/04(水) 22:21:07 ] 質問だけど、MSDNにはCFileのwriteはバッファリングしないって 書いてあったんですけどCFileのwriteとfwriteってどちらが速いですか? また、それ以外にも速いファイルライト関数ってありますか?
112 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:34:01 ] 自分で試して違いがわからなかったら気にする必要ないだろ
113 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:35:54 ] 速度程度なら、ループさせてGetTickCount()あたりでも計測すればいい
114 名前:デフォルトの名無しさん [2008/06/04(水) 23:41:51 ] 質問です。 WindowsXPでVS2005なんですけど、CFileDialog等のコモンダイアログって リソース上の文字列(“開く”とか)は実行環境に合わせ勝手にローカライズ されませんよね? 環境に応じて表示言語を変えたい(少なくとも日本語←→英語の切り替え)を やりたいんですけど、リソースIDとかがわからず、どこをどう触ればいいのか 途方に暮れてしまってるんですが、何かセオリーってありますか?
115 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:46:07 ] ローカライズの切り替えは知らないけど、リソースIDはふられていたはず ダイアログ自体書き換えれるし
116 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:12:34 ] 数年ぶりにMFCに戻ってきたんだけど いつのまにか、テンプレート クラス用のメッセージ マップなんて 作られたんだね。結構使われてるのかな?
117 名前:114 mailto:sage [2008/06/05(木) 00:17:00 ] >115 レスありがとうございます。 ちなみにコモンダイアログのリソースIDはどこで確認すればいいのでしょうか? 目ぼしいドキュメントが見つからなくて、てっきりリソースIDは無いものだとばかり・・・
118 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:20:35 ] >>112 ,113 わかりました。結局あなた達も知らないのですね。 >速度程度なら、ループさせてGetTickCount()あたりでも計測すればいい そんなしょぼい精度の計測はせず、QueryPerformanceCounter()で計測します。
119 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:31:41 ] なんという恥ずかしいレス
120 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 07:35:44 ] MFCは一定間隔の更新に弱く、MFCの表示周りの更新を行うと内部で勝手にウエイトが入るんだよな。 別スレとか方法としてはいくつもあるけど正確な更新をするのであればMFCベースでやらないほうがいい。
121 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:20:58 ] 動画再生ぐらい余裕でできるだろ
122 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:27:10 ] >>117 Dlgs.h の中の edt1 とかの値が使われている。
123 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:35:11 ] >>118 fpsの調節をするためにビジーループでQueryPerformanceCounterを呼び出していると、 環境によっては数秒に一度関数からしばらく戻って来ないでフリーズする現象が発生します。
124 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:22:53 ] 動画の再生なんて、アバウトでいいのよ 30 fps をきっちり正確に表示する必要は全くない 人間の目なんて、数コマ落ちしようと時間間隔が多少 ずれてもわからんのよ よって、秒単位に適当に切り捨てればよい
125 名前:デフォルトの名無しさん [2008/06/05(木) 20:54:18 ] MFCの中でオーバーライドされてる関数の元の関数を使いたいんですが、どうやるんでしょうか? LRESULT SendMessage( HWND, WPARAM , WPARAM, LPARAM ); これを使いたいんですが、HWNDがない方になっちゃいます。 ::つけるようだった気がするんですが違うみたいでした。
126 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:08:00 ] あってると思うけどな。
127 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:01:08 ] >>125 それはオーバーライドとは言わない ただのAPIをCWndオブジェクトに対してのみ便利メンバ関数として用意してるだけ
128 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:05:00 ] 頭に::をつけるというのは、グローバルな関数や変数を指定してるだけだからな 頭にクラス名がついていない代わりだ ていうか、自動補完が動いてないだけで、書けばコンパイルはとおるだろ?
129 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 20:29:32 ] とおらないんじゃないだろうか。
130 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:39:29 ] SDI(ドキュメント無し)のMFCアプリで、Viewウィンドウサイズを指定(800*600)して起動させたいのだけど、やり方がさっぱり分からん。 やりたいことは、指定の画像(800*600)をビューでピッタリ描写すること。 いや、CMainFrame::PreCreateWindow()でcs.cx, cs.cyを設定すればいいのは分かるんだけど、ここに800, 600と入れるとウィンドウサイズが800,600になって、Viewの描写領域のサイズはメニューやツールバーに削られた小さな領域になってしまう。 メニューやツールバーの領域をあらかじめ計算して大きめのウィンドウサイズを指定する方法があるけど、それはあまりにスマートじゃないので、何かベンツのやり方はないだろうか?
131 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:43:45 ] GetMatrixHogehoge(名前忘れた)で、タイトルバーのサイズとかをあらかじめ取得しておいて、 そいつらの高さや幅をあらかじめ加算しておけば? メニューやステータスバーのサイズはあらかじめわかるだろうし
132 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:10:21 ] メニューが二段とかの例外を気にしないならAdjustWindowRect
133 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:14:28 ] >>131 , 132 情報ありがとう。教えてもらった情報を試してからまた報告に来ます。
134 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 01:51:10 ] そのテのはネットで結構あった気がする
135 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 13:47:23 ] AdjustWindowRectを試してみたけど、ツールバーとステータスバーの領域は考慮してくれなくて、 その部分は自前で算出してやらなきゃいけないみたい。
136 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:12:33 ] MFCの勉強をしようと思ったら何からはじめたらいいの? WinAPIではガリガリ組めるレベルだ。
137 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:17:38 ] Win32がそのくらいのレベルあるなら、かなり楽かもなー 逆に隠ぺいされすぎて、ムカつくかもしれないけどw とりあえず、MSが配布してるサンプル読んで理解して、あとは適当に自力で作ってみたらいいんじゃないかな
138 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:18:34 ] まずはダイアログアプリから始めて、基本的な GUI の 実装を一通り経験すべし その後にドキュメント/ビュー に進むがよい
139 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:19:18 ] >>137 隠蔽されすぎてるのかw わかった取りあえず、サンプル読みまくるよ。 ところで、MFC自体のソースって公開されてるの?
140 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:22:04 ] 関数名がそのままだけど、第1引数のハンドルとかが、クラスに隠蔽されていて、なかったりする たしかに、先にダイアログから手をつけるべきだな サンプルは公式にあったと思う
141 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:36:12 ] 個々のクラスで見ると、素直にクラスで包んでるだけだよ。 後はそれにアプリケーションレベルの仕組み(Doc/Viewとか)があるくらい。 コマンドメッセージとかはちょっと複雑なルート辿るけどね。
142 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:44:17 ] みんなありがとう。 ダイアログから読んでいろいろやってみるよ。
143 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:57:47 ] 確かに、目の前にハンドルがあるとついついクラスのメンバ関数じゃなくてAPI呼びたくなるよな。 ハンドルを意識する必要が全くなければいいんだけどね。
144 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:02:25 ] VS2005のMFCで作ったexeファイルが 別のPCで起動させた際に不正なファイルとでて起動できませんでした プログラムを組んだPCではきちんと起動するのですが原因がわかりません 原因についてわかる方、教えていただけませんか PCのOSは両方ともWinXP Pro SP2です VS2005は片方にしか入っていません よろしくお願いいたします
145 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:29:46 ] インストーラ作れよ
146 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:40:41 ] >>145 作り方教えてください。
147 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:44:04 ] ヘルプを見よ
148 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:46:54 ] これをダウンロードして実行しろ www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ja
149 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:29:14 ] >>144 ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt VS2005にもスタティックリンク出来ないグレードあるんだっけ?
150 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:37:33 ] >>149 ありがとうございます。 そこに書いてあるように「マルチスレッド MT」に変えると ビルドする際に c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds といったエラーがでるようになってしまいました 解決方法がわかれば教えていただけませんか
151 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:25:31 ] >>150 >解決方法がわかれば教えていただけませんか >Please use the /MD switch for _AFXDLL builds
152 名前:デフォルトの名無しさん [2008/06/12(木) 00:11:07 ] VS2005でStdioFile::ReadString()関数を引数をCString参照で使っているんだけど、 何行かread(大体1000行ぐらい)していると、stringのバッファサイズが何とかという 実行時エラーが出てしまいます。何か対策はありませんでしょうか。
153 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:17:16 ] 何とかって何?
154 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:24:33 ] 改行文字で止まるのに1000行とはなんぞや
155 名前:152 mailto:sage [2008/06/12(木) 07:05:45 ] >>153 154 今ソース、環境が手元に無いので詳細は今日帰宅したらまた書きます。
156 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 09:46:49 ] CStringの上限は2GBぐらいだろ
157 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:47:45 ] m_timerID = SetTimer; ↓ OnTimerでInvalidate(FALSE); ↓ アニメが終わったらKillTimer(m_timerID); ピクチャーコントロールにビットマップを表示してるダイアログで これでアニメーションをしてると、 タイマー開始するたびに4Kずつ使用メモリが増えていきます なぜでしょうか
158 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 15:31:49 ] 知るかよ お前んとこのバグに決まってるだろ
159 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:36:16 ] >>157 m_timerIDって解放しなくてよかったっけ。 時計の電池を抜いて止めても時計の本体は残っている状態のような。
160 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:43:37 ] >159はキチガイだから無視で
161 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:51:05 ] 水平方向のバイト数が4の倍数じゃないから? m_buf[(10*24/8+7)&~3*10];
163 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:56:00 ] >>162 元のは横240*縦240*3バイトだったのを編集したときに4バイトアライメントを失念してました。 すみません。 CreateBitmapでいけることはいけるんでしょうか?
164 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:02:12 ] m_bmpのデストラクタで破棄されたらそれまで。描画されなくて当然。 Windowsのハンドルは参照カウンタで管理されているわけではないので注意しる。
165 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:03:10 ] その辺まともに理解してないと、メモリリークとかもやらかしそうだな
166 名前:161 mailto:sage [2008/06/13(金) 19:45:30 ] 自己解決。 リソース読みのm_bmpを使い回して、32bppに変換したデータをSetBitmapBitsすることで表示されるようになった。
167 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 21:36:42 ] どのへんが自己?w
168 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:22:12 ] あえてWin16時代の名残りであるSetBitmapBitsを使うところが渋いな。 まあ、直接イメージを弄るなら普通はCreateDIBSectionを使う。 MFCならCImageだな。
169 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:20:40 ] MFC に CImage なんかあるかよ
170 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:28:42 ] あるある
171 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:57:23 ] VC++6.0で時間が止まってる人なんだろうな
172 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 13:15:25 ] MFC じゃなくて ATL だろが
173 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 13:29:08 ] CImage の中身は GDI+
174 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 13:35:47 ] GDI の BitBlt はハードウェアを使うので早い GDI+ の BitBlt はソフトウェアのみで処理するので遅い
175 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:29:18 ] Vistaではどちらもソフトウェアになるけどな
176 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:31:13 ] そういえばGDI専用のスレってないんだな この手の話するならここかWin32になるのか?
177 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 12:48:15 ] FTP転送経過情報(転送サイズ)がわかるFTPクライアントを作成したいです。 FTP転送状況を取得するにはOnStatusCallbackをオーバーライド する、とのことだったのでマニュアルを見たのですが、 ▼▼▼ OnStatusCallback (DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) dwInternetStatus コールバックの理由を示すステータス コード。指定できる値については、後の「解説」を参照してください。 lpvStatusInformation このコールバックに関する情報を格納しているバッファへのポインタ。 ▲▲▲ 上記の引数によりファイルの転送済みサイズとかが取得できるように なるのかなと思ったのですが、マニュアルにはそれらしき記述はありません でした。 OnStatusCallbackの中でどのような処理をすれば転送済みファイルサイズとか 取得できるのでしょうか。 ご教示のほど、よろしくお願いします。
178 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 14:01:26 ] >上記の引数によりファイルの転送済みサイズとかが取得できるように >なるのかなと思ったのですが なんでそんなこと思ったの?
179 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:03:42 ] FTP転送状況を取得するには、 OnStatusCallbackをオーバーライドして、FTP転送状況を提供 してやるってことじゃねえの? でなきゃ、オーバーライドする意味ないし。
180 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:21:41 ] 転送状況を取得したいのは判る。MSDNにも取得できると書いてある。 しかし、転送済みサイズが取得できるとはどこにも書いてないし、そもそもなんでそんな発想できるのかと。 # 要は、私もOnStatusCallbackで転送済みサイズが取得*できない*とは確認していないのだけどね。
181 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:21:11 ] 転送状況のステータスはとれても転送済みサイズは取れないってことですかね。 FTPコマンドとかフリーのFTPソフトで転送経過(%)が表示されているのってどうやってるんでしょうね。
182 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:32:10 ] 適当なバイト単位で読む
183 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:12:09 ] >>181 そりゃぁあんた、FTPクライアントがMFCを使う義理なんてないからねぇ。
184 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:08:44 ] ダイアログについて質問です。 ダイアログの中のstatic textを変更したいのですが、SetDlgItemTextを呼ぶとassertで止まります。 assertはm_hWnd=NULLが原因です。 しかしCDialogの中のCWnd周りは勝手にやっているので、nullは仕様かと思われます。 m_hWndを必要としない、static text変更の命令はどれに当たるのでしょうか? またはMFCはそういうことが出来ない仕様なのでしょうか?
185 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:19:31 ] いつもは GetDlgItem(hoge)->SetWindowText() でやってるな ちなみに、それを呼び出しているタイミングは? OnInitDialog()とか?
186 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:42:29 ] とりあえずメンバ変数に入れておき、OnInitDialogかDoDataExchange辺りで 生成されたウィンドウに対して設定するというのが一般的なやり方。
187 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:33:08 ] VC7のプログレスバーでマーキースタイルを実装する方法は有りませんか? VC8と9は重すぎて使用に耐えません。。。
188 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:38:00 ] VC2008SP1ってリリース予定っていつくらいになるか発表してましたっけ? 夏くらいとも聞いた気もするけど自信がない
189 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 00:41:07 ] >>187 CProgressCtrl::Createで直接スタイル指定して作れないか? リソーススクリプトを直接編集してもいいけど、IDEで弄ったらたぶん消える。
190 名前:デフォルトの名無しさん [2008/06/19(木) 02:41:15 ] ダイアログベースで終了時の処理を行いたいのですが、 OnDestroy()が自動生成されないのですが、これって自分で作らないとだめなんですか? ためしに自分で virtural void OnDestroy()でオーバーライドしてみたんですが、 OnDestory()内にコード書いても動作してくれません。
191 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 06:08:33 ] OnDestoryはちゃんと呼ばれる
192 名前:184 [2008/06/19(木) 15:45:20 ] >>185 試してみたのですが、GetDlgItemも内部でm_hWndがnullだとassertにヒットするので出来ませんでした。 呼び出すタイミングはOnInitDialogでやっています。 もうちょっとしたら別のとこでもやる予定ですが、今は初期値を入れているだけです。 >>186 設定をしようとすると、m_hWndがnullのため設定出来なくて困っています。 自前でダイアログを呼んで返り値のハンドルを保存しているならいいのですが、MFC側で隠蔽され何故か保存されていないため、どうしたらm_hWndに値を入れられるかというのが一番悩んでいるところです。
193 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:12:44 ] GetDlgItemで存在しないものを呼んでるんだろ
194 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:13:28 ] >>192 普通はちゃんと入っているよ そもそもWM_INITDIALOGメッセージを送るのにもウィンドウハンドルは必要だろ?
195 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:40:33 ] 土地を買う → 家を立てる → 家具を買う いきなり家具を買われても困るだろ
196 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 17:25:59 ] >>192 >呼び出すタイミングはOnInitDialogでやっています。 が、CDialog::OnInitDialog を呼ぶ前でした、というオチを想像した。
197 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 18:53:57 ] たしかにそのタイミングだと、コントロールにメンバ変数を割り当ててあっても、 CDialog::OnInitDialog → UpdateData → DoDataExchange が呼ばれる前だから、まだNULLの状態になるな。
198 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 19:37:07 ] OnInitDialog()でWM_APP_XXXメッセージを自分にポストして遅延処理する。
199 名前:192 mailto:sage [2008/06/19(木) 20:24:32 ] CDialog::OnInitDialogを呼ぶ前でした>< 皆さんありがとうございます。
200 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 20:51:02 ] あほ
201 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 20:52:45 ] 大体そんなことだろうとは思ってたw
202 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 00:03:25 ] >>190 message_mapにon_wm_destroy定義してある? 自分で記述しないで、どのバージョンか知らんがVSにまかせたら?
203 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 15:55:10 ] ドキュメント・ビューアーキテクチャを利用して常駐型アプリを作成したいと考えています。 内容を簡単に説明すると、一つのデータベース(自作)を参照する複数のビューがあり、 それらは同時に表示可能であるといったものです。 ただ、常駐型なのでタスクバーに表示されないようにしたいのと、外見上メインフレームの みを非常時にしていのですが、メインフレームを非表示にすると、それのビューまでが非表 示になってしまいます。 メインフレームとビューの表示・非表示を個別で制御することはできないでしょうか?
204 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 16:29:29 ] >>203 メインフレーム以外のフレームつくればいいんでねえの?
205 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:15:03 ] 子ウインドウは親にひっついてるから 独立したウインドウにして切り離すしかない
206 名前:デフォルトの名無しさん [2008/06/22(日) 18:30:31 ] 複数のダイアログで同じ内容のコントロールを使うときはどうすればいいんでしょうか?
207 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:13:16 ] >>206 複数のダイアログに同じ内容のコントロールを使うことで、何が問題となるのかわからん。
208 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:31:14 ] >>207 ダイアログを作るたびにコントロールの初期設定とかで同じ処理を何度もコピペして書いて、 修正するときは同じ部分を全部書き直すのが無駄な気がして、もっと楽にできる方法がないかと思って。
209 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:34:58 ] コモンダイアログ
210 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:53:38 ] >>208 "同じ内容のコントロール"を持ったダイアログを基底クラスとしてつくって、 そっから派生させたらどうだ?
211 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 20:24:30 ] VC8でマウスの右ボタンを押しながらツールバーのボタンを左クリックすると落ちるのですが解決方法はあるのでしょうか。 プロジェクトを作った直後にビルドし、ツールバーにある印刷ボタンなどを押すと落ちました。 自分で置いたツールバー(CToolBar)も同じ状態です。 今までのバージョンでは確認出来ないのですが、VC8では何か処理を噛まさないといけないのでしょうか。
212 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 20:52:25 ] プログラムに問題があったのに今まで偶然に動いてただけかもしれないけど VC側のバグを疑ってるならサポートに聞くしかない
213 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 21:28:55 ] >>212 なるほど、そちらで聞いてみます。
214 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 22:25:38 ] >>210 その場合MESSAGE_MAP・DoDataExchangeのリソースIDはどうすれば良いでしょうか?
215 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 22:41:02 ] >>214 何を問題としているかわからん。
216 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:04:30 ] > 205 ということはCMDIFrameWndをそのまま使用して実現することは出来ないということでしょうか?
217 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 07:45:17 ] みんな結構SP1Beta入れてるのか 正式版待った方がいいと思って粘ってるんだけど、なんか羨ましいな
218 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 10:06:02 ] >>211 ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200402/04020028.txt これと同じ問題だとしたら、VC2003から直っていないバグかも。 自分でも試してみた限りでは、デバッグ時のASSERTに引っかかって落ちるだけで、 リリース版では落ちることは無く、他のウィンドウをクリックすると回復したけど、 MFCのソースも結構いい加減だな。
219 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:44:08 ] Picture Controlで Type四角形にした時の プログラムでの 色の変更ってどうすればいいですか?
220 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:22:12 ] 四角形のまま色変えるにはサブクラス化するしかないんじゃないかな。 オーナードローにするか、テキストのスタティックにしてOnCtlColor使うかするといいかも。
221 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:36:59 ] ってもしかして白黒灰の範囲内の話?
222 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:22:58 ] 直接描画したほうが早い予感
223 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 01:30:08 ] MFCでアプリケーションハンガリアン記法使うときって、どんな感じにしてますか? APIがシステムハンガリアン記法なんで、色々書きづらいと思うけど
224 名前:デフォルトの名無しさん [2008/06/27(金) 18:24:55 ] コンボボックスからユーザーが入力した値を取得するにはどうしたらいいでしょうか? m_Combo.GetLBText(m_Combo.GetCurSel(),str); だと取得できませんでした。
225 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 18:34:40 ] コンボボックスのスタイルにもよるんだけど、通常のエディットコントロールが乗ってる ドロップダウンスタイルのエディットコントロール部分が欲しいの? もしそれなら、GetWindowtext()で。
226 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 18:55:29 ] >>225 できましたー。ありがとうございます!
227 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 21:24:00 ] sp1 にある MFC FeaturePack はなかなかのもんだ 大幅なバージョンアップだな
228 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 21:48:46 ] んで、sp1 はいつよ?
229 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 22:35:58 ] βはもうでてる
230 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 00:16:00 ] むしろSP1入れて始めて2008の意味があるだろう VCにとっては
231 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:16:44 ] シングルウィンドウについて、親を指定せずに作ったウィンドウやダイアログからCMainFrmは取得できるのですが、 C〜Viewは取得できないのでしょうか。 CMainFrmのメンバクラスかと思ってたのですがそうではないですよね。
232 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:18:10 ] ViewはChildFrmの子供じゃなかったっけ
233 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 19:02:20 ] viewを取得するメンバ関数があるだろ
234 名前:デフォルトの名無しさん [2008/06/28(土) 20:54:22 ] MFCのソースを読んでみようと思ったんだが、 どれから手をつけていいのかわからん。 どれがいい?
235 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:18:56 ] 必要になった部分だけ拾い読みするから愛読してる部分はない
236 名前:デフォルトの名無しさん [2008/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 mailto:sage [2008/07/01(火) 14:48:29 ] 書き忘れてました 環境は Visual Studio .NET 2003 です。
238 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:03:11 ] 設定フォントはUnicode表示できるの?
239 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:12:41 ] >>238 できます。 それも含め、エディットボックスでならすべてうまくいっています。 ただ、リッチエディットだとうまくいかないんです・・・
240 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:58:18 ] >>236 の通りにやってみたが、すべて問題なく動作した。 VS2008だけど。2003もあるんでちょっとやってみる。
241 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:37:13 ] ご苦労
242 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:55:07 ] 2003だとたしかにそうなるな。 文字エンコーディングの指定かとも思ったが、 ttp://oshiete1.goo.ne.jp/qa4140782.html マルチみたいだからもうやめた。
243 名前:236 mailto:sage [2008/07/01(火) 17:06:44 ] >>242 回答ありがとうございます。 やっぱり2003のリッチエディットはUnicodeに対応してないんですかねぇ・・・ あ、その添付のURLは私が上げた質問ですw OKWaveで質問しても回答が得られなかったのでこっちに来た次第です。
244 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 17:25:21 ] とりあえず、これやったらうまく取れた。 ちょっと変更必要だったけど、まあわかるっしょ。 ttp://d.hatena.ne.jp/halts/20030805
245 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 17:33:38 ] よくやった
246 名前:236 mailto:sage [2008/07/01(火) 18:20:59 ] >>244 ありがとうございます、さっそく試してみます。
247 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:28 ] >>244 さんの紹介ページの通りやってみたらうまくいきました。 ・・・とはいっても、>ex と書くべきところを >ex と書いてあったり、TCHAR*型のポインタを渡すべきところにCString型変数を渡してたりと、なかなか誤字の多いページでしたけど。
248 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:56:28 ] そこは const のTCHAR*渡すようにすれば CString のまま渡せるんだけどね。 オレはそこはLPCTSTRにした。 結局、コードページ1200にしてEM_GETTEXTEXが必要ってことみたいだな。
249 名前:247 mailto:sage [2008/07/01(火) 18:57:17 ] あ、誤字ってる・・・ > とはいっても、>ex と書くべきところを >ex と書いてあったり 「&gtex」を半角で打つと「>ex」になってしまうようですね。前者の「>ex」は「&gtex」のつもりで書きました。
250 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:29:57 ] MFCはマルチコアなど気にする必要は無いのでしょうか。 現在P4 2.8Gを使っているのですが、処理によってはCPU使用率が80%を超える場合があります。 もしC2Dなどのマルチコアで実行した場合、 何も気にせず組むと1つしか使っていない(=現状より処理が重い)という状況になるかと思ったのですがどうなのでしょうか。
251 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:54:07 ] MFCじゃなくてスレッドの話だろ
252 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:03:33 ] 内容次第としか言いようがないな 今でもまともにマルチコアを使いこなしてるソフトなんて、エンコーダくらいしかないし
253 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:10:27 ] コンパイルそのものは速くなるよ 複数のファイル平行してコンパイルするからね
254 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:13:11 ] あと、C2Dの1コアだけで同クロックのPen4より かなり速いぞ クロックだけで判断しないほうがいい
255 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:15:04 ] マルチコアって響きはプログラマとしてトキメクものがあるが 現状1つのアプリ内で有効に活用できる機会はあまり無いわな。
256 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:16:31 ] というか複数アプリ起動時にパフォーマンスが高いから、もう十分
257 名前:250 mailto:sage [2008/07/01(火) 20:39:43 ] レスありがとうございます。 特殊なことをしない限りMFCでマルチコア云々を特に考える必要は無いのですね。
258 名前:デフォルトの名無しさん [2008/07/02(水) 16:19:51 ] いま、EXEにあるクラスのヘッダーをincludeしてDLLを作ろうとしてます。 構造体ならうまくいくのですが、クラスだと fatal error LNK1120: 外部参照 1 が未解決です。 になってしまいます。解決方法ご存じでしょうか?
259 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:24:16 ] 何言ってるのかわかりにくいが、、、 その外部参照1の名前から推測できないの?
260 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:32:40 ] __declspecをつけてないとか
261 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:48:29 ] unicodeとか、シングルスレッド/マルチスレッドとかの設定は合ってるか? 最初に競合してるとかのエラーは出てない?
263 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:06:37 ] そのクラスがDLLの外から呼び出せるようになってるか確認した? あと、構造体ならうまくいくって、どううまくいくんだ?
264 名前:デフォルトの名無しさん [2008/07/05(土) 04:47:27 ] いつも使っているUpdateData(FALSE);を マルチスレッドで作った別スレッドの中で実行するとエラーが出るんですが、どういう問題が考えられますか?
265 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 10:04:58 ] 別スレッドの中で実行してるという問題が考えられる
266 名前:デフォルトの名無しさん [2008/07/05(土) 13:28:30 ] やはりそうですか、別スレッドの中で実行するにはどうすればいいですか?
267 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 16:18:23 ] だから別スレッドの中で実行したらだめ
268 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 16:21:58 ] MFCやってて、マルチスレッドなんてプログレスバー処理やるときくらいだな
269 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 19:12:01 ] ↑あほ確定
270 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 20:59:03 ] うむ
271 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 00:22:36 ] マルチスレッドって何ですか?
272 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 00:35:35 ] つ set.bbspink.com/test/read.cgi/leaf/1198723568/
273 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 10:50:58 ] 親子関係を持たないシングルウィンドウとダイアログについての質問です。 メインフレームをクリックするとダイアログも並び順はそのままで他のアプリケーションの上にウィンドウが来るように組もうとしています。 例えば以下のようにウィンドウが並んでいる場合 デスクトップ) ダイアログ1 ダイアログ2 メインフレーム 他のアプリケーション (最前面 このメインフレームをクリックすると デスクトップ) 他のアプリケーション ダイアログ1 ダイアログ2 メインフレーム (最前面 このように重なりを替えたいです。 しかしダイアログ1と2の前後関係が分からないため デスクトップ) 他のアプリケーション ダイアログ2 ダイアログ1 メインフレーム (最前面 このようになってしまいます。 メインフレームを親にしてダイアログを生成するとダイアログの前面にメインフレームが持ってこれず躓きました。 重なり順をそのままに他のアプリケーションの前面に移動させるのは無理なのでしょうか。
274 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 03:55:36 ] CPenで点を打つとき座標が必要ですが、コントロール上の座標を調べる方法はないんですか? 適当に座標を入れて、もう少し上だ、とかでずらしてコンパイルするしかないんですか?
275 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 14:41:53 ] もう少し上、てのは何を基準に? その基準を利用してみては。 見た目でなんとなく、というのならキミがやるしかないでしょ。
276 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 15:22:57 ] マウス持ってけばわかるけど ダイアログ上の座標は実行環境で可変だから 計算じゃなくて見た目で決めると実行時にずれる
277 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:03:04 ] 解決しました。付属のspyツールでマウスイベントのX,Y座標がとれました。
278 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 20:45:58 ] 座標関連のことやってるなら、PC用語ではないが黄金比くらいは知っておいた方がいい 役に立つかどうかは別だが
279 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 21:25:24 ] ダメな方法を教えてやったのに
280 名前:デフォルトの名無しさん [2008/07/13(日) 18:29:59 ] ビットマップをピクチャコントロールの大きさに合わせて表示したり、 ボタンの横幅を文字数にあわせたりするのはどうしたら良いでしょうか?
281 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:47:52 ] ピクチャコントロールの大きさを調べて合わせる 文字数から横幅を計算して合わせる
282 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 19:26:06 ] 文字数はDrawTextでパラメータにCALCっぽいやつつけろ
283 名前:デフォルトの名無しさん [2008/07/13(日) 23:32:56 ] 素人質問ですいません。 MFCでダイアログを表示させる時に作成したボタンを クリックしている状態にするのにはどうすれば良いでしょうか?
284 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 23:50:13 ] 見た目だけでよかったらへこんだ状態にすればいい
285 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 23:52:59 ] チェックボックスのボタンスタイルか?
286 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 01:07:13 ] ダイアログエディタなら、チェックボックスを貼ってPushLikeをtrueに。 それ以外なら、、3ステートボタンとか2ステートボタンで探してみて
287 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 02:50:21 ] ON_BN_CLICKED で ピクチャーコントロールの上をクリックされたときによばれるコールバックを設定したんだけど、 このとき、クリックされた座標が知りたい。どうすればいい?
288 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 09:50:52 ] >>287 CPoint pt = GetMessagePos();
289 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 09:53:04 ] GetCursorPos使えばいいよ
290 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 09:58:09 ] STNじゃないの? CLICKEDはボタンを押して離した後に来るからマウス座標の概念は無いかもな。 サブクラス化してLBUTTONDOWNやUPを見たほうがいいかも?
291 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 10:00:16 ] GetCursorPos や GetMessagePos にはタイムラグあるんじゃない? CLICKEDが最後のメッセージであると決まってればGetMessagePosでいいのかもしれん
292 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 10:04:48 ] GetCursorPosはその瞬間のカーソル位置であって、 イベント発生時の座標はGetMessagePos。 ttp://msdn.microsoft.com/ja-jp/library/kt4by313(VS.80).aspx
293 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 11:52:42 ] >>292 GetMessagePosも、 イベント発生時の座標=クリックされた座標では無いのが曲者だな クリックされた座標を拾えるAPIは、もしかして無いんじゃね?
294 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 12:15:27 ] 実際にやってみて、ずれなきゃそれでいいしずれるなら自前で取るのがいいかもね。
295 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 23:06:45 ] 287 です。 みなさん、回答ありがとう。GetMessagePos() を使用して要望がかないました。 実際、実装したかったモノはCStaticにカラーグラデーションを配置して、簡易なカラーピッカを実現することでした。 実装してみるとクリック時よりもリリース時の座標の方が使い勝手がいいことが分かりましたが、 助言をヒントにこれも実現できそうです。
296 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 13:29:26 ] いったい何がやりたいのか理解できない
298 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 13:45:16 ] CStringA
300 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 13:55:01 ] コピーじゃなくて変換なのか?
301 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 18:05:29 ] Visual Studio 2005で、WindowsMobile6用のダイアログベースアプリを作っています。 ダイアログにメニューをつけたいのですが、やり方がわかりません。 下記URLのやり方をやってみようと思ったのですが、2箇所やり方がわからず、詰まってしまいました。 www.g-ishihara.com/mfc_me_01.htm 1.メニューのIDが設定できない リソースの追加でMenuを作成したときに、リソースビューには「IDR_MENU1」というのができるのですが、 メニューのプロパティでは「IDの編集ができません」と書かれて、IDが編集できません(サブメニューは編集できました)。 でも、とりあえず、メニューリソースの作成方法はわかったつもりです。 また、下記2.で使うのは「IDR_MENU1」という名前だと考えたので、 ここでIDの編集ができないことは、メニューをつけられないこととは関係ないと思っています。 2.ダイアログにメニューを関連付けられない >> ダイアログのプロパティで、「Menu」に作成したメニューのIDを指定 という手順で、ダイアログのプロパティに、「Menu」という項目がありませんでした。。。。 もしMenuという項目があれば、「IDR_MENU1」を記入すればよいと思っています。 ダイアログにメニューをつける方法を教えていただけませんでしょうか。 足りない情報があれば、ご指摘ください。 よろしくお願いいたします。
302 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 18:21:05 ] >>301 1.リソースビューの「IDR_MENU1」をシングルクリック 2.リソースビューの該当ダイアログIDをダブルクリック (※VS2003だけど)
303 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 18:22:25 ] >>301 1. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ 2. でも、モバイルでダイアログにメニュー持たせられたっけ
304 名前:301 mailto:sage [2008/07/16(水) 18:35:44 ] レスありがとうございます。 >>302 その通りにやってみましたが、ダイアログの編集が開くだけでした。 また、実行してみても、画面的に変化はありませんでした。 >>303 >> 1. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ これはできました!リソースのプロパティでのIDの編集なのですね。 >> 2. でも、モバイルでダイアログにメニュー持たせられたっけ ガーン。 もし無理ならばSDIで作り直して、メニューを編集することにします。 モバイルで可能かどうかって、何を調べればわかりますでしょうか?
305 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 18:54:01 ] どうだろ、そういうアプリ見たこと無いしなぁ やっぱMSDN探すしかないか?
306 名前:301 mailto:sage [2008/07/16(水) 18:54:25 ] 書き忘れました。。。 >>302 1.については、リソースのプロパティが表示され、IDが編集できました。 (303さんと同じ結果でした)
307 名前:301 mailto:sage [2008/07/16(水) 19:05:41 ] >>305 MSDNでの探し方ってよくわからないんです。 モバイルで可能かどうかっていうのの情報が、どう書いてあるのかわからなくて。。。 .NET Compact Frameworkのどのバージョンに対応とか そういうのは書いてある気がするんですけど、これはまた別の話ですよね? # 当方MFCとかCompactFrameworkとかが何を指しているのかわかっていません。 言葉の意味はわかるのですが、具体的に何を指しているのかわからないのです。。。 たとえばCStringってクラスはMFCっぽい?とかそんなくらいの認識です。。。
308 名前:デフォルトの名無しさん [2008/07/16(水) 22:42:12 ] >>284 >>285 >>286 返信遅くなりすみません。 無事解決しました。ありがとうございました。
309 名前:301 mailto:sage [2008/07/17(木) 13:07:04 ] WindowsMobile用のスレを見つけたので、そっちで聞いてみます。 お邪魔しました。
310 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:00:15 ] VC6、VC7.1ともにダイアログベースのスケルトンにボタン貼り付けて、 クリックしたらMessageBox表示するだけのアプリで、 何回かボタンクリックしてるとメモリ使用量が4K増えるんですけど、こういうもんなんですか?
311 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:09:05 ] 一応、そのボタンクリック時の関数の中身貼ってみて
312 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 00:38:13 ] >>310 そんなもんだろう。 ページングがおこって4kが確保されたんだろうが、それ以上その動作で確保されることはない(とは断定できないが)。
313 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 06:56:50 ] ほかのアプリで同様の現象が起きるなら、MFCは関係ないな。 再インストールでもした方が良い。
315 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 16:28:22 ] VS2005でピクチャーボックスのサイズが知りたくてGetWindowRectを使おうと思ったんだけど void C・・・Dlg::OnBnClickedButton1(){} こんな形の場所だとhwndの指定がうまくできないんですがどうすればいいんですか?
316 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 16:44:21 ] 欲しいのはこれかね? つGetDlgItem
317 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 16:59:32 ] >>316 それ使いたいんですがGetWindowRectの引数が1個しか指定できなくて使えないんです
318 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 17:09:35 ] RECT rc; GetDlgItem(IDC_XX)->GetWindowRect(&rc); こういう事?
319 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 17:18:40 ] そんなやり方があったんですか ずっとGetWindowRect(GetDlgItem(hwnd,IDC_XX),&rc);こんな感じでしかできないものと思ってました どうもです
320 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 17:20:59 ] >>319 GetWindowRect()は、this->GetWindowRect() のthisが省略された書き方だと言う事を意識した方が良い
321 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 19:25:16 ] Win32と入り混じってそうだな
322 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 19:39:36 ] GetDlgItem(IDC_XX)-> これ一番最初の方で習うだろ 別のやり方もあるけど、MFCでその方法教えない本はないと思う
323 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 09:48:03 ] >>322 MFCなら変数化して使うのが一般的じゃないかな。 IDを変数に置きなおして直感的に触れるようにするのがMFCの特徴の1つでもあるし。
324 名前:310 mailto:sage [2008/07/19(土) 14:11:23 ] >>311 亀で申し訳ないです。 void CmessageboxDlg::OnBnClickedButton1() { // TODO : ここにコントロール通知ハンドラ コードを追加します。 MessageBox("Message", "Title", MB_OK | MB_ICONWARNING); } で、張り付けたボタン→メッセージボックスのボタン の順にクリックし続けると何回かに1回4K増えます。 ボタンにフォーカス当ててエンター押しっぱなしだとより 顕著に増加します。 それ以外の部分はダイアログベースのスケルトンです。
325 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 21:07:10 ] CWnd一時オブジェクトが増えるのが原因じゃないかなあ。 放っておけば適当な間隔で解放されるから、あまり気にしなくても良いと思うけど。
326 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 21:21:25 ] だろうな 環境によって違うけど、ある程度時間を待てば解放されると思う
327 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:57:52 ] まあ、多分聞きたいことはみなさんの環境でも同じことやって同じ現象おきませんか? ってことだと思うけど俺は腰が重くてとても動く気になれないなw
328 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 08:36:39 ] >>327 もしそうなら、同じOS・同じMFCバージョンでやらないと意味無いかもな。 さすがにメッセージボックス表示させるだけのコードなら大丈夫だと思うぜ。 MFCのバグの可能性を疑うのなら別だけど、それを言い出したらキリが無い。
329 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 09:51:32 ] MFCもapi呼んでるだけだし、 呼んだ人のハンドル渡すぐらいのことしかやってないから 特にメモリ使ってるようには見えないな メモリ使ってるとしたらapiだろ
330 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 09:59:07 ] 所詮CWnd::MessageBox()がAfxMessageBoxを呼んで、そいつがAPIのMessageBox呼んでるだけだよなw
331 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 07:32:41 ] ちょいとスレ違いだけど EmeditorってMFC使ってないらしいけど どうやって作ってるんですか
332 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 08:51:20 ] MFCを使わずに作ればいい
333 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 19:34:18 ] MFCの仕組み分かってないのか・・・
334 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 17:24:12 ] ウィンドウが作られる前はPreCreateWindowっぽいのですが、 ウィンドウが作られた後のイベントは何でしょうか?
335 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 17:49:44 ] OnCreate の話?
336 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:01:25 ] CHogeWnd::OnCreate() { CWnd::OnCreate(); // ここに書け }
337 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:51:34 ] CHogeDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ダイアログならこれの方がいい // TODO: でもなんでダイアログだとこれの方がいいんだろう??? }
338 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:55:25 ] 子コントロールも初期化終わってるからじゃない?
339 名前:デフォルトの名無しさん [2008/07/23(水) 21:46:18 ] リストコントロールの行の高さを変えるにはどうすりゃいいでしょうか?
340 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:18:37 ] リソースで書き換えとけ
341 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:28:34 ] これかも リストビュー(レポート)でアイテムの高さを変更する www.rainylain.jp/vc/QandA.htm#CListCtrl_ItemHeight
342 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:35:16 ] MFC初心者です ダイアログ内の状態に応じて、×ボタンなのでダイアログを閉じさせたくないのですが どのイベントを拾ってどういう処理をすればいいのでしょうか?
343 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:41:44 ] ×ボタン→WM_SYSCOMMAND(SC_CLOSE)→WM_CLOSE どっか(OnSyscommand等)で捕まえるのがいいかと。 ×ボタン自体はSYSMENUのSC_CLOSEを消すと消える。
344 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 11:57:41 ] 即レスどうもです! ためしにOnCloseをオーバーライドしてみたんですが、終了時に呼ばれない。 ためしにOnOkとOnCancelも作ってみたけど・・・呼ばれないorz 何が悪いんでしょうか
345 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 12:05:52 ] ×ボタンのキャンセルじゃないの? void Cmfc005Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == SC_CLOSE) { // ×ボタン } } とか
346 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 13:56:57 ] いろいろやってみてるんですがやっぱり継承したOn〜が全然呼ばれていないようです メッセージマップの設定もしているはずなんですが… 唯一呼ばれるのはOnInitDialogくらいです エスパー助けて >o<
347 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:27:47 ] virtual になって無いとか・・・
348 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:36:34 ] メッセージマップの設定もなにも、、、 クラス選択してプロパティ出して、上のイベントボタン押して そこから追加してる?手でやってるならどれとどれ書いた?
349 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:37:38 ] イベントじゃないや、メッセージね
350 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 23:39:08 ] >>346 「On〜が全然呼ばれていないようです」 「メッセージマップの設定もしているはずなんですが」 どちらかが嘘だと思う。
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は持ってるが