- 1 名前:デフォルトの名無しさん [2007/08/01(水) 06:23:28 ]
- Microsoft Foundation Classライブラリ専用スレです。
- 100 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:13:46 ]
- >>99
msdn2.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx
- 101 名前:100 mailto:sage [2007/09/06(木) 00:14:51 ]
- アンカー間違えた、ごめん。
99じゃなくて96宛です。
- 102 名前:96 mailto:sage [2007/09/06(木) 00:47:54 ]
- >>99 >>100
スレッドから参照できないんですね。 ということで、タイマーで監視することにしました。 ありがとうございました。
- 103 名前:デフォルトの名無しさん [2007/09/06(木) 01:28:16 ]
- >>102
作り方によってはタイマー監視でもいいけど、同期オブジェクト使った方がいいかも スレッドプログラミングをタイマーで監視するプログラムは安易でいいけど嵌ることもあるから
- 104 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 01:32:44 ]
- あ、スマン96のようなステータスバー監視だったら
タイマーで良いや
- 105 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 07:34:25 ]
- >スレッドプログラミングをタイマーで監視するプログラム
何を監視するんだか。
- 106 名前:デフォルトの名無しさん [2007/09/06(木) 08:20:53 ]
- >>94
さぁ、ドキュメントのフィードバックをしよう
- 107 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:14:58 ]
- VC++ 2005, OSはXPProを用いているものです。
DLLを作成し、そこからAfxBeginThreadでスレッドを複数立ち上げているのですが、 メモリリークが起こってしまいます。 同様のコードをDLL経由でなく、EXEから直接動かすとリークしません。 恐らく、何らかの初期化処理が足りてないためと思っているのですが、心当たりのある方がいらっしゃいましたら、教えてください。 //--- 以下ソース #pragma once #include "TestThread.h" class CThreadManager { public: CThreadManager() { m_pThreads = NULL; } virtual ~CThreadManager() { delete [] m_pThreads; } void Run() { if (m_pThreads == NULL) {m_pThreads = new CTestThread[50];} for (int i = 0; i < 50; i ++) { if (m_pThreads[i].IsEnable()) { m_pThreads[i].SetEnable(FALSE); m_pThreads[i].Run(); return; } } } private: CTestThread* m_pThreads; };
- 108 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:15:43 ]
- //続き
#pragma once class CTestThread { public: CTestThread() { m_pThread = NULL; m_bEnable = TRUE; } virtual ~CTestThread(void) { EndThread(); } void Run() { EndThread(); m_pThread = ::AfxBeginThread(TestProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); if (m_pThread != NULL) { m_pThread->m_bAutoDelete = FALSE; m_pThread->ResumeThread(); } }
- 109 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:15 ]
- //続き
BOOL IsEnable() {return m_bEnable;} void SetEnable(BOOL bEnable) {m_bEnable = bEnable;} private: void EndThread() { if (m_pThread != NULL) { m_bEnable = -1; ::WaitForSingleObject(m_pThread->m_hThread, INFINITE); delete m_pThread; m_pThread = NULL; } } static UINT TestProc(LPVOID pParam) { for (int i = 0; (i < 50) && (((CTestThread*)pParam)->m_bEnable == FALSE); i ++) ::Sleep(5); ((CTestThread*)pParam)->m_bEnable = TRUE; return 0; } CWinThread* m_pThread; BOOL m_bEnable; };
- 110 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:16:58 ]
- 以上です。
108,109は一つのファイルを分割しています。 それと、掲示板に登校するサイズを減らすためにヘッダファイルのみで書いてみました…… よろしくお願いします。
- 111 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:44:11 ]
- >>107に追加です。
CThreadManager::Run(); 関数をタイマーで何回も呼ぶと、どんどんメモリが消費されていくという現象です。 確認は[管理ツール]→[パフォーマンス]から行い、一日ほど回し続けました。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:28:50 ]
-
初心者です、質問させてください。 OnFileNewなどMFCが用意してくれた関数の中身(=ソースコード)って 見る事ができないのでしょうか? もしできるのなら、その方法を教えてください。 よろしくお願いします。
- 113 名前:デフォルトの名無しさん [2007/09/09(日) 00:55:01 ]
- 初心者を自称する人がMFCのソースコードが読めるとでも?
- 114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:54:18 ]
- >>107
もっと簡素化したソースで検証したほうがいいんでねえの? あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、 メモリリークが発生しているかどうかをどのように見極めているとか、 メモリリークは、1スレッドあたりどの程度発生しているとか、記載すべきことがあるんでねえの? >>112 どのクラスのOnFileNewだかしらねーけど、MFCのソースはインストールされてんの? されてんなら検索すればいいだろう。 されてねーならインストールすればいいだろう。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:56:48 ]
- 検証方法は>>111に書いてるつもりなんじゃね?
- 116 名前:112 mailto:sage [2007/09/09(日) 02:15:39 ]
- >>114
「OnFileNew」をキーワードに、下記フォルダを検索したら探せました。 ありがとうございました!! C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc
- 117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:24:10 ]
- WIN32開発、java、C#とやってきて
最近MFCを始めました。 MFCってすごく難しく感じます。 実際どうなんですか?
- 118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:25:59 ]
- >>117
あなたにとって難しい。それだけのことです。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:16:30 ]
- >>117
平然と並列でないものを並べられると、頭がグラグラする。 漢文、英語、中国語とやってきて、 最近2ch語を始めました。 2ch語って凄く難しく感じます。 とかそんな感じか?
- 120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:24:08 ]
- とりあえず、107のソース使って、dllとexeから実行してみたけど
リーク検出できなかったな 1日実行してみて、どれくらいリークしてるの?
- 121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:17:53 ]
- >>117
win32の経験があるのなら、mfcはそんなに難しくないと思うが。
- 122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:15:43 ]
- フレームワーク「郷に入っては郷に従え」
の考え方ができればいける。
- 123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:48:24 ]
- >>114
もっと簡素化したソースについては今から作る事にします。 >あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、 何らかの初期化処理というのは、単にスレッドを起こす前に、おまじない的なものが必要なのかと思って書いただけです。 また、DLLMain関数はMFC側で作っているものを使っているので、こちらの初期化処理については不明です。 >メモリリークが発生しているかどうかをどのように見極めているとか、 管理ツールからパフォーマンスモニタを開きまして、そこでプロセスを選択して、15秒おきにワーキングセットを監視しています。 直接のメモリリークではないと思いますが、exeとの比較により、ワーキングセットの増え方があまりに異常なので問題かと…… >メモリリークは、1スレッドあたりどの程度発生しているとか 1スレッドあたりのリークは調べていませんが、15秒おきのワーキングセット増加値は平均で23kBほどです。 これは、CThreadManager::Run();をタイマーで、90msごとに動かした結果です。 一日動かしたときは、これよりも間隔をあけて1000msでやりました。割合は減りますが、同じようにリークします。 なお、1000msで一日動かしたときの、一日のリーク量は1MBほどです。 >>120 1000ms間隔で1MB程度です。 ちなみに、事情がありまして、DLLエクスポートの部分は少々特殊かなぁ……と。 そこのソースも書いてみます。
- 124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:49:25 ]
- // エクスポート部分のソース。
__declspec(dllexport) void CreateThreadManager(DWORD** ppObject) { *ppObject = (DWORD*)(new CThreadManager()); } __declspec(dllexport) void RunThread(DWORD* pObject) { ((CThreadManager*)pObject)->Run(); } __declspec(dllexport) void DeleteThreadManager(DWORD* pObject) { delete (CThreadManager*)pObject; } //アプリ側の使用部分 #include "stdafx.h" #include "ThreadTest.h" #include "ThreadTestDlg.h" #include "ThreadDll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CThreadTestDlg::CThreadTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CThreadTestDlg::IDD, pParent) { m_pManager = NULL; m_nTimerEvent = 0; } // 続く
- 125 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:50:08 ]
- //続き
BEGIN_MESSAGE_MAP(CThreadTestDlg, CDialog) ON_WM_TIMER() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CThreadTestDlg::OnInitDialog() { CDialog::OnInitDialog(); ::CreateThreadManager(&m_pManager); m_nTimerEvent = SetTimer(1, 89, NULL); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } void CThreadTestDlg::OnTimer(UINT_PTR nIDEvent) { if (m_pManager) { RunThread(m_pManager); } CDialog::OnTimer(nIDEvent); } void CThreadTestDlg::OnDestroy() { CDialog::OnDestroy(); if (m_nTimerEvent != 0) { KillTimer(m_nTimerEvent); } DeleteThreadManager(m_pManager); }
- 126 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:51:26 ]
- てな具合で、動かしています。正直な話タイマー間隔をこのぐらい短く設定すると一日は多分動きません。
もうちょっと空けてやらないと、マシンスペックの弱いPCだと落ちてしまうのではないかと……
- 127 名前:デフォルトの名無しさん [2007/09/09(日) 13:59:38 ]
- >>122
そうですか? BCBやVC#と比べると何をどうしていいのかまったく分からん
- 128 名前:デフォルトの名無しさん [2007/09/09(日) 14:11:26 ]
- >>127
>何をどうしていいのかまったく分からん たとえば、何をどうしたいのかな? よほど難解なことをしようとしてるのか。それともごく標準的なGUIツールも作れないのか。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:18:07 ]
- >>127
ぶっちゃけ、すぐ上のサンプルコードは動かせる?
- 130 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:10:07 ]
- >>126
とりあえず、そのもたないと思われる状態で一日動かしてみるべき
- 131 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 10:16:49 ]
- CObjectから派生させていないデータクラスでも
Serializeでないファイル読み書きに CArchiveを使ってしまってよいものでしょうか? virtual void LoadData(CArchive& ar); virtual void SaveData(CArchive& ar) const; こんな感じのメンバ関数を用意しようかと思っているんですけど。 それとも、CFile*を引数にしてしまうべきですか?
- 132 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:42:47 ]
- >>131
シリアル化にIMPLEMENT_SERIALを使わないなら、 CObject派生の意味は殆ど無いし、良いんじゃないかな。 結局は単純なバイト列の読み書きなのだし。
- 133 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:47:20 ]
- >>132
ありがとうございます。 自作データクラス群は大元の親クラスが純粋仮想クラスで、 また、自分自身がCObjectから派生することに慣れていないため、 この形のままCArchiveだけ使えないかなと思いました。 このデータクラス群の一つが内部でCArrayのメンバを持っているのですが、 これを保存するためにCArray::Serializeを呼ぼうとすると、 SaveDataはconstにはできないですね…。 まぁconstを取り外してしまえば、とりあえず動きそうですが、 SaveDataの中でMFCクラスメンバのSerializeをコールというのが かなりまずい構造なのかなぁ。
- 134 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:05:42 ]
- >>133
MFC - 概念 - シリアル化 - シリアル化 : オブジェクトのシリアル化 - アーカイブを通じた CObject の格納と読み込み
- 135 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:03:21 ]
- 質問です
CDialogの派生クラスを作成して、そのダイアログに CButtonやCStaticなどのコントロールを貼り付けています そのコントロールの上に色々描画したいんですが やり方が解りません。どうすればいいでしょうか? OnPaintを作ってその中で CPaintDC dc(this); dc.MoveTo(*,*); dc.LintTo(**,**); としてみましたが、コントロールの上でなく背後に描画されてしまいます
- 136 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:57:38 ]
- >>135
ダイアログを派生させるまで分かって、 コントロールを派生させることに思いつかなかったってことでいいの?
- 137 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:53:45 ]
- >>136
CStaticを派生させてそのOnPaintを処理したら キャプションが表示されなくなりました。 やりたいことはCStaticのコントロールがあれば、そのコントロールに 縁取りして線を描いたり、コントロールの上にビットマップを表示したり したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。 イメージとしてはダイアログを表示してそれをビットマップで保存し、 その上に落書きする、みたいな。
- 138 名前:デフォルトの名無しさん [2007/09/14(金) 12:06:25 ]
- DLLの関数をコールした時に、よく解らない現象が起きます。
char Buff[1000]; int nRet = ((PT_FUNC)*m_fpFunc)( Buff, sizeof(Buff) ); 1行目でBuff領域を確保した後、 2行目のDLLをコールするとBuffのアドレス値が変化してしまいます。 しかもthis変数の値も変化してしまい、エリアの破壊が起きている感じです。 DLL側(自作)では無処理のreturn としています。 2行目のBuff宣言を static char Buff[1000] とすると正常に動作します。 DLL関数には 静的なバッファしか渡せないという事なんでしょうか? 教えて下さい
- 139 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:26:52 ]
- >>138
m_fpFuncの中身をさらせ
- 140 名前:138 mailto:sage [2007/09/14(金) 12:38:29 ]
- >>139
FARPROC m_fpFunc; です。ここが違うのでしょうか?
- 141 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:53:40 ]
- >>140
FARPROCやめて実体と同じ型で宣言してみ 引数と戻値が呼び出しと実体で違っててスタックを壊してるだけだと思うぞ
- 142 名前:138 mailto:sage [2007/09/14(金) 13:30:42 ]
- >>141
指摘の通りでした。 ありがとうございました。
- 143 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 17:31:24 ]
- >>137
> やりたいことはCStaticのコントロールがあれば、そのコントロールに > 縁取りして線を描いたり、コントロールの上にビットマップを表示したり > したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。 CStaticのOnEranseBkGroundって作れるっけ? 作れるんなら、そこで処理してみたら? 作れないなら、無理っぽい。
- 144 名前:143 mailto:sage [2007/09/15(土) 17:34:21 ]
- ×OnEranseBkGround
○OnEraseBkgnd
- 145 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 19:40:30 ]
- >>143
結局CStaticから派生してOnPaintの中で DrawTextとかFrameRectとかを使用するようにしました 今OnEraseBkgndでFrameRectを使ってみましたが、 これでも出来そうな気がします しかし、テキストの描画時にFrameRectで描いた枠が消されて しまうようで他にも幾つかいじらなければいけないっぽいですね 一応解決です、皆さんアリガト
- 146 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:26:04 ]
-
CHtmlView::Navigate2のエラー検知を行いたいのですが、 どうすれば良いのでしょうか? どなたか教えてください。
- 147 名前:デフォルトの名無しさん [2007/09/16(日) 14:49:26 ]
- 自作DLLでダイアログを表示しようとしています。
m_pcDebugDlg->Create(IDD_TEST); を実行すると、 ERROR: Cannot find dialog template with IDD 0x36B1. というエラーが発生します。 何かの設定が足りないのでしょうか? よろしくお願いします。
- 148 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:25:03 ]
- そこに書いてある通りじゃないの?
- 149 名前:147 mailto:sage [2007/09/16(日) 17:25:10 ]
- >>148
IDD_TEST は resource.h に定義されていました。 プロジェクト/プロパティ/MFCの使用を「共有DLLでMFCを使用する」から 「スタティックライブラリでMFCを使用」に変更したら、ダイアログが表示される様になりました。 ただし、客先からは「共有MFC」でと指示があります。 何が悪いのでしょうか?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 17:33:08 ]
- リソースをビルドしなおしても同じ?
- 151 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 17:44:40 ]
- >IDD_TEST は resource.h に定義されていました。
.rc ではどうなってますか まあ>>150でおkだと思うけど
- 152 名前:147 mailto:sage [2007/09/16(日) 18:02:30 ]
- ..rc には
IDD_TEST DIALOGEX 0, 0, 250, 170 という記述がありました。 リソースをビルドという方法がよくわからなかったのですが、 ソリューションのリビルド . rcファイルのコンパイル の両方とも、現象は変わりませんでした。 リソースのビルドって、他のやり方でしょうか?
- 153 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:10:28 ]
- つ AFX_MANAGE_STATE
- 154 名前:147 mailto:sage [2007/09/16(日) 18:43:56 ]
- >>153
DLL関数の先頭に AFX_MANAGE_STATE(AfxGetStaticModuleState( )); を追加したらうまくいきました。 どうもありがとうございました。
- 155 名前:デフォルトの名無しさん [2007/09/19(水) 17:46:56 ]
- ダイアログの上でエンターキーを押すと、
プログラムが正常終了してしまいます。 プログラムを終了させたくないのですが、どうすればいいのか教えて下さい。 よろしくお願いします
- 156 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:47:04 ]
- >>155
つ[OnOK()]
- 157 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:23:59 ]
- いや俺は PreTranslateMessageで処理するほうが好きだ
- 158 名前:155 mailto:sage [2007/09/19(水) 20:06:07 ]
- >>156,157
ありがとうございました OnOK()で対応しました
- 159 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:57:01 ]
- OnOK()で対応するというのは間違っていると思う。
OnOK()の意味をちゃんと考えるべき。 そして「Enterキーを押したときにダイアログを終了させない」という仕様の意味をちゃんと考えるべき。 するとどうやって実現するのが正しい形かわかるでしょ。 面倒でも、何事も正しい形ってものを常に意識して作っておかないと後悔するよ。大袈裟だがw
- 160 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:19:33 ]
- MFCが勝手に定義してる機能を殺すだけだろ
元のダイアログにはそんな機能ない
- 161 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:50:34 ]
- リターンキーが押される→OnOK()が呼び出される→OnOK()の処理をキャンセルする
よりは リターンキーが押される→OnOK()を呼ばないようにする の方がスマート。 よってPreTranslateMessageを推奨するよ。 他の用途にも使えるし覚えといて損はない。
- 162 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 23:14:48 ]
- そこまで気にするんなら
メッセージ発生するごとにPreTranslateMessage呼ばれるのも気にした方がいいよ OnOKよりはるかにオーバヘッドになってるはず
- 163 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 12:46:43 ]
- Okボタンが在る場合、
Okボタンがデフォルトボタン形状なのはUI的にまずい。
- 164 名前:デフォルトの名無しさん [2007/09/20(木) 17:56:11 ]
- フォトショップ等、メインウィンドウの他に、
レイヤー情報などを表示するウィンドウがあるんですが、 それをCDialogで作ろうと思っているんです m_dlg.Create( CTestDialog::IDD , this ); m_dlg.ShowWindow( SW_SHOW ); で、一応表示されるんですが、 ダイアログにフォーカスが写ると、 メインウィンドウのタイトルバーが灰色になるのです。 正しい、子ウィンドウの作り方ってありますか?
- 165 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:38:14 ]
- 正しいかどうか知らんけどツールウィンドウ
- 166 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 12:26:58 ]
- Enterキーは、OKボタンを押すのではなく、デフォルトボタンを押す操作です。
PreTranslateMessageでEnterキーを弾いてしまうと、 OKボタン以外のボタン上でEnterキーを押したときにも無視されてしまいます (そのときにはそのボタンが押されるべき)。 もちろん、PreTranslateMessageでフォーカス位置を調べてもいいけど、 そこまで面倒なことをするのなら、 OKボタンをDisable・非表示にしたほうが早いです。 OKボタン自体は残しておきたいのであれば、 なにもしない非表示ボタンをデフォルトにすればよいです。 PreTranslateMessageの方法だと、デフォルトボタン枠が出ているのに Enterキーが効かないというGUI上の矛盾もあります。
- 167 名前:392 mailto:sage [2007/09/21(金) 21:55:41 ]
- > OKボタン自体は残しておきたいのであれば、
> なにもしない非表示ボタンをデフォルトにすればよいです。 デフォルトボタンは何ですか、と問われたときに、ありませんと答える方が良いかと。
- 168 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:03:04 ]
- 今、以下の方法で自作ボタンを作ろうとしています。
・CStaticを派生させる。SS_BITMAPとSS_NOTIFYを設定する。 ・OnMouseMoveでカーソルが乗ったらSetCaptureなどして降りるまでハイライト用のビットマップをSetBitmapする。 ・カーソルが降りたらReleaseCaptuerして通常のボタン用ビットマップをSetBitmapする。 ・OnLButtonUpで親ウインド(CDialog)にWM_COMMAND,BN_CLICKEDをPostMessageする。下記ソース参照。あと押された時のビットマップをセットする。 CMyButton::OnLButtonUp { WPARAM w = MAKEWPARAM(id,BN_CLICKED); ::PostMessage(hParent,WM_COMMAND,w,0); ごにょごにょ } すると確かにLボタンを押下すると親のダイアログに通知されます。 しかしながら親ダイアログではON_BN_CLICKEDマクロで登録したハンドラが2回呼ばれます。 一回目は不明。2回目は私の作ったCMyButton::OnLButtonUpから。 誰が一回目のBN_CLICKEDを送るの?CStaticの規定クラス??
- 169 名前:392 mailto:sage [2007/09/22(土) 22:02:59 ]
- winuser.h
#define STN_CLICKED 0 #define BN_CLICKED 0
- 170 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:19:04 ]
- >>169
ありがとうございます。
- 171 名前:デフォルトの名無しさん [2007/09/22(土) 23:31:42 ]
- 本当にMFCが全くわかりません。
とにかく、GUIを作るのが難しすぎに感じます。 VC#なんて超簡単にGUI作れるのに・・・ まだまだ、VC+++MFCはデファクトスタンダードなんですかね?
- 172 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:33:02 ]
- >>171
MFCは欠陥製品だと思う 対抗するボーランドがコケちゃったんでMSの一人天下になっていますが これに付き合わされる開発者はたまらない C#を使いましょう
- 173 名前:デフォルトの名無しさん [2007/09/23(日) 00:42:51 ]
- 慣れの問題ですよ
VC#が簡単に、作れるって言っても例えばテキストエディタを作る場合 商用を考えたら標準のTextBoxなんて使い物になりません。 一から書くことになります。 だったら、WIN32APIを手間なく呼べるVC++に利がある。 VC#だと使う、WIN32APIをいちいち宣言しなくてはいけない。
- 174 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:58:19 ]
- MFC使わねばならん環境なら、頑張って使えるようになればいいだけだし、
使わなくて言い環境なら、C#でやればいいだろう。 何故このスレで愚痴るのか理解できない。
- 175 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 23:52:49 ]
- >>174
MFCの習得に挫折した人がMFC叩きしてるだけ。 穏やかになだめてあげてください。
- 176 名前:デフォルトの名無しさん [2007/09/24(月) 00:10:51 ]
- 確かに他のライブラリと比較すると挫折率はダントツに高いかもしれん
よく、Cはポインタで躓いたなんて人いるけど似たようなもん
- 177 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 01:45:06 ]
- ていうかあまりの複雑さと面倒臭さに死にたくなるときあるな
なんでもかんでもメッセージって逆に面倒臭いだけだったんじゃないだろうか・・・
- 178 名前:デフォルトの名無しさん [2007/09/24(月) 02:17:59 ]
- けど、大抵の商用ソフトはMFCが使われている。
.NETなんて皆無では???
- 179 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 02:47:39 ]
- >>178
だって糞おせぇし
- 180 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 02:54:45 ]
- Vistaならネイティブとほとんど変わらんが?
- 181 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:10:20 ]
- >>180
それって普通に作ってた奴の方が遅くなったんでしょ?w
- 182 名前:デフォルトの名無しさん [2007/09/24(月) 05:07:52 ]
- MFCは隠蔽化というより隠蔽工作だというようなことがかかれた本があった。
本来仕組みなど知らなくても簡単に使用できるのが隠蔽化だが MFCには仕組みを知らなければバグの原因がまったく理解できない不可解な現象も多い。 それらを苦労して乗り越えて来た人間は威張り腐りって、 「MFCが糞なんじゃなくて理解できないやつが糞」と言いたいのだろう。気持ちはわかる。 だが世間一般ではそういう場合ライブラリが糞だという。 自分の腕前を自慢したいからって言葉を捻じ曲げてはいけない。
- 183 名前:デフォルトの名無しさん [2007/09/24(月) 05:31:44 ]
- あの当時に書かれたライブラリで今まで通用したものってほかに何かあるかな?
OLEを隠蔽するフレームワークとして十分納得いくし、フル機能のウインドウズ ソフトウエアを書くのにほかにいいライブラリが無かったのも事実だと思う。
- 184 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 06:03:59 ]
- >>それらを苦労して乗り越えて来た人間は威張り腐りって、
被害者意識が強い傾向が見られます。 何かトラウマになるような事でもあったのでしょうか(w
- 185 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 06:41:22 ]
- MFCがなければWIN32のバグが分からない
永遠に更新を続けるべき
- 186 名前:デフォルトの名無しさん [2007/09/24(月) 07:39:58 ]
- >>182
あー、でも俺、そういうラッパー系のクラスで 下層の構造知らずにうまく包んであるもんってみたことないわ 無理なんじゃねぇの?って思ってる 可変長ですよといいつつ なんも意識せずに1文字ずつ追加すると毎回全バッファを再確保する 最近の次世代(?)言語の文字列クラスのようにw
- 187 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 09:28:21 ]
- 文字列定数 -> System.String
CString -> System.Text.StringBuilder と考えれば、それはそんなもんかって気もする。 Stringの連結はおまけ機能ってことで。
- 188 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 10:54:07 ]
- MFCのいいところはVisualStudioで使う場合にドキュメントモデルを提供してくれることとダイアログエディタがあることか。
ちょっと凝ったことをしようと思うと折角クラスで隠蔽化しているように見えても実際にはAPIと同じ名前のメソッドだからAPIと手間は変わらないし、 全てを網羅しているわけではないから結局APIを直截呼ばないといけないケースもある。 あれはだからAPIラッパクラス集と思えばいいのであって、それ以上のフレームワークと思ってはいけないのだろう
- 189 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 15:22:11 ]
- >>187
>Stringの連結はおまけ機能ってことで。 そんなことになってるぐらいならラップなんてしないほうがいいじゃないって思う
- 190 名前:デフォルトの名無しさん [2007/09/26(水) 11:01:12 ]
- CDC型のメンバからその描画領域のサイズを取る方法はありますでしょうか。
CBitmap* pBitmap = pDC->GetCurrentBitmap(); BITMAP bmp; pBitmap->GetBitmap(&bmp); とやってbmp.bmWidthやbmp.bmHeightを参照しようと思ったのですが、 ビューのOnDrawなどで渡される画面DCに対しては GetBitmapがエラーになるようなのです。 メモリDCに対しては成功します。 もちろん、OnDraw時はGetClientRectを使えばサイズを取れるのですが、 関係無い場所でpDCだけを見て調べられないかなと思っています。
- 191 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:43:46 ]
- つ ::WindowFromDC
- 192 名前:デフォルトの名無しさん [2007/09/26(水) 11:53:25 ]
- >>191
ありがとうございます。 ::WindowFromDCというのは、CDC::GetWindowと対応しているようなので、 CRect rect; BITMAP bmp; if (pDC->GetCurrentBitmap()->GetBitmap(&bmp)) { /* メモリDC */ rect = CRect(0, 0, bmp.bmWidth, bmp.bmHeight); } else { /* 画面DC */ pDC->GetWindow()->GetClientRect(rect); } とやってみたところ、どちらの場合でもサイズを取ることができました。 判定方法はこれで大丈夫ですよね?
- 193 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 13:30:06 ]
- .NETのMenuStrip簡単にできていいなぁ
MFCでもサポートしてくれ
- 194 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:33:08 ]
- 簡単に作れる代わりに使い物にならんほど遅いプログラムとなってしまった
.NET非常に残念だったな
- 195 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:39:05 ]
- MFC not dead - "massive update" planned
まさか .NETは無しね!MFC大幅機能強化するから! なんてことになるん(r
- 196 名前:デフォルトの名無しさん [2007/09/30(日) 06:51:40 ]
- MFC と NET って、どの程度の処理速度がちがうんですか?
まじレス希望
- 197 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:27:09 ]
- >>196
MFC全盛期のPCでMFCを動かすと、今のハイエンドなPCで.netを動かすのとは較べ物にならないほどもっさりしています。
- 198 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:28:36 ]
- MFCって.NETのコントロールと比べると鼻くそみたいにショボイのに2008にもまだ残ってる理由ってなんですか?
必要かな?
- 199 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:54:06 ]
- 鼻くそみたいにショボイと思ってるのに
このスレへやってくる理由ってなんですか? 必要かな?
- 200 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:07:07 ]
- .NETのコントロールなんて飾りです。偉い人には(ry
冗談抜きで。
|

|