■MFC相談室 mfc19d.dll■
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/04/04(金) 18:37:47前スレ
■MFC相談室 mfc18d.dll■
http://pc11.2ch.net/test/read.cgi/tech/1185917008/
0002デフォルトの名無しさん
2008/04/04(金) 21:49:05乙
0003デフォルトの名無しさん
2008/04/04(金) 23:00:55{
GetDC(m_hWnd)->DrawText(">>1乙", m_rect, 0);
}
0004デフォルトの名無しさん
2008/04/05(土) 08:18:260005デフォルトの名無しさん
2008/04/05(土) 19:05:54リソースビュー上で初期設定はできますが、マクロや使用者のスペックに合わせて内容を変更したい時に対応できず困っています。
ダイアログはクラス化され、初期窓クラスにメンバとして保有しています。
そのため自動的にダイアログが生成されるのですが、ダイアログのコンストラクタでボタンのテキストを変えようとするとエラーが出ます。
0006デフォルトの名無しさん
2008/04/05(土) 19:26:090007デフォルトの名無しさん
2008/04/05(土) 19:29:52ダイアログアイテム(ウィンドウハンドルを持つデータ)の初期化はコンストラクタではなくOnInitDialogでやるようにする。
コンストラクタの時点ではまだm_hWndが生成されていない。
00085
2008/04/05(土) 19:38:53いつもダイアログを生成した後に自前で初期化関数を呼んでいたのでソースがすっきりしそうです。
0009デフォルトの名無しさん
2008/04/07(月) 19:53:18プロパティを触っていると何故か中心の棒は太くなったのですが選択マークは目盛りに埋まって視認し難いままどうにもなりませんでした。
VC8を使っています。
0010デフォルトの名無しさん
2008/04/11(金) 19:03:01亀レスだが
msdn2より
>作成時に TBS_ENABLESELRANGE スタイルを指定した場合にだけ、スライダ コントロールに選択範囲を表示できます。
>スライダ コントロールにこのスタイルが設定されていると、選択範囲の開始位置と終了位置の目盛りが
>垂直のダッシュではなく三角形で表示され、選択範囲が強調表示されます。
TBS_ENABLESELRANGEを設定するとスライダーバーは広がるのはVC8では何の意味もない。
以前はそこが強調表示されたがVC8では上記の通り三角形が強調表示。
VC8でも出来たらいいんだけど、俺も色々試したが無理だった。
0011デフォルトの名無しさん
2008/04/14(月) 21:10:20しかしMSは何を考えて仕様を変えたのかさっぱりわからん。
0012デフォルトの名無しさん
2008/04/14(月) 23:00:47まだ英語版だけだし・・・でも誰か感想よろ
0013hori
2008/04/16(水) 10:09:39ダイアログにピクチャーBOXを入れ
APPWizardでメンバー変数追加しょうとしましたが
一覧にPICT1 が無いのです。(
プロパテイではIDC_PICT1は入っているのですが)
。なぜなのでせうか?。。。m(__)m
0014デフォルトの名無しさん
2008/04/16(水) 23:18:58ダイアログエディタの当該コントロール上で右クリックしてからメンバ変数として追加じゃダメなん?
0015hori
2008/04/17(木) 06:00:03見間違いしていました、、、、(-_-;)
デフオルテでIDC_STATICをIDC_PICT1と見間違いしていました。。。m(__)m
0016hori
2008/04/17(木) 06:13:11問題解決。。。ヨーソロー。。。^^
0017デフォルトの名無しさん
2008/04/17(木) 11:28:46CString cstr=(CString)str;
テンパってるときに書いたコードなんだけど
エラーにならないのはなんで?一時のCStringインスタンスが生成されて
cstrにコピーされたっていう解釈でいいの?
0018デフォルトの名無しさん
2008/04/17(木) 11:43:27ん。型変換コンストラクタ (CString::CString(LPCTSTR)) が呼ばれてる。
0019デフォルトの名無しさん
2008/04/19(土) 00:46:100020デフォルトの名無しさん
2008/04/19(土) 01:11:25一行もコード書かずにコンパイルしたプログラムが、6.3MBもメモリ食ってるし。
VBより酷い。なんかいきなり嫌になってきた。
MFC使わずにしこしこCreateWindowとかやった方がいいのか?
0021デフォルトの名無しさん
2008/04/19(土) 01:25:270022デフォルトの名無しさん
2008/04/19(土) 01:28:03リリースビルドしてもexeファイルサイズが小さくなるだけで、メモリ使用量はほとんど変わらないよ。
0023デフォルトの名無しさん
2008/04/19(土) 01:32:340024デフォルトの名無しさん
2008/04/19(土) 01:36:26まあ微量っちゃ微量だな。
どうせ動的に確保できるメモリってあるブロック単位になっちゃうし。
スタック使用量は明らかに増えるが、
どうせスタックサイズはリリースかどうかで変える訳でもないし。
0025デフォルトの名無しさん
2008/04/19(土) 11:50:25実装していくうちに、VB6もMFCも殆ど変わらなくなるんじゃね?
てか、.NETでなくてわざわざMFCに来たんだか。
既存のC/C++のライブラリでどうこうしたいなら非常にお勧めだが、
逆に、そうでないなら全くやる理由がない。
0026デフォルトの名無しさん
2008/04/19(土) 15:19:12.netは金取る製品を作るための開発環境じゃないから。
あれはサンデープログラマのお勉強用。
作るのは楽だけど、起動が遅くて動作もモッサリしてるのでダメ。
0027デフォルトの名無しさん
2008/04/19(土) 17:34:540028デフォルトの名無しさん
2008/04/19(土) 23:17:400029デフォルトの名無しさん
2008/04/20(日) 01:55:44CPU対象がAnyでJITコンパイル済みの.NET(WinFormあるいはWPF)
どっちが速いんだろ。
もっとも構造や機能がまるで違うものを単純比較しても意味ないけど。
0030hori
2008/04/21(月) 14:05:54OS XPに”Visual C++ 6.0 Professional”をインストールしたら
まずい、、、でしょうか? ^^;
0031デフォルトの名無しさん
2008/04/21(月) 18:06:270032hori
2008/04/22(火) 00:55:35ぐぐって見ました。
、、、、やはり、、。。^^;
0033デフォルトの名無しさん
2008/04/23(水) 02:19:410034デフォルトの名無しさん
2008/05/04(日) 21:57:35リソースエディタにて複数のダイアログの画面を作成し、
任意のタイミングで表示されるダイアログを切り替える機能を実装したいです。
具体的には、IDD_DIALOG1とIDD_DIALOG2という画面を作成し、
アプリ起動時はIDD_DIALOG1が表示されるのですが
指定したチェックボックスの状態を有効にすると
画面がIDD_DIALOG1からIDD_DIALOG2に切り替わる、
といった動作を想定しています。
何か方法はありませんでしょうか。
ちなみに開発環境はVC++6.0@Win2kです。
0035デフォルトの名無しさん
2008/05/04(日) 22:04:39Dialog1の状態パラメータ等を取りたいならDoModalオーバーライドの引数として&参照で構造体バッファ渡すなり
単純な数値だけ欲しいならDoModalの返値としてIDOK等ではないものを返せばいいし。
とりあえずフレーム+ビューにしろダイアログにしろWinApp派生から呼ばれてるから
そいつに管理させればカンタンである
0036デフォルトの名無しさん
2008/05/04(日) 22:31:54レスありがとうございます。
つまり、イメージ的にはDialog1とDialog2それぞれ別のプログラムを作って、
プログラム終了時にお互いを呼び出す、というイメージでしょうか。
0037デフォルトの名無しさん
2008/05/04(日) 23:01:190038デフォルトの名無しさん
2008/05/04(日) 23:02:32Dialogオブジェクトを生成してDoModalするのはあくまでAppのメインさんね
0039デフォルトの名無しさん
2008/05/05(月) 00:06:43チェックボックスでダイアログ自体が入れ替わるUIは、一寸前衛的すぎる気がする。
0040デフォルトの名無しさん
2008/05/05(月) 09:13:27初心者モード、エキスパートモードみたいに
たまにしか切り替えない場合はタブは邪魔なだけ
0041デフォルトの名無しさん
2008/05/05(月) 09:44:24自分もチェックボックスで画面が変わるというのは標準的ではないと思う。
やりたいことがよく分からないけど、チェックボックスの代わりにボタンじゃあかんの?
その方が標準的と思う。
004241
2008/05/05(月) 09:54:03>>36
別のプログラムではないよ。
35、38は1つのプログラム内でWinApp(アプリ管理クラス)が切り替えをする案。
004341
2008/05/05(月) 10:15:22×WinApp(アプリ管理クラス)が
○CWinAppクラスの派生クラス(C+プロジェクト名+Appクラス)
C+プロジェクト名+App.cppの下のほうにあるDoModalの辺りで処理するという話っす
0044デフォルトの名無しさん
2008/05/06(火) 13:10:43子ダイアログDialog1,Dialog2(Create)を貼り付ける
0045デフォルトの名無しさん
2008/05/06(火) 15:52:440046デフォルトの名無しさん
2008/05/07(水) 10:40:27このプログラムにはハンドルリークが有ることが分かっていますが、その場合呼び出し
元のプログラム(スレッドを作成したプログラム)でハンドルが増加し続けたりするのでしょうか。
0047デフォルトの名無しさん
2008/05/07(水) 10:48:05いいえ、それだけなら「別のプログラム」のハンドルがリークするだけで「元のプログラム」のハンドルはリークしません。
勿論、適切なプログラムであるとの前提ですが。
# ありがちなのは、スレッドハンドルをクローズし忘れているケースですが……
## そもそもなんでCreateProcessを使わないのかとか、TaskManagerでハンドルの数を観測しろとか。
0048デフォルトの名無しさん
2008/05/09(金) 00:28:01使いたい場合は「〜App」のメンバ変数にクラスのオブジェクトを作成するのが普通ですか?
例えば、CDialog1、CDialog2と言うダイアログとクラスを作成し、
CDialog2からCDialog1のメンバ変数と関数を使いたいのですが。
0049デフォルトの名無しさん
2008/05/09(金) 02:57:24Appのインラインメンバ関数として「Dialog派生クラスのポインタ(あるいは参照)だけくれる関数」を作ればよいのでは。
0050デフォルトの名無しさん
2008/05/09(金) 13:29:140051デフォルトの名無しさん
2008/05/09(金) 20:47:100052デフォルトの名無しさん
2008/05/11(日) 02:08:09そこで困ったことがあり質問させていただきました。
あるアクティブな一つのウィンドウをViewクラスに属しているメニューコマンドで
メニューを選択したらアクティブMDIの子ウィンドウを最大化したいのです。
メニューコマンドを選択したら自動的にアクティブなウィンドウに対してコマンドが
実行されると思っています。
コマンドを追加した関数から「ShowWindow( SW_SHOWMAXIMIZED );」を
呼んだのですが最大化しそうな動きが一瞬するのですが、子ウィンドウが最大化表示しません。
最大化の方法が間違っているのでしょうか?
実現方法をよろしくお願いいたします。
0053デフォルトの名無しさん
2008/05/11(日) 03:03:29005452
2008/05/11(日) 03:37:32ありがとうございます。解決しました。
CMDIChildWndをヘルプを見ましたらクラスメンバでvoid MDIMaximize();を見付けました。
ヘルプでのMDI子ウィンドウフレーム派生クラスの親クラスを見ていませんでした。
今回の件で解決方法を調べるのにネットの方ばかり探していました。
「MDIMaximize」でググると検索で欲しかった情報が出てきました。
Viewクラスからの呼び出しているコマンド内では、以下の通りでMDIMaximize()を呼びました。
CChildFrame *pChildFrameWnd = (CChildFrame *)GetParentFrame();
pChildFrameWnd->MDIMaximize();
この処理を追加しましたらMDI子ウィンドウのタイトルバーの最大化ボタンをクリックしないで
MDI子ウィンドウを最大化する事ができました。
重ねてありがとうございます。
0055デフォルトの名無しさん
2008/05/11(日) 12:59:37全てリソースビューでやろうとすると、全てのタブに表示されるべきコントロールが同じ場所に表示されてしますので扱い辛く・・
0056デフォルトの名無しさん
2008/05/11(日) 16:37:550057デフォルトの名無しさん
2008/05/11(日) 16:49:32リソースビュー上はバラバラだけどプログラム上の初期処理で位置変えるとかもある
0058デフォルトの名無しさん
2008/05/11(日) 18:26:28# それやるくらいならプロパティシートかな。
005955
2008/05/11(日) 19:35:03色々なアプローチの仕方があるのですね。
0060デフォルトの名無しさん
2008/05/14(水) 16:46:33印刷ダイアログを表示せずにデフォルトのプリンタで印刷するときの前後処理は
こんな感じのやり方でよろしいのでしょうか
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);
0061デフォルトの名無しさん
2008/05/14(水) 18:37:510062デフォルトの名無しさん
2008/05/15(木) 13:48:03メモリを解放しないといけないかと思いまして
0063デフォルトの名無しさん
2008/05/15(木) 16:22:21当方、6年位前に貧乏でして、VisualC++スタンダード版を何とか買いました。
その後、JavaやPHPで食いつないできたんですが、今になって当時買った本とか読んで
WindowsAPIやらMFCやら勉強したら面白くてだいぶ身についたんですが、
今は.NETFrameWorkで動くCLRというのがもっぱららしいんですが、私はぜんぜん知らないし
大体環境をもってません。まあ無料でダウンロードできるらしいんですが。
私みたいのでも就職口ありますかね?別にJavaやPHPでくっていけるんでいいんですが
一度仕事でもVC++やってみたいですし。
よろしくお願いしますm(_ _)m
0064「んですが」なくても読める罠
2008/05/15(木) 16:29:21--
別にどっちでもいい
んですが。。
当方、6年位前に貧乏でして、VisualC++スタンダード版を何とか買いました。
その後、JavaやPHPで食いつないできた
んですが、
今になって当時買った本とか読んで
WindowsAPIやらMFCやら勉強したら面白くてだいぶ身についた
んですが、
今は.NETFrameWorkで動くCLRというのがもっぱららしい
んですが、
私はぜんぜん知らないし
大体環境をもってません。まあ無料でダウンロードできるらしい
んですが。
私みたいのでも就職口ありますかね?別にJavaやPHPでくっていけるんでいい
んですが
一度仕事でもVC++やってみたいですし。
よろしくお願いしますm(_ _)m
--
そもそも鼬害だし、望み薄だと思う
んですがw
0065デフォルトの名無しさん
2008/05/15(木) 16:30:34結局、訊きたいのは
>私みたいのでも就職口ありますかね?
これか?
ここ、そゆこと訊くスレに見える?
0066デフォルトの名無しさん
2008/05/15(木) 16:36:25どうでもいいそうだから、質問にさえなってないと思われ。
0067デフォルトの名無しさん
2008/05/15(木) 18:25:120068デフォルトの名無しさん
2008/05/16(金) 00:57:00そういうのはマ板で聞け
0069デフォルトの名無しさん
2008/05/17(土) 16:01:58〜ViewのOnDestroyやメッセージでWM_Destroyを関知したときにwhile(1)で無限ループさせても終了してしまいます。
OnDestroyを通った後にOnCloseは通らず、×ボタンを押したときウィンドウを閉じさせないという選択肢をどこで作ればいいのか・・。
0070デフォルトの名無しさん
2008/05/17(土) 16:25:260071デフォルトの名無しさん
2008/05/17(土) 16:59:03MainFrameでOnClose
0072デフォルトの名無しさん
2008/05/17(土) 18:01:48なるほど、Viewで無限ループさせてもFrameが閉じられるのでアプリケーション自体が終了していたのですね。
0073あは〜ん
2008/05/19(月) 18:54:120074デフォルトの名無しさん
2008/05/24(土) 17:49:58質問なのですが、
エクセルなんかのカラー選択のコンボボックスの動きを実現させたいのですが、
コンボボックスの内容をオーナードローで描画するのは出来るのですが、
あの色サンプル(コンボボックス押すと出てくるリスト)はどのように作るべきでしょうか。
CColorDialogとかではなく、あの30色ぐらいのパレットがほしいのですが。
0075デフォルトの名無しさん
2008/05/24(土) 18:10:48このへん?
CMFCColorButton
0076デフォルトの名無しさん
2008/05/24(土) 23:57:24レスありがとうございます。MFCと書いてあるということはVS2008版ですよね。
残念ながら、当方VS2003なのです。
エクセルのパレットがそのままの形ででもあれば・・・。
0077デフォルトの名無しさん
2008/05/25(日) 08:32:41これでよい?
http://www.kumei.ne.jp/c_lang/sdk2/sdk_139.htm
007877
2008/05/25(日) 08:36:46MFC→VS2008じゃないよ。2008EEにはついてないし。
逆にVS2003には必ずついていると思われ。
「CColorDialogとかではなく」ってことは77はNGか orz
0079デフォルトの名無しさん
2008/05/25(日) 10:52:10レスありがとうございます。
MFCと書いたのはCMFCColorButtonのことでした。略して分かりにくしてすいません。
http://up.cgi.jp/mek3
↑作りたいのはコレなんです。これをチョコチョコ改変して作りたいのです。
やはりダイアログを作成して、CBitmapButtonでサンプル色ボタンを作って貼り付けて、
テキストリンクのところはCButtonの枠線なしとかで対応するのでしょうか。
008077
2008/05/25(日) 14:22:21う〜ん。やっぱり79のような感じなんですかね。
0081デフォルトの名無しさん
2008/05/25(日) 16:58:27008274
2008/05/25(日) 19:22:25レスありがとうございます。
形状的にはそうするのが一番形になるような気がします。
>>81
レスありがとうございます。
えっ?!コンボボックスの中身をツールバーにするのですか?
ちょっとイメージがつきません…。
0083デフォルトの名無しさん
2008/05/25(日) 19:31:31これ参考にすれば?
0084デフォルトの名無しさん
2008/05/25(日) 20:14:33ツールバーの中にコンボボックスがあるんだろ。
008574
2008/05/25(日) 20:22:12レスありがとうございます。
おお、これです。コレがしたかったんです。ありがとうございます。
英語ばかりですが、サンプルコード読みながら何とか紐解いてみます。
サンプルプロジェクトコンパイルしたらエラーしますがorz...
0086デフォルトの名無しさん
2008/05/25(日) 20:24:420087デフォルトの名無しさん
2008/05/26(月) 00:33:51…って書き込もうと思ったんだが、ググったらそういうソフトがあるのな。自動翻訳の。
0088デフォルトの名無しさん
2008/05/26(月) 14:13:22_DEBUGが定義されてるように
MFCだと
定義されてるやつってありますか?
0089デフォルトの名無しさん
2008/05/26(月) 19:08:440090デフォルトの名無しさん
2008/05/27(火) 01:54:21ダイアログ上にCStaticを配置して、そこにJPG画像を表示しています。
JPG表示領域に別のWindowが重なったりした場合に、それをどかしても
重なっていた部分だけ表示が消えた状態となってしまいます。
自分自身が最上位に来たときに再描画するようにすれば良いと思うのですが
何のMessageを捕まえればよいのでしょう?
0091デフォルトの名無しさん
2008/05/27(火) 06:43:050092デフォルトの名無しさん
2008/05/27(火) 08:44:120093デフォルトの名無しさん
2008/05/27(火) 11:00:310094デフォルトの名無しさん
2008/05/28(水) 22:33:46タブMDIやリボンバーを実現するクラスの仕様や構成をご存じの方いますか?
0095デフォルトの名無しさん
2008/05/29(木) 09:35:55ttp://msdn.microsoft.com/en-us/library/bb982354.aspx
ふつーにMSDNライブラリでどーぞ
0096デフォルトの名無しさん
2008/05/31(土) 11:13:03非アクティブ時も処理したい場合、どのように書けばよいですか?
0097デフォルトの名無しさん
2008/05/31(土) 11:58:380098デフォルトの名無しさん
2008/05/31(土) 14:19:420099デフォルトの名無しさん
2008/05/31(土) 14:26:080100デフォルトの名無しさん
2008/05/31(土) 14:39:15ボタンが押されたら任意に設定したキーイベントを発生させたいんです。
0101デフォルトの名無しさん
2008/05/31(土) 15:27:22できないこともないけどMFCとは関係ない
0102デフォルトの名無しさん
2008/05/31(土) 15:45:44MFCでSDIアプリを作っている。CMainFrameのメンバにCDialog m_toolDlgを保持して、
モードレスで実体化させている。
やりたいことは、モードレスダイアログ m_toolDlg のあるボタンが押されたときに、CHogeViewの向けて
メッセージ(?)を飛ばしたいのだけど、どういう枠組みを用意してやって、どういうメソッドを使ってやればいいのか
わからない。
どうも体系的に知識が不十分なのは分かっているのだけど、今時MFCの資料が無くて困っている。
だれかアドバイスをくれないだろうか。
0103デフォルトの名無しさん
2008/05/31(土) 15:58:58CView * pView = pFrame->GetActiveView();
あとはSendMessageするなりキャストして直接関数呼ぶなり好きにしろ。
0104デフォルトの名無しさん
2008/05/31(土) 16:12:07早速ありがとう。示してもらったとおりに SendMessage(WM_COMMAND, ID_XXX, 0) としたら、
Viewがうまく反応した。
感謝
0105デフォルトの名無しさん
2008/05/31(土) 16:14:05WM_PAINTならOnPaint()みたいな感じで
0106デフォルトの名無しさん
2008/05/31(土) 16:20:190107デフォルトの名無しさん
2008/05/31(土) 21:40:12ON_MESSAGE(WM_APP+n,OnXXXXX) とかだね
OnCommandとか直に呼ぶと、まずい場合もあるから↑書き方も覚えておくと良いかも
0108デフォルトの名無しさん
2008/06/04(水) 18:48:11もちろん、一番手軽なのはWM_TIMERで処理することだと思うけど、精度が低いので保留。
OnIdleをハンドリングして、中でtimeGetTime()を使って適切な時間をカウントしてやる方法も試してみたんだけど、こちらは常にCPUを100%使い切ってしまうのが厳しい。
実行している処理内容は大した負荷ではないはずなのに、CPUを使い切ってしまうとユーザがいやがるし、美しくない。
できれば、この両者の間ぐらいが方法が欲しい。つまり、まずまず精度が高くて、CPU使用率がむやみに100%に振り切らない方法。
自分はMFCやWin32APIの初心者なんだけど、何かいい企てや情報はないだろうか?
0109デフォルトの名無しさん
2008/06/04(水) 19:07:10参考
ttp://orangeknowledge.jpn.org/tips/game002.html
0110デフォルトの名無しさん
2008/06/04(水) 19:08:320111デフォルトの名無しさん
2008/06/04(水) 22:21:07書いてあったんですけどCFileのwriteとfwriteってどちらが速いですか?
また、それ以外にも速いファイルライト関数ってありますか?
0112デフォルトの名無しさん
2008/06/04(水) 22:34:010113デフォルトの名無しさん
2008/06/04(水) 22:35:540114デフォルトの名無しさん
2008/06/04(水) 23:41:51WindowsXPでVS2005なんですけど、CFileDialog等のコモンダイアログって
リソース上の文字列(“開く”とか)は実行環境に合わせ勝手にローカライズ
されませんよね?
環境に応じて表示言語を変えたい(少なくとも日本語←→英語の切り替え)を
やりたいんですけど、リソースIDとかがわからず、どこをどう触ればいいのか
途方に暮れてしまってるんですが、何かセオリーってありますか?
0115デフォルトの名無しさん
2008/06/04(水) 23:46:07ダイアログ自体書き換えれるし
0116デフォルトの名無しさん
2008/06/05(木) 00:12:34いつのまにか、テンプレート クラス用のメッセージ マップなんて
作られたんだね。結構使われてるのかな?
0117114
2008/06/05(木) 00:17:00レスありがとうございます。
ちなみにコモンダイアログのリソースIDはどこで確認すればいいのでしょうか?
目ぼしいドキュメントが見つからなくて、てっきりリソースIDは無いものだとばかり・・・
0118デフォルトの名無しさん
2008/06/05(木) 00:20:35わかりました。結局あなた達も知らないのですね。
>速度程度なら、ループさせてGetTickCount()あたりでも計測すればいい
そんなしょぼい精度の計測はせず、QueryPerformanceCounter()で計測します。
0119デフォルトの名無しさん
2008/06/05(木) 00:31:410120デフォルトの名無しさん
2008/06/05(木) 07:35:44別スレとか方法としてはいくつもあるけど正確な更新をするのであればMFCベースでやらないほうがいい。
0121デフォルトの名無しさん
2008/06/05(木) 09:20:580122デフォルトの名無しさん
2008/06/05(木) 16:27:10Dlgs.h の中の edt1 とかの値が使われている。
0123デフォルトの名無しさん
2008/06/05(木) 17:35:11fpsの調節をするためにビジーループでQueryPerformanceCounterを呼び出していると、
環境によっては数秒に一度関数からしばらく戻って来ないでフリーズする現象が発生します。
0124デフォルトの名無しさん
2008/06/05(木) 20:22:5330 fps をきっちり正確に表示する必要は全くない
人間の目なんて、数コマ落ちしようと時間間隔が多少
ずれてもわからんのよ
よって、秒単位に適当に切り捨てればよい
0125デフォルトの名無しさん
2008/06/05(木) 20:54:18LRESULT SendMessage( HWND, WPARAM , WPARAM, LPARAM );
これを使いたいんですが、HWNDがない方になっちゃいます。
::つけるようだった気がするんですが違うみたいでした。
0126デフォルトの名無しさん
2008/06/05(木) 21:08:000127デフォルトの名無しさん
2008/06/05(木) 22:01:080128デフォルトの名無しさん
2008/06/05(木) 22:05:00頭にクラス名がついていない代わりだ
ていうか、自動補完が動いてないだけで、書けばコンパイルはとおるだろ?
0129デフォルトの名無しさん
2008/06/06(金) 20:29:320130デフォルトの名無しさん
2008/06/06(金) 22:39:29やりたいことは、指定の画像(800*600)をビューでピッタリ描写すること。
いや、CMainFrame::PreCreateWindow()でcs.cx, cs.cyを設定すればいいのは分かるんだけど、ここに800, 600と入れるとウィンドウサイズが800,600になって、Viewの描写領域のサイズはメニューやツールバーに削られた小さな領域になってしまう。
メニューやツールバーの領域をあらかじめ計算して大きめのウィンドウサイズを指定する方法があるけど、それはあまりにスマートじゃないので、何かベンツのやり方はないだろうか?
0131デフォルトの名無しさん
2008/06/06(金) 22:43:45そいつらの高さや幅をあらかじめ加算しておけば?
メニューやステータスバーのサイズはあらかじめわかるだろうし
0132デフォルトの名無しさん
2008/06/06(金) 23:10:210133デフォルトの名無しさん
2008/06/07(土) 00:14:28情報ありがとう。教えてもらった情報を試してからまた報告に来ます。
0134デフォルトの名無しさん
2008/06/07(土) 01:51:100135デフォルトの名無しさん
2008/06/08(日) 13:47:23その部分は自前で算出してやらなきゃいけないみたい。
0136デフォルトの名無しさん
2008/06/08(日) 14:12:33WinAPIではガリガリ組めるレベルだ。
0137デフォルトの名無しさん
2008/06/08(日) 14:17:38逆に隠ぺいされすぎて、ムカつくかもしれないけどw
とりあえず、MSが配布してるサンプル読んで理解して、あとは適当に自力で作ってみたらいいんじゃないかな
0138デフォルトの名無しさん
2008/06/08(日) 14:18:34実装を一通り経験すべし
その後にドキュメント/ビュー に進むがよい
0139デフォルトの名無しさん
2008/06/08(日) 14:19:18隠蔽されすぎてるのかw
わかった取りあえず、サンプル読みまくるよ。
ところで、MFC自体のソースって公開されてるの?
0140デフォルトの名無しさん
2008/06/08(日) 14:22:04たしかに、先にダイアログから手をつけるべきだな
サンプルは公式にあったと思う
0141デフォルトの名無しさん
2008/06/08(日) 14:36:12後はそれにアプリケーションレベルの仕組み(Doc/Viewとか)があるくらい。
コマンドメッセージとかはちょっと複雑なルート辿るけどね。
0142デフォルトの名無しさん
2008/06/08(日) 14:44:17ダイアログから読んでいろいろやってみるよ。
0143デフォルトの名無しさん
2008/06/10(火) 10:57:47ハンドルを意識する必要が全くなければいいんだけどね。
0144デフォルトの名無しさん
2008/06/10(火) 14:02:25別のPCで起動させた際に不正なファイルとでて起動できませんでした
プログラムを組んだPCではきちんと起動するのですが原因がわかりません
原因についてわかる方、教えていただけませんか
PCのOSは両方ともWinXP Pro SP2です
VS2005は片方にしか入っていません
よろしくお願いいたします
0145デフォルトの名無しさん
2008/06/10(火) 14:29:460146デフォルトの名無しさん
2008/06/10(火) 14:40:41作り方教えてください。
0147デフォルトの名無しさん
2008/06/10(火) 14:44:040148デフォルトの名無しさん
2008/06/10(火) 14:46:54http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ja
0149デフォルトの名無しさん
2008/06/10(火) 18:29:14ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt
VS2005にもスタティックリンク出来ないグレードあるんだっけ?
0150デフォルトの名無しさん
2008/06/11(水) 01:37:33ありがとうございます。
そこに書いてあるように「マルチスレッド 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
といったエラーがでるようになってしまいました
解決方法がわかれば教えていただけませんか
0151デフォルトの名無しさん
2008/06/11(水) 03:25:31>解決方法がわかれば教えていただけませんか
>Please use the /MD switch for _AFXDLL builds
0152デフォルトの名無しさん
2008/06/12(木) 00:11:07何行かread(大体1000行ぐらい)していると、stringのバッファサイズが何とかという
実行時エラーが出てしまいます。何か対策はありませんでしょうか。
0153デフォルトの名無しさん
2008/06/12(木) 01:17:160154デフォルトの名無しさん
2008/06/12(木) 02:24:330156デフォルトの名無しさん
2008/06/12(木) 09:46:490157デフォルトの名無しさん
2008/06/12(木) 14:47:45↓
OnTimerでInvalidate(FALSE);
↓
アニメが終わったらKillTimer(m_timerID);
ピクチャーコントロールにビットマップを表示してるダイアログで
これでアニメーションをしてると、
タイマー開始するたびに4Kずつ使用メモリが増えていきます
なぜでしょうか
0158デフォルトの名無しさん
2008/06/12(木) 15:31:49お前んとこのバグに決まってるだろ
0159デフォルトの名無しさん
2008/06/12(木) 18:36:16m_timerIDって解放しなくてよかったっけ。
時計の電池を抜いて止めても時計の本体は残っている状態のような。
0160デフォルトの名無しさん
2008/06/12(木) 18:43:370161デフォルトの名無しさん
2008/06/12(木) 22:29:14メモリ上からは失敗(何も描画されない)します。
どうするのが適切なのか、教えてください。
//// リソース読み込み
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);
0162デフォルトの名無しさん
2008/06/12(木) 22:51:05m_buf[(10*24/8+7)&~3*10];
0163デフォルトの名無しさん
2008/06/12(木) 22:56:00元のは横240*縦240*3バイトだったのを編集したときに4バイトアライメントを失念してました。
すみません。
CreateBitmapでいけることはいけるんでしょうか?
0164デフォルトの名無しさん
2008/06/13(金) 00:02:12Windowsのハンドルは参照カウンタで管理されているわけではないので注意しる。
0165デフォルトの名無しさん
2008/06/13(金) 00:03:100166161
2008/06/13(金) 19:45:30リソース読みのm_bmpを使い回して、32bppに変換したデータをSetBitmapBitsすることで表示されるようになった。
0167デフォルトの名無しさん
2008/06/13(金) 21:36:420168デフォルトの名無しさん
2008/06/13(金) 22:22:12まあ、直接イメージを弄るなら普通はCreateDIBSectionを使う。
MFCならCImageだな。
0169デフォルトの名無しさん
2008/06/14(土) 12:20:400170デフォルトの名無しさん
2008/06/14(土) 12:28:420171デフォルトの名無しさん
2008/06/14(土) 12:57:230172デフォルトの名無しさん
2008/06/14(土) 13:15:250173デフォルトの名無しさん
2008/06/14(土) 13:29:080174デフォルトの名無しさん
2008/06/14(土) 13:35:47GDI+ の BitBlt はソフトウェアのみで処理するので遅い
0175デフォルトの名無しさん
2008/06/14(土) 16:29:180176デフォルトの名無しさん
2008/06/14(土) 16:31:13この手の話するならここかWin32になるのか?
0177デフォルトの名無しさん
2008/06/15(日) 12:48:15FTP転送状況を取得するにはOnStatusCallbackをオーバーライド
する、とのことだったのでマニュアルを見たのですが、
▼▼▼
OnStatusCallback
(DWORD dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
dwInternetStatus
コールバックの理由を示すステータス コード。指定できる値については、後の「解説」を参照してください。
lpvStatusInformation
このコールバックに関する情報を格納しているバッファへのポインタ。
▲▲▲
上記の引数によりファイルの転送済みサイズとかが取得できるように
なるのかなと思ったのですが、マニュアルにはそれらしき記述はありません
でした。
OnStatusCallbackの中でどのような処理をすれば転送済みファイルサイズとか
取得できるのでしょうか。
ご教示のほど、よろしくお願いします。
0178デフォルトの名無しさん
2008/06/15(日) 14:01:26>なるのかなと思ったのですが
なんでそんなこと思ったの?
0179デフォルトの名無しさん
2008/06/15(日) 15:03:42OnStatusCallbackをオーバーライドして、FTP転送状況を提供
してやるってことじゃねえの?
でなきゃ、オーバーライドする意味ないし。
0180デフォルトの名無しさん
2008/06/15(日) 15:21:41しかし、転送済みサイズが取得できるとはどこにも書いてないし、そもそもなんでそんな発想できるのかと。
# 要は、私もOnStatusCallbackで転送済みサイズが取得*できない*とは確認していないのだけどね。
0181デフォルトの名無しさん
2008/06/15(日) 16:21:11FTPコマンドとかフリーのFTPソフトで転送経過(%)が表示されているのってどうやってるんでしょうね。
0182デフォルトの名無しさん
2008/06/15(日) 16:32:100183デフォルトの名無しさん
2008/06/15(日) 17:12:09そりゃぁあんた、FTPクライアントがMFCを使う義理なんてないからねぇ。
0184デフォルトの名無しさん
2008/06/18(水) 21:08:44ダイアログの中のstatic textを変更したいのですが、SetDlgItemTextを呼ぶとassertで止まります。
assertはm_hWnd=NULLが原因です。
しかしCDialogの中のCWnd周りは勝手にやっているので、nullは仕様かと思われます。
m_hWndを必要としない、static text変更の命令はどれに当たるのでしょうか?
またはMFCはそういうことが出来ない仕様なのでしょうか?
0185デフォルトの名無しさん
2008/06/18(水) 21:19:31ちなみに、それを呼び出しているタイミングは?
OnInitDialog()とか?
0186デフォルトの名無しさん
2008/06/18(水) 21:42:29生成されたウィンドウに対して設定するというのが一般的なやり方。
0187デフォルトの名無しさん
2008/06/18(水) 22:33:08VC8と9は重すぎて使用に耐えません。。。
0188デフォルトの名無しさん
2008/06/18(水) 22:38:00夏くらいとも聞いた気もするけど自信がない
0189デフォルトの名無しさん
2008/06/19(木) 00:41:07CProgressCtrl::Createで直接スタイル指定して作れないか?
リソーススクリプトを直接編集してもいいけど、IDEで弄ったらたぶん消える。
0190デフォルトの名無しさん
2008/06/19(木) 02:41:15OnDestroy()が自動生成されないのですが、これって自分で作らないとだめなんですか?
ためしに自分で
virtural void OnDestroy()でオーバーライドしてみたんですが、
OnDestory()内にコード書いても動作してくれません。
0191デフォルトの名無しさん
2008/06/19(木) 06:08:330192184
2008/06/19(木) 15:45:20試してみたのですが、GetDlgItemも内部でm_hWndがnullだとassertにヒットするので出来ませんでした。
呼び出すタイミングはOnInitDialogでやっています。
もうちょっとしたら別のとこでもやる予定ですが、今は初期値を入れているだけです。
>>186
設定をしようとすると、m_hWndがnullのため設定出来なくて困っています。
自前でダイアログを呼んで返り値のハンドルを保存しているならいいのですが、MFC側で隠蔽され何故か保存されていないため、どうしたらm_hWndに値を入れられるかというのが一番悩んでいるところです。
0193デフォルトの名無しさん
2008/06/19(木) 16:12:440194デフォルトの名無しさん
2008/06/19(木) 16:13:28普通はちゃんと入っているよ
そもそもWM_INITDIALOGメッセージを送るのにもウィンドウハンドルは必要だろ?
0195デフォルトの名無しさん
2008/06/19(木) 16:40:33いきなり家具を買われても困るだろ
0196デフォルトの名無しさん
2008/06/19(木) 17:25:59>呼び出すタイミングはOnInitDialogでやっています。
が、CDialog::OnInitDialog を呼ぶ前でした、というオチを想像した。
0197デフォルトの名無しさん
2008/06/19(木) 18:53:57CDialog::OnInitDialog → UpdateData → DoDataExchange
が呼ばれる前だから、まだNULLの状態になるな。
0198デフォルトの名無しさん
2008/06/19(木) 19:37:070199192
2008/06/19(木) 20:24:32皆さんありがとうございます。
0200デフォルトの名無しさん
2008/06/19(木) 20:51:020201デフォルトの名無しさん
2008/06/19(木) 20:52:450202デフォルトの名無しさん
2008/06/20(金) 00:03:25message_mapにon_wm_destroy定義してある?
自分で記述しないで、どのバージョンか知らんがVSにまかせたら?
0203デフォルトの名無しさん
2008/06/22(日) 15:55:10内容を簡単に説明すると、一つのデータベース(自作)を参照する複数のビューがあり、
それらは同時に表示可能であるといったものです。
ただ、常駐型なのでタスクバーに表示されないようにしたいのと、外見上メインフレームの
みを非常時にしていのですが、メインフレームを非表示にすると、それのビューまでが非表
示になってしまいます。
メインフレームとビューの表示・非表示を個別で制御することはできないでしょうか?
0204デフォルトの名無しさん
2008/06/22(日) 16:29:29メインフレーム以外のフレームつくればいいんでねえの?
0205デフォルトの名無しさん
2008/06/22(日) 17:15:03独立したウインドウにして切り離すしかない
0206デフォルトの名無しさん
2008/06/22(日) 18:30:310207デフォルトの名無しさん
2008/06/22(日) 19:13:16複数のダイアログに同じ内容のコントロールを使うことで、何が問題となるのかわからん。
0208デフォルトの名無しさん
2008/06/22(日) 19:31:14ダイアログを作るたびにコントロールの初期設定とかで同じ処理を何度もコピペして書いて、
修正するときは同じ部分を全部書き直すのが無駄な気がして、もっと楽にできる方法がないかと思って。
0209デフォルトの名無しさん
2008/06/22(日) 19:34:580210デフォルトの名無しさん
2008/06/22(日) 19:53:38"同じ内容のコントロール"を持ったダイアログを基底クラスとしてつくって、
そっから派生させたらどうだ?
0211デフォルトの名無しさん
2008/06/22(日) 20:24:30プロジェクトを作った直後にビルドし、ツールバーにある印刷ボタンなどを押すと落ちました。
自分で置いたツールバー(CToolBar)も同じ状態です。
今までのバージョンでは確認出来ないのですが、VC8では何か処理を噛まさないといけないのでしょうか。
0212デフォルトの名無しさん
2008/06/22(日) 20:52:25VC側のバグを疑ってるならサポートに聞くしかない
0213デフォルトの名無しさん
2008/06/22(日) 21:28:55なるほど、そちらで聞いてみます。
0214デフォルトの名無しさん
2008/06/22(日) 22:25:38その場合MESSAGE_MAP・DoDataExchangeのリソースIDはどうすれば良いでしょうか?
0215デフォルトの名無しさん
2008/06/22(日) 22:41:02何を問題としているかわからん。
0216デフォルトの名無しさん
2008/06/23(月) 00:04:30ということはCMDIFrameWndをそのまま使用して実現することは出来ないということでしょうか?
0217デフォルトの名無しさん
2008/06/23(月) 07:45:17正式版待った方がいいと思って粘ってるんだけど、なんか羨ましいな
0218デフォルトの名無しさん
2008/06/23(月) 10:06:02ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200402/04020028.txt
これと同じ問題だとしたら、VC2003から直っていないバグかも。
自分でも試してみた限りでは、デバッグ時のASSERTに引っかかって落ちるだけで、
リリース版では落ちることは無く、他のウィンドウをクリックすると回復したけど、
MFCのソースも結構いい加減だな。
0219デフォルトの名無しさん
2008/06/24(火) 16:44:08Type四角形にした時の
プログラムでの
色の変更ってどうすればいいですか?
0220デフォルトの名無しさん
2008/06/24(火) 17:22:12オーナードローにするか、テキストのスタティックにしてOnCtlColor使うかするといいかも。
0221デフォルトの名無しさん
2008/06/24(火) 17:36:590222デフォルトの名無しさん
2008/06/24(火) 18:22:580223デフォルトの名無しさん
2008/06/26(木) 01:30:08APIがシステムハンガリアン記法なんで、色々書きづらいと思うけど
0224デフォルトの名無しさん
2008/06/27(金) 18:24:55m_Combo.GetLBText(m_Combo.GetCurSel(),str);
だと取得できませんでした。
0225デフォルトの名無しさん
2008/06/27(金) 18:34:40ドロップダウンスタイルのエディットコントロール部分が欲しいの?
もしそれなら、GetWindowtext()で。
0226デフォルトの名無しさん
2008/06/27(金) 18:55:29できましたー。ありがとうございます!
0227デフォルトの名無しさん
2008/06/27(金) 21:24:00大幅なバージョンアップだな
0228デフォルトの名無しさん
2008/06/27(金) 21:48:460229デフォルトの名無しさん
2008/06/27(金) 22:35:580230デフォルトの名無しさん
2008/06/28(土) 00:16:00VCにとっては
0231デフォルトの名無しさん
2008/06/28(土) 17:16:44C〜Viewは取得できないのでしょうか。
CMainFrmのメンバクラスかと思ってたのですがそうではないですよね。
0232デフォルトの名無しさん
2008/06/28(土) 17:18:100233デフォルトの名無しさん
2008/06/28(土) 19:02:200234デフォルトの名無しさん
2008/06/28(土) 20:54:22どれから手をつけていいのかわからん。
どれがいい?
0235デフォルトの名無しさん
2008/06/28(土) 21:18:560236デフォルトの名無しさん
2008/07/01(火) 14:16:59MFCのダイアログベースでプロジェクトを作成
↓
プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更
↓
エディットボックスとリッチエディット2.0を適当に配置
↓
エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加
↓
InitInstance()内に AfxInitRichEdit2(); を追加
↓
あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。
すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。
例えば“ÄÅÆ”を入力すると、エディットボックスではそのまま“ÄÅÆ”なのに、リッチエディット2.0では“AAA”になります。
※入力している段階では“ÄÅÆ”と表示されています。GetWindowText関数で取得すると“AAA”になってしまいます。
リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。
0237236
2008/07/01(火) 14:48:29環境は Visual Studio .NET 2003 です。
0238デフォルトの名無しさん
2008/07/01(火) 15:03:110239デフォルトの名無しさん
2008/07/01(火) 15:12:41できます。
それも含め、エディットボックスでならすべてうまくいっています。
ただ、リッチエディットだとうまくいかないんです・・・
0240デフォルトの名無しさん
2008/07/01(火) 15:58:18VS2008だけど。2003もあるんでちょっとやってみる。
0241デフォルトの名無しさん
2008/07/01(火) 16:37:130242デフォルトの名無しさん
2008/07/01(火) 16:55:07文字エンコーディングの指定かとも思ったが、
ttp://oshiete1.goo.ne.jp/qa4140782.html
マルチみたいだからもうやめた。
0243236
2008/07/01(火) 17:06:44回答ありがとうございます。
やっぱり2003のリッチエディットはUnicodeに対応してないんですかねぇ・・・
あ、その添付のURLは私が上げた質問ですw
OKWaveで質問しても回答が得られなかったのでこっちに来た次第です。
0244デフォルトの名無しさん
2008/07/01(火) 17:25:21ちょっと変更必要だったけど、まあわかるっしょ。
ttp://d.hatena.ne.jp/halts/20030805
0245デフォルトの名無しさん
2008/07/01(火) 17:33:380247デフォルトの名無しさん
2008/07/01(火) 18:54:28・・・とはいっても、>ex と書くべきところを >ex と書いてあったり、TCHAR*型のポインタを渡すべきところにCString型変数を渡してたりと、なかなか誤字の多いページでしたけど。
0248デフォルトの名無しさん
2008/07/01(火) 18:56:28オレはそこはLPCTSTRにした。
結局、コードページ1200にしてEM_GETTEXTEXが必要ってことみたいだな。
0249247
2008/07/01(火) 18:57:17> とはいっても、>ex と書くべきところを >ex と書いてあったり
「&gtex」を半角で打つと「>ex」になってしまうようですね。前者の「>ex」は「&gtex」のつもりで書きました。
0250デフォルトの名無しさん
2008/07/01(火) 19:29:57現在P4 2.8Gを使っているのですが、処理によってはCPU使用率が80%を超える場合があります。
もしC2Dなどのマルチコアで実行した場合、
何も気にせず組むと1つしか使っていない(=現状より処理が重い)という状況になるかと思ったのですがどうなのでしょうか。
0251デフォルトの名無しさん
2008/07/01(火) 19:54:070252デフォルトの名無しさん
2008/07/01(火) 20:03:33今でもまともにマルチコアを使いこなしてるソフトなんて、エンコーダくらいしかないし
0253デフォルトの名無しさん
2008/07/01(火) 20:10:27複数のファイル平行してコンパイルするからね
0254デフォルトの名無しさん
2008/07/01(火) 20:13:11かなり速いぞ
クロックだけで判断しないほうがいい
0255デフォルトの名無しさん
2008/07/01(火) 20:15:04現状1つのアプリ内で有効に活用できる機会はあまり無いわな。
0256デフォルトの名無しさん
2008/07/01(火) 20:16:310257250
2008/07/01(火) 20:39:43特殊なことをしない限りMFCでマルチコア云々を特に考える必要は無いのですね。
0258デフォルトの名無しさん
2008/07/02(水) 16:19:51構造体ならうまくいくのですが、クラスだと
fatal error LNK1120: 外部参照 1 が未解決です。
になってしまいます。解決方法ご存じでしょうか?
0259デフォルトの名無しさん
2008/07/02(水) 16:24:16その外部参照1の名前から推測できないの?
0260デフォルトの名無しさん
2008/07/02(水) 17:32:400261デフォルトの名無しさん
2008/07/02(水) 17:42:14error 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) で参照されました。
というエラーが弊出します
0262デフォルトの名無しさん
2008/07/02(水) 17:48:29最初に競合してるとかのエラーは出てない?
0263デフォルトの名無しさん
2008/07/03(木) 01:06:37あと、構造体ならうまくいくって、どううまくいくんだ?
0264デフォルトの名無しさん
2008/07/05(土) 04:47:27マルチスレッドで作った別スレッドの中で実行するとエラーが出るんですが、どういう問題が考えられますか?
0265デフォルトの名無しさん
2008/07/05(土) 10:04:580266デフォルトの名無しさん
2008/07/05(土) 13:28:300267デフォルトの名無しさん
2008/07/05(土) 16:18:230268デフォルトの名無しさん
2008/07/05(土) 16:21:580269デフォルトの名無しさん
2008/07/05(土) 19:12:010270デフォルトの名無しさん
2008/07/05(土) 20:59:030271デフォルトの名無しさん
2008/07/06(日) 00:22:360272デフォルトの名無しさん
2008/07/06(日) 00:35:350273デフォルトの名無しさん
2008/07/07(月) 10:50:58メインフレームをクリックするとダイアログも並び順はそのままで他のアプリケーションの上にウィンドウが来るように組もうとしています。
例えば以下のようにウィンドウが並んでいる場合
デスクトップ) ダイアログ1 ダイアログ2 メインフレーム 他のアプリケーション (最前面
このメインフレームをクリックすると
デスクトップ) 他のアプリケーション ダイアログ1 ダイアログ2 メインフレーム (最前面
このように重なりを替えたいです。
しかしダイアログ1と2の前後関係が分からないため
デスクトップ) 他のアプリケーション ダイアログ2 ダイアログ1 メインフレーム (最前面
このようになってしまいます。
メインフレームを親にしてダイアログを生成するとダイアログの前面にメインフレームが持ってこれず躓きました。
重なり順をそのままに他のアプリケーションの前面に移動させるのは無理なのでしょうか。
0274デフォルトの名無しさん
2008/07/08(火) 03:55:36適当に座標を入れて、もう少し上だ、とかでずらしてコンパイルするしかないんですか?
0275デフォルトの名無しさん
2008/07/08(火) 14:41:53その基準を利用してみては。
見た目でなんとなく、というのならキミがやるしかないでしょ。
0276デフォルトの名無しさん
2008/07/08(火) 15:22:57ダイアログ上の座標は実行環境で可変だから
計算じゃなくて見た目で決めると実行時にずれる
0277デフォルトの名無しさん
2008/07/08(火) 16:03:040278デフォルトの名無しさん
2008/07/08(火) 20:45:58役に立つかどうかは別だが
0279デフォルトの名無しさん
2008/07/08(火) 21:25:240280デフォルトの名無しさん
2008/07/13(日) 18:29:59ボタンの横幅を文字数にあわせたりするのはどうしたら良いでしょうか?
0281デフォルトの名無しさん
2008/07/13(日) 18:47:52文字数から横幅を計算して合わせる
0282デフォルトの名無しさん
2008/07/13(日) 19:26:060283デフォルトの名無しさん
2008/07/13(日) 23:32:56MFCでダイアログを表示させる時に作成したボタンを
クリックしている状態にするのにはどうすれば良いでしょうか?
0284デフォルトの名無しさん
2008/07/13(日) 23:50:130285デフォルトの名無しさん
2008/07/13(日) 23:52:590286デフォルトの名無しさん
2008/07/14(月) 01:07:13それ以外なら、、3ステートボタンとか2ステートボタンで探してみて
0287デフォルトの名無しさん
2008/07/15(火) 02:50:21このとき、クリックされた座標が知りたい。どうすればいい?
0288デフォルトの名無しさん
2008/07/15(火) 09:50:52CPoint pt = GetMessagePos();
0289デフォルトの名無しさん
2008/07/15(火) 09:53:040290デフォルトの名無しさん
2008/07/15(火) 09:58:09CLICKEDはボタンを押して離した後に来るからマウス座標の概念は無いかもな。
サブクラス化してLBUTTONDOWNやUPを見たほうがいいかも?
0291デフォルトの名無しさん
2008/07/15(火) 10:00:16CLICKEDが最後のメッセージであると決まってればGetMessagePosでいいのかもしれん
0292デフォルトの名無しさん
2008/07/15(火) 10:04:48イベント発生時の座標はGetMessagePos。
ttp://msdn.microsoft.com/ja-jp/library/kt4by313(VS.80).aspx
0293デフォルトの名無しさん
2008/07/15(火) 11:52:42GetMessagePosも、
イベント発生時の座標=クリックされた座標では無いのが曲者だな
クリックされた座標を拾えるAPIは、もしかして無いんじゃね?
0294デフォルトの名無しさん
2008/07/15(火) 12:15:270295デフォルトの名無しさん
2008/07/15(火) 23:06:45みなさん、回答ありがとう。GetMessagePos() を使用して要望がかないました。
実際、実装したかったモノはCStaticにカラーグラデーションを配置して、簡易なカラーピッカを実現することでした。
実装してみるとクリック時よりもリリース時の座標の方が使い勝手がいいことが分かりましたが、
助言をヒントにこれも実現できそうです。
0296デフォルトの名無しさん
2008/07/16(水) 13:01:17char a[10]; CString s;
strcpy(a,s);
_tcscpy(a, s);
_tcscpy_s(a, s);
とか、CStringからcharへのコピーがうまくいきません。
誰かご教授くださいm(_._)m
0297デフォルトの名無しさん
2008/07/16(水) 13:29:260298デフォルトの名無しさん
2008/07/16(水) 13:33:19char a[10]; CString s;
strcpy(a, CT2A(s));
とか
USES_CONVERSION;
char a[10]; CString s;
strcpy(a, T2A(s));
とやれば動くだろうけど、そもそもaがchar配列なのは何故?
0299デフォルトの名無しさん
2008/07/16(水) 13:45:160300デフォルトの名無しさん
2008/07/16(水) 13:55:010301デフォルトの名無しさん
2008/07/16(水) 18:05:29ダイアログにメニューをつけたいのですが、やり方がわかりません。
下記URLのやり方をやってみようと思ったのですが、2箇所やり方がわからず、詰まってしまいました。
http://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」を記入すればよいと思っています。
ダイアログにメニューをつける方法を教えていただけませんでしょうか。
足りない情報があれば、ご指摘ください。
よろしくお願いいたします。
0302デフォルトの名無しさん
2008/07/16(水) 18:21:051.リソースビューの「IDR_MENU1」をシングルクリック
2.リソースビューの該当ダイアログIDをダブルクリック
(※VS2003だけど)
0303デフォルトの名無しさん
2008/07/16(水) 18:22:251. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ
2. でも、モバイルでダイアログにメニュー持たせられたっけ
0304301
2008/07/16(水) 18:35:44>>302
その通りにやってみましたが、ダイアログの編集が開くだけでした。
また、実行してみても、画面的に変化はありませんでした。
>>303
>> 1. メニューの編集閉じてから、リソースビューからメニュー右クリックでプロパティ出してみ
これはできました!リソースのプロパティでのIDの編集なのですね。
>> 2. でも、モバイルでダイアログにメニュー持たせられたっけ
ガーン。
もし無理ならばSDIで作り直して、メニューを編集することにします。
モバイルで可能かどうかって、何を調べればわかりますでしょうか?
0305デフォルトの名無しさん
2008/07/16(水) 18:54:01やっぱMSDN探すしかないか?
0307301
2008/07/16(水) 19:05:41MSDNでの探し方ってよくわからないんです。
モバイルで可能かどうかっていうのの情報が、どう書いてあるのかわからなくて。。。
.NET Compact Frameworkのどのバージョンに対応とか
そういうのは書いてある気がするんですけど、これはまた別の話ですよね?
# 当方MFCとかCompactFrameworkとかが何を指しているのかわかっていません。
言葉の意味はわかるのですが、具体的に何を指しているのかわからないのです。。。
たとえばCStringってクラスはMFCっぽい?とかそんなくらいの認識です。。。
0309301
2008/07/17(木) 13:07:04お邪魔しました。
0310デフォルトの名無しさん
2008/07/17(木) 23:00:15クリックしたらMessageBox表示するだけのアプリで、
何回かボタンクリックしてるとメモリ使用量が4K増えるんですけど、こういうもんなんですか?
0311デフォルトの名無しさん
2008/07/17(木) 23:09:050312デフォルトの名無しさん
2008/07/18(金) 00:38:13そんなもんだろう。
ページングがおこって4kが確保されたんだろうが、それ以上その動作で確保されることはない(とは断定できないが)。
0313デフォルトの名無しさん
2008/07/18(金) 05:34:53JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg|All Files (*.*)|*.*||
と設定していて最初はJPEG Filesの拡張子が表示されるんですがJPEG FilesからAll Filesに変えると何も表示されなくなります(JPEG Filesに戻しても表示されない)
あとXPですが左側にあるマイコンピュータを押してもCドライブなどが表示されず真っ白の状態(上と同じ)になります
これをちゃんと表示させる方法ありませんか?
0314デフォルトの名無しさん
2008/07/18(金) 06:56:50再インストールでもした方が良い。
0315デフォルトの名無しさん
2008/07/18(金) 16:28:22void C・・・Dlg::OnBnClickedButton1(){}
こんな形の場所だとhwndの指定がうまくできないんですがどうすればいいんですか?
0316デフォルトの名無しさん
2008/07/18(金) 16:44:21つGetDlgItem
0317デフォルトの名無しさん
2008/07/18(金) 16:59:32それ使いたいんですがGetWindowRectの引数が1個しか指定できなくて使えないんです
0318デフォルトの名無しさん
2008/07/18(金) 17:09:35GetDlgItem(IDC_XX)->GetWindowRect(&rc);
こういう事?
0319デフォルトの名無しさん
2008/07/18(金) 17:18:40ずっとGetWindowRect(GetDlgItem(hwnd,IDC_XX),&rc);こんな感じでしかできないものと思ってました
どうもです
0320デフォルトの名無しさん
2008/07/18(金) 17:20:59GetWindowRect()は、this->GetWindowRect()
のthisが省略された書き方だと言う事を意識した方が良い
0321デフォルトの名無しさん
2008/07/18(金) 19:25:160322デフォルトの名無しさん
2008/07/18(金) 19:39:36これ一番最初の方で習うだろ
別のやり方もあるけど、MFCでその方法教えない本はないと思う
0323デフォルトの名無しさん
2008/07/19(土) 09:48:03MFCなら変数化して使うのが一般的じゃないかな。
IDを変数に置きなおして直感的に触れるようにするのがMFCの特徴の1つでもあるし。
0324310
2008/07/19(土) 14:11:23亀で申し訳ないです。
void CmessageboxDlg::OnBnClickedButton1()
{
// TODO : ここにコントロール通知ハンドラ コードを追加します。
MessageBox("Message", "Title", MB_OK | MB_ICONWARNING);
}
で、張り付けたボタン→メッセージボックスのボタン
の順にクリックし続けると何回かに1回4K増えます。
ボタンにフォーカス当ててエンター押しっぱなしだとより
顕著に増加します。
それ以外の部分はダイアログベースのスケルトンです。
0325デフォルトの名無しさん
2008/07/19(土) 21:07:10放っておけば適当な間隔で解放されるから、あまり気にしなくても良いと思うけど。
0326デフォルトの名無しさん
2008/07/19(土) 21:21:25環境によって違うけど、ある程度時間を待てば解放されると思う
0327デフォルトの名無しさん
2008/07/19(土) 23:57:52ってことだと思うけど俺は腰が重くてとても動く気になれないなw
0328デフォルトの名無しさん
2008/07/20(日) 08:36:39もしそうなら、同じOS・同じMFCバージョンでやらないと意味無いかもな。
さすがにメッセージボックス表示させるだけのコードなら大丈夫だと思うぜ。
MFCのバグの可能性を疑うのなら別だけど、それを言い出したらキリが無い。
0329デフォルトの名無しさん
2008/07/20(日) 09:51:32呼んだ人のハンドル渡すぐらいのことしかやってないから
特にメモリ使ってるようには見えないな
メモリ使ってるとしたらapiだろ
0330デフォルトの名無しさん
2008/07/20(日) 09:59:070331デフォルトの名無しさん
2008/07/22(火) 07:32:41EmeditorってMFC使ってないらしいけど
どうやって作ってるんですか
0332デフォルトの名無しさん
2008/07/22(火) 08:51:200333デフォルトの名無しさん
2008/07/22(火) 19:34:180334デフォルトの名無しさん
2008/07/23(水) 17:24:12ウィンドウが作られた後のイベントは何でしょうか?
0335デフォルトの名無しさん
2008/07/23(水) 17:49:440336デフォルトの名無しさん
2008/07/23(水) 20:01:25{
CWnd::OnCreate();
// ここに書け
}
0337デフォルトの名無しさん
2008/07/23(水) 20:51:34{
CDialog::OnInitDialog();
// TODO: ダイアログならこれの方がいい
// TODO: でもなんでダイアログだとこれの方がいいんだろう???
}
0338デフォルトの名無しさん
2008/07/23(水) 20:55:250339デフォルトの名無しさん
2008/07/23(水) 21:46:180340デフォルトの名無しさん
2008/07/23(水) 22:18:370341デフォルトの名無しさん
2008/07/23(水) 22:28:34リストビュー(レポート)でアイテムの高さを変更する
http://www.rainylain.jp/vc/QandA.htm#CListCtrl_ItemHeight
0342デフォルトの名無しさん
2008/07/28(月) 11:35:16ダイアログ内の状態に応じて、×ボタンなのでダイアログを閉じさせたくないのですが
どのイベントを拾ってどういう処理をすればいいのでしょうか?
0343デフォルトの名無しさん
2008/07/28(月) 11:41:44どっか(OnSyscommand等)で捕まえるのがいいかと。
×ボタン自体はSYSMENUのSC_CLOSEを消すと消える。
0344デフォルトの名無しさん
2008/07/28(月) 11:57:41ためしにOnCloseをオーバーライドしてみたんですが、終了時に呼ばれない。
ためしにOnOkとOnCancelも作ってみたけど・・・呼ばれないorz
何が悪いんでしょうか
0345デフォルトの名無しさん
2008/07/28(月) 12:05:52void Cmfc005Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == SC_CLOSE)
{
// ×ボタン
}
}
とか
0346デフォルトの名無しさん
2008/07/28(月) 13:56:57メッセージマップの設定もしているはずなんですが…
唯一呼ばれるのはOnInitDialogくらいです
エスパー助けて >o<
0347デフォルトの名無しさん
2008/07/28(月) 14:27:470348デフォルトの名無しさん
2008/07/28(月) 14:36:34クラス選択してプロパティ出して、上のイベントボタン押して
そこから追加してる?手でやってるならどれとどれ書いた?
0349デフォルトの名無しさん
2008/07/28(月) 14:37:380350デフォルトの名無しさん
2008/07/28(月) 23:39:08「On〜が全然呼ばれていないようです」
「メッセージマップの設定もしているはずなんですが」
どちらかが嘘だと思う。
0351デフォルトの名無しさん
2008/07/29(火) 10:05:31ID は IDCANCEL
0352デフォルトの名無しさん
2008/07/29(火) 12:22:44クローズボックスで閉じたときの話をしてるんだが。
>ID は IDCANCEL
そう。OnCancel が呼ばれるのは、IDがIDCANCELのダイアログの子ボタンが
NOTIFY投げてきたとき&ダイアログがESCキー検出したとき。
けど今それ関係ないから。
>>346
>継承したOn〜が全然呼ばれていないようです
仮想関数でもない OnClose に継承とか関係ない。
メッセージマップに ON_WM_CLOSE があれば、ディスパッチされるハズ。
0353デフォルトの名無しさん
2008/07/29(火) 12:34:05閉じるボタンでも閉じなくなってしまうから
閉じるボタンだったら閉じる処理を入れたのを思い出した
0354デフォルトの名無しさん
2008/07/29(火) 12:40:340355デフォルトの名無しさん
2008/07/29(火) 12:51:24そこでEndDialogしてるんだろ
void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}
0356デフォルトの名無しさん
2008/07/29(火) 12:57:18「閉じる」ボタンのメッセージハンドラについて
0357デフォルトの名無しさん
2008/07/29(火) 21:34:16ありがとうございます。
その方法で行の高さはかえれるようになりましたが、ヘッダの高さが変えられません。
どうすればいいでしょうか?
0359デフォルトの名無しさん
2008/08/02(土) 14:06:49ヘッダは別コントロールだから、そっちで何とかするしかないかも
0360デフォルトの名無しさん
2008/08/02(土) 20:22:34DDXとか初期化されて無いでしょ?
0362デフォルトの名無しさん
2008/08/04(月) 00:11:31こんな感じになってるからね。
大体、WM_CREATEの時点だと子ウィンドウはまだ存在しないと思うし。
0363デフォルトの名無しさん
2008/08/04(月) 23:01:35edit controlを2個
OKボタンを1個
作成しました。edit controlが共に値が入っていないと
OKボタンが非表示になるようにしたのですが
非表示の場合でも、Enterキーを入力するとOKが適用されてしまいます。
非表示の場合、Enterキーの無効化または常に無効化する方法を
ご存じの方はご教示ください。
0364デフォルトの名無しさん
2008/08/04(月) 23:05:57OnOkをオーバーライドしてそこにエディットコントロールの中身を調べるプログラムを書く。
もし空白など適切なものではない場合はreturnでそのまま返してやるだけ。
0365デフォルトの名無しさん
2008/08/04(月) 23:25:420366デフォルトの名無しさん
2008/08/05(火) 10:20:15同時にDisableにしておけばよいかと。
0367デフォルトの名無しさん
2008/08/05(火) 10:37:010368デフォルトの名無しさん
2008/08/05(火) 11:46:45OKボタンじゃなくて自分で作ったボタンにすればいい
0369デフォルトの名無しさん
2008/08/05(火) 13:32:40>OnOkはシステム定義のメッセージだろ
何を言っているのか解らんが、
1. IDがIDOKである、ダイアログの子ボタンからのBN_CLICKED を受け取ったとき
2. ダイアログ自身がキー入力を見て Enter だったとき
に、ダイアログから呼び出される仮想メンバ関数。
0370デフォルトの名無しさん
2008/08/05(火) 13:58:56WINUSER.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 */
0371デフォルトの名無しさん
2008/08/05(火) 14:16:02話をどこにもっていきたいのかわからん。
0372デフォルトの名無しさん
2008/08/05(火) 14:32:05リターンキーでIDOKを回避するにはこれだけじゃだめで、
その自分で作ったボタンをデフォルトボタンにする必要がある。
まあOnOK()捕まえたほうが確実だね。
0373デフォルトの名無しさん
2008/08/05(火) 15:53:18なんでDisableが無理?
Disableにすればエディットボックス上でEnter押しても効かなくなるけど。
>>369
> 2. ダイアログ自身がキー入力を見て Enter だったとき
> に、ダイアログから呼び出される仮想メンバ関数。
これは違う。
Enterキーはデフォルトボタンを押す操作。
キャンセルボタン上でEnterキーを押せばOnCancelがコールされるし、
自分で用意したボタン上ならそのハンドラがコールされる。
0374デフォルトの名無しさん
2008/08/05(火) 21:17:560375デフォルトの名無しさん
2008/08/05(火) 21:21:230376デフォルトの名無しさん
2008/08/05(火) 22:40:24OKボタンを削除してもOnOKが呼ばれるのは、IsDialogMessage()が、
デフォルトボタンが存在しないときにIDOKを発行しているからであって、
直接OnOKが呼ばれているのではないのでは?
OKボタン削除だけしておいて代わりのデフォルトボタンを用意しなかったり、
DM_GETDEFIDメッセージを処理しなかったりしているからそうなるだけ。
0377デフォルトの名無しさん
2008/08/08(金) 20:02:47どの部分でドロップしたファイルや開いたファイルのパスを取得するのでしょうか。
0378デフォルトの名無しさん
2008/08/08(金) 20:50:07取得しなくとも__argv or __wargvに保持されています。
DialogベースのアプリでないならCYourApp::InitInstanceのParseCommandLineでコマンドラインの解析が行われます。
argvなんて単語初めて聞いた!!という場合はParseCommandLineの利用をお勧めします。
0379デフォルトの名無しさん
2008/08/12(火) 14:27:14リストボックスのフォントを等幅フォントにしたいと思って、次のように書いたのですけど、反映されません。
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指定しても太字にならないし、何がなにやらよくわからないです・・・。
リストボックスの文字を等幅フォントに設定する方法を教えてください〜
0380デフォルトの名無しさん
2008/08/12(火) 14:37:120382デフォルトの名無しさん
2008/08/18(月) 06:32:06いろんなニュースに紛れてて気付かなかった
0383デフォルトの名無しさん
2008/08/19(火) 14:20:46ファイルのフルパスからファイル名を省いたフォルダパスを取得するのってどうするんでしたっけ?
0384デフォルトの名無しさん
2008/08/19(火) 14:41:01PathRemoveFileSpec()
0385383
2008/08/19(火) 14:41:34でしたね。。。
すまそ。
0387デフォルトの名無しさん
2008/08/19(火) 21:19:420388デフォルトの名無しさん
2008/08/19(火) 23:09:10splitpathなんてDOSの頃使ったっきりで、すっかり忘れてたよ
0389デフォルトの名無しさん
2008/08/22(金) 00:07:2310文字以上になった場合にメッセージボックスを表示させるにはどうしたら良いでしょうか?
0390名無し募集中。。。
2008/08/22(金) 00:29:000391デフォルトの名無しさん
2008/08/31(日) 01:07:17皆どこ行っちゃったんだろう?
0392デフォルトの名無しさん
2008/08/31(日) 01:42:320393デフォルトの名無しさん
2008/08/31(日) 03:16:540394デフォルトの名無しさん
2008/08/31(日) 11:28:580395デフォルトの名無しさん
2008/09/02(火) 14:28:56ブラザーのレーザープリンタが、ちょいちょいヒットするの
なんとかしてくれませんか?
0396名無し募集中。。。
2008/09/02(火) 14:49:17http://pc.watch.impress.co.jp/docs/2008/0902/brother.htm
0397デフォルトの名無しさん
2008/09/02(火) 19:22:38インストールされるようになったけど、あれはいいな。手軽に試せて。
0398名無し募集中。。。
2008/09/02(火) 21:06:180399デフォルトの名無しさん
2008/09/04(木) 23:22:19まだちゃんと仕様見てないが・・・ていうかテーマで挙動かわりやがる
0400デフォルトの名無しさん
2008/09/05(金) 09:17:49現在、VC6でMFCを用いて開発しています。
昨日、取引先から、過去に弊社が納品したソフトを、
「Google Chrome」みたいなマルチタスク方式を組み込んで
バージョンアップして欲しいという要求が来ました。
過去に納品したソフトにはタブで画面を切り替える部分がありますが、シングルタスクです。
この部分をマルチタスクにして欲しいという内容でした。
要求の理由は目新しさや安定性が売りになるからとのです。
まず、実現可能性の調査をすることが決定し、
私がその調査をすることになったのですが、
いろいろ検索したりして情報を探しても、
なかなか適した情報がヒットしない状況です。
で、質問なのですが、VC6で実現できるのでしょうか?
場合によっては最新の開発環境(VS2008だったかな)へ移行することも考えています。
よろしくお願いします
0401デフォルトの名無しさん
2008/09/05(金) 10:15:38たぶん、きっと
0402デフォルトの名無しさん
2008/09/05(金) 10:27:08まずはその違いを理解してから質問しろよ
0403デフォルトの名無しさん
2008/09/05(金) 11:26:07MFC は使用されていないみたいです。
VC6, VS2003, VS2008 を持っているおいらは負け組み? orz
0404名無し募集中。。。
2008/09/05(金) 16:52:12VISTAで開発するなら2008になるよなぁ
0405デフォルトの名無しさん
2008/09/05(金) 17:39:240406デフォルトの名無しさん
2008/09/05(金) 18:07:340407デフォルトの名無しさん
2008/09/05(金) 19:16:02釣りじゃないよね?
今から試してみよう
0408デフォルトの名無しさん
2008/09/05(金) 19:28:10warning C4396 が山のように出てるぞ
(Chome をビルド・改造するってスレはある?あれば移動します)
0409デフォルトの名無しさん
2008/09/10(水) 09:29:12フォントキャッシュが壊れた時のようにコンボボックスの右側の▽ボタンに6と表示されたり、画面全体(Windows含)が残像を残すようになったり。
データの受信を中止してもそのままで、またメモリ使用量を調べても特に増えてはいません。
InValidate関数等も試しましたが同じ現象が起こります。
最小化する、別の画面を最前面に表示する等で他の画面は正常に戻るのですが、再度リストを表示するとその瞬間に同じ症状が出ます。
どのような対策方法があるか教えていただけないでしょうか。
0410デフォルトの名無しさん
2008/09/10(水) 10:57:580411デフォルトの名無しさん
2008/09/10(水) 12:02:520412デフォルトの名無しさん
2008/09/10(水) 13:12:050413デフォルトの名無しさん
2008/09/10(水) 13:46:39普通無いケースだからなあ
0414デフォルトの名無しさん
2008/09/10(水) 15:23:51別スレッドでなんかやってるとか、
逆にシングルスレッドで表示の更新が止まってるとか。
0415デフォルトの名無しさん
2008/09/10(水) 15:46:550416デフォルトの名無しさん
2008/09/10(水) 17:24:260417デフォルトの名無しさん
2008/09/10(水) 19:20:41のか
0418デフォルトの名無しさん
2008/09/10(水) 19:23:340419デフォルトの名無しさん
2008/09/10(水) 21:56:10メモリーじゃないとすればGDIオブジェクトの数確認してみ。
タスクマネージャで表示メニューいじれば確認できる。
ひとつのアプリで使用できるGDIオブジェには上限があり
開放し忘れ関数が何度も呼ばれると409のような状態になる。
0420デフォルトの名無しさん
2008/09/11(木) 09:59:09タスクマネージャにそんな機能があるとは、知らなかった
これは便利
0421409
2008/09/11(木) 11:12:54単純なプログラムでも同じ状態になるので、何か単純な回避方法があるのではないかと思ったのです。
とりあえずGDIオブジェクトを調べてみようと思います。
ありがとうございました。
0423デフォルトの名無しさん
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版でやらなければいけない処理などがあるでしょうか?
また、間違ってる処理などがあれば教えてください。
0424デフォルトの名無しさん
2008/09/16(火) 00:04:300425デフォルトの名無しさん
2008/09/16(火) 00:17:590427名無し募集中。。。
2008/09/16(火) 00:57:28m_hMutex = ::CreateMutex( NULL, 0, "__HogeAppMutex__" ) ;
if ( ::GetLastError() == ERROR_ALREADY_EXISTS ) {
::CloseHandle( m_hMutex ) ;
m_hMutex = NULL ;
return( FALSE ) ;
}
0428デフォルトの名無しさん
2008/09/16(火) 13:22:56Releaseビルド時にも式の評価だけはしてくれるVERIFYマクロがあるよ
0429デフォルトの名無しさん
2008/09/16(火) 20:16:49共有メモリでもいいかも知れない。
共有メモリに最初に起動したウィンドウの
ハンドルを格納しておいて、
多重起動された時に最初に起動したウィンドウ
を最前面に表示させるとか・・・
0430デフォルトの名無しさん
2008/09/17(水) 00:00:23実はその方針では破綻する。
0431デフォルトの名無しさん
2008/09/17(水) 10:51:59>最初に起動したウィンドウの
>ハンドルを格納
する前に、二番目に起動したプロセスのウィンドウハンドルが
格納されてしまうかも知れないわけよ。
0432423
2008/09/17(水) 11:52:16>>427
これからはこれを多重起動の確認に使ってみようと思います。
ありがとうございます!
>>428
こんなマクロもあったんですね。
これからはASSERTの代わりに使ってみます。
0433名無し募集中。。。
2008/09/17(水) 16:24:05>多重起動された時に最初に起動したウィンドウ
>を最前面に表示させるとか・・・
>>427のreturn前にコレだな
CString strWndTitle ;
strWndTitle.LoadString( IDR_MAINFRAME ) ;
::SetForegroundWindow( ::FindWindow( NULL, (LPCTSTR)strWndTitle )) ;
0434デフォルトの名無しさん
2008/09/21(日) 14:03:320435デフォルトの名無しさん
2008/09/21(日) 15:03:100436デフォルトの名無しさん
2008/09/21(日) 15:26:380437名無し募集中。。。
2008/09/21(日) 15:46:460438デフォルトの名無しさん
2008/09/21(日) 16:36:400439デフォルトの名無しさん
2008/09/21(日) 16:57:36マクラいいなw
0440デフォルトの名無しさん
2008/09/21(日) 19:24:060441名無し募集中。。。
2008/09/21(日) 20:13:570442デフォルトの名無しさん
2008/09/21(日) 21:14:150443デフォルトの名無しさん
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 );
0444デフォルトの名無しさん
2008/09/29(月) 22:13:320445443
2008/09/30(火) 03:00:33LoadIconで2種類のサイズのアイコンを取得していると思っていたんですが、LoadImageで取得する必要があるのでしょうか?
今はこうやってアイコンを取得しています。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
0446デフォルトの名無しさん
2008/09/30(火) 08:07:470447デフォルトの名無しさん
2008/09/30(火) 09:44:390448デフォルトの名無しさん
2008/09/30(火) 20:42:14SetIcon(m_hIcon, FALSE)
ってあるけど、32x32のアイコンを16x16に縮小して表示するだけで、
16x16のアイコンを読み出して表示しているわけでは無かったりする。
DestoryIcon呼ぶの('A`)マンドクセ、ってのが理由だろうな。
0449デフォルトの名無しさん
2008/10/01(水) 22:44:16アイコン使うメリットってなんだろ?
0450デフォルトの名無しさん
2008/10/02(木) 14:45:03CArray<〜*, 〜*>& GetData()
{
return( m_arrData );
}
だと、コンパイル時にprivateにアクセスしています。みたいなメッセージが表示されます。
(他のクラスからアクセスしてる)
どのように書くのが正しいのでしょうか…
0451デフォルトの名無しさん
2008/10/02(木) 14:49:350452443
2008/10/03(金) 00:29:16>446-449
ということは16x16と32x32のアイコンをそれぞれロードする必要があるということでしょうか?
また、16,32,48ピクセルのアイコンをそれぞれ出力するにはどうすればいいんでしょうか?
0453デフォルトの名無しさん
2008/10/03(金) 07:56:310454デフォルトの名無しさん
2008/10/03(金) 09:55:19これと同じように、
m_hSmallIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
とかやればよし。
0455デフォルトの名無しさん
2008/10/04(土) 13:28:01GetClassName API
0456デフォルトの名無しさん
2008/10/05(日) 12:31:570457443
2008/10/05(日) 14:32:49無事アイコンの使い分けが出来るようになりました。
ありがとうございました!
0458デフォルトの名無しさん
2008/10/11(土) 21:06:35App::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);
}
0459デフォルトの名無しさん
2008/10/11(土) 21:30:40そこまでできてたらデバッガで調べるだろ
0460デフォルトの名無しさん
2008/10/11(土) 21:42:49デバッガでステップ実行すれば、正しいパスが渡せているかどうかは一発だな。
0461デフォルトの名無しさん
2008/10/11(土) 21:43:130462デフォルトの名無しさん
2008/10/11(土) 21:49:120463デフォルトの名無しさん
2008/10/11(土) 21:59:130464デフォルトの名無しさん
2008/10/11(土) 22:04:390465デフォルトの名無しさん
2008/10/11(土) 22:04:55実際、ファイルは出来上がっていない。しかし、GetProfileStringでデータは取れるという状態
0466デフォルトの名無しさん
2008/10/11(土) 22:31:210467デフォルトの名無しさん
2008/10/11(土) 22:52:140468デフォルトの名無しさん
2008/10/11(土) 22:56:44コードに書いてるのは、GetProfileStringなのか?
ぐぐり直したほうがいんじゃねーのか?
0470デフォルトの名無しさん
2008/10/11(土) 23:31:17WriteProfileStringなんか引数が全く同じだし。
0471463
2008/10/11(土) 23:34:38ありがとう><;まだ、MFCはじめたばかりなので、習ってCString使っていこうと思います><;
ただ単に慣習的なもののような気がしますが。
0472デフォルトの名無しさん
2008/10/11(土) 23:58:42そのまま使うとレジストリ保存だった。
正しくはWritePrivateProfileString() で最後に保存先指定でいけた
0473472
2008/10/12(日) 00:36:160474デフォルトの名無しさん
2008/10/12(日) 02:17:50愛は要らんから、CWinApp側のメソッドを使ってやろうぜ。
MFCだと、普通はCWinApp派生クラスがtheAppとしてグローバルで宣言されているはず。
0475デフォルトの名無しさん
2008/10/12(日) 04:27:45だれか教えてください。
0476デフォルトの名無しさん
2008/10/12(日) 04:30:12ダイアログ側のクラスで、CStaticのハンドルを指定してOnMouseMoveを受け取ればいい
どっちが綺麗かと言われると、ときと場合によるけど、前者の方がいいかな
0477デフォルトの名無しさん
2008/10/12(日) 05:43:560478デフォルトの名無しさん
2008/10/12(日) 12:12:43固有の名前をつけないと
0479デフォルトの名無しさん
2008/10/13(月) 08:06:30こちらの方法をもう少し詳しく教えてもらえないだろうか。
ON_WM_MOUSEMOVE() と void CFooDlg::OnMouseMove(UINT nFlags, CPoint point)
のセットで間に合うモノなんだろうか?
コントロールのIDはもちろんユニークなモノを付けている。
0480デフォルトの名無しさん
2008/10/13(月) 10:14:380481デフォルトの名無しさん
2008/10/13(月) 11:24:09ごめんなさい。問題解決しました。
今までクリックを検出するためにnotifyをtrueにしていたため、OnMouseMoveでは
コントロール領域のMouseMoveが取得できなかっただけでした。
0482デフォルトの名無しさん
2008/10/15(水) 20:11:56それがメニューからか、ツールバーからか、アクセラレータからか
などをコマンドハンドラ内で調べられませんか?
MFC内の隠し関数とかでも構わないのですけど。
コマンドハンドラまで来てしまったら絶対に区別できないですか?
0483デフォルトの名無しさん
2008/10/15(水) 21:09:110484デフォルトの名無しさん
2008/10/15(水) 21:12:190485デフォルトの名無しさん
2008/10/15(水) 21:43:28WM_COMMANDにそういうパラメータあったはずだから調べてみなさい。
0486デフォルトの名無しさん
2008/10/16(木) 21:01:29CWnd::GetCurrentMessage()を使って
WM_COMMANDの付加情報からコマンド発生元を取れました。
ありがとうございます。
0487デフォルトの名無しさん
2008/10/17(金) 17:54:12たくさん表示させると重いです
何か回避方法はありますか?
0488デフォルトの名無しさん
2008/10/17(金) 17:57:510489デフォルトの名無しさん
2008/10/17(金) 17:59:14仮想リストコントロール
ttp://msdn.microsoft.com/ja-jp/library/ye4z8x58(VS.80).aspx
0490デフォルトの名無しさん
2008/10/17(金) 18:34:18ありがとうございます。
心持ち軽くなったような気がするけどやっぱり重いです
これって
LVS_OWNERDATA で作成して
描画する文字列の部分を自分で割り当てるってことでいいんですよね。
仮想リストビュー
http://www.hokuriku.ne.jp/ymyamada/mfc/VirtualList.htm
ここも参考にしました。
やりかたまちがえてるのかな^^;
0491デフォルトの名無しさん
2008/10/17(金) 18:39:04更新すべき場所だけ更新すればOK
普通のリストだと表示部分全てに更新がかかるから重いだけ。
0492デフォルトの名無しさん
2008/10/17(金) 23:49:31ラジオボタン1
ラジオボタン2
が設置されていて、この二つのラジオボタンがグループで、
2を押したら1のチェックが外れるとします(逆もあり)。
今、2を押して、1のチェックが外れました。
ダイアログAのWindowProcにはラジオボタン1のコントロールIDで何かしらのメッセージが
飛んでくるのでしょうか?
ちなみに自分で試してみたところだとどうも飛んでこないようなのです。
ではラジオボタン1のチェックが外れた!というイベントをダイアログA上でキャッチすることはできないのでしょうか?
0493デフォルトの名無しさん
2008/10/18(土) 10:21:36チェックのON/OFFを手動にすれば、チェックをつけなおす前に以前の状態を調べればチェックが外れたかどうか調べれる。
0494デフォルトの名無しさん
2008/10/18(土) 10:22:25「ラジオボタン2が押された」→「ラジオボタン1のチェックが外れた」
でいいじゃん。
0495デフォルトの名無しさん
2008/10/18(土) 11:24:17WindowProc使った方法は知らん
0496デフォルトの名無しさん
2008/10/18(土) 13:10:47>>494
説明が足りませんでしたが事情によりチェックが外れた瞬間のイベント駆動の処理が必要なんです
まだチェックオンの瞬間は、オンクリックで拾うことはできますが、
ラジオボタンの場合、他のボタンを押したときに勝手に外れるので、オンクリックでは拾えず
また、SetCheck関数などで変更されたときもオンクリックでは拾えませんし悩んでます。
クリックから、関数から、などの入力方法に関わらず、とにかく「チェックが切り替わったとき」の
イベントが欲しいのです…
例えばエディットボックスなら内容を変更されたときのイベントを取れるとおもうんですが、
考えてるのは「今変わった!」というのがわかる、そんなイメージです…
>>495
どういったメッセージか、もしわかればヒントだけでも教えてください><
できるだけ自分で調べるつもりですので
0497デフォルトの名無しさん
2008/10/18(土) 13:16:170498デフォルトの名無しさん
2008/10/18(土) 17:36:14ttp://msdn.microsoft.com/en-us/library/cc678956.aspx
0499デフォルトの名無しさん
2008/10/18(土) 18:11:09>ラジオボタンの場合、他のボタンを押したときに勝手に外れるので
ラジオボタンのプロパティでそういう風に設定しているからだろ。
リソースでラジオボタンをダブルクリックしたときに作られる関数で、
SetCheckする前にチェックの状態が変わったかどうか自分で調べれば解決。
0500デフォルトの名無しさん
2008/10/18(土) 20:45:55とりあえずそのグループのラジオボタンのイベントを一箇所で捕まえて
今回選択されたラジオボタンと前回で選択されたラジオボタンが異なっていたら、
「前回選択されたラジオボタンのチェックが外れた」
と考えればいいと思う。
なんとなく>>496はWindowProcとか言ってるからMFCじゃない気もするが、
MFCならON_COMMAND_RANGE使って10行も必要ないから
とりあえずダメ元で試してみたら?
0501名無し募集中。。。
2008/10/18(土) 23:14:23リソースIDを連続させるためにresource.hを編集しちゃう俺はヘタレですか?
0502デフォルトの名無しさん
2008/10/19(日) 03:21:49ID指定するとき、=つけて数値指定できるけど、面倒だもんね。
0503デフォルトの名無しさん
2008/10/19(日) 22:43:58リソースIDが飛び飛びでも一つのハンドラにまとめられるけど、
こっちはあまり使われないのかな。
0504デフォルトの名無しさん
2008/10/21(火) 11:17:02CWinAppを派生したアプリケーションクラスが用意されますが、
これはDLL内の単独のスレッドというわけではないのでしょうか?
OnIdle()をオーバーライドしてもコールされないのですが。
0505デフォルトの名無しさん
2008/10/21(火) 18:20:070506デフォルトの名無しさん
2008/10/21(火) 19:20:58VC6で本の通りにブラウザとかつくりました。VC6の生成するブラウザだから
いまどきのWebページは開けないだろうと思っていたんですが、普通にうまくひらけました。Flushとかもです。
これは、VC6とはいえ、ブラウザエンジン?はいまどきのPCの最新のを(要するにIE7のを)
作成してくれるのでしょうか?
よろしく教えてください。
0508デフォルトの名無しさん
2008/10/23(木) 02:18:54ViewのOnDrawで縦軸横軸を引いて
その上にグラフを描画する方法がわかりません。
どなたか、わかる人教えてください。
0509デフォルトの名無しさん
2008/10/23(木) 06:44:330510デフォルトの名無しさん
2008/10/23(木) 15:16:36一つのEXEで問題なく、
日本語Win上では、日本語のダイアログ、
英語Win上では、追加した英語のダイアログが表示されたのですが、
現在選択しているリソースが日本語か英語か知りたいのですが、
プログラム実行時、
英語日本語のリソース切り替え選択はどの値を見て読み替えてるのでしょうか?
GetSystemDefaultLangID() 辺りは、コントロールパネルによって変化しているのは確認したのですが、
リソース読み替えとは関係ない様でした。
GetACP() , GetVersionEx()でも取得はできませんでした。
ご存知の方、ヒントだけでも御教授下さい。
よろしくお願いします。
0511デフォルトの名無しさん
2008/10/23(木) 15:32:35でも自分でFindResourceExする必要はある気がする。
0512デフォルトの名無しさん
2008/10/23(木) 15:44:510513デフォルトの名無しさん
2008/10/23(木) 16:21:45GetSystemDefaultUILanguage
も調べていたのですが、これはVC7以降のAPIの様です。
多分ですが、
GetSystemDefaultLangIDと同様、コントロールパネルのロケールIDを返すのではないかと思います。
コントロールパネルからロケールIDは変更できるのですが、
実行時に使用されるリソースは変化ありませんでした。
現在の状態が知りたいだけですので、動的に読み替える必要は今のところありません。
どうしても・・・となれば、リソースに番号振って、プログラム中から判定するという方法もあるのですが、
Kernel32あたりで、どう判断しているのかが知れればと思った次第です。
0514デフォルトの名無しさん
2008/10/23(木) 16:26:190515デフォルトの名無しさん
2008/10/23(木) 16:29:43インポートライブラリにもヘッダーにもないのなら作ればいいし。
0516513
2008/10/23(木) 18:13:02karnel32.libに無いので、呼べないのかと思ってました。
karnel32.dll をLoadLibraryして呼び出すことができました。
結果、
・日本語Win
GetSystemDefaultUILanguage() = 1041
GetUserDefaultUILanguage() = 1041
・英語Win (XP-Pro SPなし)
GetSystemDefaultUILanguage() = 2011628553
GetUserDefaultUILanguage() = 1033
と、
コントロールパネルに影響されないGetSystemDefaultLangID()と同じ値が取得できました。
ただ、リソース読み替えに使われているのかは不明なのと、
英語Winで、GetSystemDefaultUILanguageが不思議な値を返してくるのですが、
とりあえずは目的を果たせそうです。
助かりました。ありがとうございました。
0517デフォルトの名無しさん
2008/10/23(木) 18:18:39下16ビット、0x0409は10進で1033だから上と下で別々に意味もってるのかも。
0518デフォルトの名無しさん
2008/10/23(木) 19:16:010519513
2008/10/23(木) 19:27:20LANGIDFROMLCIDマクロを使ったところ、下位だけ抜けました。
言われるとおりのHEXで見るべきでした。
WINNT.H には、上位16bitは、Reserved、SortIDとコメントがありましたから、
Reservedは不明ですが、何か意味はありそうですね。
0520デフォルトの名無しさん
2008/10/24(金) 00:46:43CMyDialog mydlg;
if ( dlg.doModal() ){
0521名無し募集中。。。
2008/10/24(金) 13:39:41返り値はIDOKじゃないのか?
そもそもmydlgじゃないdlgって何者?
0522デフォルトの名無しさん
2008/10/28(火) 16:49:40通常はプロパティの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);
0523デフォルトの名無しさん
2008/10/28(火) 17:48:42m_Check1.SetButtonStyle(BS_ICON);
でもウィンドウサイズも変えないとアイコンの大きさにはならないかもな。
0524デフォルトの名無しさん
2008/10/28(火) 17:53:270525デフォルトの名無しさん
2008/10/28(火) 19:36:32絵や文字と一体化してる必要ないし、
隣に自分で絵や文字書いても何の問題もない。
0526デフォルトの名無しさん
2008/10/28(火) 19:42:590527デフォルトの名無しさん
2008/10/31(金) 18:07:01起動時、非表示にしたいのです。
CDialog dlg;
dlg.Create( IDD , this );
dlg.ShowWindow( SW_HIDE );
とやっているのですが、
一瞬表示されるのです。
OnInitdialogで
ShowWindow( SW_HIDE );
と記入しても。
回避できませんでした。
他に方法はありますか?
0528デフォルトの名無しさん
2008/10/31(金) 18:26:03ダイアログエディタでVisibleの初期値をfalseにしてもだめかな?
0529デフォルトの名無しさん
2008/10/31(金) 18:35:43いけました
ありがとうございます><
0530デフォルトの名無しさん
2008/11/01(土) 19:08:110531デフォルトの名無しさん
2008/11/01(土) 19:48:43standard以上を買ってください。
0532デフォルトの名無しさん
2008/11/01(土) 20:08:26ありがとうございました。
しつこい質問で申し訳ないですが、今少し困っていることがあります。
当方
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から記述しなければならないのでしょうか?
(初心者のため、バカなことかもしれませんが、ライブラリ
にはないため、自分で定義しなくてはならないのでしょうか?)
長文の上、稚拙な文になってしまいましたが、躓いてしまっている
ので、ご助力を加えて下されば幸いです。
よろしくお願いします。
0533デフォルトの名無しさん
2008/11/01(土) 20:25:42CDatabaseは C++ からODBCを介してSQL-Serverにアクセスするもので、
CDatabaseはMFCのクラスで、あなたは利用できないから、
ほかの手段を探すことになる。
ODBCの代わりにOLE-DBを使うこともできるし、
今からDBの勉強はじめるならこちらをお勧めする人が多いと思う。
"C++ OLE-DB SQL-SERVER アクセス"あたりのキーワードでぐぐればいいんじゃないかな。
というわけで、さようなら。
0534デフォルトの名無しさん
2008/11/01(土) 20:36:51ご教授ありがとうございました。
貴重なお時間を割いていただき、申し訳ございませんでした。
0535デフォルトの名無しさん
2008/11/02(日) 02:30:04vc 2005
MFCを使ってGETやPOSTでデータを送信するプログラムを作成しようと思います。
勉強になるサイトなどありませんか?
検索のヒントでもいいので宜しくお願いしまっす
0536デフォルトの名無しさん
2008/11/02(日) 05:29:150537デフォルトの名無しさん
2008/11/02(日) 18:18:14WebProg板
0539デフォルトの名無しさん
2008/11/02(日) 18:22:360540デフォルトの名無しさん
2008/11/02(日) 19:04:18MFCのクラスを使わずにやるんならスレ違い
0541デフォルトの名無しさん
2008/11/02(日) 19:16:10いやぁMFCのクラスを使いたいのですが・・・
んー検討つかないんです
検索ワードだけでもヒントをぉぉぉぉぉ・・・orz
0542デフォルトの名無しさん
2008/11/02(日) 19:31:30MFC ライブラリ リファレンス
インターネット クライアント アプリケーションの作成用の MFC クラス
更新 : 2007 年 11 月
MFC には、インターネット クライアント アプリケーションを作成するための以下のクラスとグローバル関数があります。
0543デフォルトの名無しさん
2008/11/02(日) 19:44:46ありがとうございます!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0544デフォルトの名無しさん
2008/11/02(日) 20:44:58MFC > 階層図
http://msdn.microsoft.com/ja-jp/library/ws8s10w4.aspx
0545デフォルトの名無しさん
2008/11/03(月) 02:18:47本当にありがとうございます・・・
階層図・・・目から鱗です・・・
0546デフォルトの名無しさん
2008/11/11(火) 10:30:14CString 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
0547デフォルトの名無しさん
2008/11/11(火) 10:51:26CStringT::Format
--------
文字列オブジェクト自体をパラメータとして Format に渡すと、呼び出しは失敗します。たとえば、次のコードの結果は保証されません。
CAtlString str = "Some Data";
str.Format("%s%d", str, 123);
--------
0548デフォルトの名無しさん
2008/11/11(火) 11:08:54その下に
----------
オプションの引数として文字列を渡すときは、LPCTSTR に明示的にキャストしてください。
書式は、printf 関数の書式引数と同じ機能を持っています。(書式や引数の説明は、
『ランタイム ライブラリ リファレンス』の「printf」を参照してください)。
書き込まれる文字列の終わりには NULL 文字が追加されます。
----------
とあったのですが、これはそもそも>>546の中でいう strValue のことであって、
自身を引数に指定するのはキャストしようが何しようがダメってことなんですよね?
0549デフォルトの名無しさん
2008/11/11(火) 11:36:26ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx
のほうには書いてないけど、
その説明は「キャストすれば自分自身を渡せるよ」ということでは無いと思う。
CStringTに書いてないということは昔はそういう制限でもあったのか、
それとも「CString::operator intなどを追加するかもしれないから、
LPCTSTRも明示的にキャストして渡しておけ」という意味じゃないだろうか。
0550デフォルトの名無しさん
2008/11/11(火) 12:52:46Format中に元のバッファが変わったら長さがかわるからバッファ足りなくなる。
0551デフォルトの名無しさん
2008/11/11(火) 14:19:28なるほど、ありがとうございました。
ちなみに>>548の文は
ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx
では無くなっちゃってるみたいですが、
VC6付属のMSDNに書かれていた文章です。
0552デフォルトの名無しさん
2008/11/11(火) 20:41:35GUI画面作成、メッセージ処理、メモリ管理、例外処理とか泣けてくるな…
まあでも刺激はあるからいいか…
0553デフォルトの名無しさん
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;
}
0554デフォルトの名無しさん
2008/11/13(木) 13:09:15の間違い。配列はなしね。
なお「g_」をつけているのはグローバル変数
0555デフォルトの名無しさん
2008/11/13(木) 14:12:14サスペンド中だったりしない?
0556デフォルトの名無しさん
2008/11/13(木) 14:38:07いま調べているんだけど、タイムアウトの10000ms以内には
絶対に終わるはずなんだけどなー。
でもそれが疑わしいか…
回答してくれてありがとん。
0557デフォルトの名無しさん
2008/11/13(木) 14:46:42原因はそこ以外にある?
0558デフォルトの名無しさん
2008/11/13(木) 14:57:53自分でもやってみたら確かに動いたんだよね。
Test()の処理部分に原因がありそうなのは間違いない。
(ここで10秒かかるってのは考えにくかったからここで質問させてもらったけど)
お騒がせさせてすまんかった。
>>557もありがとん
0559名無し募集中。。。
2008/11/13(木) 15:24:330560デフォルトの名無しさん
2008/11/13(木) 16:11:23Test()の処理部分に処理回数をカウントアップして、
Editボックスに毎回その値を表示する処理として
SetWindowTextを使っているんだけど、
Stop関数をコールした後、どうもそこで固まるらしい。
(SetWindowTextをコメント化したら問題がでなくなった)
…意味分からん。なんで最後の1回のSetWindowTextで固まる!?
0561デフォルトの名無しさん
2008/11/13(木) 16:17:20ULONG num; //処理回数
CString str;
str.Format("%d", num);
EditBox->SetWindowText(str);
とこんな感じ。
もちろん、メインウィンドウのハンドルはもらってきて、
使っている(その部分は省略しているけど)
0562デフォルトの名無しさん
2008/11/13(木) 16:50:110563デフォルトの名無しさん
2008/11/13(木) 16:53:40メインスレッドのメッセージループでそれを受け取らない以上、SetWindowTextからは返ってこないよ。
0564デフォルトの名無しさん
2008/11/13(木) 17:00:11>>562-563ありがとん
0565デフォルトの名無しさん
2008/11/14(金) 06:39:270566デフォルトの名無しさん
2008/11/14(金) 06:41:170567デフォルトの名無しさん
2008/11/14(金) 08:09:460568デフォルトの名無しさん
2008/11/14(金) 08:39:36そうです。
ウィザードの吐き出すコードの解説と、リソースエディタの使い方が解説してあるサイトや本なんかが
あればいいなあ、と。
0569デフォルトの名無しさん
2008/11/14(金) 08:56:25ウィザードの吐き出すコードの前に、ここを熟読して出直してきます
0570デフォルトの名無しさん
2008/11/14(金) 23:08:06覚えてないよ。ただ、よく使うクラスは限られるし、自分で使い勝手の
よいMFC派生クラスのライブラリを用意してあるので、それをプロジェ
クトに読み込んで使うことの方が多いな。
慣れてくると、ウィザードがどんなコードを吐き出すか判るので、既存の
テキトーなクラスの.cpp/.hをコピー&リネーム&文字列置換して、新しい
クラスの雛型にして、あとは全部手で書いている。
VC++ 6.0は、クラスウィザードがコード挿入位置を知るために使う特別な
書式のコメントがあるけど、これもクラスウィザードがコード生成したのと
同じように書いている。 その後、一度.clwファイルを消してからクラス
ウィザードを起動して.clwを再構築させれば、手で書いたクラスもちゃんと
クラスウィザードで認識させられる。
0571デフォルトの名無しさん
2008/11/15(土) 12:42:17こういうの見るとSetDlgItemInt使えといいたくなる。
0572デフォルトの名無しさん
2008/11/15(土) 14:36:25新機能使うとレジストリでなくてiniファイルに保存・読み込みできないのだが(´ω`)・・トホー
0573デフォルトの名無しさん
2008/11/15(土) 15:56:10素人さんですかw
0574デフォルトの名無しさん
2008/11/15(土) 17:45:43玄人がSetDlgItemInt使わない理由とかあるの?
0575デフォルトの名無しさん
2008/11/15(土) 19:25:39ダイアログに委託しているところ
0576デフォルトの名無しさん
2008/11/15(土) 23:01:11今回の場合、ワーカースレッド側からだとSetDlgItemIntを使いようが無いってだけだな。
コントロール変数とかで持っていても、値をテキストとして設定したい時は、
地味に便利なメソッドだったりする。
0577デフォルトの名無しさん
2008/11/16(日) 01:34:50ひっこんでろタコ
0578デフォルトの名無しさん
2008/11/16(日) 01:59:29素人さんですかw
0580デフォルトの名無しさん
2008/11/17(月) 02:50:44ItemInt()も、単純にAPIのラッパだし、ワーカスレッドからでもなんら
問題なく呼べるだろ。
ダイアログのポインタが嫌なら、ハンドルとAPI直接呼び出し使え。
::SetDlgItemText(this->m_hWnd,IDC_EDIT1,...);
::SetDlgItemInt(this->m_hWnd,IDC_EDIT1,...);
0581デフォルトの名無しさん
2008/11/17(月) 22:09:370582デフォルトの名無しさん
2008/11/17(月) 22:22:44というか、おまいら今回の話はUIスレッドがスレッド終了待機に入った所為で、
UIスレッドへのSendMessageがデッドロックした、っていう事完全に忘れてるだろ。
0583デフォルトの名無しさん
2008/11/18(火) 00:00:19Win32APIを直接叩く以外無いよな。
脱線すまん
0584デフォルトの名無しさん
2008/11/18(火) 00:09:04でもGDIだけはベタ書きしてしまう俺
それ自体をクラス化するんだけどな
0585デフォルトの名無しさん
2008/11/18(火) 21:59:29MSDNにはHANDLE渡して該当するFromHandleを呼び出す、とあるから
オブジェクトは渡せないけどMFCで行けるんじゃない?
個人的にはしないけどね。
0586名無し募集中。。。
2008/11/18(火) 22:07:020587デフォルトの名無しさん
2008/11/19(水) 13:37:26m_cdlg = new CDlg(this);
m_cdlg->ShowWindow(SW_SHOW);
みたいな感じで表示するとボタンを押せばいくつでもダイアログが出てしまいます。
1つしか出さないにはどうしたらいいでしょうか?
あと、親クラスの関数でモーダレスダイアログを扱うことはできますか?
XP+VC.netです。
0588デフォルトの名無しさん
2008/11/19(水) 13:53:44その2行を通るたびに new で作ってんだから、そりゃいくつでも出るでしょう。
そのボタン貼ったウィンドウの初期化部分で一回だけ作って、
ボタン押したときに ShowWindow すればいいんじゃね?
>親クラスの関数でモーダレスダイアログを扱うことはできますか?
ちょっと意味が解らんかった。
0589デフォルトの名無しさん
2008/11/19(水) 14:10:21モーダレスが終了した後なら、もう一度ボタンを押したときはモーダレスを表示したいのですが・・・。
モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。
0590デフォルトの名無しさん
2008/11/19(水) 14:18:24private:
CUnkoDlg m_dlg;
Initidialog
m_dlg.Create( CUnkoDlg::IDD , this )
OnButton
m_dlg.ShowWindow( SW_SHOW )
0591デフォルトの名無しさん
2008/11/19(水) 14:29:490592デフォルトの名無しさん
2008/11/19(水) 14:30:440593デフォルトの名無しさん
2008/11/19(水) 16:14:060594デフォルトの名無しさん
2008/11/19(水) 16:40:22自分でWM_NOTIFYして親に通知して、実処理は通知先で
0595名無し募集中。。。
2008/11/19(水) 17:12:27モードレスダイアログに親のthisを渡してpublicな操作をしてもらう事はたまにやる
終了時には 『m_cdlg = new CDlg(this); 』のm_cdlgもNULLにして終わらせる
たぶんあんまり行儀が良くないと思う
0596デフォルトの名無しさん
2008/11/19(水) 17:23:38俺もやったことあるけど
0597デフォルトの名無しさん
2008/11/19(水) 21:07:31一旦Createした後は、ShowとHideしかしないという作り方もある。
で、ダイアログ自体はポインタでなくメンバ変数としてそのまま持っておく、と。
0598デフォルトの名無しさん
2008/11/19(水) 21:08:330599デフォルトの名無しさん
2008/11/19(水) 21:37:130600デフォルトの名無しさん
2008/11/20(木) 01:28:13はぁ?何言ってんの?
0601デフォルトの名無しさん
2008/11/20(木) 01:32:38アプリケーションフレームワーク使ってないの?
0602デフォルトの名無しさん
2008/11/20(木) 01:38:21delete thisってどういう挙動になるのかな?
0603デフォルトの名無しさん
2008/11/20(木) 13:47:140604デフォルトの名無しさん
2008/11/20(木) 17:42:17なら実際に見たことがある。
0605デフォルトの名無しさん
2008/11/20(木) 20:03:19きもw
0606デフォルトの名無しさん
2008/11/20(木) 21:05:35親と子ダイアログ、どっちを指してるのかも不明だが、それが
シングルトンであるかどうかが今の話にどう関係してくるってんだ。
0607デフォルトの名無しさん
2008/11/20(木) 21:44:49ライブラリ化などして、後々まで利用するなら、親ウィンドウなり、
オーナーウィンドウに対して、ユーザー定義メッセージを投げるのが、
一番汎用性があるのでは?
WPARAM,LPARAMで、操作したい内容(処理を特定するためのボタンのID等)
を渡す。 DWORD値2個で足りなければ、他のメッセージと同様に、構造体
やクラスオブジェクトのポインタを渡す。
処理は、ユーザー定義メッセージを貰う親ウィンドウなり、オーナーウィン
ドウ側にON_MESSAGE()のハンドラとして記述することになる。
0608デフォルトの名無しさん
2008/11/20(木) 22:08:54いいかどうかは別にして、自分もやるし、何度もやったことある。
>>597-598
1回だけCreateして、Show/Hideで使い回す場合、2回目以降表示する際
には、モーダレスダイアログ側のOnInitDialog()が呼ばれないことを
ちゃんと理解していれば、それで問題ないと思う。
ダイアログが、親ウィンドウが持つパラメータや状態を表示したり、変更
する機能を持つ場合、同じ実体をリサイクルしてもいいけど、親ウィン
ドウ側にはダイアログのポインタをメンバに持たせて、表示時は、newした
後でダイアログのメンバ変数をセットしてCreateを呼び、非表示時は、
DestroyWindow()してdeleteしてしまうのが良いかと。
0609デフォルトの名無しさん
2008/11/20(木) 22:14:44ON_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;
}
}
0610デフォルトの名無しさん
2008/11/21(金) 00:21:05前回開いてた状態で再表示されたほうが使い勝手も良さそう
0611デフォルトの名無しさん
2008/11/21(金) 01:20:56中身初期化しないならそれがベストだろし
0612デフォルトの名無しさん
2008/11/21(金) 15:07:35親ダイアログにタブコントロールを付けて、タブに更に子ダイアログがくっついている形です。
ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後なのは仕様ですか?
CWnd::OnInitDialogが呼び出されるよりも前にOnSizeが来てしまうので、
サイズを一緒に調整したい子ウィンドウ全てに対してGetSafeHwnd()関数でチェックしてから
サイズを変更しているのですが、もうちょっと効率的な方法はないですか?
それと、なぜかウィンドウでエンターを押すとShowWindow(SW_HIDE)が渡されるのか、
子ダイアログは消えてしまうし、親ダイアログではアプリ自体が終了してしまいます。
何か対処法はありますか?
0613名無し募集中。。。
2008/11/21(金) 15:09:41OnOKに飛んでいる
0614デフォルトの名無しさん
2008/11/21(金) 15:25:15OnOKって自分で呼ばなくても勝手に呼び出されちゃうんですか…
てっきりIDOKボタンを押した(又はDefault Buttonに設定した上でエンターした)時だけだと思っていました。
これは自分でOnOKを空の関数にオーバーライドして、CDialog::OnOK呼ばないようにせざるを得ないと言うことですか?
0615名無し募集中。。。
2008/11/21(金) 16:40:38その通り
ESCを押すとOnCancelが呼ばれるのも同じ仕組み
0616デフォルトの名無しさん
2008/11/21(金) 17:13:490617デフォルトの名無しさん
2008/11/21(金) 17:28:43>>376
0619デフォルトの名無しさん
2008/11/21(金) 17:57:18ダイアログ内に子ダイアログを置くのであれば、
子ダイアログの「Control」をTrueにしておいたほうがよいですよ。
子ダイアログだけ消えるということも無くなるはず。
0620デフォルトの名無しさん
2008/11/21(金) 19:12:310621デフォルトの名無しさん
2008/11/21(金) 19:19:050622デフォルトの名無しさん
2008/11/21(金) 19:19:280623デフォルトの名無しさん
2008/11/21(金) 21:40:45>>620-622
位置決め用にスタティックコントロールを置いて、そのスタティック
コントロールに重ねて、動的にプロパティシート(CPropertySheet)を
貼り付けて、そのシートに、さらにCPropertyPageをAddPage()する
というコードを実際に書いたことあるけど?
0624デフォルトの名無しさん
2008/11/21(金) 21:50:21> ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後
> なのは仕様ですか?
DoModal()を呼んだ場合、OnInitDialog()より前、OnCreate()の後に
OnSize()が呼ばれていると思うけど?
ダイアログリソースに貼り付けたコントロールではなくて、自分でコント
ロールを動的にCreate()しているのなら、コントロール作成より前には
呼ばれないでしょ。 そういうことではなくて?
0625デフォルトの名無しさん
2008/11/21(金) 22:37:42あ、いや、ダイアログリソースで貼り付けて、DDXで関連づけたコントロールをOnSizeで調整しようとしているので、
DoDataExchangeで関連づけられる前にOnSizeが呼び出されるのが気にくわなかっただけでして…
(OnInitDialogはそれよりもあと)
あれ、UpdateDataを勝手に呼び出しちゃえば問題なかったですかね? もしかして。
0626デフォルトの名無しさん
2008/11/22(土) 03:20:48IPAddressクラスから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(); みたいなキャストがしたい */
0627デフォルトの名無しさん
2008/11/22(土) 08:53:01たぶん.NETのデータ型をアンボクシングしてからキャストすればよさそうだが
0628624
2008/11/22(土) 09:32:53やりたいことがイマイチわからんのですが?
DoDataExchange()内のDDX_Control()で関連付けせずに、OnInitDialog()
内で、SubclassDlgItem()で動的に関連付け(サブクラス化)することも
できますが、コントロールの初期サイズはリソースで指定したサイズに
なるので、特定コントロールのみ例外扱い(リソース指定と異なるサイズ
にしたい)場合、そのコードはどこかに書く必要があると思います。
そもそも、OnSize()って、ダイアログのスタイルを「ダイアログ枠」で
なくて「サイズ変更枠」にすると、ダイアログをドラッグしてサイズ変更
したら、表示中はいつでも何回でも呼ばれる可能性がありますよ?
codeguru.comあたりの「CResizeDialog」を参考にしては?
0629デフォルトの名無しさん
2008/11/22(土) 19:11:260630デフォルトの名無しさん
2008/11/22(土) 22:24:08DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
if (2回目以降のOnSizeだったら) {
コントロールのサイズ変更;
}
のような判定が必要になるのが気にくわないということでは?
0631デフォルトの名無しさん
2008/11/23(日) 03:30:09本筋とそれる話で申し訳ない。
"2回目以降"でなくて、コントロールのhWndがIsWindow通るとかでいいんじゃね?
0632デフォルトの名無しさん
2008/11/23(日) 07:07:430633624
2008/11/23(日) 11:35:19> DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
DoDataExchangeとの順番は関係なく、最小化のタイミング等でもWM_SIZEは
飛んでくるから、何らかの判定は必要だと思うけど?
codeguru.comの「CResizeDialog」だと、ダイアログにCRect型のメンバ変数
を追加して、コンストラクタでCRect::Empyt()しといて、一発目のOnSize
で、CRect::IsRectEmpty()がTRUEなら、現在のダイアログサイズを変数に
取り込み、FALSEなら、直前のOnSize()時に取り込んだダイアログサイズと、
新しいサイズの差を計算して、子コントロールのダイアログ内での移動や、
サイズ変更をやっていたかと。
OnCreate()⇔OnDestroy()のように、明らかに逆で呼ばれることはないメッ
セージを除いて、安易にフレームワークが呼び出す順番に依存するような
造りにはしない方がいいのでは?
アイコンやビットマップを貼り付けるスタティックコントロールとか、貼り
付けたイメージのサイズに合わせて、コントロールのみ単独でOnSize()が
呼び出されることもあるし。
0634デフォルトの名無しさん
2008/11/23(日) 12:28:51なんかかみ合ってないような。
一発目のOnSizeではDDXメンバがまだ設定されていないということですよ?
そのCResizeDialogというのは、派生用のダイアログクラスなんだろうから、
内部で子コントロールのDDXメンバを持ってるわけではないでしょう?
昔のソースを掘り返してみたら、
if (IsWindow(m_buttonOK)) {
m_buttonOK.MoveWindow(〜);
}
と自分もIsWindowを使っていた。
0636624
2008/11/23(日) 12:41:26>>634
> なんかかみ合ってないような。
そもそも、なんでサイズ変更に際して、DDX_Control()での関連付けが
必要なのか全く説明がないし、自分が設計するとしても、その必要性を
まったく感じないんですが?
0637デフォルトの名無しさん
2008/11/23(日) 20:05:240638デフォルトの名無しさん
2008/11/23(日) 20:27:160639デフォルトの名無しさん
2008/11/23(日) 20:37:320640デフォルトの名無しさん
2008/11/23(日) 21:27:30グローバルスコープなのを呼び出すなって話だろ
0641デフォルトの名無しさん
2008/11/23(日) 23:00:14そのウィンドウが存在しているかどうかはわからないのでは?
0642デフォルトの名無しさん
2008/11/23(日) 23:02:48CWndの実体ができる時点でウィンドウが作られてるわけじゃないぞ
0643デフォルトの名無しさん
2008/11/23(日) 23:12:18それはどこかで明記されてたっけ?
初期化していないポインタのようにゴミが入っている可能性は常に無い?
あとそれが大丈夫だとしても、>>634のようにDDXメンバの実体に対するものには
GetSafeHwnd()ではなくm_hWndで十分だと思うけど。
0644デフォルトの名無しさん
2008/11/24(月) 00:54:260645デフォルトの名無しさん
2008/11/24(月) 01:32:23そのハンドルが、実は他プロセスのウィンドウを指してしまっている状態すら、
考慮しないといけなくなるんじゃないか?
0646名無し募集中。。。
2008/11/24(月) 02:08:50でも、たぶんどっちでも良くて気分の問題
0647デフォルトの名無しさん
2008/11/24(月) 07:43:46> それはどこかで明記されてたっけ?
> 初期化していないポインタのようにゴミが入っている可能性は常に無い?
挙動はMFCのソース見れば判るだろ。 というより、C++やクラスの本質
を理解しているのかと?
その理屈なら、CFileクラスのm_hFileメンバ変数や、CGdiObjectクラス
(CPen,CBrush等の基底クラス)のm_hObjectメンバ変数の値も信用できん
とな?(w
> あとそれが大丈夫だとしても...
『大丈夫だとしても』ぢゃなく『大丈夫でなければ』、どんな場面であって
も(m_hWndの値を返す)GetSafeHwnd()も、m_hWndの直接参照も使えない。
0648デフォルトの名無しさん
2008/11/24(月) 07:44:54> たぶんどっちでも良くて気分の問題
んなことぁない。
直接参照する場合、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()を
使った方がいい。
0649デフォルトの名無しさん
2008/11/24(月) 10:56:07自分もNULLチェックではなくAPIのIsWindowに渡してチェックすることが多いな。
0650デフォルトの名無しさん
2008/11/24(月) 11:41:00開け閉めして確認しちゃう人?
IsWindow()呼んで戻り値をチェックした後で、APIを呼び出すまでの間に
ウィンドウが消滅しているかもしれないという心配はしないの?(w
0651デフォルトの名無しさん
2008/11/24(月) 13:18:36ドキュメントビューアーキテクチャのSDIプログラムを作っているのですが、
メニューのハンドラってxxxDocment.cppに作成するのが良いのでしょうか?
あと、設定データとかファイル入出力のデータの実態もxxxDocment.cppに
作成した方がよいのでしょうか?
0652デフォルトの名無しさん
2008/11/24(月) 14:40:44それは別問題では?
IsWindow()でチェックしようがm_hWnd!=NULLでチェックしようが、
その後APIを呼び出すまでの間にウィンドウが消滅しているかもしれないのは同じ。
>>651
「表示倍率を拡大」なんていうコマンドならビューやアプリケーションだろうし、
コマンドの内容に依りますよ。
0653デフォルトの名無しさん
2008/11/24(月) 16:47:20高さなどを知る方法ってあるのでしょうか?
┌──────────────┐
│たいとる .│←この高さが知りたい
├──────────────┤
0654デフォルトの名無しさん
2008/11/24(月) 16:52:38::GetSystemMetrics(SM_CYCAPTION);
でいけると思うが、未確認。
0655デフォルトの名無しさん
2008/11/24(月) 17:25:35上にもあるようにGetSystemMetrics()でOK
というか、GetSystemMetrics()からとれるやつは全部こっからとらないと、ちょっとしたWindowsのデザイン設定の違いでカオスになるからな
0656名無し募集中。。。
2008/11/24(月) 17:57:06データにまつわる事ならDoc
見せ方(表示)にまつわる事ならView
アプリ全体(データ全体)にまつわる事ならMainFrame
0657デフォルトの名無しさん
2008/11/25(火) 03:57:200658デフォルトの名無しさん
2008/11/25(火) 09:02:09CWinApp派生クラスのメンバに登録しているなぁ。 一応、データ本体は、
protectedで、設定をGet/Setするヘルパ関数を用意している。
あと、メッセージハンドラはともかく、ドキュメントの表示方法(例えば
色やスタイルなどの見せ方)に関する設定値は、ViewではなくDocクラスに
持たせているなぁ。
これらの一部をViewに持たせると、ファイルに保存する際にViewクラスに
アクセスしなければならないし、Viewが生成されてドキュメントに関連
付けされる前に、ファイルから初期値を読み込む時等に実装に困る。
CListViewクラスのLVS_REPORT等、ウィンドウが存在する時は、実質的に
Viewもウィンドウ属性という形でそうしたデータを持っているけど、最初
にCreate()する際に、どの初期値でスタイルを指定するという場合に困る。
0659名無し募集中。。。
2008/11/25(火) 13:46:17たとえば表示倍率とかViewごとに変化する(保存する必要のない)データはViewが持って良いだろう
アプリ全体(複数のデータ)は、Appが持つのも良いと思う。
でもCWnd派生のMainFrameだとSetTimerとかPostMessageが使えるから
シーケンシャルな処理が入った時に便利なんで、MainFrameを使ってる
でも>>651の質問ってSDIだよな。1つのDocにViewが複数あるわけじゃないから神経質にならなくてもいいな
0660デフォルトの名無しさん
2008/11/25(火) 16:05:52SDIはドキュメントが1つであって、ビューが1つではないですよ。
実際、エクスプローラスタイルで作成されたSDIはビューが2つあるし、
標準のスタイルでも任意にビューを増やせる。
0661デフォルトの名無しさん
2008/11/25(火) 17:06:390662デフォルトの名無しさん
2008/11/25(火) 18:36:100663名無し募集中。。。
2008/11/25(火) 18:54:480664デフォルトの名無しさん
2008/11/25(火) 19:27:45テキストを表示したりできるからね。
0665デフォルトの名無しさん
2008/11/26(水) 17:34:11する方法はありますか?
0666デフォルトの名無しさん
2008/11/26(水) 17:35:42C**Doc::Serializeを使っているのですが、ファイルの保存や開くときのファイル形式を
指定する方法はありますか?
0667デフォルトの名無しさん
2008/11/26(水) 17:52:530668名無し募集中。。。
2008/11/26(水) 18:10:15\nで区切られた何番目がどんな意味かはヘルプ参照
"IDR_アプリ名TYPE"は、InitInstance()の中でnewするCMultiDocTemplate()の第1パラメータ
0669デフォルトの名無しさん
2008/11/26(水) 18:32:500670デフォルトの名無しさん
2008/11/26(水) 23:18:280671651
2008/11/26(水) 23:35:46SDIといってもCFormViewをベースに、複数のダイアログを切り替えて表示するような
プログラムを作っています。データの所在がそれぞれのダイアログに散らばってしまうと
管理が面倒なので今はDocumentクラスにすべて実体を持たせ、メニューのハンドラも
そこにおいています。
みなさんの説明を要約すると基本的なセオリーとしては、
・GUI等の画面表示に関係するデータ、ハンドラ: View(ダイアログ)に持たせる
・ファイル入出力に関するデータ、ハンドラ: Docに持たせる
・アプリ全体に関する設定: CWinAppとかMainFrameに持たせる
と言ったところでしょうか。
データの中にはコンストラクタでデータ設定したりオブジェクト生成したりしていて
その順番が問題になる事もありますので、その辺も考慮して決めたいと思います。
0672デフォルトの名無しさん
2008/11/27(木) 01:01:54スピンコントロールの上ボタンや下ボタンを凹ませるには、
どのようなメッセージを送れば良いのでしょうか?
0673名無し募集中。。。
2008/11/27(木) 01:15:56> Win7では2D描画はDirect2Dがメインになるって聞いたが
VistaではGDI ハードウェアアクセラレーションが効かなかったが
Windows7では有効になる
http://d.hatena.ne.jp/NyaRuRu/20081126/p1
0674デフォルトの名無しさん
2008/11/27(木) 01:36:16家の7600GSじゃ4K×4Kが最大だから対応できないのか。
0675デフォルトの名無しさん
2008/11/27(木) 04:56:15ずーっと昔に買ってそのまま放置しておいたプログラミングVisualC++.NET基礎編があるのですが
やっぱり新しい本を購入してやったほうがいいですか?
0676デフォルトの名無しさん
2008/11/27(木) 07:23:12適当になんか作りたいだけならサンプル眺めてるだけでいいし
0677デフォルトの名無しさん
2008/11/27(木) 12:00:03基本VS6時代の本でおK
というかあの頃の本が一番詳しく書いてある
VSが.NETになってからだとVC本がしょっぱい現実
0678名無し募集中。。。
2008/11/27(木) 13:07:56のチュートリアルを一通りやるといいよ
VC6の時はSTEP1〜7までていねいに解説してあった
0679デフォルトの名無しさん
2008/11/27(木) 22:41:01何人がそれであきらめてやめたことか
悪いことは言わん
最初は、ダイアログアプリからやるべし
0680デフォルトの名無しさん
2008/11/27(木) 22:54:16最初にあれに手を出すと、確実に拒絶反応起こすこと請け合い。
ダイアログアプリ以外だと、Document-Viewを切ったSDIとかも練習には良いな。
0681デフォルトの名無しさん
2008/11/27(木) 23:04:43SDIやるなら、適当にGDIの勉強とか、Doc-View-Frameとかの関係を理解するとか・・・良いサンプルないかな
0682デフォルトの名無しさん
2008/11/28(金) 02:55:52ttp://msdn.microsoft.com/ja-jp/library/482ck6x8.aspx
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=01AE159F-08CD-495B-8BF4-A48CC395AD7B&displaylang=ja
0683名無し募集中。。。
2008/11/28(金) 12:58:34でもリソースエディタの使い方とかVSの操作は役に立ったような・・・
0684デフォルトの名無しさん
2008/11/28(金) 19:39:24ウィンドウを破棄する時に警告がでてしまいます
警告の内容はデストロイウィンドウが呼ばれてないといった内容で
ダイアログを破棄するときに実際にデストロイウィンドウを呼んでみると
例外エラーが発生してアプリケーションが落ちてしまいます
0685デフォルトの名無しさん
2008/11/28(金) 19:40:280686デフォルトの名無しさん
2008/11/28(金) 23:46:390687デフォルトの名無しさん
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- あたりも参照のこと。
0688デフォルトの名無しさん
2008/11/29(土) 01:32:49IDDあたりも工夫して・・・
0689デフォルトの名無しさん
2008/11/29(土) 01:52:050690デフォルトの名無しさん
2008/11/29(土) 01:57:20CDialogのような使い方は出来ないと思うけど
0691デフォルトの名無しさん
2008/11/29(土) 02:40:06レスありがとうございます
このサイトのコードを参考にしていたのですがこれがなんかまずかったみたいです
http://athomejp.com/goldfish/mfc/dialog/modeless.asp
CWaitDlg *pWait = new CWaitDlg();
pWait->Create(this);
//処理
pWait->DestroyWindow();
delete pWait;
で普通に消せました
ご迷惑おかけしました
0692デフォルトの名無しさん
2008/11/29(土) 03:03:13キー入力を認識しているのですが、ctrl+Cなどコピペや複合の入力を検知する方法はありますでしょうか。
XP+VC2005です。
0693デフォルトの名無しさん
2008/11/29(土) 03:11:57なんでnew使うの?
{
CWaitDlg wait;
wait.Create(this);
// 処理
wait.DestroyWindow();
}
でいいと思うのだけど。
破棄のタイミングに拘らなければブロック化({})すら要らない。
0694デフォルトの名無しさん
2008/11/29(土) 03:32:55あんまり意味ないです
貼り付けたサンプルがたまたまそうだったからという理由だけですw
0695デフォルトの名無しさん
2008/11/29(土) 03:43:50CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの?
>>692
リソースに記述してCOMMAND_UIあたりで処理するのではなかったっけ?
0696デフォルトの名無しさん
2008/11/29(土) 04:13:03>CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの?
いや、なんかよくわかりませんでした
とりあえず、モードレス側に書く処理はCreate関数だけで
削除は親に全部まかせるのがいい気がします
0697デフォルトの名無しさん
2008/11/29(土) 17:15:04モードレスの場合はダイアログの作成と破棄のタイミングが違うのでメンバに抱えてnewを使う
0698デフォルトの名無しさん
2008/11/29(土) 18:14:42モードレスとモーダルを同じダイアログで使いまわす状況なんてないんじゃね?
0699デフォルトの名無しさん
2008/11/29(土) 18:30:38ダイアログが閉じられたからといって、
クラスのインスタンスを即座に破棄しなければならない理由は無い。
別々の派生クラスを時と場合に応じて使い分ける、とかいうなら話は解るけど。
0700デフォルトの名無しさん
2008/11/29(土) 20:37:50じゃあモードレスの場合にダイアログが作成されてるか破棄されてるかはどうやって判別すんの?
0701デフォルトの名無しさん
2008/11/29(土) 21:03:490702デフォルトの名無しさん
2008/11/29(土) 21:08:110703デフォルトの名無しさん
2008/11/29(土) 21:17:29用語が曖昧だからなんとも言えないけれど、モードレスダイアログが実際に表示されているのかされていないのか、
そのダイアログ自身以外に一体全体誰が気にしなければいけないというの?
そのダイアログのインスタンスを持っている側にとっては、出ていて欲しいときに出せと要求するだけで充分でしょ。
0704デフォルトの名無しさん
2008/11/29(土) 21:17:480705デフォルトの名無しさん
2008/11/29(土) 21:18:19用途と状況と目的によりけりかと。
0706!699
2008/11/29(土) 21:22:14質問元のモードレスダイアログは、処理中ダイアログみたいだから、
判別する必要ねえんじゃね?
ユーザーによるオペレーションで表示/非表示するようなやつの場合、
俺は(複数表示する必要なかったので)シングルトン的なものにして対応したんで、
作成されている/いないを判別するは必要なかった。
0707706
2008/11/29(土) 21:24:280708デフォルトの名無しさん
2008/11/29(土) 22:06:13処理中ダイアログって考えはなかったわ
でも1ハンドラ内に>>691の記述でモードレス中ダイアログを表示できたっけ?
0709デフォルトの名無しさん
2008/11/29(土) 22:07:10表示/非表示じゃなくダイアログの作成/破棄な CDialog::Create()とCWnd::DestroyWindow()
インスタンスの生成/破棄(new/delete)とも別だよ
0710デフォルトの名無しさん
2008/11/29(土) 22:20:51PeekMessageでもはさむんじゃね?
0711デフォルトの名無しさん
2008/11/29(土) 22:48:54事情は変わらんだろ。ダイアログ自身が管理していれば、利用者はそれを意識する必要はない。
0712デフォルトの名無しさん
2008/11/29(土) 22:52:27モードレスとモーダルをいっしょのクラスで分岐させる無意味な汎用性と
Createされてる状況でCreate関数を再び呼ぶ必要を考慮してるクラスの仕様のが
気持ち悪くていまの話題についていけないけどね
0713デフォルトの名無しさん
2008/11/29(土) 22:56:54.NETは相性悪すぎる
せっかくDirect2DとDirectWriteもC++向けに提供するんだし、アプリケーションハンガリアンでエレガントなクラス群を是非
0714デフォルトの名無しさん
2008/11/29(土) 23:01:17モードレスダイアログのサンプル書いてみてよ
0715デフォルトの名無しさん
2008/11/29(土) 23:03:47CWaitDlg wait;
wait.Create(this);
// 処理
wait.DestroyWindow();
0716デフォルトの名無しさん
2008/11/29(土) 23:14:20処理中ダイアログじゃなくてOKボタン押すまで表示されてるモードレスダイアログのサンプル書いてみてよ
0717デフォルトの名無しさん
2008/11/29(土) 23:15:52意味がわかんない
0718デフォルトの名無しさん
2008/11/29(土) 23:18:19CWaitDlg wait;
wait.Create(this);
while(1){
PeekMessage
GetMessage
TranslateMessage
DispatchMessage
if(ボタンが押されたら)break;
//処理
}
wait.DestroyWindow();
0719デフォルトの名無しさん
2008/11/29(土) 23:32:06モードレスのサンプルになってないよ
その用途ならモーダル使うのが普通じゃん
0720デフォルトの名無しさん
2008/11/29(土) 23:36:43プログレスバーが表示できるじゃん
質問元が思いっきりそういう意図じゃん
普通だったらモードレスなんてつかわねぇよ
正直いってバグりやすいもん
大部分がこんな感じで済むんだよ
0721706
2008/11/29(土) 23:49:451ハンドラでの処理は考えてなかった。 てか忘れてた。
new/deleteの話いらないって話なんだから、1ハンドラだね。
そういうわけで、>>706はなかったことに。
(>>710の通りやればできそうだけど、確認したくないという事情によります)
まったく持ってごめん。 反省した。 次は、、次も、、とり頭だからやってしまうかもしれん。
0722デフォルトの名無しさん
2008/11/29(土) 23:58:540723デフォルトの名無しさん
2008/11/30(日) 00:00:13何がやりたいのか具体的にいいたまへ
0724デフォルトの名無しさん
2008/11/30(日) 00:13:23どっかのクラス
{
CWaitDlg m_wait;
};
どっかのクラス::モーダレス表示するハンドラ()
{
wait.Create(AfxGetMainWnd());
}
これで、親クラスが消滅するかダイアログの「×」ボタン「OK」または
「Cancel」ボタンがクリックされるまで表示されたままになる。
>>719
モードレスだが?
>>722
スレッドを起こせばいい。
0725デフォルトの名無しさん
2008/11/30(日) 00:15:04> wait.Create(AfxGetMainWnd()); ... 誤
m_wait.Create(AfxGetMainWnd()); ... 正
0726デフォルトの名無しさん
2008/11/30(日) 00:30:19ダイアログ自身が管理する形で書かれていないので
CWaitDlgが管理するようにしたいんだけど
0727デフォルトの名無しさん
2008/11/30(日) 00:38:36m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない?
m_wait.DestroyWindow();は必要ないの?
0728デフォルトの名無しさん
2008/11/30(日) 00:39:43何を管理する?ちゃんと日本語で書けよバカSEよ。それとも低級な魔法
使い気取りか?
0729デフォルトの名無しさん
2008/11/30(日) 00:51:56> m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない?
概念の説明だけでなく、エラー処理まで手取り足取り見なきゃならん
のか?
if(m_wait.m_hWnd=NULL)
m_wait.Create(AfxGetMainWnd());
とでもしておけばいい。
> m_wait.DestroyWindow();は必要ないの?
MFCの場合、明示的に呼ばなくても、m_waitのデストラクタ内で
DestroyWindow()が呼び出される仕様。
CFile::Close()等も同様。
0730デフォルトの名無しさん
2008/11/30(日) 01:12:45呼ばれなくね?
とりあえず俺の環境では
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
って警告がでちゃうよ
0731デフォルトの名無しさん
2008/11/30(日) 01:27:560732デフォルトの名無しさん
2008/11/30(日) 02:18:51MFCのソースも読めないし、トレースの仕方も知らんと恥を晒している
ようだな。 まさに宝の持ち腐れ。 豚に真珠ってヤツだ。
その警告メッセージは、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のバグとか、ゲイツ様のせいにすんじゃねぇぞ、ゴルァ!』
ってこった。
0733デフォルトの名無しさん
2008/11/30(日) 02:49:47わざわざトレース文が入っているようなお情け処理を、
正式な仕様として扱う勇気は俺には無いな。
0734デフォルトの名無しさん
2008/11/30(日) 05:34:25今までの話を整理したらこうなった
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);
}
0735デフォルトの名無しさん
2008/11/30(日) 07:02:30でもそこなんでトレースいれるんだろうね
少なくとも俺の感覚としちゃそこでDestroyWindowを呼ぶのは当然の処理で
警告なんて出す意味がわからないんだけど
0736デフォルトの名無しさん
2008/11/30(日) 07:11:07コンストラクタでCreateしないからデストラクタでもDestroyWindowしない方針
0737デフォルトの名無しさん
2008/11/30(日) 08:00:16しろよな
しない方針にすることでなにかいいことあるのか?って感じ
Create関数のヘルプにもそんなこと書いてねーし
DestroyWindow関数のヘルプには
MFC側で呼んだり呼ばなかったりするからユーザー側でうまくやれよマジで
とかかなりむかつく仕様だしで作った奴マジ嫌な感じだな
0738732
2008/11/30(日) 10:06:48> そんなことは、皆了解済みの上で話していると思うのだがどうか。
理解したり、(実際に呼ばれていることを)知っていたら『呼ばれなくね?』
なんて発言は、マヂでありえなくね。(w
C++の基本を理解し、警告メッセージの意味を正しく理解していれば、
> わざわざトレース文が入っているようなお情け処理を、
> 正式な仕様として扱う勇気は俺には無いな。
なんて発言も出てこないハズ。
0739732
2008/11/30(日) 10:08:09CDialogクラスのデストラクタで呼び出しているので、(この時点では
派生クラスのメッセージマップや仮想関数テーブルを参照できない、
もしくは存在自体を知りえないため)派生クラスのOnDestroy()やPost
NcDestroy()は呼ばれないだけ。 当然ながら、CDialog::OnDestroy()
やCDialog::PostNcDestroy()の呼び出しは行われる。
派生クラスのOnDestroy()やPostNcDestroy()で独自の実装(例:閉じた
時のウィンドウサイズを取得してレジストリやINIファイルに保存する
等)を呼び出していなければ、デストラクタに処理を任せてもなんら
問題ない。
だからこそ「Error:」じゃなく、あくまで「Warning:」ってなってる。
CFileクラスのデストラクタや、CGdiObjectクラス(CPen,CBrush等の基本
クラス)のデストラクタでも同様のことをやっているけど、これらはメッセ
ージループを廻す必要がないので、TRACE記述はない。
0740732
2008/11/30(日) 10:13:43こういう文句を言う連中は、MFCはおろかC++の基本的な仕様(派生クラスと
基本クラスのコンストラクタ/デストラクタが呼び出される順序や、仮想
関数など)さえロクに理解していないんだろうナァ。
方針なんて関係ない。強いて言えばデザインパターンってやつか?
コンストラクタでデフォルト値を代入してメンバ変数の初期化忘れを防ぐ
とか、デストラクタでメモリやハンドルの解放忘れを防ぐというのは、
基本中の基本。
インスタンスの消滅で確実にウィンドウを破棄し、なおかつ派生クラス
のOnDestroy()やPostNcDestroy()も呼び出されるようにしたければ、MFC
内部の実装に関係なく、派生クラスのオブジェクトが消滅するタイミング
でDestroyWindow()を呼び出せばいいだけ。
すなわち、自分が作るCDialog派生クラスで、デストラクタ関数を定義し、
m_hWndが有効ならDestroyWindow()を呼び出してやればいい。
class CMyDialog : public CDialog
{
virtual ~CMyDialog();
};
CMyDialog::~CMyDialog()
{
if(m_hWnd!=NULL)
DestroyWindow();
}
ただそれだけのことだ。
0741デフォルトの名無しさん
2008/11/30(日) 10:14:42俺とそいつは別人だ
ちなみに「よばれてなくね?」は俺
>>739
警告の必要なくね?
0742デフォルトの名無しさん
2008/11/30(日) 10:18:33でもヘルプでだってどういうときに
DestroyWindowを呼ばなきゃいけないのか書いてないわけだし
当然MFCの中身の都合なんてこっちはしったこっちゃないわけで
もし、自分でこういうもんを作るとしたら解放はフレームワークのほうで自動でやってほしいかな?
0743デフォルトの名無しさん
2008/11/30(日) 11:15:410744デフォルトの名無しさん
2008/11/30(日) 15:54:00どうせお互いまったく譲り合わないんだから、これ以上書いても無駄だよ
0745デフォルトの名無しさん
2008/11/30(日) 18:51:38今後作るソフトはリボンで作った方が惹きやすいのだろうか・・・2008SP1は持ってるが
0746732
2008/11/30(日) 20:41:12何を言いたいのかな? 根拠があるなら問題点を明示すればいい。 でき
ないなら、黙っておくことだ。
GetSafeHwnd()を使わずm_hWndを直接参照していることが問題だとでも
言いたいのかな? だとすれば、C++の仕様を理解していないと自白して
いるようなもの。
C++の仕様ではNULLに対してdeleteを呼び出しても何も行われないことが
保証されている。「delete (CWnd *)NULL;」では何も起こらない。
つまり、デストラクタ関数のアドレスを関数ポインタに取得して明示的に
デストラクタを呼び出すなんて使い方をしない限り、deleteからデスト
ラクタが呼ばれた時点で、thisポインタの値はNULLではない。
だから、この場合this->m_hWndで直接参照してもなんら問題ない。
0747デフォルトの名無しさん
2008/11/30(日) 20:50:420748デフォルトの名無しさん
2008/11/30(日) 21:11:34自動削除の仕組みと相性悪いよそれ。
自分だけで使うのにとどめといたほうがいい
0749デフォルトの名無しさん
2008/11/30(日) 21:24:01> SAFE_DELETEを使ってるのを見ると
> ああ10年前に学ぶのを止めてしまったんだなと分かる
> 自分自身がSAFE_DELETEされてしまったんだ
0750733
2008/11/30(日) 21:40:07メニュー項目が多い場合はリボンも良いけど、
基本はメニュー非表示でツールバーだけ、って感じで良いんじゃないかなあ。
あと、進む・戻るボタンがこっそり標準UIになりつつある気がする。
>>746
とりあえず落ち着け。誰もそれが駄目だなんて書いてないぞ?
0751デフォルトの名無しさん
2008/11/30(日) 23:33:39「派生クラスのOnDestroy()やPostNcDestroy()は呼ばれない」ってのが
期待している挙動と異なるので「デストラクタに処理を任せてもなんら問題ない」とは思えない
0752デフォルトの名無しさん
2008/12/01(月) 07:43:41はなしがむずかしくて、りかいできないんだね。
0753デフォルトの名無しさん
2008/12/01(月) 10:22:21お前がなw
0754デフォルトの名無しさん
2008/12/01(月) 11:55:29「問題ない」しか読んでないのか?その段落ちゃんと嫁。
つか、書いてないコードが呼び出されるのを「期待している」のは莫迦すぐる。
0755デフォルトの名無しさん
2008/12/01(月) 18:39:38頭悪すぎwww
話にならね
0757デフォルトの名無しさん
2008/12/01(月) 21:10:10で、ほぼ間違いないのかな? バカに付ける薬はないな。
0758デフォルトの名無しさん
2008/12/02(火) 23:05:00レジストリ汚すソフトは嫌われるのだがな・・・
0759デフォルトの名無しさん
2008/12/02(火) 23:19:56XMLならMSXMLを使うのが一般的じゃないかな
MFCでラッピングしているクラスは知らない
0760デフォルトの名無しさん
2008/12/03(水) 00:31:22レス�d
あー具体的には、CWinAppEx クラスでウィンドウ情報が勝手(?)にレジストリ登録されるので、ファイルへの書き込みに変えたいのです
VC++2008 SP1が出たばかりで情報がないみたいです。あと半年ROMることにします
0761名無し募集中。。。
2008/12/03(水) 01:10:030762デフォルトの名無しさん
2008/12/03(水) 01:19:35>760はINIファイルへの書き込み手段を探しているのではなく、レジストリ書き込みをさせない手段を探しているようだよ。
0763デフォルトの名無しさん
2008/12/03(水) 01:33:03勝手にレジストリに登録する迷惑なやろうって
SetRegistryKey だったりする?
0764デフォルトの名無しさん
2008/12/03(水) 01:47:36INIのAPIって、レジストリ用のAPIと共有しているんだっけ
あの辺あんまり使わないから、よく分からんw
0765名無し募集中。。。
2008/12/03(水) 02:38:05CWinAppExってレジストリアクセスを提供するってくらいだから容易にはずせないじゃないかな
http://msdn.microsoft.com/ja-jp/library/bb983877.aspx
CWinAppExはCWinAppの子供だからCWinAppからCMyAppを継承させるようにしてみたらどうかな
ソースはある(afxwinappex.cpp)わけだから足りない分は移植すればいいわけだし
0766デフォルトの名無しさん
2008/12/03(水) 02:56:00しかしMS自身がXML勧める時代に、勝手にレジストリに書きにいくなんて…
0767デフォルトの名無しさん
2008/12/03(水) 04:04:27うん
CWinApp::SetRegistryKey()を呼び出さないよう変更したらINIファイルに登録されたハズ
0768デフォルトの名無しさん
2008/12/03(水) 10:24:57iniファイルに書こうとするとレジストリに書くiniファイルマッピングというのもある
どちらもすり抜ければiniファイルに書くが、その場所がexeと同じディレクトリで
Program Filesだったりすると今度はVistaではまる。
0769デフォルトの名無しさん
2008/12/03(水) 16:16:49>>768
CWinAppExはレジストリ前提だからSetRegistryKey()を呼ばないと動作しなくなる。(落ちる)
だから>>765が正解。
0770デフォルトの名無しさん
2008/12/03(水) 16:41:120771デフォルトの名無しさん
2008/12/03(水) 16:42:500772デフォルトの名無しさん
2008/12/03(水) 17:56:570773デフォルトの名無しさん
2008/12/03(水) 22:47:29書籍は壊滅状態だった希ガス
0774デフォルトの名無しさん
2008/12/03(水) 23:26:31ストリパスを取得/設定する、GetRegistryBase()/SetRegistryBase()って
メンバ関数があるね。
例によってあまり役に立たないヘルプには、SetRegistryBase()のデフォ
ルト引数「NULL」を指定した時の挙動が説明されていないけど、おそらく
下請けでCWinApp::SetRegistryKey()が呼び出されているだろう。
あとは、MFCのソースをトレースするしかないな。
XMLは、自分はC++のオーバーロードを使って指定のデータ型とXMLデータを
やりとりしたり、ノード名を指定してXMLツリーを検索するとか、Read_XML()
/Write_XML()という仮想関数を持つ、CObject派生のCXML_Objectクラスとか、
MSXMLを呼び出す汎用関数やライブラリを作ったなぁ。
ところで、SOAPの扱いってどうなったんだろ?
0775デフォルトの名無しさん
2008/12/04(木) 00:32:472008/05/31をもってサポートが完全に打ち切られている。
SOAPやるなら.NETで、って方針だったようだ。
0776デフォルトの名無しさん
2008/12/04(木) 00:47:49ちょっとやってみたら割りと簡単にできた件について
kwskは↓に載っている
http://msdn.microsoft.com/ja-jp/library/cc309001.aspx
0777デフォルトの名無しさん
2008/12/04(木) 01:19:18MFC本スレでありながら、この認知度は問題ないか?w
0778デフォルトの名無しさん
2008/12/04(木) 10:32:05おぉっ、なるほど。
これで.iniに保存するようにして
CWinAppEx::SaveState()で
CDockState::SaveState()が呼ばれ更に
CWinApp::WriteProfileInt()が呼ばれて勝手にレジストリに保存されるという
中途半端な実装を目の当たりにするわけですね?
0779デフォルトの名無しさん
2008/12/04(木) 20:54:57うちのプログラムも CSettingsStoreSP クラスでINIファイルに保存するようにしたが、
レジストリに ControlBars-Summary のキーができていた
ダメすぎオワタ
0780デフォルトの名無しさん
2008/12/05(金) 15:44:00検索して見つけたttp://isobe.exblog.jp/2290292/に書かれているように、一つずつ消さなきゃならんもんかのぉ。
# つーか、MSDNのサンプルって馬鹿? 件のブログでも書かれているけど何の意味があるんでしょ。
0781デフォルトの名無しさん
2008/12/05(金) 15:59:550782780
2008/12/05(金) 16:09:09THX!
--
>コンボ ボックスのリスト ボックスとエディット コントロールからすべての項目を削除します。
--
あー、「文字列」じゃなくて「項目」を削除か。MSDNは思い込みを持たずに読まなければならないのを忘れてた。
これで納得。MSDNのサンプルの馬鹿さ加減は兎も角。
>ComboBoxに関しては、すべてのアイテムを1発で消すことができる便利関数が用意されていない。
--
うーん、3年前にこれって……
0783デフォルトの名無しさん
2008/12/05(金) 19:06:540784デフォルトの名無しさん
2008/12/05(金) 20:12:27WindowFromPoint
0785デフォルトの名無しさん
2008/12/05(金) 20:57:31SetDlgItemTextでは値が表示されません
何かいい方法ないでしょうか?
0786デフォルトの名無しさん
2008/12/05(金) 21:17:350787デフォルトの名無しさん
2008/12/05(金) 21:23:38代わってねぇ〜
SetWindowTextだよな?
0788デフォルトの名無しさん
2008/12/05(金) 21:39:25駄目です
SetWindowTextでも
かわりませんでした
0789デフォルトの名無しさん
2008/12/05(金) 21:45:540790デフォルトの名無しさん
2008/12/05(金) 21:57:050791デフォルトの名無しさん
2008/12/05(金) 21:57:09ダイアログの(オブジェクトではなく)ウィンドウが存在する状態で、
ちゃんと正しいコントロールIDと文字列を指定していれば、SetDlg
ItemText()でいけると思うが?
まさか、
CMyDlg wndDlg;
wndDlg.SetDlgItemText(IDC_COMBO1,_T("テスト"));
wndDlg.DoModal();
とか、
CMyDlg wndDlg;
wndDlg.m_wndComboBox.SetWindowText(_T("テスト"));
wndDlg.DoModal();
なんて書いていないだろうな? DoModal()やCreate()を呼ぶ前は、ウィン
ドウが生成されていないので、SetWindowText()やSetDlgItemText()は
使えない。
DoModal()でコンボボックスに表示される初期文字列を指定したいなら、
ダイアログクラスにCString型のメンバ変数を追加して、DoDataExchange()
内で、DDX_CBString()を使ってコンボボックスに関連付けておき、DoModal()
を呼ぶ前に、CString型のメンバ変数に文字列をセットする。
wndDlg.m_strComboBoxText=_T("テスト");
wndDlg.DoModal();
0792デフォルトの名無しさん
2008/12/05(金) 22:03:06ちゃんとOnInitDialogでやってるのですが
どうもドロップダウンリストだと駄目っぽいです
ちなみにドロップダウンだといけます
0793デフォルトの名無しさん
2008/12/05(金) 22:19:49そりゃ、ドロップダウンリストは、リストボックスの項目内からしか
選択させない仕様だから、ダメに決まってる。
あらかじめ文字列のインデックスが判っていればSetCurSel()で直接指定
して文字列を選べるが、そうでなければFindString(-1,"文字列")でリスト
ボックス全体から文字列を探して、なければAddString()して、SetCurSel()
するしかない。
いずれにしろ、「ドロップダウンリスト」スタイルではリストに追加されて
いない文字列は表示できない。
0794デフォルトの名無しさん
2008/12/05(金) 22:29:34いえ、リストにないものを表示したいわけではなくてですね
SelectStringという関数で文字列を指定するといけるということがわかったので
今度はコントロールを判別(エディットかコンボか?)しようとしてます(笑)
何がやりたいかというと
大量のIDリストからループで文字列をセットしてるわけです
そのIDリストにコンボボックスのドロップダウンとドロップダウンリストとエディットボックスが
混じってしまっているのでなんとか全部に突っ込めないものだろうか?
と考えていたわけです
0795デフォルトの名無しさん
2008/12/05(金) 22:43:26何がヤリたいのか今ひとつ判らんが、一番お手軽な方法は、resource.h
を直接編集して、コントロールの種類毎に、コントロールIDに割り当てる
値の範囲を分けてしまうことだな。 関数を分けた方がいいと思うけどな。(w
#define IDC_EDIT1 1000
#define IDC_EDIT2 1001
#define IDC_EDIT3 1002
…
#define IDC_COMBO1 2000
#define IDC_COMBO2 2001
#define IDC_COMBO3 2002
…
0796デフォルトの名無しさん
2008/12/05(金) 22:49:27void CMyDialog::PresetString(UINT nCtrlID,LPCTSTR lpszDefaultString=NULL,const CStringArray *pListBoxText=NULL)
{
if(IDC_EDIT1<=nCtrlID && nCtrlID<=IDC_EDITxx) // エディットコントロール
{
CEdit *pEdit=(CEdit *)GetDlgItem(nCtrliD);
ASSERT(pEdit);
pEdit->SetWindowText(lpszDefaultString):
}
else if(IDC_COMBO1<=nCtrlID && nCtrlID<=IDC_COMBOxx) // コンボボックス
{
CComboBox *pComboBox=(CComboBox *)GetDlgItem(nCtrliD);
ASSERT(pComboBox);
if(pListBoxText)
{
for(int n=0;n<pListBoxText->GetSize();n++)
(pComboBox->AddString(pListBoxText->GetAt(n)):
if(lpszDefaultString && lstrlen(lpszDefaultString))
SelectString(lpszDefaultString);
}
}
}
※ resource.hを編集したら、リビルドしなおすこと。
0797デフォルトの名無しさん
2008/12/05(金) 22:53:17おお、そういう方法もありましたか
ありがとうございます
私の方は
ウィンドウクラス名を取得する方法をみつけてきました
char temp[256];
memset(temp,0,sizeof(temp));
GetClassName(cmb->m_hWnd,temp,sizeof(temp));
if(0 == strcmp(temp,"ComboBox")){
((CComboBox*)cmb)->SelectString(-1,"あいうえお");
}
リソースはみんなでつつきまくって編集不能(笑)な状態になっているので
とりあえずこっちのが楽そうなんでこっちでいきます
ありがとうございました
0798デフォルトの名無しさん
2008/12/06(土) 19:42:26クラス判定にはCObject::IsKindOf()を使うのが一般的だお
if (pCtrl->IsKindOf(RUNTIME_CLASS(CComboBox)))
((CComboBox*)pCtrl)->SelectString(-1, "あいうえお");
0799デフォルトの名無しさん
2008/12/06(土) 20:13:30その方法は無理っぽいかな。
0800デフォルトの名無しさん
2008/12/07(日) 07:08:31ウィンドウに張り付けたボタンのメッセージを拾うためにボタンの派生クラスを作らなくてもサブクラス化すればウィンドウに全部メッセージ来るってこと?
0801デフォルトの名無しさん
2008/12/07(日) 10:33:20C++のクラスとサブクラスのクラスは違うんだよ
あんまり関係ない
0802デフォルトの名無しさん
2008/12/08(月) 16:52:58「...」などの表記がすごく幅を取るブサイクなフォントになるのですが、
これってユーザの環境が反映されるものなのですよね?
どこで設定されているものなのでしょうか?
0803デフォルトの名無しさん
2008/12/08(月) 18:49:18やはり自力で、
void CChildView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
等のイベントで、スクロールバーいじるしかないのでしょうか?
0804デフォルトの名無しさん
2008/12/08(月) 18:52:370805デフォルトの名無しさん
2008/12/09(火) 21:01:23した後に再びフォーカスが当たったときにeditboxがアクティブになりません。
いい方法はありますでしょうか?
0806デフォルトの名無しさん
2008/12/09(火) 21:34:50MFCの枠から外れそうな気もしますが。
メモリが不足したときにメッセージが返ってきたり、メモリ確保している部分にtry catch文を仕掛けてもいいのですが、
そうなる前に余裕を持たせたい+リアルタイムで監視したい等の理由があります。
0807デフォルトの名無しさん
2008/12/09(火) 21:40:050808名無し募集中。。。
2008/12/09(火) 22:38:12HANDLE hProcess ;
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, GetCurrentProcessId() );
GetProcessMemoryInfo( hProcess, &MemInfo, sizeof( MemInfo )) ;
LOG4CXX097_INFO( Logger::getLogger( "ProcessMemoryInfo" ), "WorkingSetSize="<<int(MemInfo.WorkingSetSize)<<", PageFileUsage="<<int(MemInfo.PagefileUsage)<<", hProcess="<<std::hex<<hProcess ) ;
CloseHandle( hProcess );
パクリ改造だからほぼそのまま晒す
0809名無し募集中。。。
2008/12/09(火) 22:39:52#pragma comment(lib, "psapi.lib")
あと、これが必要だな
0810デフォルトの名無しさん
2008/12/09(火) 22:44:02使用可能とか使用量とは、システム全体での値? それとも実行中の自
プロセスに割り当てられた分? あるいはスレッド単位や別のプロセス?
システム全体なら、Win32 APIのGlobalMemoryStatus()または改良版の
GlobalMemoryStatusEx()かな。 前者は95系のOSでもサポートされている
けど2GB以上は正しい値を返さない。 後者は2000以降でのみ使えるけど、
2GB以上のメモリにも対応。
プロセス単位で詳しく知りたい場合は、Inside Windowsあたりで解説され
ている。パフォーマンスメータ関係のAPIだったかな。
ただ、リアルタイムで監視といっても、常時切れ目なくメモリ状態変化を
監視はできない(定期的にメモリ状態取得しても、直後に別プロセスで大
きなメモリ領域を確保されてしまう可能性がある)し、スラッシングで
空きメモリがあっても要求した連続メモリが確保できず、malloc()に失敗
する場合もあるので、戻り値のチェックを省略することはできない。
0811デフォルトの名無しさん
2008/12/09(火) 22:49:03MDIのViewは、CViewやCScrollViewからの派生クラス? それとも
CFormViewからの派生クラス?
前者なら、コードを書いてCEditを動的に配置しているんだろうけど、
CEdit::Create()時にEditコントロールの親にViewを指定していない
のでは?
後者なら、ダイアログエディタでEditコントロールを配置するだけで、
あとは勝手にプログラムがリソースから読み込んだフォームで親子
関係を設定してくれるから、プログラムで余計なことをしない限り
質問のような結果にはならないはず。
0812デフォルトの名無しさん
2008/12/10(水) 01:16:49createEx時にthisを指定しているのですが・・・うまくいかないです
ウィンドウがアクティブになったときにC〜Viewに通知されるイベントがわかると
setFocusで何とかするのですが、イベント分かりませんか?
0813デフォルトの名無しさん
2008/12/10(水) 04:15:450814デフォルトの名無しさん
2008/12/10(水) 09:09:08> createEx時にthisを指定しているのですが・・・
CreateEx()を呼んでいる場所は、ビュークラスのメンバ関数内ですよね?
また、メンバ関数は、OnInitialUpdate()など、ビューのウィンドウが
生成されてた状態で呼ばれるメンバ関数ですよね?
thisが指すウィンドウが生成されていない(m_hWndが無効)なビューの
コンストラクタや、thisがビューを指していない他のクラス等では、
親子関係が正しく設定されません。
そもそも、MFCのCEditクラスのメンバにCreateEx()はなかったかと。
CreateExを使っているのは拡張スタイルを指定したいからだと思い
ますが、これはどの関数でしょう? また、スタイルの指定には
WS_CHILD と WS_TABSTOP が含まれていますか?
あとクラス名の指定とかどうなってます?
面倒でもCEdit::Create()でウィンドウを生成した後で、GetExStyle()と
ModifyStyleEx()で拡張スタイルを変更してみては?
0815814
2008/12/10(水) 09:41:30ttp://m--takahashi.com/bbs/pastlog/a1700/A1618.html
上記のページを見るまで、CEditの場合、Create()でウィンドウを生成した
後でGetExStyle()とModifyStyleEx()で拡張スタイルは変更できないって、
すっかり忘れてました。(w
アクティブにならないと言うのが、ビューがアクティブになった際に、
エディットにフォーカス移動しない(カレットが表示されない)ということ
であれば、ダイアログと違って、ビューのデフォルトハンドラにはそういう
処理が含まれていないので、フォーカス移動の位置を記憶するメンバ変数を
ビュークラスに追加してCView::OnActivateView()などで自前で実装する
ほかないと思います。
0816デフォルトの名無しさん
2008/12/11(木) 16:36:50画面上のボタンを押すとWindowsForm画面を開いています。
こんな感じです
ボタンの処理
Form1 ^ fm = gcnew Form1;
fm->Show();
画面は普通に開きますが
別プロセスみたいにメイン画面の下に隠れます
親ハンドルを指定すればいいのかな?と思い
下のようにしても裏に隠れます
Form1 ^ fm = gcnew Form1;
fm->Show(fm->FromHandle(GetSafeHwnd()));
親子関係にするにはどうやればいいのかわからないです。
fm->Parentやfm->Ownerを設定してもダメでした
MFCダイアログとWindowsForm画面の親子関係は無理なんでしょうか?
やりたいことはMFC画面上に.NETコンポーネントである
グラフコントロールを表示したいだけです。
素ではダイアログに組み込めないのでWindowsForm画面に組み込み
子画面として特定の位置に固定させようとしています。
画面は表示できたのに位置合わせだけがダメです。
0817デフォルトの名無しさん
2008/12/11(木) 18:21:04FromHandleだと.NET以外で作ったウィンドウはダメだと思う。
多分fm->FromHandle(GetSafeHwnd())がnull参照返してると思う。
自分でIWin32Window実装してやらないとダメなんじゃないかな。ヘルパークラスがあるような気もするが。
詳しく知りたかったら.NETスレ行った方がいいと思う。
0818デフォルトの名無しさん
2008/12/11(木) 19:56:05変更前の値と、変更後の値を取得したいのですが、
どのイベントでとればいいのでしょうか?
OnHScrollだと、変更後しか見れまえん
0819デフォルトの名無しさん
2008/12/11(木) 20:37:161つ前のCWnd::OnHScroll()の値を覚えとく
0820812
2008/12/11(木) 23:44:020821デフォルトの名無しさん
2008/12/12(金) 00:23:09ありがとうございました
.NETの方で聞いてみます
0822デフォルトの名無しさん
2008/12/12(金) 20:21:06ExtCreatePenで作ったハンドルをm_hObjectに入れてやればいいんですかね?
0823デフォルトの名無しさん
2008/12/12(金) 20:50:09わざわざAttachする必要は無し。
というか、ソースが提供されているのだから疑問に思ったら読もうぜ。
0824デフォルトの名無しさん
2008/12/14(日) 23:40:030825デフォルトの名無しさん
2008/12/14(日) 23:49:06MDIにすればいいんじゃね?
0826デフォルトの名無しさん
2008/12/15(月) 00:03:04スプリッタウィンドウやタブを親ウィンドウにして作れる。
MDIはドキュメントが複数作れるだけで関係ない。
0827デフォルトの名無しさん
2008/12/15(月) 16:16:08ボタンを押してC***Viewの関数で処理することってできますか?
0828デフォルトの名無しさん
2008/12/15(月) 16:59:420829デフォルトの名無しさん
2008/12/15(月) 17:47:530830デフォルトの名無しさん
2008/12/15(月) 17:55:190831デフォルトの名無しさん
2008/12/15(月) 17:59:520832デフォルトの名無しさん
2008/12/15(月) 18:24:34http://jfk.2ch.net/test/read.cgi/news4vip/1229319433/
世界フィギュア選手権で浅田真央が韓国を破り金賞に輝く
↓
韓国人が腹いせに2ちゃんねるを攻撃
↓
vipper今夜19:00 反撃凸 ←いまここ★
目標
http://www.dcinside.com/
Dcinside(ディーシーインサイド)は、韓国の電子掲示板サイトである。
デジタルカメラの情報を提供する専門サイトとして有名になりつつ、だんだん人が集まり韓国最大のコミュニティーサイトとなった。 韓国の2ちゃんねるともいえるサイト。
2004年に2ちゃんねるのサーバをDoS攻撃したことで有名。
0833デフォルトの名無しさん
2008/12/15(月) 18:37:18同じプロセスならできないこともないが、、、
コモンダイアログの検索を試しに使ってみては?
これでもデータのやり取りやってるぞ。
0834デフォルトの名無しさん
2008/12/15(月) 22:02:460835デフォルトの名無しさん
2008/12/15(月) 22:08:430836名無し募集中。。。
2008/12/15(月) 23:26:270837デフォルトの名無しさん
2008/12/16(火) 08:58:01なくても、流れ的にはこんなやり方でいけると思う。
#define UM_SEARCH_EXEC (WM_APP+1)
class CMySearchDlg;
class CMainFrame : public CFrameWnd
{
CMySearchDlg m_wndSearchDlg;
};
void CMainFrame::OnSearchExec(WPARAM,LPARAM)
{
CString strSearchText;
m_wndSearchDlg.GetDlgItem(IDC_EDIT1,strSearchText);
if(!strSearchText.IsEmpty())
SearchText(strSearchText);
}
void CMySearchDlg::OnSearchBtnPressed()
{
CWnd *pWnd;
pWnd=AfxGetMainWnd();
if(pWnd)
pWnd->PostMessage(UM_SEARCH_EXEC);
}
厳密にはPostMessageした後、メッセージが処理されるまでの間にダイア
ログ側のテキストが変更される可能性があるので、ダイアログ側でnewした
CStringにGetDlgItem()でテキストを取り込んで、CStringのポインタを
LPARAM等で渡し、メインウィンドウ側で使い終わった後deleteした方が
いいかな。
0838デフォルトの名無しさん
2008/12/16(火) 09:53:02モードレスでボタン押したらそのメンバ関数を呼ぶ
そんだけでいいんじゃないか?
0839デフォルトの名無しさん
2008/12/16(火) 13:47:22.NETで作りなおした方がいいですか?
また別の技術とかできたら困る
0840デフォルトの名無しさん
2008/12/16(火) 13:58:53ファイルを読み込みたいのですが、
普通にOnDropFilesを使うしかないのでしょうか?
その後、CDocument::OnOpenDocumentを通してファイルの読み取りを行いたいのですが、
何を呼べばよろしいのでしょうか?
(OnOpenDocumentのままだと、タイトルバーが変わらない)
0841デフォルトの名無しさん
2008/12/16(火) 14:02:28MFCは、C/C++
.NETは、C++/CLI
C/C++ユーザーがいる限りMFCは続くはず。
0842デフォルトの名無しさん
2008/12/16(火) 14:45:37ドラッグドロップしたら新しいファイル開くと思うけど
まず呼ばれるのはonfilenewだろ
0843デフォルトの名無しさん
2008/12/16(火) 15:00:51ファイル系メッセージや
印刷プレビューの文字列が英語になるのですが
日本語にする方法ってありますか?
ちなみに、共有DLL だと日本語になります。
環境はVS2003 sp1です
0844デフォルトの名無しさん
2008/12/16(火) 15:07:32http://support.microsoft.com/kb/832187/ja
0845デフォルトの名無しさん
2008/12/16(火) 17:54:31誰か作らねぇかな。
0846デフォルトの名無しさん
2008/12/16(火) 18:04:010847デフォルトの名無しさん
2008/12/17(水) 02:00:470848デフォルトの名無しさん
2008/12/17(水) 12:18:15これライセンスと、他のPCにVBランタイムが入ってないとダメみたいなんです。
数行表示できればいいんですが、他に似たようなコントロールは今でもないんですか?ランタイムなしで動くやつがいいです。
0849デフォルトの名無しさん
2008/12/17(水) 14:52:580850デフォルトの名無しさん
2008/12/17(水) 15:20:320851デフォルトの名無しさん
2008/12/17(水) 15:32:540852デフォルトの名無しさん
2008/12/17(水) 16:25:160853デフォルトの名無しさん
2008/12/17(水) 17:51:18常に""が返ってくるんだけど。
0854デフォルトの名無しさん
2008/12/17(水) 17:55:14試しにそうなるコード書いてみてよ。
0855デフォルトの名無しさん
2008/12/17(水) 18:07:13ソースおっかければわかるが、常に空文字列になる。
0856デフォルトの名無しさん
2008/12/17(水) 18:15:59CSettingsStore::Readのところで、strValue.Empty();になってるよね?
完全にバグだよね?
0857デフォルトの名無しさん
2008/12/17(水) 18:40:060858デフォルトの名無しさん
2008/12/17(水) 21:49:09CString GetString(
LPCTSTR lpszEntry,
LPCTSTR lpzDefault= _T("")
);
デフォルトは自分で設定するんだよ
0859デフォルトの名無しさん
2008/12/17(水) 23:56:42CListCtrlでは事が足りないのかね。
0860デフォルトの名無しさん
2008/12/18(木) 00:33:08いや足りた。グリッドは糞thx
0861デフォルトの名無しさん
2008/12/18(木) 01:35:18ポップアップダイアログの中にタブコントロールを作って、
そのタブの中にダイアログを張り付けたのですが、中のボタンが押せません
ダイアログではなくエディットコントロールを張り付けたらメッセージが届くのですがどうすればいいんでしょうか
0862デフォルトの名無しさん
2008/12/18(木) 02:30:10ダイアログの中にダイアログをどう貼り付けたか知らんけど、ボタンの
メッセージ(BN_CLICKED)が届くのは、中のダイアログの人になるだけで、
フツーに押せると思うが?
0863デフォルトの名無しさん
2008/12/18(木) 02:59:19M$はバグを仕様と言い張るからな〜
困ったもんだw
0864名無し募集中。。。
2008/12/18(木) 03:13:33結局見た目が同じようなコントロールを自分で作った
きっと需要あるだろうなーと思うが請負った仕事で書いたものだから公開は出来ないのー
0865デフォルトの名無しさん
2008/12/18(木) 07:48:360866デフォルトの名無しさん
2008/12/18(木) 10:09:24無知は困ったもんだ
0867デフォルトの名無しさん
2008/12/18(木) 10:23:510868デフォルトの名無しさん
2008/12/18(木) 12:29:04thx解決した。ダイアログ.Create(IDD..., this);
のthisをタブコントロールにしたらメッセージが届いたよ!
0869デフォルトの名無しさん
2008/12/18(木) 16:51:14つくだろう
CString str = GetString("entry","ないよ");
entry がなければ、
str = "ないよ"
だろが
0870デフォルトの名無しさん
2008/12/18(木) 17:09:59で、君はそれを試してみたのかい?
0871デフォルトの名無しさん
2008/12/18(木) 17:29:13それ以降にGetStringするとエントリーがあることになって空文字が返ってくるんだろ?
だから、ダイアログベースとかでレジストリを使わないようにするときちんと動作する。
ってことじゃないの?
0873デフォルトの名無しさん
2008/12/18(木) 22:25:59ボタンのクラスウィザード見てもないんですけど、CWndの派生だから手動で追加しても大丈夫ですかね
0874デフォルトの名無しさん
2008/12/19(金) 01:00:36WM_ACTIVATEメッセージハンドラ(CWnd::OnActivate())。
関数の引数と戻り値の型さえ間違わなければ手で追加しても問題ない。
メッセージマップの追加も忘れずに。
クラスウィザードで出ないって、ちゃんとボタンの派生クラス作ってる?
ボタンを配置したダイアログにOnActvate()ハンドラ追加しても、そこで
取れるのはダイアログのウインドウがアクティブ/非アクティブになった
タイミングのイベントだけだぞ。
0875デフォルトの名無しさん
2008/12/19(金) 02:35:12使えるハンドラだけウィザードで表示される
0876デフォルトの名無しさん
2008/12/19(金) 14:26:14これ回避できませんか?メモリ上のDCに書いて入れ替えてるんですが描画が終わる前に次の描画が来ることってあるんでしょうか?
0877デフォルトの名無しさん
2008/12/19(金) 14:57:48WM_ERASEBKGND メッセージハンドラ CWnd::OnEraseBkgnd() はどうしてる?
0878デフォルトの名無しさん
2008/12/19(金) 15:33:02自力で絶対解決できないことを教えてもらいありがとうございました。
BOOL CView::OnEraseBkgnd(CDC* pDC)
{
return 0;
return CScrollView::OnEraseBkgnd(pDC);
}
pDCの範囲がでかすぎる場合、RedrawWindowではなくInvalidataRect(rect)にしたんですが、解決できなくて困ってました
ありがとうございました。
0879デフォルトの名無しさん
2008/12/20(土) 23:30:14CDCじゃないほうがどうしてもよびだせないんです。
0880デフォルトの名無しさん
2008/12/21(日) 00:33:12何が聞きたいのかわけわかんね
0881デフォルトの名無しさん
2008/12/21(日) 01:07:49おれも>>880とまったく同じ意見なんだ。
とりあえず、"CDCじゃないほう"ってのを説明してみてくれ。
0882デフォルトの名無しさん
2008/12/21(日) 01:23:34>CDC::DrawTextってどうやって呼び出せばいいの?
ってのもよくわかんね
よんでんじゃんw
0883デフォルトの名無しさん
2008/12/21(日) 12:46:550884デフォルトの名無しさん
2008/12/21(日) 13:57:190885デフォルトの名無しさん
2008/12/21(日) 14:44:51VBとかCLIとかしか経験してないのかもしれないが
そもそもどんなアプリを作ろうとしていて、どこに文字列を描画しようとしているんだよ・・・
0886デフォルトの名無しさん
2008/12/21(日) 16:02:33DrawText(hDC.,.....とインテリセンス続きますが、
hDCが意味不明なので
CDC::DrawText(str...の書式の方で書きたかったのですが、
hDC->DrawText(str....としたらCDCのDrawTextのインテリセンス出てきました。
結局hDCが理解できてしまい、どっちでもいい感じになってしまいました。
すいません。
0887デフォルトの名無しさん
2008/12/21(日) 16:27:570888デフォルトの名無しさん
2008/12/21(日) 19:05:030889デフォルトの名無しさん
2008/12/21(日) 22:53:02で、型を定義できないのでポインタを渡す事も出来ません。
Docクラスを別なクラス内で使いたい時ってどうすればいいんですかね?
0890デフォルトの名無しさん
2008/12/21(日) 23:33:44エラーってのはコンパイルエラーだね? 最初の一個張ってみて。
もしかしたら、前方宣言ってググるだけでことたりるのかもしれない、と、おもった。
0891デフォルトの名無しさん
2008/12/22(月) 02:01:59そのエラーを全部なくせよ。ヴァカか、おまえは。
ああ、ヴァカなのかw
0892名無し募集中。。。
2008/12/22(月) 02:25:06別class.cppで hogedoc.h をインクルードさせればエラーは出ない(事が多い
0893デフォルトの名無しさん
2008/12/22(月) 06:46:41別クラスを定義したヘッダーに型の定義をする為にhogeDoc.hをインクルードさせると
別クラスを定義していないっていうエラーが大量にでます
0894デフォルトの名無しさん
2008/12/22(月) 09:29:21>>891
0895デフォルトの名無しさん
2008/12/22(月) 10:01:44XP上でもクラシックスタイルになってしまうのですが、
通常のテキストボタンと同じように環境に合わせて描画してくれるような
拡張クラスとかどこかにありませんか?
CodeGuruとかCodeProjectとか見ても、そのものズバリなものが見つからないです。
0896デフォルトの名無しさん
2008/12/22(月) 10:23:250897デフォルトの名無しさん
2008/12/22(月) 11:06:31CMFCButton
ただし、VS 2008 sp1限定だけど。
0898デフォルトの名無しさん
2008/12/22(月) 13:20:07CodeguruかCodeprojectか忘れたけど、XPStyleButtonってのがあった。
けど、結局は自分でボタン派生クラスを作ったよ。
0899デフォルトの名無しさん
2008/12/22(月) 18:32:08VS 2008 SP1 の場合は >>897
そうじゃない場合は http://msdn.microsoft.com/ja-jp/library/cc422017.aspx を読んで
CBuuton の派生クラスにそういうコードを書く。
0900デフォルトの名無しさん
2008/12/23(火) 19:32:10CButton* m_btn;
OnButtonDown
{
m_btn = new CButton();
m_btn->Create(・・・・);
}
これで、Createの行を削除したらエラー止まるので、ここだと思うのですが、
CObjectのPrivateメンバにアクセスできませんと出てしまいます。どう書けばいいんでしょうか
0901デフォルトの名無しさん
2008/12/23(火) 19:42:07まずは、C++自体をちゃんと勉強してから出直して来い。
0902デフォルトの名無しさん
2008/12/23(火) 19:49:540903デフォルトの名無しさん
2008/12/23(火) 20:27:58CButtonのCreateは純粋仮想関数にもなってないし、privateにもなってません。
ねんをおして((CButton*)m_btn)->Createとキャストしましたが、変わりません、
CObjectはどこからあらわれたのでしょうか
0904デフォルトの名無しさん
2008/12/23(火) 20:38:060905デフォルトの名無しさん
2008/12/23(火) 20:55:44OnButtonDownを外部のクラスから呼んで実行させてるんですが、ここは問題ありますか?
0906デフォルトの名無しさん
2008/12/23(火) 20:59:30virtual BOOL Create(
LPCTSTR lpszCaption,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
こんなんだぞ?
ちょっと該当箇所晒してみ?
0907デフォルトの名無しさん
2008/12/23(火) 21:06:46"間違ってない"って判断が怪しい。 多分、間違ってる。
"OnButtonDownを外部のクラス〜"は、その文章だけでは判断できない。
とりあえず情報は先に出せ。 聞き出すのがだるいから。
0908デフォルトの名無しさん
2008/12/23(火) 21:07:27このページのだいたいそのままでいけたぜ
0909デフォルトの名無しさん
2008/12/23(火) 21:09:08できないのがよくわからないし
0910デフォルトの名無しさん
2008/12/23(火) 21:23:46>OnButtonDownを外部のクラスから呼んで実行させてる
クラスの宣言で、
private:
void OnButtonDown();
になってるから外部からアクセスできない。ただそれだけ。エラーメッセージの通りだよ。
しかし、new で確保したメモリはいったいどこで解放してるんだろーな。
そのコードじゃ、OnButtonDown() 呼ぶたびに以前のアドレスは忘却の彼方に飛んでいくし、
最後に作ったボタンにしかアクセスできなくなんだがな。
0911デフォルトの名無しさん
2008/12/23(火) 21:26:15>これで、Createの行を削除したらエラー止まるので、ここだと思うのですが、
そしたらこの意味がわかんねー
やっぱり初心者はコードを晒すべきだな
多分、はじめに質問した時点と後で確かめた時点でのソースがかわってそうだしね
0912デフォルトの名無しさん
2008/12/23(火) 21:26:42幾らなんでもC++を知らなさ過ぎて話にならん。
0913デフォルトの名無しさん
2008/12/23(火) 21:29:24あ、ゴメン。そこ見落とした。
0914デフォルトの名無しさん
2008/12/23(火) 21:32:45class CCopyStaticButton: public CStatic
{
public:
CCopyStaticButton(int Num = 0){historyNum = Num;}
int historyNum;
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
vector<CCopyStaticBox> vCopyBox;
int boxNum;
CCopyStaticButton* pm_CSB;
void CCopy::ActiveCopy()
{
boxNum++;
CRect rectBox;
rectBox.SetRectEmpty();
pm_CSB = new CCopyStaticButton(boxNum);
vCopyBox.push_back(*pm_CSB);
(vCopyBox.end()-1)->Create(_T("CopyBox")+boxNum, WS_CHILD | WS_VISIBLE, rectBox, this, boxNum);
RedrawWindow();
}
0915デフォルトの名無しさん
2008/12/23(火) 21:43:46?
0916デフォルトの名無しさん
2008/12/23(火) 21:47:59CButtonで書いてしまいました。
正確にはStaticを派生させた独自作成のボタンです。
コンパイルエラー悪化してました。
vector<CCopyStaticBox> vCopyBox
は
vector<CCopyStaticButton> vCopyBox
です。
0917デフォルトの名無しさん
2008/12/23(火) 21:51:27なんか言ってること変わってきたなぁ
0918デフォルトの名無しさん
2008/12/23(火) 21:52:160919デフォルトの名無しさん
2008/12/23(火) 21:55:22CCopyクラスってなんのクラス?
0920デフォルトの名無しさん
2008/12/23(火) 21:56:190921デフォルトの名無しさん
2008/12/23(火) 21:57:18new初めて使うのでメモリ関連は勘弁してくださいすいません
0922デフォルトの名無しさん
2008/12/23(火) 22:00:10この"+boxNum"っておかしくないのか?
0923デフォルトの名無しさん
2008/12/23(火) 22:03:53矩形が空だから表示はされないけどw
0924デフォルトの名無しさん
2008/12/23(火) 22:04:20CString strNum;
strNum.Format(_T("%d"),boxNum);
(vCopyBox.end()-1)->Create(_T("CopyBox")+strNum, WS_CHILD | WS_VISIBLE, rectBox, this, boxNum);
に変更しました。ありがとうございます。なんでエラーにならなかったんだろう・・・
しかしエラー内容は変わりません。
依然、CObjectのPrivateメンバにアクセスできませんです。
0925デフォルトの名無しさん
2008/12/23(火) 22:10:21仮にこうしてみても結果は同じ?
0926デフォルトの名無しさん
2008/12/23(火) 22:12:340927デフォルトの名無しさん
2008/12/23(火) 22:13:430928デフォルトの名無しさん
2008/12/23(火) 22:13:440929デフォルトの名無しさん
2008/12/23(火) 22:15:490930デフォルトの名無しさん
2008/12/23(火) 22:20:01CButtonで書き換えました
vector<CButton> vCopyBox;
CButton* pm_CSB;
pm_CSB = new CButton(boxNum);
この3か所書き換えましたがだめです。
.ncb消し、クリーン。VS再帰。ダメでした。
CCopyクラス重複してませんでした。
0931デフォルトの名無しさん
2008/12/23(火) 22:23:43を
vector<CButton*> vCopyBox;
じゃね?
0932デフォルトの名無しさん
2008/12/23(火) 22:24:54こんなんにしてもエラーそのまま? あと、unicode/マルチバイトはどっち?
0933デフォルトの名無しさん
2008/12/23(火) 22:28:31>pm_CSB = new CButton(boxNum);
CButton に CButton( CButton& hoge) はあっても、CButton( int hoge) なんつうコンストラクタはないぞ。
0934デフォルトの名無しさん
2008/12/23(火) 22:29:45ゆにコードです
0935デフォルトの名無しさん
2008/12/23(火) 22:30:00テキトーに貼ってるのも怖いんだよねぇ
はじめはCButtonとか言ってたわけだし
一度最小のプロジェクトを作って同じことを一番シンプルな形でやってみたほうがいいよね
0936デフォルトの名無しさん
2008/12/23(火) 22:31:00>>931は?
0937デフォルトの名無しさん
2008/12/23(火) 22:33:07this以降(this含む)の引数削ってみてくんない? さすがにエラー内容変わるよね?
0938デフォルトの名無しさん
2008/12/23(火) 22:33:160939デフォルトの名無しさん
2008/12/23(火) 22:33:580940デフォルトの名無しさん
2008/12/23(火) 22:39:50int boxNum;
CButton* pm_CSB;
{
boxNum++;
CRect rectBox;
rectBox.SetRectEmpty();
pm_CSB = new CButton();
vCopyBox.push_back(pm_CSB);
CString str;
str.Format(_T("%d"),boxNum);
(vCopyBox.end()-1).Create(_T("CopyBox")/*+str*/, WS_CHILD | WS_VISIBLE, rectBox, this/*, boxNum*/);
RedrawWindow();
}
現状これなんですが、Createをコンパイルどうかけば通せますか
0941デフォルトの名無しさん
2008/12/23(火) 22:46:57>(vCopyBox.end()-1).Create
?
0942デフォルトの名無しさん
2008/12/23(火) 22:48:28このレベルじゃ他でもどうせdelete忘れたりするから諦めろ。
0943デフォルトの名無しさん
2008/12/23(火) 22:50:37ここ貼ってるコードとソースも状況が違うな?
RECT rect;
SetRect(&rect,0,0,50,50);
CStatic *m_pBut = new CStatic;
m_pBut->Create(_T("Button 2"),WS_VISIBLE | WS_CHILD ,rect, this, 50);
もうこれそのまま貼ってみろw
0944デフォルトの名無しさん
2008/12/23(火) 22:54:23起動しました。
0945デフォルトの名無しさん
2008/12/23(火) 22:56:060946デフォルトの名無しさん
2008/12/23(火) 22:57:10int boxNum;
CButton* pm_CSB;
boxNum++;
CRect rectBox;
rectBox.SetRectEmpty();
pm_CSB = new CButton();
vCopyBox.push_back(pm_CSB);
CString str;
str.Format(_T("%d"),boxNum);
(*(vCopyBox.end()-1))->Create(_T("CopyBox")/*+str*/, WS_CHILD | WS_VISIBLE, rectBox, this, boxNum);
RedrawWindow();
これで起動できました。
ありがとうございます!!!まじありがとうございます!
vector<CButton> vCopyBox;
はでなんでだめなんですか?
0947デフォルトの名無しさん
2008/12/23(火) 22:58:13>vector<CButton> vCopyBox;
>はでなんでだめなんですか?
ポインタじゃないから
0948デフォルトの名無しさん
2008/12/23(火) 22:58:220949デフォルトの名無しさん
2008/12/23(火) 22:59:18ということはお前
>>925をやってねぇな?
死刑だな
0950デフォルトの名無しさん
2008/12/23(火) 23:02:000951デフォルトの名無しさん
2008/12/23(火) 23:02:14徹底的に解析に入ります。ありがとうございました。
出来ればnewど素人に開放の場所のアドバイスをくださいお願いします。
>>949すいませんそこ直したんですが関連どこを直せばいいかわからなくなって忘れてました。
そこだったんですね!すいません
0952デフォルトの名無しさん
2008/12/23(火) 23:02:530953デフォルトの名無しさん
2008/12/23(火) 23:18:23pm_CSB->Create(
直した時もCObjectのPrivateメンバにアクセスできません。でなにもエラー内容変わらなかったんです
0954デフォルトの名無しさん
2008/12/23(火) 23:32:38CCopyStaticButton* pm_CSB;
CCopyStaticButton pm_CSB;
ってなってたってことぐらいしか考えられないな
0955デフォルトの名無しさん
2008/12/23(火) 23:53:18>出来ればnewど素人に開放の場所のアドバイスをくださいお願いします。
仕様による
最後でいいならボタン貼ってるウィンドウのデストラクタでもおk
Create();したからDestroyWindow();を忘れずに・・・
0956デフォルトの名無しさん
2008/12/23(火) 23:54:050957デフォルトの名無しさん
2008/12/23(火) 23:56:28コピーコンストラクタとかでおかしくなりそうだけど
0958デフォルトの名無しさん
2008/12/24(水) 00:18:32いらんよ。親が破棄する。
しかしまあ、>>946 も雑なコーディングだな。
>int boxNum;
int boxNum = 0; // 初期化しないでインクリメントするな。これだと warning C4700 がでてるはずなんだがな。
>str.Format(_T("%d"),boxNum);
>(*(vCopyBox.end()-1))->Create((_T("CopyBox")/*+str*/, WS_CHILD
str.Format( _T("CopyBox %s"), boxNum); // こうすりゃ一度で終わるだろ。
(*(vCopyBox.end()-1))->Create( str, WS_CHILD
0959デフォルトの名無しさん
2008/12/24(水) 00:20:01str.Format( _T("CopyBox %s"), boxNum); → str.Format( _T("CopyBox %d"), boxNum);
0960デフォルトの名無しさん
2008/12/24(水) 03:38:02アレってどうやるんすか?
0961デフォルトの名無しさん
2008/12/24(水) 03:58:04どうやるもこうやるも、ファイル名の脇に'*'を出力するのと確認ダイアログを出すだけなんだが。
まさか、コードが天から降ってくると思っているわけじゃないだろ?
0962デフォルトの名無しさん
2008/12/24(水) 06:42:57やったことあるわ
0963デフォルトの名無しさん
2008/12/24(水) 10:59:03そのアプリケーションをダイアログみたいにウインドウに張り付けて起動させることはできないんでしょうか?
0964デフォルトの名無しさん
2008/12/24(水) 12:43:130965デフォルトの名無しさん
2008/12/24(水) 13:46:560966デフォルトの名無しさん
2008/12/24(水) 15:47:440967デフォルトの名無しさん
2008/12/24(水) 16:10:23無理やりやればできなくは無いだろうが、まともに動くとは思えない。
0968デフォルトの名無しさん
2008/12/24(水) 16:28:06インスタンスとってそのインスタンスのメインウィンドウを
取得してやれば何とかできるかもしれないけど
全部が対応できるわけねえよ
>>964
てきとうに「できる」とか言うなボケ
0969デフォルトの名無しさん
2008/12/24(水) 20:37:54そこまでする必要が普通はないだけで。
# 少なくともリモートデスクトップにはできるのだから。
0970デフォルトの名無しさん
2008/12/24(水) 22:40:57移行してみようかな的な、.NETのアプリを作って組み込んで切り替えて使えるようにしようかと思ったんですが。
最悪WebBrawserコントロール貼り付けてSilverlightでUI全部すませたら面白いかなーと
今後、MFCのドッキングウィンドウは絶対はずしたくない機能なんで、どうすればいいとこどりできるかを考えてたんです。
CreateProcessで他のウィンドウを操作するところから始めてみます。ありがとうです。
0971デフォルトの名無しさん
2008/12/24(水) 22:51:23標準コントロールはつかえないから自前で用意することになるから
MFCとなんらかわりない
0972デフォルトの名無しさん
2008/12/24(水) 23:01:39自由度なくて調整するのにMFC以上に時間かかるなら意味ないですけどそんな予感はたしかにしますw
0973デフォルトの名無しさん
2008/12/24(水) 23:22:18リストコントロールの着色とか
ダイアログにダイアログを貼り付けたときのフォーカスの移動とか
リストコントロールのセルチェンジ時のコントロールの切替とか
ふつーにやらなきゃならんけどMFCだとかなり困難な部分って楽になってないの?
0974デフォルトの名無しさん
2008/12/25(木) 00:02:30WPFは自由度高い。
リストコントロールの各項目に別のコントロール入れたり
ボタンの中にボタン入れられたり(意味無いけど)
それらを任意の拡大率・角度に調整できたり。
0975デフォルトの名無しさん
2008/12/25(木) 09:28:32WPFやったらもう、MFC使ってるやつはマゾとしか思えなくなるレベル。
まあ、C++使わざるを得ないとMFCしか選択肢なくなるんだが・・・
0976デフォルトの名無しさん
2008/12/25(木) 10:14:00それってほとんど実用性ないじゃん。(w
>>973 が指摘している件は、具体的にWPFでカイゼンされているの?
> C++使わざるを得ないとMFCしか選択肢なくなるんだが・・・
MFCは文字通りマイクロソフト謹製のクラスライブラリでしかない
んだが? 対してC++は汎用言語なんで、MFCを一切使わず、自前の
クラスライブラリを作ってもいいんだよ。
もっとも、それができればの話だが、MFCさえ使いこなせないヤツに、
ムリな注文だよなぁ。
0977デフォルトの名無しさん
2008/12/25(木) 17:02:33>ほとんどの
>標準コントロールはつかえないから
何を言っているんだ君は。
>C++使わざるを得ないとMFCしか選択肢なくなるんだが・・・
C++/CLI はあかんの?俺使ったことないけど。
0978デフォルトの名無しさん
2008/12/25(木) 18:54:16C++0xスレだと、C++0xで標準化しようとしている記法を馬鹿にするほどC++/CLIの記法は評判良かったりする
そこは俺も同感だが、正直.NETとC++の相性なのか結構使いにくい印象
C++の長所も捨ててるしな
0979デフォルトの名無しさん
2008/12/25(木) 19:19:30[長所]
・GUIが細かい設定ができる
・GC
[短所]
・文字列変換がめんどくさい
C++/CLIオンリーならいいけど、
WindowsAPIとか、自分のC/C++なライブラリ使うんだったらこれ必要
他にも色々あるけど
結構C/C++の楽な部分ができなくなるお。
MFCは、GUIのタブ系と画面サイズ変更時の子コントロール変更がめんどくさいけど、
それ管理周りを自作したら、あと10年は戦える。
という結果になった。
俺は。
0980デフォルトの名無しさん
2008/12/25(木) 19:20:110981デフォルトの名無しさん
2008/12/25(木) 19:51:24どのようにすればいいでしょうか?
0982デフォルトの名無しさん
2008/12/25(木) 20:11:29C++0xの記述が長ったらしいのは柵のせいなんだろうな・・・
拡張性はあるだろうけど、正直勘弁
0983デフォルトの名無しさん
2008/12/25(木) 20:26:25どう制限したいの?
−や少数点が無しならエディットのコントロールに番号ってのがあるからそれにチェックをいれれば
数字以外入力できない
あとはキルフォーカスの瞬間にエラーメッセージを出すとか
OKボタンを押した瞬間にチェックが走ってエラーメッセージが表示されるとか
そもそも入力させないってのもあるけどこれは使う側が面倒だな
どの瞬間にどう制限したいのか?ってところでもやり方変わるけど・・・
0984デフォルトの名無しさん
2008/12/25(木) 20:49:50そもそも入力させないようにしたいのです。
出来たら制限範囲よりも大きい数字が入力されたら、補正して範囲内の最大値にするといった風にしたいのです。
0985デフォルトの名無しさん
2008/12/25(木) 20:53:03だからどのタイミングで?
キルフォーカス?
アップデート?
0986デフォルトの名無しさん
2008/12/25(木) 21:00:380987デフォルトの名無しさん
2008/12/25(木) 21:05:250988デフォルトの名無しさん
2008/12/25(木) 21:05:38色々と試行錯誤したところ上手くいきそうです。
くだらない質問に答えて頂いてありがとうございました。
0989デフォルトの名無しさん
2008/12/25(木) 21:09:23嘘だな
SetLimitTextとか他の制限は頭に入ってなさそう
0990デフォルトの名無しさん
2008/12/25(木) 22:22:25ていうかWinのマウスキャプチャーの仕様考えたの誰だよ
この辺でいつも悩んでしまう
0991デフォルトの名無しさん
2008/12/26(金) 00:01:11CDialog::::OnChangeFileName のハンドラをEditコントロールの親ウィンドウに
追加して、そこで入力された数値を監視すればいい。
で、範囲外の数値が入力されたら CEdit::SetWindowText() を使って書き直す。
ただそれだけだ。難しく考えるな。
0992991
2008/12/26(金) 00:04:52要はこれね。ON_EN_CHANGE( <id>, <memberFxn> ) afx_msg void memberFxn( );
0993デフォルトの名無しさん
2008/12/26(金) 00:44:35http://pc11.2ch.net/test/read.cgi/tech/1230219816/
0994デフォルトの名無しさん
2008/12/26(金) 02:21:10rect.Width();
こう書いた方がいい?
それとも極力
rect.right;
の方がいいと思う?
0995デフォルトの名無しさん
2008/12/26(金) 02:22:18同じもんか?それ?
0996デフォルトの名無しさん
2008/12/26(金) 02:35:14GetClientRect(&rect)の時とかで、
Width()は関数なので.rightの方がいいのではと考えながらやってたらごっちゃ混ぜで統一できてなくてひどくなってきました。
いいかげんどっちがいいのか決着をつけたいです!
0997デフォルトの名無しさん
2008/12/26(金) 03:50:53rect.right と rect.Width() の値は違うぞ。
GetWindowRect( rect)してみ。
0998デフォルトの名無しさん
2008/12/26(金) 03:55:16関数といってもやってることはこれだけだから、rect.Width() を使うクセをつけておいたほうが、
>>997のような時にバグらなくていい。
0999デフォルトの名無しさん
2008/12/26(金) 05:08:19引き算しかしてないということで、.rightに統一しようと思います。
もっと複雑なことをしていて、.rightで大丈夫なのかと不安だったんです
GetWindow、toScreenを全てGetClientに統一したので大丈夫です。ありがとうざいました。
1000デフォルトの名無しさん
2008/12/26(金) 07:48:33(・∀・)ヨユーヨユー
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。