■MFC相談室 mfc18d.dll■at TECH
■MFC相談室 mfc18d.dll■ - 暇つぶし2ch1:デフォルトの名無しさん
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

187:デフォルトの名無しさん
07/09/24 09:28:21
文字列定数 -> System.String
CString -> System.Text.StringBuilder
と考えれば、それはそんなもんかって気もする。
Stringの連結はおまけ機能ってことで。

188:デフォルトの名無しさん
07/09/24 10:54:07
MFCのいいところはVisualStudioで使う場合にドキュメントモデルを提供してくれることとダイアログエディタがあることか。
ちょっと凝ったことをしようと思うと折角クラスで隠蔽化しているように見えても実際にはAPIと同じ名前のメソッドだからAPIと手間は変わらないし、
全てを網羅しているわけではないから結局APIを直截呼ばないといけないケースもある。
あれはだからAPIラッパクラス集と思えばいいのであって、それ以上のフレームワークと思ってはいけないのだろう

189:デフォルトの名無しさん
07/09/24 15:22:11
>>187
>Stringの連結はおまけ機能ってことで。
そんなことになってるぐらいならラップなんてしないほうがいいじゃないって思う

190:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/26 11:43:46
つ ::WindowFromDC

192:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/29 13:30:06
.NETのMenuStrip簡単にできていいなぁ
MFCでもサポートしてくれ

194:デフォルトの名無しさん
07/09/29 21:33:08
簡単に作れる代わりに使い物にならんほど遅いプログラムとなってしまった
.NET非常に残念だったな

195:デフォルトの名無しさん
07/09/30 01:39:05
MFC not dead - "massive update" planned

まさか
.NETは無しね!MFC大幅機能強化するから!
なんてことになるん(r

196:デフォルトの名無しさん
07/09/30 06:51:40
MFC と NET って、どの程度の処理速度がちがうんですか?
まじレス希望

197:デフォルトの名無しさん
07/09/30 08:27:09
>>196
MFC全盛期のPCでMFCを動かすと、今のハイエンドなPCで.netを動かすのとは較べ物にならないほどもっさりしています。

198:デフォルトの名無しさん
07/09/30 11:28:36
MFCって.NETのコントロールと比べると鼻くそみたいにショボイのに2008にもまだ残ってる理由ってなんですか?
必要かな?


199:デフォルトの名無しさん
07/09/30 12:54:06
鼻くそみたいにショボイと思ってるのに
このスレへやってくる理由ってなんですか?
必要かな?

200:デフォルトの名無しさん
07/09/30 13:07:07
.NETのコントロールなんて飾りです。偉い人には(ry

冗談抜きで。

201:デフォルトの名無しさん
07/09/30 16:56:35
>>198
2008ではMFCはなくなってたお

202:デフォルトの名無しさん
07/09/30 18:25:47
>>201 ソースキボンヌ

2008でも含まれると考えられるソースはこちら
URLリンク(msdn.microsoft.com)

203:デフォルトの名無しさん
07/09/30 18:29:11
EEダウンロードできんじゃん


204:デフォルトの名無しさん
07/10/01 11:36:20
VS2005とMFCで拡張DLLを作成しているのですが、
この拡張DLLを呼び出した側のインスタンスハンドルって
どうやって参照すればよいのでしょうか。

AfxRegisterClassで必要なのですが、
AfxGetInstanceHandleだと、大元のEXEのハンドルが返ってきてしまいます。
EXEから呼び出された別の拡張DLLがこの拡張DLLを使う可能性もあるため、
大元のEXEではなく、呼び出し元を参照できるようにしたいのです。

205:デフォルトの名無しさん
07/10/01 23:44:38
Code Projectにたくさんのコントロールがあげられているが
コントロールってダイアログベースにするかViewをFormViewに選択するしか
使えないんでしょうか?



206:デフォルトの名無しさん
07/10/02 19:19:08
VC6です。

プログレスバーについての質問。
時間がどのくらい掛かるか不明な処理でプログレスを表示したい。
Webなんかで有るような、2-3このコマが左から右へくるくる回ってるの
が良いんだけど、CProgressCtrlじゃできないっぽい?
なんか良い案あったらおしえて。

時間がどのくらい掛かるか不明なのは、開始ボタン押すとハードと通信して
ハードが処理終了するのを待つから。
ハードは詳細な進捗なんて返してくれない。
ハードの状態や処理対象によっても時間が大きく変わるので平均でこのくらい
ってどんぶりで表示するのも厳しい状況。

したがって、ループするようなヤツが欲しいといった理由。

207:デフォルトの名無しさん
07/10/02 19:21:10
砂時計

208:206
07/10/02 19:29:58
>>207

レスサンクス。

砂時計は却下されてしまいました。
と言うか、すでに砂時計は出してるけど、曰く
「ホントに、動いてるのか解らない」だそーで。
プラスでプログレスが欲しいんだと。

えらい人の考えは良くわかりません。


209:デフォルトの名無しさん
07/10/02 21:23:57
>>206
まあ、砂時計出したままフリーズするアプリもあるから、動いているか
どうかを確認したいというのもわからなくはない。
どうしてもプログレスコントロールにこだわるなら、何回も繰り返して
描画してやればいいんじゃない?

210:デフォルトの名無しさん
07/10/03 01:24:29
>>205
ん? Code Projectにあがっているコントロール”だけ”使えてないの?
そうなら、そのコントロールを挙げてくれ。
そうでなく普通のEditやComboも同じように使えてないなら、動的生成すればいい。
”Edit 動的生成”とかでググレば、サンプルとかあるんじゃねーかな。

211:デフォルトの名無しさん
07/10/03 02:23:43
>>206
IEのようなウィンドウ右上のアニメーションで済むならCAnimateCtrlでが楽。

プログレスバーの現在位置が左から右へ動き続けるような奴だと
中断ボタンも必要だろうし、別スレッドでプログレスバー制御と中断の
入力待ちをすることになるんじゃないかな。

砂時計を却下する上司って良いなーと思った。

212:デフォルトの名無しさん
07/10/03 08:38:51
動いてるのか解らないという理由で砂時計がダメなら
IEのようなアニメーションもダメだろう

213:デフォルトの名無しさん
07/10/03 18:40:21
>>206
URLリンク(blogs.wankuma.com)

214:デフォルトの名無しさん
07/10/03 20:03:48
エディットコントロールの質問です。
コントロール内部に画像を表示させて、文字編集を行うものを作ろうと思ってるのですが
なかなかうまくいきません。
OnCtlColorでCreatePatternBrushで作ったものを返すようにして
何とか文字未入力領域に画像を表示させたのですが、
文字入力エリア部分に画像を表示できなくて困っています。

何かいい解決方法はないんでしょうか?

215:デフォルトの名無しさん
07/10/03 20:19:12
>>214
SetBkModeで透過にするのを忘れている予感
マルチラインは、この方法だと不都合があるみたいなので注意

216:デフォルトの名無しさん
07/10/03 20:30:44
>>215
あ、説明たりなくて申し訳ない。
複数行エディットコントロールについての話でした。


217:デフォルトの名無しさん
07/10/04 01:05:32
質問です。

CViewの派生クラス を A 、
CWndの派生クラス を B とします。

Aのメンバ変数にBを持ち、A の OnCreate にて B を Create し、A全体に貼り付けました。
正常に生成され、貼り付けもうまくいっているのですが、B にてマウスホイールが
取得出来ないことに気づきました。(クリック等は正常動作します)

どうもフォーカスがいっていないようなので、A の OnSetFocus にて、B に対して
SetFocus をすると、期待通りの動作をしてくれ、B にてホイールを取得出来る
ようになりました。

A全体にBが貼り付けてあり、これをクリックしたら当然Bにフォーカスが行くものだと
思っていたのですが、なぜ行かないのでしょうか?

XP Pro SP2
VC++8 sp1

218:デフォルトの名無しさん
07/10/04 02:15:47
>>217
例えば、ラベルをクリックしてもフォーカス受け取らないじゃん?
そしてどーやるんだったか忘れた。 ごめん。

SPYでフォーカス受け取るコントロールと
受け取らないコントロールのメッセージの違いを調べる…とか。 激しく疲れるな。。


219:デフォルトの名無しさん
07/10/04 06:11:25
ラベルというかスタティックはidの設定だから全然別の話

220:デフォルトの名無しさん
07/10/06 00:21:28
>>219
idの設定て、IDC_STATIC? まさか、そんなはずは。 もうちょっと分かるように説明してくれ。

221:デフォルトの名無しさん
07/10/06 10:53:03
シングルダイアログのプログラムです、最小化ボタンと最大化ボタンを付けるのを忘れてしもうたww
今から付加したいのだが、どのクラスのどのプロパティーをいじったらええの?
VS20005 MFC


222:デフォルトの名無しさん
07/10/06 11:21:44
>>221
ダイアログエディタかテキストエディタで<project>.rcを編集し給え。

223:デフォルトの名無しさん
07/10/06 11:58:13
>>222
221です
rcファイルいじって悲惨な目(編集不能)に何回かあったのだが大丈夫なのか?


224:デフォルトの名無しさん
07/10/06 12:34:21
ダイアログのプロパティでMinimize/MaximizeBoxをTrueにすればいいだけの話だろ。
何を悩んでるんだ?

225:デフォルトの名無しさん
07/10/06 12:53:44
>>224
('ー')ゞラジャサンクス

226:デフォルトの名無しさん
07/10/06 13:57:59
>>223
ダイアログエディタでプロパティを変更する行為だけで編集不能にできるならたいしたもんだ。

227:デフォルトの名無しさん
07/10/06 15:19:49
CToolBarのボタンを大きくすることは出来ますか?ロードするビットマップのサイズが大きければ大きくなるのでしょうか?

228:デフォルトの名無しさん
07/10/06 18:17:23
MFCのSDIアプリケーションを作成しています。
日本語以外のOSでも正しく動作させたいのですが、
最小化ボタンの上にカーソルを合わせたときに表示されるツールチップの「最小化」
などは自動的に現地の言葉で表示されるのでしょうか?


229:デフォルトの名無しさん
07/10/06 19:09:31
コード調べたらわかるでしょ

230:デフォルトの名無しさん
07/10/06 19:24:13
日本語化されてない英語アプリ動かしてみりゃわかるだろ

231:デフォルトの名無しさん
07/10/06 19:28:51
apiのソースは非公開
漏れたのもあるけど

232:デフォルトの名無しさん
07/10/07 09:57:50
CStringのTrimの中でアサートするんですが・・・

CString str = "33 "
str.Trim();
 ・・・
Truncate
  ATLASSERT( nNewLength <= GetLength() );

Unicodeライブラリ使ってますがこれがまずい?

233:デフォルトの名無しさん
07/10/07 10:33:50
"33 "

234:デフォルトの名無しさん
07/10/07 11:07:27
VC2005で試したところ、>>232のコードはコンパイルを通らなかったのだが、
それはそれとして、不思議な現象が。

1. CString str = "33"; // NG
2. CString str("33"); // OK
3. CString str; str = "33"; // OK

いまいち納得がいかない。

235:デフォルトの名無しさん
07/10/07 11:10:22
すみません str = _T(" 33 ")なら通りますね

236:デフォルトの名無しさん
07/10/07 12:22:02
>>234
コンストラクタと=の動作が違うんかな?とかわからずに言ってみるテスト

237:デフォルトの名無しさん
07/10/07 21:32:43
>>234
初期化と代入の違いわかってるか?
あと_T()マクロがどう展開されるか

238:234
07/10/08 08:29:48
WCHARベースのCStringでも
CString(LPCSTR)
operator=(LPCSTR)
の両方とも定義されているので、2.と3.が通るのは分かるが、
なら、何故1.が通らないのかがよく分からない。
1.は3.の省略系みたいなものだとの解釈は間違い?

239:デフォルトの名無しさん
07/10/08 08:39:47
コンパイラはヘッダみてるだけだから
コンパイラの立場でヘッダ見てみればいい

240:デフォルトの名無しさん
07/10/08 16:48:36
MDIでApp作ってます。

CMDIChildFrameA :: OnCreate()
{
dlg.Create(IDD_DIALOG, this);
}

としておいて

Dialog 内 OnOKで
if ( GetParent()->IsKindOf(RUNTIME_CLASS( CMDIChildFrameA )) )

とすると何故か失敗するのですが・・・
GetParent()で取れるCWnd* がCMainFrameになっているみたいです。
誰かボスケテ

241:234
07/10/08 16:52:45
(・∀・)ワカッタ!!

1.
CString str="33"; は、暗黙的に CString str("33") に変換される

2.
が、WCHARベースのCStringでは
#define CSTRING_EXPLICIT explicit
CSTRING_EXPLICIT CString::CString (LPCSTR str);
と宣言されることになる

3.
explicit宣言されていると、1.のような暗黙的なコンストラクタへの変換は禁止される。
よってコンパイルエラー発生。

explicit使った事無かったから、全然思いもつかなかった。

242:デフォルトの名無しさん
07/10/08 17:36:32
>>240
Windowsの仕様で、自動的にフレームウィンドウを親にされてしまうみたいだな。
Get/SetOwnerで関連付けてしまうのも一つの方法か。

243:デフォルトの名無しさん
07/10/08 18:20:18
>>242さん ありがとうございます

色々試してみてたんだけど
GetWindow(GW_OWNER) ← 駄目
GetParent() ← 駄目

SetOwner() GetOwner()すればRUNTIME_CLASSうまくいきました

244:デフォルトの名無しさん
07/10/08 22:34:05
>>228
MFC使わないコードで
Tooltip(?)の処理しなくても出てくるから
OSが処理してる。
だからOS依存で英語版なら英語で表示されるでしょ。

MFC内で独自処理してたらしらない

245:デフォルトの名無しさん
07/10/08 23:04:47
英語版のVCでコンパイルすれば解決ということだな

246:デフォルトの名無しさん
07/10/08 23:05:39
そうだっけ?
なんかリソースファイルの中くまなくさがしてみるとか・・・

247:デフォルトの名無しさん
07/10/09 00:25:46
SDIアプリでCreateWindowでCFrameWindowの子供ウインドを作成し、Viewの上に沢山並べてみた。
で、そいつらをクリックしたら、アクティブになってフォーカスがあたってフォアグラウンドになる予定だった。
でも実際はWM_MOUSEMOVEすらそいつらには飛んでこない。くるのはWM_CREATE,WM_MOVE,SIZE,PAINTくらいだ。
この子供ウインドをWS_POPUPとかにすれば飛んでくるけど。。あーわかんないよぉ。
子供ウインドの一つを選択したら、他のウインドがフォーカスを失って、選択されたウインドがフォーカスされて
しかもメッセージを受け取って欲しいんだよぉ。なんでだめなの?????


248:デフォルトの名無しさん
07/10/09 01:23:05
>>247
何が作りたいのか俺にはわからんが
他のアプリで似たような動きしてるもんあったら教えてみぃ

249:デフォルトの名無しさん
07/10/09 08:18:03
MFCのライブラリをスタティックリンクすると挙動が変になり悩んでます。

[現象]
・スタティックリンクすると、
 メニュー → ファイルを開く → コモンダイアログのフィルタに「すべてのファイル(*.*)」がなくなる。
・共有DLLでビルドすると普通に出来る。

--
新規プロジェクトでスタティックリンク試してみると
普通に出来るので俺が悪いのは確かだろうが・・・

ちなみにデバッグビルド(&スタティックリンク)すると
[docmgr.cpp]
DoPromptFileName()
    VERIFY(title.LoadString(nIDSTitle));
でエラーになる。
この先を追っかけているが(atlcore.hとか)だんだん鬱になってきた。
似たような現象になった人いませんか?

>>247 割り込んでごめんなさい

250:デフォルトの名無しさん
07/10/09 08:41:24
フォーカスないウインドウにもマウスのメッセージは飛んでくるし
WM_MOUSEMOVEすらそいつらには飛んでこないというのは変

251:デフォルトの名無しさん
07/10/09 14:34:01
>>248
そうですね。。たとえて言えばエクセルのオートシェープをウインドで表現し、
シートに沢山並べた状態みたいなものでしょうか。


252:デフォルトの名無しさん
07/10/09 21:54:53
トラッカークラス使えよ

253:デフォルトの名無しさん
07/10/10 10:54:24
VC6です。CListCtrlをレポート形式で使ってます。
SetExtendedStyle()でLVS_EX_GRIDLINESを設定するとグリッド線が表示されていたのですが、
Windows2000からWindowsXPに変えて、画面をXPスタイルで表示するとグリッドが消えてしまします。
設定の仕方を間違えているのでしょうか。

254:デフォルトの名無しさん
07/10/10 11:22:16
>>253
スクロールさせると消える挙動はバグ。修正予定はたぶん無い。
どうしても直したいなら、自前描画するしかないと思われ。

255:253
07/10/10 12:35:12
>>254
まだスクロールもさせていない段階なのですが・・・。

256:デフォルトの名無しさん
07/10/14 20:02:58
カスタムコントロールにCPenで書いた線を消そうと
void CLineChartCtrl::DeInvalidateCtrl()
{
CClientDC dc(this);
CRect rcClient;
GetClientRect(rcClient);
InvalidateRect(rcClient , TRUE);
}
として再描画しても消えないのはお子ちゃまだからデツカ?
ハンドルもしっかり取れてるのにな??


257:デフォルトの名無しさん
07/10/14 22:11:51
おぼっちゃまがやっていることは
ただ画面を更新してるだけ


258:デフォルトの名無しさん
07/10/14 22:14:22
再描画でまた書いてるだけなんじゃ……
ちなみに、その処理ならCWnd::Invalidate()一発で済む。

259:デフォルトの名無しさん
07/10/14 22:19:55
>>257のおじさま、ありが㌧
うぅぅぅ~~~、嫌な悪寒デツ
どうしたら簡単に線が消せマツカ?
やっぱり書いた線をxorで描くとかマンドクサイことやんなきゃムリッポなのかなぁ。。。。。。うぅぅぅ~~~


260:デフォルトの名無しさん
07/10/14 22:31:29
>>258さんもありが㌧
やってミマスタガ線が消えません、MFCってCPenクラスがあるならCEraserクラスも
作ってホスイ片手落ちって言うんだよねこれ豆知識
線が消したいというか初期画面に戻したいんデツガ、コンストラクタをも一回読んでみたら
どうなるのかな、実験シマツ

261:デフォルトの名無しさん
07/10/14 22:41:26
おまいは何か根本的に勘違いをしている。
ウィンドウに描画した内容は、基本的に保持されていない。
描画内容を変更したい時は、一旦クライアント全体を無効にして、
次の再描画からその変更した内容で描くようにする。

自前でフレームバッファを用意してそこに描画してる、とかは無しな。

262:デフォルトの名無しさん
07/10/14 22:45:15
>>260
おまえ、あたまん中をいっぺん消した方がいいぞ


263:デフォルトの名無しさん
07/10/14 22:57:24
最小化して戻したら消えてないか?

264:デフォルトの名無しさん
07/10/14 22:59:21
>>260
消しゴムかそうか?

265:デフォルトの名無しさん
07/10/15 01:27:09
まぁマイクロソフトのウインドシステムは確かにわかりにくい仕様がおおいけどな。



266:デフォルトの名無しさん
07/10/15 10:11:46
VS2005です。
SDIのプロジェクトからダイアログを追加し(CDialog1)、
そのコンストラクタにビューのポインタを渡してみたのですが、
ダイアログはフレームウィンドウの中央に出てきてしまいます。

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
  CDialog1 dlg(this);
  dlg.DoModal();
}

ダイアログのコンストラクタで親ウィンドウを指定しているのに、
なぜその中央に表示されないのでしょうか?
中央に表示させたい場合は、ダイアログに何を渡せばよいのでしょうか?

267:デフォルトの名無しさん
07/10/15 11:49:39
.........@ノ”

かたつむりなのです。
わかってほしいのです。
触られると触角がひっこんじゃうの。
動けなくなっちゃうの。
よくわかんない、でもそうなっちゃうのだ。
雨の日とかにぺたぺた這うのが好きなのです。
なんでかしら。
自分でもよくわからないのだ。
あんまり指ではがさないでください。
ごはんたべてうんこしようっと。


268:デフォルトの名無しさん
07/10/15 20:36:21
塩撒くか

269:デフォルトの名無しさん
07/10/15 22:02:40
>>266
>>240とたぶん同じ原因なので、同じ解決法で。
SetOwnerしておいて、OnInitDialogでCWnd::CenterWindow(GetOwner())。
別にオーナーに拘らずとも、中央配置の元になるウィンドウを渡せればいいんだけどね。

270:デフォルトの名無しさん
07/10/16 09:30:39
>>269
ダイアログのOnInitDialog()でGetParent()とm_pParentWndを調べてみたら、
m_pParentWndにはコンストラクタで渡したビュークラスが入っているのに、
GetParent()ではメインフレームが返ってきました。

OnInitDialog()でm_pParentWndを直接CenterWindow()に渡してみたところ、
ビュークラスの中央に表示させることができました。
m_pParentWndっていうのは隠れメンバっぽいけど、
これならダイアログを呼ぶ側でオーナーを別途指定する必要は無いですよね。

ダイアログのコンストラクタって、なんの意味があるんだ…?

271:デフォルトの名無しさん
07/10/16 11:14:36
>>270
それはダイアログ(そのもの)ではなくてダイアログクラスだ。
OnInitDialog()以前に一回だけ必要な処理を行なっておくなどの使い道がある。

272:デフォルトの名無しさん
07/10/16 11:49:03
>>271
> OnInitDialog()以前に一回だけ必要な処理を行なっておくなどの使い道がある。

もちろんコンストラクタの使いかた自体は理解しているつもりですが、
ダイアログクラスのコンストラクタで親ウィンドウを指定しても
それが実際の親にならないのなら、
コンストラクタで親ウィンドウなんて指定させるなよっていうことでした。

まぁ今回の件では、隠れメンバに保管されていることがわかったので、
コンストラクタに渡す作業は無駄ではなかったようですが。

273:デフォルトの名無しさん
07/10/16 17:58:53
>それが実際の親にならないのなら、

親になってるからCenterWindowが正しく動作しているのでは?
CWnd::GetParent()が親じゃなくオーナーを返すのは、内部で
呼び出しているAPI(GetParent())の仕様。
トップレベルウィンドウがGetParentするとオーナーを返すみたいね。

274:273
07/10/16 18:04:38
あ、CenterWindow(NULL)じゃ駄目なのか。しょっく

275:デフォルトの名無しさん
07/10/16 21:29:33
MFCアプリケーション(ダイアログ)の終了時、アプリケーションのの戻り値(%ERRORLEVEL%)を
使用したいんですが何か方法ありますか?

・コンソールアプリケーションだと一瞬コンソールが表示されるのが問題
・引数なしの起動でダイアログでて起動をさせたいができればMFCダイアログテンプレートで作りたい。

という理由です。

WinMainのでやれば恐らく可能とは思いますが・・誰か知ってたら教えてください。

276:デフォルトの名無しさん
07/10/16 22:04:11
>>275
CWinApp::ExitInstanceをオーバーライド

277:デフォルトの名無しさん
07/10/16 22:12:31
>>276
今その方法でやったらできました。

一応方法を書いておくと、ExitInstance で戻り値を返すだけではだめで
start /wait aaa.exe
とかしてアプリケーションの終了を待機しないとだめなんですね・・
当然といえば当然なのかも。

なにはともあれ、ありがとうございました。


278:デフォルトの名無しさん
07/10/16 23:44:10
ダイアログアプリケーションでCDialog派生クラスのデストラクタがないのですが、
デストラクタの処理はどこでするのでしょうか?

279:デフォルトの名無しさん
07/10/16 23:54:06
>>278
勝手にオーバーライドすればいい。

280:デフォルトの名無しさん
07/10/17 00:09:14
定型文のボタンを押したら、
CEditコントロールのカーソル位置に文字を自動で入力したいのですが、
どうやればいいですか?


281:デフォルトの名無しさん
07/10/17 00:13:17
現在のCEditの文字取得して定型文追加して再設定
カーソル位置は GetSel() で取得

282:デフォルトの名無しさん
07/10/17 00:26:29
>>281
ありがとうございます!

283:デフォルトの名無しさん
07/10/17 11:46:56
★番組で紹介された亀田史郎が息子・興毅に書いた手紙
興毅 ほんとうに おめでとう
お前は もう 親父だけの者ではない
今や世界の亀田興毅になったんじゃ
それも山あり谷ありの厳しい勝負の道を
ひたすら歩み続けたからこそ今日の栄光が会った
しかしボクシングの道は終った分けではない
これから厳しいボクシング道が待ってる
興毅よ万文の山はいくつはばまおうとも
戦陣の谷に何度も落ちようとも前え 進め
最後に 本当におめでとう
親父

★ アニメ「侍ジャイアンツ」最終回
川上監督が番場蛮に贈った言葉
番場よ、本当におめでとう。
おまえはもうジャイアンツだけのサムライではない。
今や世界のサムライになったんじゃ。
それも山あり谷ありの厳しい勝負の道を
ひたすら歩み続けたからこそ、今日の栄光があった!
しかし、野球の道はこれで終わったわけではない。
これから厳しい野球道が待っている。
サムライよ、万丈の山がいくつ阻もうと、
千尋の谷に何度落ちようと、前へ進め!
その前途を祝って、もう一度言わせて貰おう。
番場蛮、本当に、おめでとう!
巨人軍監督 川上哲治


284:デフォルトの名無しさん
07/10/17 21:16:32
visual c++ 2005 SP1でSDIアプリを作っています。
MFCをスタティックリンクでビルドすると、Cランタイム(_recalloc)で
メモリリークが発生します。共有DLLでビルドするとリークは発生しません。
リークのチェックにはBoundsChecker8.2を使用しました。

スケルトン(ソースは変更しない)でも同じでした。
どなたかご存知ないでしょうか?

285:デフォルトの名無しさん
07/10/17 22:26:32
>>284
BoundsCheckerって使ったことないから知らないけど
URLリンク(support.microsoft.com)
この情報のVCのバージョン相当古いのは分かってるが、参考にならないかな?

286:デフォルトの名無しさん
07/10/17 23:02:39
スタティックリンクは使うなってことよ


287:デフォルトの名無しさん
07/10/19 13:00:37
CInternetsessionでのFTPのcloseは、FTPサーバーにログが残らないものなのでしょうか。

288:デフォルトの名無しさん
07/10/19 15:04:58
CCriticalSectionについて質問があります。
今Visual C++ 2005でアプリを作成しているます。

TestA.cppに通信処理があって2箇所からココを呼び出してます
1つはTestA.cppのOnTimerからコール
1つはTestB.cppのワーカースレッドからコール
通信処理は、入った時点で CCriticalSectionのLock()、抜けるときにUnLock()してます

で、問題なのはTestB.cppのワーカースレッドから通信処理をコールし、Lock状態のときに
TestA.cppのOnTimerから通信処理をコールするとデッドロックしてしまいます

なぜそうなってしまうのか、原因が全く分からず困ってます・・・
何か分かる方、いらっしゃいましたらご教授お願いします


289:デフォルトの名無しさん
07/10/19 15:38:34
通信処理が怪しい。
OnTimerの呼ばれるスレッド側に依存する処理が混じっていないか?
メッセージキューが回っている必要がある、とか。

290:デフォルトの名無しさん
07/10/19 16:20:28
>>289
ご返答ありがとうございます
通信処理の本体はTestC.cppに用意してあり、そこで完結してます
それをTestA.cppからコールしているだけなのです
なので依存する処理とかはないと思います

簡単に書くとTestA.cppの通信部分はこんな感じです

void CTestA::SendProc()
{
m_CriticalSection.Lock();

TestC->SendData();

m_CriticalSection.Unlock();
}

もしかして、OnTimerとCCriticalSectionのLock、UnLockは
同じ場所(TestA.cpp)にあってはいけないとか
そんなことはない・・・ですよね?


291:デフォルトの名無しさん
07/10/19 17:26:09
当たり前だろ
Lock状態というのは、他から同時に同じ部分をアクセスさせないように
するのが仕様だよ
要はバッティングしないようにしてるわけだから、用がすんだら
解放される


292:291
07/10/19 17:27:56
>>291 は、>>288 に対するレスね

293:デフォルトの名無しさん
07/10/19 17:36:27
>>292
Lock状態のときに、その処理に入ったら待機状態になりますよね?
先にLockを掛けた処理が動いてUnlockしてくれればなんの問題もないのですが、
何故か動いてくれないんですよ・・・
なので困っております・・・
説明不足ですみません

294:デフォルトの名無しさん
07/10/19 18:06:04
ワーカースレッドからSendProcを呼び出した際にm_CriticalSection.Unlock(); 
までたどり着いてないってこと?

295:デフォルトの名無しさん
07/10/19 18:11:19
UI更新しようとSendMessageしてロック、とかは初心者にありがちなんだけどな。
TestC->SendData()の処理内容が判らないことにはなんとも。
あと、Lock/Unlockを直接書くより、CSingleLockを使っておいた方がいい。

296:デフォルトの名無しさん
07/10/19 18:32:57
>>294
はい、おっしゃる通りです
Lockした状態でOnTimerから通信処理に入って
m_CriticalSection.Lock(); の中へステップで進んで行くと
:EnterCriticalSection(&m_sect); で実行中になったまま処理が戻らず、
仕方なくデバッグ中断すると
「プロセスはデッドロックされているか、ユーザーモードコードがどれも実行されません。すべてのスレッドが中止されました。」
となります


>>295
TestC->SendData()の処理内容はUSBドライバに対して
プロトコルに沿ったデータの送信・受信をしています
CSingleLock、ちょっと勉強してみます


297:294
07/10/19 18:51:18
ならAPIのTryEnterCriticalSectionを使うか >>295の方法。
ワーカスレッドから呼ばれたTestC->SendData()がフリーズしてる可能性もある。

298:デフォルトの名無しさん
07/10/19 19:25:33
>>297
TryEnterCriticalSectionを試してみたところ、それっぽい動きになりました
ありがとうございます!

ところで、MSDNライブラリに書いてある解説に
「TryEnterCriticalSection 関数は、クリティカルセクションの所有権を
取得できたかどうかにかかわらず、すぐに制御を戻します。」
とありますが、これは処理が終わる前に次の処理が動いてしまう
と解釈してよろしいのでしょうか・・・


299:デフォルトの名無しさん
07/10/19 19:36:13
戻り値で、他のスレッドがCriticalSectionを所有している事が判るわけだから
後で再送するとか、諦めてエラーにするとか好きにすれば良い。

300:デフォルトの名無しさん
07/10/19 19:41:08
>>299
了解しました
戻り値で判断して何とか回避してみます

皆様、色々ご指導ありがとうございました
とてもとても助かりました
素敵な週末を過ごしてください

301:デフォルトの名無しさん
07/10/19 23:38:36
今後Winアプリって.NETがデファクトスタンダードとなるんですかね?
MFCは開発止まってるのですか?

302:デフォルトの名無しさん
07/10/20 00:03:37
デファクトスタンダード(笑)
まあ、そうだろうね。
XPが標準になってることで、.NETFrameworkデフォルトで入ってるだろうし

最近のすごいアプリ
3ds maxとか、C++/CLI(.NET使えるように拡張したC++)で
作られてるみたいだし


303:デフォルトの名無しさん
07/10/20 00:17:45
Win32で十分だろ。なぜ.Netなんかで開発するの?
いまはじめてWindowsFormアプリケーションってのを生成してみたが
さっぱりわからない。ショック。


304:デフォルトの名無しさん
07/10/20 00:37:31
しょぼいツール作るならWin32でいいけど、
こったもの作るなら、.Net最高

305:デフォルトの名無しさん
07/10/20 00:55:04
自分がMFCを勉強し始めた時と比べると、C++/CLIの学習は
随分楽だなーと思った。

でもC++/CLIの描画がGDI+を使わなくなるか、GDI+の性能が
大幅アップするまではMFCを使い続ける気がする。

306:デフォルトの名無しさん
07/10/20 09:55:15
結局.NETってライブラリとして充実しているんだろ?
Win32だって充実させてくれたらいいじゃん。
なんで言語まで変えるの。。

307:デフォルトの名無しさん
07/10/20 10:45:24
>>303
Win32、MFCが理解できて
.NET Frameworkが理解できないヤツはいねえだろ
MTは運転できるがATは運転できない というヤツがいないように

308:デフォルトの名無しさん
07/10/20 22:12:33
>>304
逆だろ?
こったものを.NETで作るのは無理
メモ帳程度のテキストエディタなら.NETでも十分つくれるが
メジャーなテキストエディタに勝とうとしたら.NETでは絶対無理

309:デフォルトの名無しさん
07/10/20 23:03:43
ちょっとさみしい気もするが手軽にきれいなのできるからいいよ
クラスの構造もMFCと比べるときれいだし、仕事の関係上使えないのが残念なくらいだ
C#とかで作ってるとVBって(使ったことないけど)こういうもんなのかなーって思うくらい簡単

310:デフォルトの名無しさん
07/10/22 20:41:09
ていうか基本的に糞重いアプリができる

311:デフォルトの名無しさん
07/10/22 22:28:10
296じゃありませんが

ちょっと前(>295)で
CCriticalSectionを直接Lock/Unlockするのではなく
CSingleLockを使った方がいいとありますが
その理由はなぜでしょうか?

CCriticalSectionだと待ち合わせ時間が設定できないって事くらいですか?

312:デフォルトの名無しさん
07/10/22 22:31:04
MFC71.DLLは何処からダウンロードできるのですか?

313:デフォルトの名無しさん
07/10/22 23:29:00
>>311
別に深い理由ではなく、単に解放し忘れが無くなるだけ。
途中returnや例外でロックしっぱなしとかなると危険だし。

314:デフォルトの名無しさん
07/10/23 01:20:13
C#でのDataGridViewみたいな便利なものはないんですか?

315:sage
07/10/23 02:40:33 BE:233717663-2BP(0)
質問です。

あるGUI有りのアプリから、別のDLLの関数を呼び、そのDLLが
生成したウィンドウを表示したところ、Tab キーや、OK, Esc キーなどが
期待通りに動作しない現象が起こりました。

具体的には、CMainFrame から DLLのある関数を呼び出し、その関数に
HWND を引数に与えて、そのHWNDを親ウィンドウとした、別ウィンドウを
表示しています。モーダルではありませんが、モーダルでも同じ挙動です。

原因が分かる方、教えてください。

VC++ 8.0 SP1
WinXP SP2

316:デフォルトの名無しさん
07/10/23 13:45:48
CEditコントロールで質問ス
カレット位置を取得するためにGetSel()を使うというのは理解できるんですが、
範囲選択状態となっている場合、カレット位置がどこにあるかという判断はどーすればいいっスか?

317:デフォルトの名無しさん
07/10/23 14:14:30
>>316
CWnd::GetCaretPos()で取れると思う。尤も、クライアント座標だから適当に変換する必要があるけど。

318:デフォルトの名無しさん
07/10/23 14:47:10
>>317
ありがとうっス!
ちょっと試してみるっス

319:315
07/10/23 16:44:59
自己解決しました。失礼しました。

URLリンク(msdn.microsoft.com)


320:デフォルトの名無しさん
07/10/23 17:12:21
VS2005、ダイアログベースで、マウスオーバーイベントを
ボタンコントロールが取得するにはどうしたらいいでしょうか?

↓やったこと
ボタンを画像にするのに、オーナードローでやってみて
それ自体は問題なかったのですが
マウスオーバーしたときにも画像を変えようと思ったら
マウスオーバーのイベントが来てませんでした。
MSDNみてCBitmapButtonなるものを使って見たのですが
AutoLoadでアサートが出てしまって動きませんでした。




321:デフォルトの名無しさん
07/10/23 17:41:50
>>320
前似たようなもの作った時は CButtonのサブクラスの中のOnMouseMoveで
マウスが入ってきたことを検知し、TrackMouseEventを呼び出してWM_MOUSELEAVE
を発生させるようにし表示画像を変えてた。一般的なやりかたかどうかは知らない。
WM_MOUSEHOVERも同様にTrackMouseEventで発生させることができる。
マウスオーバーってホバーのことだよね?

322:デフォルトの名無しさん
07/10/23 17:44:08
>>321
そうです。

ありがとうございまいた。
ちょっくらやってみます。


323:デフォルトの名無しさん
07/10/24 17:42:18
Win32APIスレから誘導されてきました。

MSGraph.Chart(Officeについてくるグラフコンポーネント)をウィンドウに張り付けたいんですが、どうすればいいですか?
MFCのCWnd::CreateContorlをいじってみましたが、うまくいかないです(´・ω・`)
゚・(ノД`)教えて下さい。

CWnd* wnd = new CWnd();
BOOL ret = wnd->CreateControl("MSGraph.Chart", "", WS_VISIBLE, rc, this, 2000);
で、retがFALSEになります。

CreateControlの第1引数を"mscal.calendar.7"にすると、ちゃんとカレンダーが表示されます。

324:デフォルトの名無しさん
07/10/24 18:45:52
ActiveXコントロールとして貼り付けたら?

325:323
07/10/24 19:25:39
>>324
(Officeフォルダ)\Graph9.olbをリソースエディタのツールボックスに登録しようとしたら、
「有効なCOMサーバーではありません」と言われました(´・ω・`)
そもそも根本的に無理なのでしょうか?

326:デフォルトの名無しさん
07/10/24 21:13:31
ググってみて思ったのだが、
もしかすると、MSGraph.ChartはActiveXドキュメントかもしれない。
自分の所にはOffice無いからそれ以上は分からないけど。

327:323
07/10/24 22:38:16
>>326
情報ありがとうございます(・∀・)
ActiveXドキュメントでググリましたが、要領を得ません(;´Д`)スミマセン
ActiveXドキュメントというのは、それ単体では表示できず、
ExcelのWorksheetや、RichEdit等にしか貼り付け出来ないということでしょうか?

328:デフォルトの名無しさん
07/10/26 16:24:44
質問です。

class CHogeA;
class CHogeB;

class CHogeA : public CView
{
...
private:
CHogeB m_hogeB;
};

class CHogeB : public CWnd
{

};

CHogeA 上に CHogeB を貼り付けて使っていたのですが、そうすると、
CHogeA にて例えばマウス操作などのイベントを拾うことが出来ません。

そこで、
1. CHogeA でも各種イベントを拾う、一般的な方法がありますか?
2. CHogeA と CHogeB で、ウィンドウを2枚作らず、1枚を共有するような手法がありますか?

よろしくお願いします。
WinXP SP2
VC++ 8.0 SP1


329:デフォルトの名無しさん
07/10/26 16:32:13
>217


330:デフォルトの名無しさん
07/10/27 01:14:52
>>328

>1. CHogeA でも各種イベントを拾う、一般的な方法がありますか? 

あなたの書いたとおりの構成でサンプルを作ってみたらマウスイベントは
全てCHogeAに流れました。逆にCHogeBでマウスイベントを拾うためには
細工が必要でした。

>2. CHogeA と CHogeB で、ウィンドウを2枚作らず、1枚を共有するような手法がありますか? 

おそらくあります。

要するに情報不足杉です。

331:デフォルトの名無しさん
07/10/27 10:09:51
SDIでCView
CViewでCWndをCreate
あとはどこもいじらないでCWndにMouseMoveイベント来たよ

332:デフォルトの名無しさん
07/10/27 10:30:33
スレ間違いで再投稿です。
マルチすいません・・・

Visual studio6.0です。
ラジオボタン2個、ボタン1個のwindow作ってます。
MFCでラジオボタンにintの変数を追加しようと
してもbuttonにしか変数が追加できません。

どうすれば、受付けてくれるのでしょうか?
VS.NET仕様のテキストを見ながらやってて違いに困ってます・・・

333:デフォルトの名無しさん
07/10/27 10:48:56
ラジオボタンはボタンなの

334:デフォルトの名無しさん
07/10/27 10:53:22
>>332
ラジオボタンのグループ分け(WS_GROUPのオン・オフ)がきちんとできているか?
面倒ならDDX_Radio()を直書きしてもいい。案外簡単だから。

335:デフォルトの名無しさん
07/10/27 11:07:00
>>333
言われて見れば・・・「チェックしたか、してないか」しかないのに
変数の設定っていうのも変な気がします・・・。

>>334
グループ分けは出来てると思うので
ラジオボタンがどんな値を返すのか勉強してきます。

VC6.0準拠の本かサイトも探してきます・・・

336:デフォルトの名無しさん
07/10/27 11:50:57
VC2005でもそこら辺の仕様は変更されていなかったはず。
MFCのヘッダをDDX_Radioで検索して、実際に中身を見た方がたぶん早い。

337:デフォルトの名無しさん
07/10/27 12:12:59
グループをチェックすれば出てくるな

338:デフォルトの名無しさん
07/10/27 17:21:37
Win2k 上で vc6 sp6 使ってMFC勉強中の者です。
ウィザードで CFormView 指定してつくったもので、
その画面のボタンから CDialogの Modal で表示してる部分があるんですけど、
垂直方向に一画面に入りきらなくなってスクロールさせようと思い、ハマッテマス。
リソースで垂直のチェック入れて、OnVScrollとってきてScrollWindowExつかって
みたんですけど再描画で位置がリセットされちゃうんで OnDrawで覚えた値を使って
ScrollWindowExで戻してます。みなさんもこんなやり方で実装します?
アドバイスお願いしますm(__)m
やり方、なんか間違ってる気がするんですよね……。
CFormViewでdoModal できれば楽なのになぁ~。

339:デフォルトの名無しさん
07/10/27 18:13:37
リセットされるところをみるに、SetScrollPosしていない予感。
WM_VSCROLLはスクロールさせたいという意図を伝えてくるだけで、
実際にスクロールバーの位置を確定させるのはプログラム側の仕事。

340:デフォルトの名無しさん
07/10/27 18:35:10
スクロールバーが付いたダイアログって見たことない。
止めるつもりは無いけど、自分ならプロパティシート使う。

341:デフォルトの名無しさん
07/10/27 19:13:02
もう1個別のCFormViewのウインドウ出すのは可能だし
CDialogの上にCFormViewを貼り付けることも可能
でも問題はそういうことではなさそうだな

342:デフォルトの名無しさん
07/10/27 20:51:04
レスありがとうございます
>>339
ウィンドウについてるって事で OnVScroll内に引数でもってきてる pScrollBarは null なので
pos = ::GetScrollPos( m_hWnd, SB_VERT );しています。
あとは nSBCodeみて 移動量決め SetScrollPos( m_hWnd, SB_VERT, pos, TRUE );して
ScrollWindowEx( 0, 垂直移動量, NULL, NULL, NULL, NULL, 0 ) してます
で…再描画でリセットされてしまうので OnPaint()用意して ScrollWindowEx( 0, 総移動量, …
って感じになっちゃっております。
>>340
なるほど。プロパティシートですか。
いやぁこまった、変えられない仕様みたいでして。
>>341
CDialog上にCFormViewの貼り付けですか。 CDialog持ってるクラスのメンバーに
CFormView持ってるクラスをメンバーのインスタンスもたせるのかなって想って
ちょっと今やってみましたがProtectあたりでひっかかってコンパイルもとおりませんね。
難しい……。

343:デフォルトの名無しさん
07/10/27 21:18:23
子ウィンドウを全然動かしていない件について。
そりゃ、再描画でリセットされるように見えるわ。

子ウィンドウを一つ一つ動かすより、
フレーム-CDialog派生の子ウィンドウ(=フォーム) という風に乗せて、
フォームの位置を動かす感じで作ればいいんじゃないかな。

344:デフォルトの名無しさん
07/10/28 01:43:07
CSliderCtrlを使用して、マウスでクリックした位置に一発で移動する動作をさせたいです。
(通常はページスクロールをしますが、この動作をさせずに、クリックした位置に移動させたいです。)

ためしにGetChannelRectでスライダーの稼動範囲(厳密には稼動範囲より広いエリアになってしまうけど。。)とマウス位置から
Posを求め、SetPosしています。これだと問題が二個あります。
1)ユーザーが一回クリックすると、見た目上二回動く
2)そもそもGetChannelRectはスライダーの稼動範囲を取るわけではないので、微妙に位置の計算が狂う。

なにか良いアイディアは無いものでしょうか?


345:デフォルトの名無しさん
07/10/28 03:19:32
ぶち殺すぞ糞が

346:デフォルトの名無しさん
07/10/28 03:39:56
↑しゃぶれよ


347:デフォルトの名無しさん
07/10/30 11:52:37
とりあえず保守させておいてくれ
また質問したい時がくるかも知れんから

348:デフォルトの名無しさん
07/10/31 09:32:39
URLリンク(tserve01.aid.design.kyushu-u.ac.jp)
のページを見てキャラクターを表示しようとしてるんですが
キャラクターの白い部分が残って
うまく表示がされません、どうすれば良いか教えて頂けないでしょうか。
お願いします。

349:291
07/10/31 10:37:25
そのページを見てわからんのなら
君にはむりだ


350:デフォルトの名無しさん
07/10/31 10:49:25
>>348
謎は解けた!
マスク描画のROPを、SRCPAINTからMERGEPAINTに変えれば正しく描画される。

普通はキャラ画像の背景は黒にして、
SRCANDで抜いてSRCORで重ねるってのが定番だと思うのだけどな。
CImageListならカラーキーを使った描画ができるから、
こっちを使った方が手っ取り早いかも。

351:デフォルトの名無しさん
07/10/31 12:36:21
>>350さん
ありがとうございました。
感謝感謝です。

352:デフォルトの名無しさん
07/11/01 07:21:07
どうも、他スレから流されてきました。

Win32環境+VS2005で開発を行っています。
ダブルクリックでファイルを開く処理に対応させようと頑張っていた所
Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。
(でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く)

そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?




353:デフォルトの名無しさん
07/11/01 10:16:22
そこまで分かってんなら呼び出せばいいじゃん

354:デフォルトの名無しさん
07/11/01 14:28:25
CTreeCtrlを使ってエクスプローラライクなダイアログを作っています。
メーラーの未読数表示のように、フォルダ内のファイル数を表示する
方法はあるのでしょうか?

ラベル編集も可能にしたいので、"フォルダ名(n)"のように直書きでは
問題が出てしまいます。
やっぱり無理矢理作るしかないのでしょうか?

355:デフォルトの名無しさん
07/11/01 14:57:38
>>354
楽な方法は無いな。
NM_CUSTOMDRAWを始め、
いくつかの通知メッセージを処理しないと実現できないと思う。

356:352
07/11/01 15:25:21
>>353
すいません、関連付け関係のレジストリをすべて掃除したら直りました。
プログラムのミスではなかったようです。orz


357:デフォルトの名無しさん
07/11/01 15:33:26
ダブルクリックってそういう意味か
仕様を満足に説明できないやつは1人でやってればいいと思う

358:デフォルトの名無しさん
07/11/01 21:04:18
MFCを使った有名なソフトはどんなものがあるんですか?

359:デフォルトの名無しさん
07/11/01 23:51:16
秀丸


360:デフォルトの名無しさん
07/11/02 00:07:13
ペイント

361:デフォルトの名無しさん
07/11/02 15:55:16
>>358
有名になる予感
URLリンク(www.cute.or.jp)
10/31


362:デフォルトの名無しさん
07/11/03 21:48:38
Internet Explorer

363:デフォルトの名無しさん
07/11/04 10:19:39
>>361
いいねえ。
これは期待できる。

364:デフォルトの名無しさん
07/11/04 10:58:22
得体の知れないリンクは踏まないようにしてる

365:デフォルトの名無しさん
07/11/05 22:00:13
マルチです。すいません。
URLリンク(tserve01.aid.design.kyushu-u.ac.jp)
のお絵かきソフトを作るページを参考にしてるんですが
「ToolBar」の「IDR_MAINFRAME」のボタンとIDを書き換えても
ページに書かれているようなIDに対応するような関数が作られず
ボタンも描いたように表示されず灰色の使用不可のような状態
になってしまいます。
VS2005stdです。
どなたか、わかるかた、VS2005ではどうしたらよいか教えていただけないでしょうか。
お願いします。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch