■MFC相談室 mfc18d.dll■
at TECH
1:デフォルトの名無しさん
07/08/01 06:23:28
Microsoft Foundation Classライブラリ専用スレです。
2:デフォルトの名無しさん
07/08/01 12:02:21
前スレくらい貼ってくれてもバチは当たらないと思う >>1
■MFC相談室 mfc17d.dll■
スレリンク(tech板)l50
3:前スレ986
07/08/02 21:54:39
前スレ>987 遅レスだがサンクス
4:デフォルトの名無しさん
07/08/10 21:12:33
GUIの設計が大変すぎるんだが
例えばVCLでいうStringGridみたいなもの作りたいとき
MFCだけでやろうとするとListBoxとかListViewとかをベースに
しこしこつくっていくわけなんすかね
5:デフォルトの名無しさん
07/08/10 21:44:32
だからMFCは基本的にWin32のラッパなんだと何度言ったら(ry
StringGridって割と便利みたいだし、誰かMFCで実装した奴いるんじゃね?
いなけりゃ、自前で実装して公開すれば皆に喜ばれるよ。
6:デフォルトの名無しさん
07/08/11 09:45:34
ダイアログの中にマウス関連のイベントやグラフィック表示を扱う
独自のコントロールを置きたいのですが、
・CWndの派生クラス(カスタムコントロール)として作成
・CStaticの派生クラスとして作成
この両者で作り勝手などに違いはありますか?
どちらが妥当な方法でしょうか?
7:デフォルトの名無しさん
07/08/12 03:00:57
>>4
よく分からんけど
URLリンク(www.codeproject.com)
URLリンク(support.microsoft.com)
URLリンク(forums.belution.com)
こんなん使ったらアカンのか?
8:デフォルトの名無しさん
07/08/14 06:33:44
CListView(report)とCDocumentの質問なんですが、
CDocumentに、オブジェクトの配列obj[10]を作って、それを配列の引数順にリストに表示させているのですが、
リストでソートしたときに、リストの表示とCDocumentのリンクのさせかたが分かりません。
つまり、リストのどの行に、オブジェクト配列obj[10]の何番目が入っているのか、どうやってリンクさせればいいんでしょうか?
9:デフォルトの名無しさん
07/08/14 06:55:17
>>8
CListCtrl.SetItemDataでインデックス・ポインタ等を関連付けておく。
UI上でのインデックスは、GetItemData用と割り切って考えるといい。
10:デフォルトの名無しさん
07/08/14 07:21:23
>>9
レス有難うございます。
やってみたのですが、SetItemDateは、 LVITEM 構造体の lParam メンバの値を設定するもののようなのですが、
で、ソートするときに、このlparamの値を、itemの値と同じ通し番号にしているので(他から引っ張ってきたソート用
のコードで、なんでこうしているのかわからないのですが・・・)、
初めにセットしたlParamの値がソートすることで消えてしまいます。
ソートのコードがおかしいのでしょうか?
どうすればよいのでしょう。
11:デフォルトの名無しさん
07/08/14 07:36:31
>>9
CompareFuncの中もobjを使って比較すればよいのですね。
わかりました。
ありがとうございました。
12:デフォルトの名無しさん
07/08/14 08:11:07
>>10
ちゃんと頭を使ってドキュメントを読めば、そんな引っ張ってきたロジックに頼らずに
自分でソートくらい書けるようになりますよ。
尤も、SetItemDateなんてTypoやっているようじゃお郷が知れますがね。
13:デフォルトの名無しさん
07/08/14 09:10:37
お郷が知れます(w
14:デフォルトの名無しさん
07/08/14 09:34:54
日曜大工ならず、夏休みプログラミングなもんで・・・
スレ汚し勘弁
15:デフォルトの名無しさん
07/08/14 23:24:41
>>10
lParamの値からFindItemを使ってアイテムのIndexを取得してソートに利用
すれば良いでしょう。そうすれば、後からソートをし直してもIndexは
変わってもlParamの値は変わらないので、配列に関連付けて使う事が可能です。
この場合lParamはアイテム挿入時に一度セットしたら後から変えないで下さい。
16:デフォルトの名無しさん
07/08/16 20:44:02
テキストエディタとかにルーラー(目盛り)ついてますが
あれと同等のことをやりたいです。下にスクロールしても常に表示するみたいな
CScrollViewと CDC::IntersectClipRectつかってもうまく行きそうにない・・・。
CViewとIntersectClipRectでスクロールは自前でやるしかないのでしょうか?
# CSplitterWndでルーラー部と本体部の2つのViewってのもありでしょうか・・・
17:デフォルトの名無しさん
07/08/16 21:57:04
>>7
試してみます thx
18:デフォルトの名無しさん
07/08/17 00:39:30
>>7
その程度のものなら自前で作ってもたかがしれてる
ドキュメント読んで使い方を覚えるほうが面倒だよ
19:デフォルトの名無しさん
07/08/17 01:00:02
すいません。質問です。
ダイアログのクラスの名前を間違えたので、
ダイアログのクラスを一旦削除して、同じ名前のダイアログのクラスを再度作成すると以下のエラーがでます
error C2374: 'classCDialogXXXX' : 再定義されています。2 回以上初期化されています。
'classCDialogXXXX' の宣言を確認してください。
error C2084: 関数 'CRuntimeClass *CDialogXXXX::GetRuntimeClass(void) const' は既に本体を持っています。
'GetRuntimeClass' の前の定義を確認してください
・・・
grepしてもclassCDialogXXXXは一箇所しか見つかりません・・・
同じ名前のクラスを再度作るにはどうすればいいですか?
20:デフォルトの名無しさん
07/08/17 01:13:13
>>19
単に、消し忘れた場所があるだけのような気もするが……
リビルドとかいう基本的な話じゃないよな?
21:デフォルトの名無しさん
07/08/17 11:28:49
MFCのソフト1つで、次の場合はダイアログとSDIのどちらが適切ですか?
メニューバーはありで、ツールバーは使いません。
ドキュメントを1つ扱います。
ビューでは、8割がボタンなどで、2割が独自の描画をします。
ビューの一部だけを独自描画の時に、どちらを選ぶのが適切か教えて下さい。
22:デフォルトの名無しさん
07/08/17 17:32:08
>>21
画面の一部のみ独自で描画したいというだけなら
DialogでもSDIでもどっちでも構わない。
メニューありでボタンが一杯という所を見る限り
自分ならSDIでViewの種類をCFormViewにする。
23:デフォルトの名無しさん
07/08/17 22:57:42
漏れなら可能な限りダイアログだ。
24:デフォルトの名無しさん
07/08/17 23:34:25
ダイアログの何が便利なのかさっぱりわからん
大体、CViewから派生させ、すべて自前で描画したほうが
客の理不尽な要求に応じれる。
25:デフォルトの名無しさん
07/08/18 00:49:36
配置がリソースエディタで弄れる
26:デフォルトの名無しさん
07/08/18 04:41:41
CFormViewでもいじれるやん
27:デフォルトの名無しさん
07/08/18 10:29:11
>>24 の条件でCFormViewって反則じゃね?
28:デフォルトの名無しさん
07/08/18 10:52:49
>>24
>ダイアログの何が便利なのかさっぱりわからん
ビューとドキュメントをわざわざ分離するまでもない場合、コード量が減る。
29:デフォルトの名無しさん
07/08/18 22:57:02
>>28
その程度のプログラムを作成する必要があるのかしらん?
30:デフォルトの名無しさん
07/08/19 01:28:23
必要がある、と答えられたらそれまでだな。
プログラムの規模とその必要性に関連は無いし。
MFCで小規模アプリ組むの禁止〜!
ってな決まりもないしね。
31:デフォルトの名無しさん
07/08/19 02:36:15
っえ?
MFCは大規模アプリケーションには向きませんよ
32:デフォルトの名無しさん
07/08/19 02:50:20
>>24
あれだろ?
MSの仕様から逸脱した仕様を希望する馬鹿な客だろ?
そういうの刎ねちゃって問題無い場合がほとんどだぜ
そいつの好感度上げてもなんもいいことねーし
やったからって次の仕事がくるかどうかも全然関係無い場合が多い
俺はタブフォーカスやショートカットの類は全部高額な金額ふっかけて刎ねてる
やりたきゃ自分のところでやれと
正直、やるだけ無駄、全く意味無し
33:デフォルトの名無しさん
07/08/19 05:50:13
ソフト会社入社3年目の初心者です。
MFCは今後は.NETに取って代わられるというような話を聞きました。
実際どうなんでしょ?
34:デフォルトの名無しさん
07/08/19 06:30:35
>>33
.NETってなーに?
35:デフォルトの名無しさん
07/08/19 06:38:50
.NET Frameworkのことじゃね?
でも.NET FrameworkってC++で使えるの?
36:デフォルトの名無しさん
07/08/19 11:43:23
>>33
まあ、単純で簡単な.NETに移っていくのはしょうがないんじゃね。
VSの機能も、明らかにC++よりC#に力入れてるし。
MFCがなくなることはないだろうけど、使う機会はゆっくり減っていくかと。
37:デフォルトの名無しさん
07/08/19 12:25:21
組み込みプログラムとそのツールの作成の仕事が多いから
MFC+C++の形を保ってくれないと困る
ソース流用できねーじゃん
基本理念(オブジェクト指向)が変わらないのに
新しい言語なんて無駄に作るんじゃねぇといいたくなる
38:デフォルトの名無しさん
07/08/19 13:50:40
C#やVB.NETは厳密にはコンポーネント指向
39:デフォルトの名無しさん
07/08/19 14:10:15
>>35
C++/CLI
>>37
>組み込みプログラムとそのツール
GUIとファイル処理、通信部でも作っとけば、
ちょっとした組み合わせと改造で事足りるんじゃないか?
その程度だったら、2ちゃん回ってる時間を少し割けば、速効で作れるだろ
VC、VBだろうが、OOPがどうとか目くじら立てるほどのもんかね?
組み込みでアーキテクチャやOSやらが変わったり、
実績のないボード動かしたりするほどの手間でもないだろ
40:デフォルトの名無しさん
07/08/19 20:01:19
.netでのアプリを出荷したことないから何とも言えないが
客先から見たら、.NETであることによるメリットってなにもないよね?
しかも、.netは遅いなんてことも浸透してるから・・・
41:デフォルトの名無しさん
07/08/20 00:32:37
今までいろんなプログラム書いてきたが
MFCほどわからんもんはない
42:デフォルトの名無しさん
07/08/20 00:47:01
>>40
なんだろうなあれ?
なんであんな糞動作するんだろか?
スクリプトで動作してんのかな?
Vistaといい動作の糞なアプリが多くなったな
43:デフォルトの名無しさん
07/08/20 06:16:33
>>42
糞動作の意味がわからん
中間言語で動いてるんだから初回起動は遅いのがあたりまえだろ
もっさりしているが 異常動作してるわけじゃない
さらにVistaをアプリと分類する頭も逝かれてるな
44:デフォルトの名無しさん
07/08/20 09:28:57
アンマネージドなのは好きになれないが、GUI周りの設計は嫌いじゃない。
45:デフォルトの名無しさん
07/08/20 09:31:23
アンマネージドじゃなくてマネージドだった
46:デフォルトの名無しさん
07/08/20 11:31:13
>>42
>>42
>>42
>>42
>>42
>>42
>>42
47:デフォルトの名無しさん
07/08/20 11:38:51
>>40
ヒント
1年目マでも使える
開発期間
ASP.NET
48:デフォルトの名無しさん
07/08/20 17:14:01
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
return pApp->DoMessageBox(lpszText, nType, nIDHelp);
else
return pApp->CWinApp::DoMessageBox(lpszText, nType, nIDHelp);
49:デフォルトの名無しさん
07/08/20 22:29:14
>>43
やっぱ、もっさりしてるんじゃんw
これが糞動作でなくてなんなんだと聞きたい
俺等は.Netをサポートしてバージョンをわざわざアップしてやるのに
動作はもっさりすんのか?
お前等なんて一生もっさりしてればいいんだ
50:デフォルトの名無しさん
07/08/20 22:36:34
CDC::SaveDCとCDC::RestoreDCって、
CDC::SelectObjectの戻り値を最後に戻す方法に比べて、
なにかデメリットってありますか?
こっちのほうがずっと簡潔に書けると思うのだけど。
51:デフォルトの名無しさん
07/08/20 23:15:09
一切合財保存するだろうから、必要なものだけ戻すよりは重いと思う。
でもまあ今時のPCならデメリットと言えるほどのものではないだろう。
52:デフォルトの名無しさん
07/08/21 20:45:43
一ヶ所でやる事しか考えないなら
どっちでもいい
53:デフォルトの名無しさん
07/08/22 12:37:48
>>51
やっぱりSaveDCとRestoreDCのほうが便利ですよね。
なんでこの方法って広く浸透していないんだろう。
卑怯な方法みたいに書かれているところもあったし。
>>52
これはどういうことでしょうか?
SaveDCはスタック的に何回でもコールできるみたいですけど。
54:デフォルトの名無しさん
07/08/29 20:40:42
CDocumentでファイル開く処理を行った後、
CViewのOnDrawで再描画行いたいんですけど
CView::GetDocumentのような
GetViewみたいなの無いですか?
OnDrawするような再描画コマンドでもいいです。
55:デフォルトの名無しさん
07/08/29 21:18:28
>>54
Viewの更新は、基本的にCDocument::UpdateAllViewsで通知する
GetFirstViewPosition/GetNextViewを使って、
関連付けられたViewの取得もできなくはないけど。
56:デフォルトの名無しさん
07/08/29 23:47:13
CMyView* pView = (CMyView*)AfxGetMainWnd()->GetActiveView();
pView->InvalidateRect(NULL, FALSE);
57:デフォルトの名無しさん
07/08/29 23:49:32
ドッキングウィンドウ難しい・・・orz
誰か詳しいページ知ってる人いませんか?
コードGruruしかない?
58:デフォルトの名無しさん
07/08/30 14:55:47
MFCでドッキングは茨の道すぎるので
C#かBCBやりなさい
59:デフォルトの名無しさん
07/08/30 23:16:51
VC++2005にCWebBrowser2が無いのですが、
ダイアログに貼り付けたWeb Browserコントロールで
下記のようにNavigate2したいのですが、どうすればできるでしょうか?
CWebBrowser2* wb = (CWebBrowser2 *)GetDlgItem(IDC_EXPLORER1);
wb->Navigate2(url,NULL,NULL,NULL,NULL・・・);
60:デフォルトの名無しさん
07/08/30 23:34:59
>>59ですが、webbrowser2.hとwebbrowser2.cppを自分のプロジェクトへ追加することで解決しそうです
61:デフォルトの名無しさん
07/08/31 09:07:23
>58
MFCはドッキングツールバーがあるから
ドッキングウインドウは簡単だけど?
62:デフォルトの名無しさん
07/08/31 14:57:46
>>61
なら教えてやれよ。
63:デフォルトの名無しさん
07/08/31 17:12:58
>>57
URLリンク(www.codeproject.com)
64:デフォルトの名無しさん
07/08/31 23:11:46
ドッキングも使えないとは・・・
65:デフォルトの名無しさん
07/09/01 11:35:46
メモリマップドファイルについてですが
hMap = CreateFileMapping( hFile, 0, PAGE_READONLY, 0, 0, NULL); // MAP名なし
if( hMap <= 0 )
{
return false;
}
pPointer = (char*)MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0); // 全サイズ
↑のようにとするとhFileの内容が数1G超とかの場合、無謀になるような気がしますが
MapViewOfFileEx等で数ページ分を部分的に割り当てていくしかないでしょうか?
1Gぐらいのファイルを試してみるとpPointerがNULLでした。
66:デフォルトの名無しさん
07/09/01 11:40:58
ここMFCスレですよ
67:デフォルトの名無しさん
07/09/01 12:14:26
CControlBarから派生する独自ドッキングバー作る時はかなり苦労したもんだ( ´∀`)
CDockBarとかCDockContextとかMSDNドキュメントにも載ってないしソース読むしかないもんな
でも.NETだと最初からリサイズ可能ドッキングバーがあるんだよなー・・・なぜMFCも拡張せん!ヽ(`Д´)ノ
68:デフォルトの名無しさん
07/09/01 14:53:09
だってMFCだもん
69:デフォルトの名無しさん
07/09/01 17:48:35
MFCって今後は先細り?
.NETマンセー時代は来るんですか?
70:デフォルトの名無しさん
07/09/01 23:55:43
VS2008でVista向けMFCが出るみたい
71:デフォルトの名無しさん
07/09/02 00:18:12
MFC嫌いなんで廃れてくんねーかな
72:デフォルトの名無しさん
07/09/02 00:23:31
なぜ?
.NETに比べたら100倍はいいと思うが?
73:デフォルトの名無しさん
07/09/02 00:28:05
>>71嫌いなんで氏んでくんねーかな
74:デフォルトの名無しさん
07/09/02 11:58:33
例外でポインタを投げてくるのだけはどうにかしてほしい
75:デフォルトの名無しさん
07/09/02 14:27:02
MFCに文句つける奴って単に使えないからだけだでょ?
現在、WINでGUIを作成するなら最強だと思う。
MFC無い時代はWINアプリを書くのはしんどかった。
最近C#なんてあるが、所詮インタプリタみたいなもんだからおもちゃw
76:デフォルトの名無しさん
07/09/02 15:24:09
お前は小学生か
77:デフォルトの名無しさん
07/09/02 15:43:12
.NET Frameworkに文句つける奴って単に使えないからだけだでょ?
現在、WINでGUIを作成するなら最強だと思う。
.NET無い時代はWINアプリを書くのはしんどかった。
昔MFCなんてものがあったが、所詮遺産みたいなもんだからガラクタw
78:デフォルトの名無しさん
07/09/03 00:22:51
MFCなんて時代遅れっしょ
79:デフォルトの名無しさん
07/09/03 00:48:28
次期VSでのMFCはかなりイイ
ダウンしてみ。
.NETなんざ使う気しなくなるぞ
80:デフォルトの名無しさん
07/09/03 01:45:52
具体的に説明せよ
81:デフォルトの名無しさん
07/09/03 03:31:47
MFCってなにがどうなってんのかさっぱりわかんね('A`)
82:デフォルトの名無しさん
07/09/03 11:39:24
ダイアログ上に数十のラジオボタンを配置したいのですが、
後のメンテナンス性を考慮して、ダイアログエディタではなく
プログラム内の初期化処理にて生成したいのですが、
どういう関数を使えばいいのですか?
よろしくお願いします。
83:デフォルトの名無しさん
07/09/03 12:42:25
>>82
CButton::Create
84:82
07/09/03 13:39:19
>>83
ありがとうございます。
85:デフォルトの名無しさん
07/09/03 20:50:30
MFCって関数ポインタテーブルを使いたい「だけ」のためにC++使ってるんだろ?
C with class でしかないじゃん、C++と言うより
86:デフォルトの名無しさん
07/09/03 20:58:27
>>85
"C with class"であることの何が悪いのか知らんけど、クラス継承もあるし、オペレータオーバロードもある。
新しいMFCならテンプレートも使っているね。
87:デフォルトの名無しさん
07/09/03 23:46:56
ダイアログ上にタブコントロールを配置してます。
ダイアログの表面色を塗りつぶしてるんですけど、
タブコントロールのタブが並んでいる部分の横の余った空間や、
タブコントロールの周囲の微小な背景がグレーのままです。
ここを塗るにはどうしたらいいんでしょうか。
塗るでもいいし、背景を透過にできればいいんですけど。
88:デフォルトの名無しさん
07/09/03 23:53:19
URLリンク(rararahp.cool.ne.jp)
場所は↑この方が説明してるのと同じです。
89:デフォルトの名無しさん
07/09/04 21:26:42
CHtmlViewでURLのドロップを受け取れるようにするにはどうすればいいの?
SetRegisterAsDropTarget(TRUE)をしてもダメだった
90:デフォルトの名無しさん
07/09/04 23:03:19
中味はIEだし、特に何もしなくてもできるだろ
91:デフォルトの名無しさん
07/09/04 23:12:42
ちょっと興味あったんで試したけどデフォルトじゃ無理みたい。
WM_DROPFILESのイベントハンドラ追加のみで出来ました。
ショートカットだけじゃなく、htmlファイルやtxtファイルも表示可。
92:デフォルトの名無しさん
07/09/04 23:36:09
ウイザードでCHtmlViewにして、あとは何もいじらない状態でできたよ
93:デフォルトの名無しさん
07/09/05 00:33:26
>>90,92
通常のCHtmlViewではドロップできませんでした
MFCのバージョンが関係あるかもしれないでしょうか?
自分はVisual Studio 2005 Standard Edition SP1を使ってます(WinXP&IE6)
>>91
OnCreateでDragAcceptFiles()してWM_DROPFILESを追加したら、
ローカルのファイルはドロップできるのですが
IEからのURLのドラッグ&ドロップはできませんでした・・・
IEからのURLのドロップをしたいのです
94:デフォルトの名無しさん
07/09/05 09:49:06
CDC::DrawDragRect()の説明には、座標は「論理座標」と書かれてるのに、
指定した位置にちゃんと描かれず、ネットで使用例を漁ってみたところ、
dc.LPtoDP(&rect);
dc.DrawDragRect(rect, Last_draw_size, NULL, CSize(0, 0));
という記述がありました。
これに倣ってLPtoDP()してみたらちゃんと描かれたんですけど、
LPtoDP()するということはデバイス座標ですよね?
MSDNの「論理座標」というのはどういう意図なんでしょうか?
CDC::Rectangle()のほうにも論理座標と書かれていて、
こっちはLPtoDP()は必要無いんですけど。
95:デフォルトの名無しさん
07/09/05 14:55:19
>>94
MSDNの説明が間違っているな、これ。英語版でも駄目だな。
VS2005のCDC::DrawDragRectのコードだと、
矩形描画の範囲を指定するのにSelectClipRgnを使っているが、
この関数はデバイス単位での指定を仮定しているにも関わらず、
単位変換無しでそのまま渡している。
96:デフォルトの名無しさん
07/09/05 23:49:14
mfc(VC++ 2005)で開発をしているのですが、
ステータスバーをスレッド中から参照しようとすると、
Assertion Failedで怒られてしまいます。
ダイアログに変数で CStatusBar m_statubar を追加して
OnInitDialog でCreate、ペインの初期化を行い
ダイアログのコンストラクタで外部変数で定義した CStatusBar *m_sb に
m_sb = &m_statusBar でアドレスを渡してスレッドで参照しているのですが
どこがいけないのでしょうか?
97:デフォルトの名無しさん
07/09/05 23:55:33
>>95
解析情報ありがとうございます。
やっぱりCDC::DrawDragRect()ってデバイス単位で渡すのですよね。
昔からある関数なのにドキュメント修正すらされてないのか…。
98:デフォルトの名無しさん
07/09/05 23:59:24
たまたま指摘が無かったんじゃね?
ちゃんとMSに言えば多分直してくれるよ。
99:デフォルトの名無しさん
07/09/06 00:11:21
>>96
メインスレッド以外からコントロールを操作してはいけないからと思われ。
100:デフォルトの名無しさん
07/09/06 00:13:46
>>99
URLリンク(msdn2.microsoft.com)(VS.80).aspx
101:100
07/09/06 00:14:51
アンカー間違えた、ごめん。
99じゃなくて96宛です。
102:96
07/09/06 00:47:54
>>99 >>100
スレッドから参照できないんですね。
ということで、タイマーで監視することにしました。
ありがとうございました。
103:デフォルトの名無しさん
07/09/06 01:28:16
>>102
作り方によってはタイマー監視でもいいけど、同期オブジェクト使った方がいいかも
スレッドプログラミングをタイマーで監視するプログラムは安易でいいけど嵌ることもあるから
104:デフォルトの名無しさん
07/09/06 01:32:44
あ、スマン96のようなステータスバー監視だったら
タイマーで良いや
105:デフォルトの名無しさん
07/09/06 07:34:25
>スレッドプログラミングをタイマーで監視するプログラム
何を監視するんだか。
106:デフォルトの名無しさん
07/09/06 08:20:53
>>94
さぁ、ドキュメントのフィードバックをしよう
107:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/07 23:16:58
以上です。
108,109は一つのファイルを分割しています。
それと、掲示板に登校するサイズを減らすためにヘッダファイルのみで書いてみました……
よろしくお願いします。
111:デフォルトの名無しさん
07/09/07 23:44:11
>>107に追加です。
CThreadManager::Run(); 関数をタイマーで何回も呼ぶと、どんどんメモリが消費されていくという現象です。
確認は[管理ツール]→[パフォーマンス]から行い、一日ほど回し続けました。
112:デフォルトの名無しさん
07/09/09 00:28:50
初心者です、質問させてください。
OnFileNewなどMFCが用意してくれた関数の中身(=ソースコード)って
見る事ができないのでしょうか?
もしできるのなら、その方法を教えてください。
よろしくお願いします。
113:デフォルトの名無しさん
07/09/09 00:55:01
初心者を自称する人がMFCのソースコードが読めるとでも?
114:デフォルトの名無しさん
07/09/09 01:54:18
>>107
もっと簡素化したソースで検証したほうがいいんでねえの?
あと、”何らかの初期処理”ってのが、DLLの初期処理ではないとか、
メモリリークが発生しているかどうかをどのように見極めているとか、
メモリリークは、1スレッドあたりどの程度発生しているとか、記載すべきことがあるんでねえの?
>>112
どのクラスのOnFileNewだかしらねーけど、MFCのソースはインストールされてんの?
されてんなら検索すればいいだろう。 されてねーならインストールすればいいだろう。
115:デフォルトの名無しさん
07/09/09 01:56:48
検証方法は>>111に書いてるつもりなんじゃね?
116:112
07/09/09 02:15:39
>>114
「OnFileNew」をキーワードに、下記フォルダを検索したら探せました。
ありがとうございました!!
C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc
117:デフォルトの名無しさん
07/09/09 02:24:10
WIN32開発、java、C#とやってきて
最近MFCを始めました。
MFCってすごく難しく感じます。
実際どうなんですか?
118:デフォルトの名無しさん
07/09/09 02:25:59
>>117
あなたにとって難しい。それだけのことです。
119:デフォルトの名無しさん
07/09/09 03:16:30
>>117
平然と並列でないものを並べられると、頭がグラグラする。
漢文、英語、中国語とやってきて、
最近2ch語を始めました。
2ch語って凄く難しく感じます。
とかそんな感じか?
120:デフォルトの名無しさん
07/09/09 03:24:08
とりあえず、107のソース使って、dllとexeから実行してみたけど
リーク検出できなかったな
1日実行してみて、どれくらいリークしてるの?
121:デフォルトの名無しさん
07/09/09 08:17:53
>>117
win32の経験があるのなら、mfcはそんなに難しくないと思うが。
122:デフォルトの名無しさん
07/09/09 13:15:43
フレームワーク「郷に入っては郷に従え」
の考え方ができればいける。
123:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/09 13:51:26
てな具合で、動かしています。正直な話タイマー間隔をこのぐらい短く設定すると一日は多分動きません。
もうちょっと空けてやらないと、マシンスペックの弱いPCだと落ちてしまうのではないかと……
127:デフォルトの名無しさん
07/09/09 13:59:38
>>122
そうですか?
BCBやVC#と比べると何をどうしていいのかまったく分からん
128:デフォルトの名無しさん
07/09/09 14:11:26
>>127
>何をどうしていいのかまったく分からん
たとえば、何をどうしたいのかな?
よほど難解なことをしようとしてるのか。それともごく標準的なGUIツールも作れないのか。
129:デフォルトの名無しさん
07/09/09 14:18:07
>>127
ぶっちゃけ、すぐ上のサンプルコードは動かせる?
130:デフォルトの名無しさん
07/09/10 00:10:07
>>126
とりあえず、そのもたないと思われる状態で一日動かしてみるべき
131:デフォルトの名無しさん
07/09/12 10:16:49
CObjectから派生させていないデータクラスでも
Serializeでないファイル読み書きに
CArchiveを使ってしまってよいものでしょうか?
virtual void LoadData(CArchive& ar);
virtual void SaveData(CArchive& ar) const;
こんな感じのメンバ関数を用意しようかと思っているんですけど。
それとも、CFile*を引数にしてしまうべきですか?
132:デフォルトの名無しさん
07/09/12 18:42:47
>>131
シリアル化にIMPLEMENT_SERIALを使わないなら、
CObject派生の意味は殆ど無いし、良いんじゃないかな。
結局は単純なバイト列の読み書きなのだし。
133:デフォルトの名無しさん
07/09/13 09:47:20
>>132
ありがとうございます。
自作データクラス群は大元の親クラスが純粋仮想クラスで、
また、自分自身がCObjectから派生することに慣れていないため、
この形のままCArchiveだけ使えないかなと思いました。
このデータクラス群の一つが内部でCArrayのメンバを持っているのですが、
これを保存するためにCArray::Serializeを呼ぼうとすると、
SaveDataはconstにはできないですね…。
まぁconstを取り外してしまえば、とりあえず動きそうですが、
SaveDataの中でMFCクラスメンバのSerializeをコールというのが
かなりまずい構造なのかなぁ。
134:デフォルトの名無しさん
07/09/13 10:05:42
>>133
MFC - 概念 - シリアル化 - シリアル化 : オブジェクトのシリアル化
- アーカイブを通じた CObject の格納と読み込み
135:デフォルトの名無しさん
07/09/13 22:03:21
質問です
CDialogの派生クラスを作成して、そのダイアログに
CButtonやCStaticなどのコントロールを貼り付けています
そのコントロールの上に色々描画したいんですが
やり方が解りません。どうすればいいでしょうか?
OnPaintを作ってその中で
CPaintDC dc(this);
dc.MoveTo(*,*);
dc.LintTo(**,**);
としてみましたが、コントロールの上でなく背後に描画されてしまいます
136:デフォルトの名無しさん
07/09/13 22:57:38
>>135
ダイアログを派生させるまで分かって、
コントロールを派生させることに思いつかなかったってことでいいの?
137:デフォルトの名無しさん
07/09/13 23:53:45
>>136
CStaticを派生させてそのOnPaintを処理したら
キャプションが表示されなくなりました。
やりたいことはCStaticのコントロールがあれば、そのコントロールに
縁取りして線を描いたり、コントロールの上にビットマップを表示したり
したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。
イメージとしてはダイアログを表示してそれをビットマップで保存し、
その上に落書きする、みたいな。
138:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/14 12:26:52
>>138
m_fpFuncの中身をさらせ
140:138
07/09/14 12:38:29
>>139
FARPROC m_fpFunc;
です。ここが違うのでしょうか?
141:デフォルトの名無しさん
07/09/14 12:53:40
>>140
FARPROCやめて実体と同じ型で宣言してみ
引数と戻値が呼び出しと実体で違っててスタックを壊してるだけだと思うぞ
142:138
07/09/14 13:30:42
>>141
指摘の通りでした。
ありがとうございました。
143:デフォルトの名無しさん
07/09/15 17:31:24
>>137
> やりたいことはCStaticのコントロールがあれば、そのコントロールに
> 縁取りして線を描いたり、コントロールの上にビットマップを表示したり
> したいんです。その時CStaticの文字を表示する機能はそのまま活かしたい。
CStaticのOnEranseBkGroundって作れるっけ? 作れるんなら、そこで処理してみたら?
作れないなら、無理っぽい。
144:143
07/09/15 17:34:21
×OnEranseBkGround
○OnEraseBkgnd
145:デフォルトの名無しさん
07/09/15 19:40:30
>>143
結局CStaticから派生してOnPaintの中で
DrawTextとかFrameRectとかを使用するようにしました
今OnEraseBkgndでFrameRectを使ってみましたが、
これでも出来そうな気がします
しかし、テキストの描画時にFrameRectで描いた枠が消されて
しまうようで他にも幾つかいじらなければいけないっぽいですね
一応解決です、皆さんアリガト
146:デフォルトの名無しさん
07/09/16 14:26:04
CHtmlView::Navigate2のエラー検知を行いたいのですが、
どうすれば良いのでしょうか?
どなたか教えてください。
147:デフォルトの名無しさん
07/09/16 14:49:26
自作DLLでダイアログを表示しようとしています。
m_pcDebugDlg->Create(IDD_TEST);
を実行すると、
ERROR: Cannot find dialog template with IDD 0x36B1.
というエラーが発生します。
何かの設定が足りないのでしょうか?
よろしくお願いします。
148:デフォルトの名無しさん
07/09/16 15:25:03
そこに書いてある通りじゃないの?
149:147
07/09/16 17:25:10
>>148
IDD_TEST は resource.h に定義されていました。
プロジェクト/プロパティ/MFCの使用を「共有DLLでMFCを使用する」から
「スタティックライブラリでMFCを使用」に変更したら、ダイアログが表示される様になりました。
ただし、客先からは「共有MFC」でと指示があります。
何が悪いのでしょうか?
150:デフォルトの名無しさん
07/09/16 17:33:08
リソースをビルドしなおしても同じ?
151:デフォルトの名無しさん
07/09/16 17:44:40
>IDD_TEST は resource.h に定義されていました。
.rc ではどうなってますか
まあ>>150でおkだと思うけど
152:147
07/09/16 18:02:30
..rc には
IDD_TEST DIALOGEX 0, 0, 250, 170
という記述がありました。
リソースをビルドという方法がよくわからなかったのですが、
ソリューションのリビルド
. rcファイルのコンパイル
の両方とも、現象は変わりませんでした。
リソースのビルドって、他のやり方でしょうか?
153:デフォルトの名無しさん
07/09/16 18:10:28
つ AFX_MANAGE_STATE
154:147
07/09/16 18:43:56
>>153
DLL関数の先頭に
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を追加したらうまくいきました。
どうもありがとうございました。
155:デフォルトの名無しさん
07/09/19 17:46:56
ダイアログの上でエンターキーを押すと、
プログラムが正常終了してしまいます。
プログラムを終了させたくないのですが、どうすればいいのか教えて下さい。
よろしくお願いします
156:デフォルトの名無しさん
07/09/19 18:47:04
>>155
つ[OnOK()]
157:デフォルトの名無しさん
07/09/19 19:23:59
いや俺は PreTranslateMessageで処理するほうが好きだ
158:155
07/09/19 20:06:07
>>156,157
ありがとうございました
OnOK()で対応しました
159:デフォルトの名無しさん
07/09/19 20:57:01
OnOK()で対応するというのは間違っていると思う。
OnOK()の意味をちゃんと考えるべき。
そして「Enterキーを押したときにダイアログを終了させない」という仕様の意味をちゃんと考えるべき。
するとどうやって実現するのが正しい形かわかるでしょ。
面倒でも、何事も正しい形ってものを常に意識して作っておかないと後悔するよ。大袈裟だがw
160:デフォルトの名無しさん
07/09/19 21:19:33
MFCが勝手に定義してる機能を殺すだけだろ
元のダイアログにはそんな機能ない
161:デフォルトの名無しさん
07/09/19 22:50:34
リターンキーが押される→OnOK()が呼び出される→OnOK()の処理をキャンセルする
よりは
リターンキーが押される→OnOK()を呼ばないようにする
の方がスマート。
よってPreTranslateMessageを推奨するよ。
他の用途にも使えるし覚えといて損はない。
162:デフォルトの名無しさん
07/09/19 23:14:48
そこまで気にするんなら
メッセージ発生するごとにPreTranslateMessage呼ばれるのも気にした方がいいよ
OnOKよりはるかにオーバヘッドになってるはず
163:デフォルトの名無しさん
07/09/20 12:46:43
Okボタンが在る場合、
Okボタンがデフォルトボタン形状なのはUI的にまずい。
164:デフォルトの名無しさん
07/09/20 17:56:11
フォトショップ等、メインウィンドウの他に、
レイヤー情報などを表示するウィンドウがあるんですが、
それをCDialogで作ろうと思っているんです
m_dlg.Create( CTestDialog::IDD , this );
m_dlg.ShowWindow( SW_SHOW );
で、一応表示されるんですが、
ダイアログにフォーカスが写ると、
メインウィンドウのタイトルバーが灰色になるのです。
正しい、子ウィンドウの作り方ってありますか?
165:デフォルトの名無しさん
07/09/20 19:38:14
正しいかどうか知らんけどツールウィンドウ
166:デフォルトの名無しさん
07/09/21 12:26:58
Enterキーは、OKボタンを押すのではなく、デフォルトボタンを押す操作です。
PreTranslateMessageでEnterキーを弾いてしまうと、
OKボタン以外のボタン上でEnterキーを押したときにも無視されてしまいます
(そのときにはそのボタンが押されるべき)。
もちろん、PreTranslateMessageでフォーカス位置を調べてもいいけど、
そこまで面倒なことをするのなら、
OKボタンをDisable・非表示にしたほうが早いです。
OKボタン自体は残しておきたいのであれば、
なにもしない非表示ボタンをデフォルトにすればよいです。
PreTranslateMessageの方法だと、デフォルトボタン枠が出ているのに
Enterキーが効かないというGUI上の矛盾もあります。
167:392
07/09/21 21:55:41
> OKボタン自体は残しておきたいのであれば、
> なにもしない非表示ボタンをデフォルトにすればよいです。
デフォルトボタンは何ですか、と問われたときに、ありませんと答える方が良いかと。
168:デフォルトの名無しさん
07/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
07/09/22 22:02:59
winuser.h
#define STN_CLICKED 0
#define BN_CLICKED 0
170:デフォルトの名無しさん
07/09/22 22:19:04
>>169
ありがとうございます。
171:デフォルトの名無しさん
07/09/22 23:31:42
本当にMFCが全くわかりません。
とにかく、GUIを作るのが難しすぎに感じます。
VC#なんて超簡単にGUI作れるのに・・・
まだまだ、VC+++MFCはデファクトスタンダードなんですかね?
172:デフォルトの名無しさん
07/09/23 00:33:02
>>171
MFCは欠陥製品だと思う
対抗するボーランドがコケちゃったんでMSの一人天下になっていますが
これに付き合わされる開発者はたまらない
C#を使いましょう
173:デフォルトの名無しさん
07/09/23 00:42:51
慣れの問題ですよ
VC#が簡単に、作れるって言っても例えばテキストエディタを作る場合
商用を考えたら標準のTextBoxなんて使い物になりません。
一から書くことになります。
だったら、WIN32APIを手間なく呼べるVC++に利がある。
VC#だと使う、WIN32APIをいちいち宣言しなくてはいけない。
174:デフォルトの名無しさん
07/09/23 01:58:19
MFC使わねばならん環境なら、頑張って使えるようになればいいだけだし、
使わなくて言い環境なら、C#でやればいいだろう。
何故このスレで愚痴るのか理解できない。
175:デフォルトの名無しさん
07/09/23 23:52:49
>>174
MFCの習得に挫折した人がMFC叩きしてるだけ。
穏やかになだめてあげてください。
176:デフォルトの名無しさん
07/09/24 00:10:51
確かに他のライブラリと比較すると挫折率はダントツに高いかもしれん
よく、Cはポインタで躓いたなんて人いるけど似たようなもん
177:デフォルトの名無しさん
07/09/24 01:45:06
ていうかあまりの複雑さと面倒臭さに死にたくなるときあるな
なんでもかんでもメッセージって逆に面倒臭いだけだったんじゃないだろうか・・・
178:デフォルトの名無しさん
07/09/24 02:17:59
けど、大抵の商用ソフトはMFCが使われている。
.NETなんて皆無では???
179:デフォルトの名無しさん
07/09/24 02:47:39
>>178
だって糞おせぇし
180:デフォルトの名無しさん
07/09/24 02:54:45
Vistaならネイティブとほとんど変わらんが?
181:デフォルトの名無しさん
07/09/24 03:10:20
>>180
それって普通に作ってた奴の方が遅くなったんでしょ?w
182:デフォルトの名無しさん
07/09/24 05:07:52
MFCは隠蔽化というより隠蔽工作だというようなことがかかれた本があった。
本来仕組みなど知らなくても簡単に使用できるのが隠蔽化だが
MFCには仕組みを知らなければバグの原因がまったく理解できない不可解な現象も多い。
それらを苦労して乗り越えて来た人間は威張り腐りって、
「MFCが糞なんじゃなくて理解できないやつが糞」と言いたいのだろう。気持ちはわかる。
だが世間一般ではそういう場合ライブラリが糞だという。
自分の腕前を自慢したいからって言葉を捻じ曲げてはいけない。
183:デフォルトの名無しさん
07/09/24 05:31:44
あの当時に書かれたライブラリで今まで通用したものってほかに何かあるかな?
OLEを隠蔽するフレームワークとして十分納得いくし、フル機能のウインドウズ
ソフトウエアを書くのにほかにいいライブラリが無かったのも事実だと思う。
184:デフォルトの名無しさん
07/09/24 06:03:59
>>それらを苦労して乗り越えて来た人間は威張り腐りって、
被害者意識が強い傾向が見られます。
何かトラウマになるような事でもあったのでしょうか(w
185:デフォルトの名無しさん
07/09/24 06:41:22
MFCがなければWIN32のバグが分からない
永遠に更新を続けるべき
186:デフォルトの名無しさん
07/09/24 07:39:58
>>182
あー、でも俺、そういうラッパー系のクラスで
下層の構造知らずにうまく包んであるもんってみたことないわ
無理なんじゃねぇの?って思ってる
可変長ですよといいつつ
なんも意識せずに1文字ずつ追加すると毎回全バッファを再確保する
最近の次世代(?)言語の文字列クラスのようにw
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4151日前に更新/114 KB
担当:undef