5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

■MFC相談室 mfc20d.dll■

1 :デフォルトの名無しさん:2008/12/26(金) 00:43:36
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc19d.dll■
http://pc11.2ch.net/test/read.cgi/tech/1207301867/

2 :デフォルトの名無しさん:2008/12/26(金) 01:09:30
逃げ

3 :デフォルトの名無しさん:2008/12/26(金) 05:21:39
乙!!!

ウィンドウに張り付けたコントロールをスクロールさせてるんですが、
ウィンドウ内のどこへでも行って他の描画を上書きしてしまいます。
このコントロールをウィンドウ領域を制限して移動させるにはどうすればいいんでしょうか?
コントロールの一部が見えている状態もあり得るので領域の制限がいいです。

CRgn rgn;
rgn.CleageRgn(表示領域);
CPaintDC dc(this);
dc.SelectObject(&rgn);

こうじゃないかと思ったんですが、
コントロールのポジション設定の前に書いても
ウィンドウのOnPaintの最初にも書いたのですが、だめでした。お願いします!

4 :デフォルトの名無しさん:2008/12/26(金) 08:41:35
コミュニケーション能力不足って、本来こういう時に使うといいのかな?


5 :デフォルトの名無しさん:2008/12/26(金) 09:10:40
>>3
何がやりたいのかさっぱりわかんない

6 :デフォルトの名無しさん:2008/12/26(金) 10:40:19
ボタンコントロールをスクロールバーで位置をスクロールさせて使っている時に
ウィンドウ内でボタンコントロールを表示させたくない領域か、表示される領域を分けて作りたいんです。

7 :デフォルトの名無しさん:2008/12/26(金) 12:03:02
ウィンドウの中に子ウィンドウを作成して、子ウィンドウの中にボタンを配置すればいい。
で、子ウィンドウそのものをスクロールさせる。
ボタンは子ウィンドウの中に存在するから、親ウィンドウの領域を侵すことはない。

8 :7:2008/12/26(金) 12:13:54
>で、子ウィンドウそのものをスクロールさせる。
子ウィンドウの中でボタンをスクロールさせる の間違い。

9 :デフォルトの名無しさん:2008/12/26(金) 23:01:00
なるほど、スタティックコントロールなどを張り付けてその中に置けばいいんですね。
きづかなかった・・・・・
お知恵を頂きありがとう!


10 :デフォルトの名無しさん:2008/12/27(土) 00:31:41
>スタティックコントロールなどを張り付けて
ちゃんと>>7を読んだ?
スタティックコントロールの上にボタンを置いても、親から見ればどちらも子供だからボタンを動かすと親の領域を侵すぞ。
親の中に子ウィンドウを作って、さらにその中にボタンを置くんだよ。つまり、親から見ればボタンは孫。

「子ウィンドウの中にボタンを配置」とわざわざ書いたのは、そういうことなんだがな。

11 :デフォルトの名無しさん:2008/12/27(土) 00:33:34
すごいな
俺は>>6の文章で何を言ってるのか意味がわかんねーよ

12 :デフォルトの名無しさん:2008/12/27(土) 03:12:14
いえ、CStaticがCWnd派生になっているので、
CStaticの上ではなくて派生CStaticの中でボタンをCreateです。
わかってます大丈夫です。ありがとうございます。
まだコンパイルまで行きませんが、はみ出したらCWnd派生を置いてやります。どうもです。

13 :デフォルトの名無しさん:2008/12/27(土) 08:35:47
ウィンドウのZオーダーとか親子関係とか、根本的なことを理解していなさ
そう。

たぶん次は、『スクロールさせるボタン以外、貼り付けたスタテイック
コントロールに重なっているダイアログ内のコントロールが上書きされ
たり、欠けてしまう』などと質問してくるに違いない。

14 :デフォルトの名無しさん:2008/12/27(土) 09:02:32
すげえ理解力だな、その何言ってるのかわからない質問を予想するとは。

15 :デフォルトの名無しさん:2008/12/27(土) 09:26:30
すごいです。なんでわかったんですか
スタティックコントロールをWS_VSCROLLで張り付けたんですが、スクロールバー操作が全くできません。
SS_NOTIFYを付けたんですがだめです。クリックDownは届いてるんです。
スタティックコントロールではなくリストコントロールを代わりに張り付けたら、リストコントロールは全部操作できるんです。
どういうことですか?

16 :デフォルトの名無しさん:2008/12/27(土) 10:52:06
もうわからないのでスクロールバーは孫ではなく子にしました
お世話になりました。

17 :デフォルトの名無しさん:2008/12/27(土) 11:04:00
>スクロールバーは孫ではなく子にしました
・・・・・・孫にしてどーする。^^;

18 :デフォルトの名無しさん:2008/12/27(土) 11:51:13
ソフトバンク社長を馬鹿にするな。

19 :デフォルトの名無しさん:2008/12/27(土) 11:53:57
次の質問は、スタティックを親にしてCreateしたボタンのクリックイベ
ント通知がダイアログに送られてこないかな?

20 :デフォルトの名無しさん:2008/12/27(土) 12:21:55
俺が正義だ!

21 :デフォルトの名無しさん:2008/12/27(土) 13:18:25
>ボタンのクリックイベント通知がダイアログに送られてこないかな?
そういうコードを子供に書くんだよ。孫から親には通知されないが、子から親には通知されるだろ?
孫から子、子から親に通知すれば、ちゃんと親元に届くじゃないか。(笑)

22 :デフォルトの名無しさん:2008/12/27(土) 16:36:43
>>21
そういうメッセージの流れを承知していれば、

> もうわからないのでスクロールバーは孫ではなく子にしました

なんて話も出てこないのでは?

23 :デフォルトの名無しさん:2008/12/27(土) 19:18:27
孫を意識しなきゃいけない設計って、結構問題あると思うぞ

24 :デフォルトの名無しさん:2008/12/27(土) 20:16:07
MDIを終了するときに、子ウィンドウが終了する前にC〜Appで終了する処理をしたいのですが
ExitInstanceとかやデコンストラクタでは読み込めないっぽいんです。
どの関数を使ったらいいですか?


25 :デフォルトの名無しさん:2008/12/27(土) 21:00:34
>>24
もう少しまともな質問の仕方ができるように、MFCを勉強してこい

26 :デフォルトの名無しさん:2008/12/27(土) 21:29:48
>>24
デストラクタくらいはちゃんと覚えようぜ。 会話にならないから。

27 :デフォルトの名無しさん:2008/12/27(土) 21:35:57
>MDIを終了するときに、子ウィンドウが終了する前にC〜Appで終了する処理をしたい
どんな「処理」をしたいのか、まったく想像できんのだが・・・。

28 :デフォルトの名無しさん:2008/12/27(土) 21:57:16
初心者のくせにやりたいことをぼかすからだろ
具体的にこれがしたいって言えよな

29 :デフォルトの名無しさん:2008/12/28(日) 08:38:34
COLORREF に 明るさのdouble値をかけるにどうすればいいんですか?
どう変化していくのか数値を眺めていたんですが3色同じ割合で変化してないのでどう書けばいいのかわからないです。


30 :デフォルトの名無しさん:2008/12/28(日) 08:46:47
面倒臭がるな、でFA

31 :デフォルトの名無しさん:2008/12/28(日) 08:48:33
UINT nBrightness; // 0〜255
COLORREF rgbRGB(255,0,0);

nBrightness=UINT(dblPercent*255.0/100.0);
  rgb=RGB(GetRValue(rgb)*nBrightness/255, \
      ,GetGValue(rgb)*nBrightness/255, \
      ,GetBValue(rgb)*nBrightness/255);

とか。

32 :デフォルトの名無しさん:2008/12/28(日) 09:37:09
color = RGB(GetRValue(rgb) + (((255.0-(double)GetRValue(rgb))/255.0)*(bufLum/255.0)),
        GetGValue(rgb) + (((255.0-(double)GetGValue(rgb))/255.0)*(bufLum/255.0)),
        GetBValue(rgb) + (((255.0-(double)GetBValue(rgb))/255.0)*(bufLum/255.0)));

まったくうまくいきません
dblPercentはなんですか?

33 :デフォルトの名無しさん:2008/12/28(日) 10:30:52
変に悩むくらいなら、shlwapiのColorAdjustLumaでも使っとけ。

34 :デフォルトの名無しさん:2008/12/28(日) 11:53:56
あーわかったパーセント、double値を100倍したパーセントを各色に掛けてるのかthx

35 :デフォルトの名無しさん:2008/12/28(日) 13:23:10
キーボードの入力でOnKeyDownを入れたんですが、Aを押した時はどう書けばいいんですか?
調べてもVK_Aとしか出てこないんですが、シンボルが無いといわれるんです

36 :デフォルトの名無しさん:2008/12/28(日) 13:47:15
>>35
ただ単に 'A' と書けばいい。VK_Aを定義したいなら、 #define VK_A 'A' もしくは #define VK_A 0x41


37 :デフォルトの名無しさん:2008/12/28(日) 13:47:25
もう馬鹿にかまうな。
こいつに素養なんか、かけらもない。

38 :デフォルトの名無しさん:2008/12/28(日) 14:15:49
俺も最初見たときは迷った口。
昔からそこら辺の説明はまともに書いてないんだよなあ。

39 :デフォルトの名無しさん:2008/12/28(日) 15:17:50
ありがとうございます。
VK_Aの情報多すぎますよね。なんでなくなったんだろ
トレースで出てきた値入れようか悩んだんですが、あまりにも原始的で・・・Aで良かったんですね。どうもです。
コントロールと同時押しも情報がなさすぎて困ってたんですがすごいのを思いつきました!今日は冴えてます。

BOOL ctrl_A = 0;
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){
 if( ctrl_A == 1 ){
  if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
  }
 }
 if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
  ctrl_A = 1;
 }
}

void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags){
 if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
  ctrl_A = 0;
 }
}

40 :デフォルトの名無しさん:2008/12/28(日) 15:40:39
「GetKeyState」を調べると幸せになれるかも

41 :デフォルトの名無しさん:2008/12/28(日) 15:47:14
感動しました。1行で書けますねwありがとう^^

42 :デフォルトの名無しさん:2008/12/28(日) 18:06:16
>>39
どーでもいいことだが、ハンガリアン記法を憶えると、あとからソース見直す時にラクになるぞ。
つうか、こっちがそれに慣れてるからそうじゃないコードを見ると読みにくくてかなわん。(笑)

>BOOL ctrl_A = 0;
BOOL は TRUE か FALSE だろ? みたいな、よ。

>if( ctrl_A == 1 ){
は、if ( ctrl_A ){ でいい。あくまで == を書きたいなら、if ( 1 == ctrl_A){ としたほうがいい。
理由はわかるだろ?

って、ここは C の初心者教室かよ・・・・。

43 :デフォルトの名無しさん:2008/12/28(日) 18:10:39
>BOOL は TRUE か FALSE だろ? みたいな、よ。
今更何を……

>は、if ( ctrl_A ){ でいい。あくまで == を書きたいなら、if ( 1 == ctrl_A){ としたほうがいい。
勘弁してくれ。

ここはいつから三田某シンパのロートルが巣食うようになったんだ?

44 :デフォルトの名無しさん:2008/12/28(日) 18:15:27
実にどうでもいい

45 :デフォルトの名無しさん:2008/12/28(日) 18:52:05
BOOLは1と0と-1
TRUEとFALSEだけではない

46 :デフォルトの名無しさん:2008/12/28(日) 18:54:55
C の初心者教室に帰って存分に熱い思いを語れ

47 :24:2008/12/28(日) 20:20:46
えっと、MDI終了時に起動しているファイルパスを全て取得したいんですが


48 :名無し募集中。。。:2008/12/28(日) 20:28:10
ファイルパス情報はDocが持っているんじゃないかな

49 :デフォルトの名無しさん:2008/12/28(日) 21:10:10
メニューの最近使ったファイルリストのところを参考にすればよさそうな気がする

50 :デフォルトの名無しさん:2008/12/28(日) 21:26:02
終了時に保存するか聞いてくるから
終了時に開いてるやつが編集されたか全部チェックしてるだろ

51 :デフォルトの名無しさん:2008/12/29(月) 00:41:49
AfxGetApp()等でアプリケーション派生クラスのポインタを得るか、アプリケーション
派生クラスのメンバ関数内から、

(1) まず、CWinApp::GetFirstDocTemplatePosition()を呼んだ後で、
(2) CWinApp::GetNextDocTemplate()を呼んで、CDocTemplateクラスのポインタを得る。


(3) (2)で取得したCDocTemplateクラスのポインタに対して、まず
  CDocTemplate::GetFirstDocPosition()を呼んだ後、
(4) CDocTemplate::GetNextDocを呼んで、CDocumentのポインタを得る。

同じテンプレートでオープンされているか複数ドキュメントを全て取得
するには、(4)をNULLが返るまで繰り返す。

という流れ。

アプリケーションに複数のドキュメントテンプレートが存在する場合、(2)が
NULLを返すまで、それぞれのテンプレートのポインタに対して(3)〜(4)を繰り
返す。

この方法ならSDI/MDI関係ない。

各ドキュメントのパスは、CDocument::GetPathName()で取得。
ドキュメントが更新されているかどうかは、CDocument::IsModified()で取得。

52 :デフォルトの名無しさん:2008/12/30(火) 04:18:01
GetAsyncKeyState のMFC版ってありますかね?

53 :デフォルトの名無しさん:2008/12/30(火) 05:41:42
CRectで指定した領域を塗りつぶしではなくカラー補正のようなことをするにはどうすればいいんでしょうか
BitBltでパターンを使う2段階描画じゃなくて、直接変更するにはどうすればいいんでしょうか

54 :デフォルトの名無しさん:2008/12/30(火) 06:30:44
すいません。マージコピーが用意されてました

55 :47:2008/12/30(火) 19:18:07
>51
ありがとうございます!
えっと、仕組みは分かったのですが、終了するときExitInstanceやデストラクタでは
すでに子ウィンドウが閉じていて取得できません。どこに書けば取得できますでしょうか?

56 :デフォルトの名無しさん:2008/12/30(火) 23:47:58
MFCはLinuxで使えないから糞ですね。
wxWidgetを使うことにします。

57 :デフォルトの名無しさん:2008/12/31(水) 08:26:19
switchの中でswitchを書いたり、ifのtrueとelseで同じcase値をもったswitchを区別させるにはどうすればいいんですか?
ずっとバグと闘ってたんですが、どうも同じcase値があるのがいけないような気がするんです。この辺どうなんでしょうか

58 :デフォルトの名無しさん:2008/12/31(水) 08:39:59
別の関数にわけたほうがいいと思うが……

59 :デフォルトの名無しさん:2008/12/31(水) 09:07:19
ですよね・・・そうします。

60 :デフォルトの名無しさん:2008/12/31(水) 10:36:30
誤爆?
ここMFCスレですよ

61 :51:2008/12/31(水) 13:24:41
WM_CLOSE メッセージハンドラ = CMainFrame::OnClose() あたりで
よいのでわ?

62 :デフォルトの名無しさん:2008/12/31(水) 15:00:45
でわ?

63 :デフォルトの名無しさん:2008/12/31(水) 20:54:58
誰か教えてください
VS2008 SP1 で CFormView から派生の SDI の新規プロジェクトを作り、
何も変えずにビルドしたらいきなり CMainFrame::OnCreate が見つからないというエラーに遭遇しました
それで、MainFrame.h に CMainFrame::OnCreate の定義を追加したところ、ビルドはできたのですが、
その CMainFrame::OnCreate が呼ばれていないらしくて、ツールバーやドッキングウィンドウ等がまったく表示されません
SDI の CFormView でツールバーやドッキングウィンドウはどうやって表示すればいいですか?
むしろ VS2008 SP1 を使うのやめといたほうがいいですかね???

64 :デフォルトの名無しさん:2008/12/31(水) 21:14:44
>>63
1.アプリケーションの種類でシングルドキュメントを選択
2.生成されたクラスで基本クラスにCFormViewを選択
3.完了ボタンを押す
4.印刷サポートが無いとの警告で「はい」を押す
5.F5でビルド-デバッグ実行

以上の操作で問題なく実行された。

65 :デフォルトの名無しさん:2008/12/31(水) 21:21:02
>>64
レスありがとうございます
んー、使っているのが VS2008 Pro の評価版でこいつにSP1あてたせいでしょうかね?
製品版のVS2008 SP1だとこの問題が出ないのでしょうかね
とりあえず、Createのイベントを追加してOnCreateのコードをごっそり移動させたら動きました

66 :デフォルトの名無しさん:2009/01/01(木) 10:18:59
>CFormView から派生の SDI の新規プロジェクト

これWizard内だけで完結させたのかな?
もしそうなら、そんなエラー出ることないと思うけどなあ。

67 :デフォルトの名無しさん:2009/01/02(金) 05:11:13
>>63の件ですが、どうもMFCアプリケーションウィザードの5枚目で
初期ステータスバーのチェックを外すと発生するみたいです
(初期ステータスバーのチェックを外す以外は何も変更しなくても起きました)

68 :デフォルトの名無しさん:2009/01/03(土) 01:08:51
>>67
検証してみたが、製品版のVS2008SP1(SE)でも発生した。
【対処法】は以下のとおり。

・MainFrm.cppのメッセージマップに、
    ON_WM_CREATE()
 の一行を追加する。
・MainFrm.h のメッセージハンドラ関数を宣言しているあたりに、
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 の一行を追加する。

これでビルドは可能になる。うーん、AppWizerd のバグかな。

69 :デフォルトの名無しさん:2009/01/03(土) 02:43:18
どなたか教えてください。


VC2005のMFC、SDIを使いラジオボタンを配置しているのですが、選択ができず、チェックがいれられないでいます。

ラジオボタン自体はradiobutton.Create()で引数指定して貼り付けています。
ググってCwnd;;CheckRadioButton等を見つけたのですが、手をつけられず困っています。
もしよろしければどなたか助言の方お願いします。

70 :デフォルトの名無しさん:2009/01/03(土) 03:02:14
ID を連続させる必要がある。
あと、「グループ」プロパティのチェックは
一連のラジオボタンの先頭のみにチェックを入れるんだったはず。

71 :デフォルトの名無しさん:2009/01/03(土) 03:14:08
radiobutton.SetCheck( int nCheck);
詳細は CButton::SetCheck のヘルプ読めばわかる。

72 :デフォルトの名無しさん:2009/01/03(土) 03:35:38
動的に作成したラジオボタンにプロパティなんぞない。
IDを連続させて、ON_CONTROL_RANGE() マクロで処理するんだよ。

73 :デフォルトの名無しさん:2009/01/03(土) 11:19:24
ダイアログで右クリックでポップアップメニューを表示するようにしたのですが、
ON_UPDATE_COMMAND_UIを実装してもコールされず、メニューの有効無効やチェックなどが更新されません
ダイアログでON_UPDATE_COMMAND_UIの関数でメニューを更新する方法はありますか?


74 :69:2009/01/03(土) 12:58:11
>>70-72

アドバイスありがとうございます。

IDを連続など調べて頑張ってみます。

75 :デフォルトの名無しさん:2009/01/03(土) 13:50:02
>>68
Microsoft Visual Studio 9.0\VC\VCWizards\AppWiz\MFC\Application\templates\1041にある
frame.h内の177行目と、frame.cppの内の47行目の
[!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || RIBBON_TOOLBAR || STATUS_BAR]

[!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR || RIBBON_TOOLBAR || STATUS_BAR]
にしておくと、次からうまくいくようになる。

ついでに、frame.cppの内の935行目の
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

return [!output MAIN_FRAME_BASE_CLASS]::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
にしておくとドキュメントのないSDIのときに、ドッキングウインドウ関係のバグがなくなる。


76 :デフォルトの名無しさん:2009/01/03(土) 14:44:38
複数の画像を表示させてドラッグで移動させるプログラムを書いていたのですが
複数選択をさせる時等はどうしたらいいんでしょう?


77 :デフォルトの名無しさん:2009/01/03(土) 14:48:18
エクスプローラでも参考にしろ

78 :デフォルトの名無しさん:2009/01/03(土) 15:15:53
出来るだけWindowsに近い直感的なUIを提供するのは基本だしな

79 :デフォルトの名無しさん:2009/01/03(土) 16:32:54
Docが持ってる変数のみで何らかの処理を行いたい場合って
Doc側に関数を実装すればいいんですかね?

80 :デフォルトの名無しさん:2009/01/03(土) 17:10:39
OK

81 :デフォルトの名無しさん:2009/01/03(土) 17:16:43
>>73
俺は、WM_KICKIDLEが届いたら、
ツールバーにWM_IDLEUPDATECMDUIを送るようにした。

82 :デフォルトの名無しさん:2009/01/03(土) 19:55:47
質問失礼します。

LoadImage関数を使いビットマップをマイピクチャから読み込もうとしているのですが、例外が出てしまい上手くいきません。
マイピクチャにあるビットマップを読み込もうとしており、フルパスで指定してみたいと思ったのですがフルパス指定の方法がいまいちわかりません。

どなたかアドバイスお願いします。

83 :名無し募集中。。。:2009/01/03(土) 19:59:15
あけおめことよろ>all

>>82
どんな例外? ファイルが無くても例外は出ないんじゃないかと。
フルパス指定ができない? \を\\にしていないとかじゃない?

84 :デフォルトの名無しさん:2009/01/03(土) 20:28:20
>>82
LoadImageはイメージリソースをロードする関数だろ。
フォルダにあるBMPを読むには、CreateFileなり、fopenなり、CImage::Load なりを使わなきゃ。

85 :名無し募集中。。。:2009/01/03(土) 20:49:00
> LoadImageはイメージリソースをロードする関数だろ。
そうでもない
http://msdn.microsoft.com/ja-jp/library/cc364835.aspx
例えばこんな感じ(fnがフルパスのファイル名)
m_hBmp = (HBITMAP)LoadImage( NULL, fn, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_VGACOLOR )) ;


86 :デフォルトの名無しさん:2009/01/03(土) 21:11:00
ほお、第2引数でパス名を指定できるんだ。ありがと。勉強になったよ。

87 :デフォルトの名無しさん:2009/01/03(土) 23:07:54
>>81
ありがとうございます
できないかと思っていましたが、おかげさまで実装できました

88 :82:2009/01/04(日) 19:22:05
>>83-85

エスケープシーケンスも間違いでしたが、ちょこちょこ手直ししていたらなんとかなりました。
本当に助かりました。ありがとうございます!

89 :デフォルトの名無しさん:2009/01/05(月) 09:26:20
何故この流れでいきなり「エスケープシーケンス」が?

90 :デフォルトの名無しさん:2009/01/05(月) 11:04:46
newして作ったクラスを切り取りや削除した場合ってdeleteってやったほうがいいんですかね?


91 :名無し募集中。。。:2009/01/05(月) 11:34:29
切り取りってなんぞ?
特に理由がない限りnewしたものはdeleteと相場が決まっている

92 :デフォルトの名無しさん:2009/01/05(月) 12:04:04
MFCの中には、使用者にnewで作らせておいて、
delete thisで自殺するクラスもあるけどね。

93 :デフォルトの名無しさん:2009/01/05(月) 12:51:52
>>91
クラス一つ一つに画像がついていて
画像を切り取る時にCRect構造体を用いてるんですよ。
で、このCRect構造体はnewで作っていて切り取りの情報を削除したらDeleteするべきなのかな。とおもいまして

94 :デフォルトの名無しさん:2009/01/05(月) 13:28:58
>>93
すまん、何を言っているのか理解できないからソースを出してくれ。

95 :名無し募集中。。。:2009/01/05(月) 13:31:51
>>93
newで作ったらdeleteしないといけない
でもnew-deleteを使わなくても良い別の方法があるような気がする(ローカル変数を使うとか

96 :デフォルトの名無しさん:2009/01/05(月) 13:51:12
>>94
理解できないなら理解しなければいいんじゃね?

ようするに、画像の範囲を切り取る時にCRectでサイズと範囲を指定してるっていう話だろ?
newで作ったならDeleteするのはお約束。
戻り値ある関数でなら戻り値作らなきゃいけないのと一緒。


97 :デフォルトの名無しさん:2009/01/05(月) 13:55:33
>削除したらDeleteする
漏れにはここが理解できん。

98 :デフォルトの名無しさん:2009/01/05(月) 13:56:34
MFCに触る以前にC++をまったく理解してないって様子がアリアリだな。

99 :デフォルトの名無しさん:2009/01/05(月) 13:57:24
>>97
範囲を切り取ったよ!
でも、この範囲の情報をいらなくなったからユーザが削除したよ!
そうしたら、プログラム的にdeleteするべき?ってきいてるんだろ。
deleteと削除を区別して考えてるというか、ユーザ側とプログラムで別って事を自覚してるから正しい。


100 :デフォルトの名無しさん:2009/01/05(月) 14:01:22
>>98
顔真っ赤だけど大丈夫?

C++からMFC来るとクラス削除しなくっても勝手に処理してくれたりで戸惑うのは当たり前だと思うのは俺だけか

101 :デフォルトの名無しさん:2009/01/05(月) 14:06:32
>>100
顔真っ赤なのは、鏡に映ってる自分のことかぃ?(w

自分のコードで明示的にnewして作ったものを、MFCが内部で勝手に削除
するMFCの標準クラスって、具体的にどのクラスのことなのか1つでいい
から挙げてみてよ。


102 :デフォルトの名無しさん:2009/01/05(月) 14:07:06
説明が下手なだけだな。

103 :デフォルトの名無しさん:2009/01/05(月) 14:10:49
MFCにもCreateとかReleaseとかいうメンバ関数があんなにいっぱいあるというのにw

104 :デフォルトの名無しさん:2009/01/05(月) 14:16:55
>>102
いわゆる、真性のコミュニケーション能力不足ってやつですね。

なんか理系全体のレベルが下がるとともに、年々新人プログラマの質も
下がっているような気がするのは、気のせいか?

>>103
メンバ関数のCreateやReleaseは、麻生読みするとnew/deleteになると
でも言うのかぃ?

予約語以外の関数名なんてコンパイラにとっちゃ、関数を個別に識別する
ための単なる記号でしかないのは、C++どころかCやアセンブラ、BASICでも
変わらん。C++から来たとか騙るな。

105 :デフォルトの名無しさん:2009/01/05(月) 14:20:17
>>104
お前は何の話をしてるんだw

106 :デフォルトの名無しさん:2009/01/05(月) 14:23:15
自分の世界に浸っているのでしょう。

つまりなにか? このスレは説明もろくにできない質問者と、
自分の世界に浸って周りを見ようともしない回答者と、
一部の傍観者によって構成されているのか?
# まぁそんなもんか。

107 :デフォルトの名無しさん:2009/01/05(月) 14:24:51
>>101
CFrameWnd

108 :名無し募集中。。。:2009/01/05(月) 14:35:34
CFrameWndというかCMultiDocTemplateあたり?

説明が下手な人は自分の考えを言葉に表現できないという事だと思うけど
コーディングってプログラム言語でプログラムしたい内容を表現するという事だから
(上司の、スレ住人の、CPUの、OSの、言語の)理解できる的確な表現をする事は重要な事だぜ

109 :デフォルトの名無しさん:2009/01/05(月) 14:36:41
惜しい、そこは「言語」ではなく「コンパイラ」とすべきかと。

110 :デフォルトの名無しさん:2009/01/05(月) 16:11:58
>>101はCFrameWndやCDocTemplateを知らなかったのか?

111 :デフォルトの名無しさん:2009/01/05(月) 16:22:20
なぁ、>>101は図星だったからこんなに必死なん?

112 :デフォルトの名無しさん:2009/01/05(月) 16:31:16
new/deleteや、クラスの生成/消滅でがたがた言ってるヴァカは、ただの屑。
それだけは真実。

113 :デフォルトの名無しさん:2009/01/05(月) 17:07:53
MFCと関係ない質問はスルーが基本

114 :デフォルトの名無しさん:2009/01/05(月) 17:23:26
親ウィンドウのクライアントエリアにある子ウィンドウがクリックされた時に
親ウィンドウでも処理をしたいんですが、どうしたらいいんでしょう?

フォーカスを無理やり親に渡してしまうと子ウィンドウ側での処理ができなくなってしまいますし。。。

と、APIの方に誤爆ってしまいましたがどなたかお知恵をお貸しくださいな

115 :名無し募集中。。。:2009/01/05(月) 17:42:02
親ウィンドウってCMDIFrameWnd?子ウィンドウってCMDIChildWnd?
フォーカスを渡さないといけない処理ってどんな処理?

>>109
インタプリタもあるじゃない?と思ったけどMFCならコンパイラ限定か(チッ

116 :デフォルトの名無しさん:2009/01/05(月) 17:53:59
>>115
子ウィンドウの移動をさせたいんですが、親ウィンドウはViewクラスで子ウィンドウはCEditになってます。


117 :デフォルトの名無しさん:2009/01/05(月) 18:59:10
何でフォーカスが関係してくるのか理解不能

118 :デフォルトの名無しさん:2009/01/05(月) 19:05:22
とどのつまり親(Viewとか)のPreTranslateMessageで解決する

119 :デフォルトの名無しさん:2009/01/05(月) 19:31:59
>>117
キー入力がそっちに行っちゃってCtrl+Vとかも使えなくなったのでフォーカスかなぁと。



120 :デフォルトの名無しさん:2009/01/05(月) 21:21:22
MFCのソース見てないけど
EditViewでツールバーやメニュー触ったあともフォーカスはeditに残ってるから
フォーカス戻す処理が入ってる気がする
仮にそうだったらEditViewじゃない普通のviewの場合はviewへフォーカスが戻るだろうね

121 :デフォルトの名無しさん:2009/01/05(月) 21:39:14
リストコントロールで追加したアイテムが常に画面に見えるようにしたいのですが
これはどこが問題あるんでしょうか?スクロールバーは常に一番下になるんですが、画面が変わりません

m_List.InsertItem(m_List.GetItemCount(), mes);
SCROLLINFO si;
m_List.GetScrollInfo(SB_VERT, &si, SIF_ALL);
si.nPos = si.nMax;
m_List.SetScrollInfo(SB_VERT, &si);
m_List.RedrawWindow();

122 :デフォルトの名無しさん:2009/01/05(月) 21:50:52
SetscrollInfo()ではなく、EnsureVisible()を使うのではないだろうか。

123 :デフォルトの名無しさん:2009/01/05(月) 22:04:49
表示されるようになりました。1行で書けてしまいました。ありがとうです!

124 :デフォルトの名無しさん:2009/01/06(火) 21:28:48
自前のウィンドウに影(ウィンドウの右と下が黒くなるやつ)を付ける方法を
教えて下され。

CWndクラスの中で下のように書くとタイトルバーもない四角いウィンドウがでるのですが、
これに影を付けたいのです。

CreateEx(
WS_EX_TOOLWINDOW,
lpszClassName,
NULL,
WS_POPUP | WS_VSCROLL,
0, 0, 100, 100,
NULL, NULL, NULL);


125 :デフォルトの名無しさん:2009/01/06(火) 21:44:36
デスクトップに対する相対座標を取得して、そこからデスクトップに対してGDIを使って、ウインドウサイズに合わせて矩形を描画すればいいんじゃね?

126 :デフォルトの名無しさん:2009/01/06(火) 22:05:23
フチに自分で色塗るだけ

127 :デフォルトの名無しさん:2009/01/06(火) 22:18:51
>>124
GDIを使って描いてもいいけれど、もっと安直にウィンドウを重ねてもできるよ。

128 :デフォルトの名無しさん:2009/01/06(火) 22:38:25
もしかしてCS_DROPSHADOWの事か?

129 :デフォルトの名無しさん:2009/01/07(水) 00:00:29
MFC Feature Packでアプリ組むと、タイトルバーのフォントが、標準のものより
ちょっと小さくて読みにくいんだけど、これって、どこで修正できるん?
どこかのタイミングでフォントを設定すれば修正できるような気がするんだけど、
上手くいかない・・・orz
どなたか、わかる方、教えてplz

130 :デフォルトの名無しさん:2009/01/07(水) 00:49:39
まだそんな名前だっけ
普通にSP1って呼んでるわ

131 :デフォルトの名無しさん:2009/01/07(水) 13:22:30
>>128
すんません。いろいろ調べてはいたのですが
灯台下暗しでした。。。
CS_DROPSHADOWでやりたいことができました。

132 :デフォルトの名無しさん:2009/01/07(水) 13:47:27
MFC(VS2005)からVBAの関数を呼び出す方法を知っている人いませんか?
ググってもなかなかみつからないので。。。
よろしくお願いします。

133 :名無し募集中。。。:2009/01/07(水) 14:09:49
VS2008からDDEを使ってExcelに値を放り込んだり多少の操作をした事はあるけど
VBAの関数を呼ぶ方法はわからないな
VBAのどんな関数を呼びたいんだ? (または任意のマクロかな)

134 :デフォルトの名無しさん:2009/01/07(水) 15:05:13
>>133
ExcelのVBEditorで作ったVBAの関数を呼びたいと思っています。
Excelに貼り付けたボタンを押すとその関数が呼び出されるんですが、
これをMFCで処理させたいと思っています。

なかなか難しいですかね?

135 :デフォルトの名無しさん:2009/01/07(水) 15:15:24
こういうやつ?

追加し、MFC からオートメーションを使用した VBA マクロを実行する方法
ttp://support.microsoft.com/kb/194906/ja

136 :デフォルトの名無しさん:2009/01/07(水) 15:22:52
>>135
日本語が。。。

でも、オートメーション使うとなにかできそうですね。

137 :デフォルトの名無しさん:2009/01/07(水) 17:58:11
>>129
タイトルバーのフォントが変わるの? XPじゃ変わらんけど。

ちなみに、メニューバーのフォントは変わるのでシステムの設定を
チェックしてそれに合わせているんだが。

138 :デフォルトの名無しさん:2009/01/07(水) 18:01:14
CDHTMLDialogのOnInitDialogでCreateExで動的生成したコントロールが、
スクロールバー等をクリックしても無反応です。

CDHTMLDialogで動的に生成したコントロールを有効にする方法は無いでしょうか?

139 :デフォルトの名無しさん:2009/01/07(水) 19:06:25
CEditを本体から呼び出してエディットボックスを作成しているのですが、これの色を変更する場合って
CEditのHDCを取得して、SetTextColorではだめなんでしょうか?

140 :デフォルトの名無しさん:2009/01/07(水) 20:19:18
つオンコントロールカラー

141 :デフォルトの名無しさん:2009/01/08(木) 00:17:30
古いアプリのメンテのために昨日から初めてMFCに触れることになった者です。

ある比較的シンプルなWindowsアプリで、なぜかCPU使用率が異常に高いので
いろいろ試行錯誤しなかがら試してみると、どうもOnPaintのオーバライドで
ベースクラスのOnPaint(CframeWnd::OnPaint)を呼んでないことが原因らしいことが
わかったのですが(つまりオーバーライドの中でCframeWnd::OnPaintを呼んでやれば
CPU使用率の異常な上昇は起こらない)これって普通なんでしょうか?

なんかググってもオーバーライドの中でCframeWnd::OnPaint読んでるようなコードって
見かけないような気がするんですが……。


142 :デフォルトの名無しさん:2009/01/08(木) 00:19:42
OnPaint で GetDC とかしてないか?
OnPaint では CPaintDC でデバイスコンテキストを作る必要がある。

あるいは、OnPaint で何もしていないか・・・。
何もしなくても CPaintDC を作る必要がある。

143 :デフォルトの名無しさん:2009/01/08(木) 00:50:27
OnPaint() ではベースクラスの OnPaint() は呼ばない。
ベースクラスでは、Default()、つまりDefWindowProc() を呼んでいるだけだから。

144 :デフォルトの名無しさん:2009/01/08(木) 00:52:34
DefWindowProc で
BeginPaint と EndPaint をしてるから
OnPaint で何もしていないなら
自前で CPaintDC 作るか
さもなくばベースクラスの OnPaint を呼ばなければいけない。

145 :デフォルトの名無しさん:2009/01/08(木) 01:06:27
CPaintDC(BeginPaintとEndPaint)しないと無効領域がクリアされず
延々とWM_PAINTが生成されるんだっけか

146 :デフォルトの名無しさん:2009/01/08(木) 01:36:29
無効領域がある限り永遠にWM_PAINT送り続けるからな。
一応メッセージの優先順位が低いから、それでもそれなりにアプリは動作するけど。

147 :デフォルトの名無しさん:2009/01/08(木) 05:09:44
つまり、元のアプリは相当酷い代物ってことだな。

148 :デフォルトの名無しさん:2009/01/08(木) 19:26:24
>>142-147
ありがとう。
ソースは会社なんで明日確認してみます。

>元のアプリは相当酷い代物ってことだな。
名前から意味がまったく読み取れない変数名やメソッド名とか、
一つのメソッドが平気で200行とかそれはもうw

149 :デフォルトの名無しさん:2009/01/08(木) 21:41:46
子ウィンドウの座標(CPoint)を親ウィンドウの座標(CPoint)に変換したいんですが関数などはあるのでしょうか?

150 :デフォルトの名無しさん:2009/01/08(木) 21:43:43
どういう意味だ?
デスクトップからの相対座標を、親ウィンドウの相対座標に変換するってことか?

151 :デフォルトの名無しさん:2009/01/08(木) 21:44:50
Viewクラス内に派生クラスで作成したCEditクラスがいるんですが
このCEdit内をクリックされた時に親ウィンドウ側に座標を渡したいんです

152 :デフォルトの名無しさん:2009/01/08(木) 22:10:12
GetCursorPosで取得したならスクリーン座標なので親でScreenToClient

153 :デフォルトの名無しさん:2009/01/08(木) 22:20:47
GetCursorPosを行ったのではなく、CEditクラスに来たWM_LBUTTONDOWNのメッセージを処理したいんですよ。


154 :デフォルトの名無しさん:2009/01/08(木) 22:23:01
応用力のない奴だな

155 :デフォルトの名無しさん:2009/01/08(木) 22:27:07
つ MapWindowPoints

156 :デフォルトの名無しさん:2009/01/08(木) 22:55:15
応用力があったらこんなところに来ません。

157 :デフォルトの名無しさん:2009/01/09(金) 08:02:43
photoshopとかwordみたいにdrawの一部を拡大縮小したくて、SetViewportOrgとか使ってみたのですが
どうもキレイに行かなくて困ってます。
イイ解決法ってありますか?

158 :デフォルトの名無しさん:2009/01/09(金) 10:12:41
MFCと関係ない質問はスルーの方向で

159 :デフォルトの名無しさん:2009/01/10(土) 11:55:15
スクリーン座標をクライアント座標に変換した所、正しく変換された物から右下側に座標がずれてしまうのですが
これは、使い方がおかしいのでしょうか?

160 :デフォルトの名無しさん:2009/01/10(土) 12:02:21
エスパーさーん

161 :デフォルトの名無しさん:2009/01/10(土) 12:09:41
ScreenToClientでスクリーン座標をクライアント座標にしたらずれてるって話だろ?
別に意味がわからなくはないとおもうが・・・。

まぁ、俺には解決策はわからんけどね

162 :デフォルトの名無しさん:2009/01/10(土) 14:04:57
・変換元座標がスクリーン座標でない。
・実はAPIのScreenToClientを使用しており、渡すHWNDが間違っている。
・"正しく変換された物"のほうがずれている。


163 :デフォルトの名無しさん:2009/01/10(土) 15:33:57
非クライアント領域が計算に入ってないんだろうな

164 :デフォルトの名無しさん:2009/01/13(火) 23:01:13
GetCurrentDirectoryより簡単な関数はありますか?

165 :デフォルトの名無しさん:2009/01/13(火) 23:18:29
>>164
「簡単」の基準は?

166 :デフォルトの名無しさん:2009/01/13(火) 23:24:58
MFCを使い ダイアログベースのプログラムを作成しています。
例えばダイアログ上にボタンを配置し 毎フレーム位置を変更させるような
プログラムを作成したいと考えています。
毎フレーム処理を行うようなコードはどのように実装すればよいのでしょうか?

167 :デフォルトの名無しさん:2009/01/13(火) 23:28:08
そもそもフレームってどういう意味で言っているのか分からない
紙芝居でもダイアログ上に表示するのか?

168 :デフォルトの名無しさん:2009/01/13(火) 23:38:06
>>167
返答ありがとうございます。
>紙芝居でもダイアログ上に表示するのか?
イメージに近いです1フレーム毎に処理を行えればと思っています。



169 :デフォルトの名無しさん:2009/01/13(火) 23:43:46
フレームの定義が時間単位とかだと、タイマーイベントでも作ってダイアログのDC上に絵を描画とかか?
関係ない話だけど、今Windows7のペイントいじってみた
なんとなくリボンの良さ分かった木はするけど、絵心がないから個人であれ作るのは面倒だな

170 :デフォルトの名無しさん:2009/01/13(火) 23:52:29
>>169
Timerを使わず
win32でいうところのメッセージループみたいな
所で独自のイベントを受け取って処理を行いたいんだけど
いまいちわからん。。。

リボンUIは確かに見た目は良いね

171 :デフォルトの名無しさん:2009/01/14(水) 00:26:54
GDIにはフレームという概念は無いはず。
タイマーかなんかで一定時間毎に処理するしかないね。

172 :デフォルトの名無しさん:2009/01/14(水) 01:39:59
やっぱりフレームがどういうものを想像しているのか分からないな
描画が必要なタイミングの単位と言うならOnDrawとかになるんだろうけど
一定周期じゃないもんな(アクティブになったときとか、リサイズされたときとか色々。。。)

173 :デフォルトの名無しさん:2009/01/14(水) 10:09:35
MFCならOnIdleの出番か?

174 :デフォルトの名無しさん:2009/01/14(水) 10:42:44
ティアリングの無い綺麗なアニメーションしたければWPF使えってんだ

175 :デフォルトの名無しさん:2009/01/14(水) 18:16:00
CRectTrackerを使って画像内にドラッグで大きさ、位置が
変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白になってしまって画像が上書きされた形になります。
枠だけ描画というのはどうやったらできるんでしょうか。

画像はrawで、OpenGLで描画されています。


176 :デフォルトの名無しさん:2009/01/14(水) 18:24:56
>>175
コンストラクタでCRectTracker::hatchInsideを指定するとどうなる?
# OpenGLで描画したものってDCの範疇じゃないのかな?

177 :175:2009/01/14(水) 18:55:08
>>176
斜線が入るだけで、白く塗りつぶされたままです。

178 :デフォルトの名無しさん:2009/01/14(水) 19:52:53
エディットボックスでキー入力の入力方法を英語から日本語入力に自動的に切り替える方法を教えてください。


179 :178:2009/01/14(水) 19:53:28
↑winXP+VC2005です。すいません


180 :デフォルトの名無しさん:2009/01/14(水) 21:15:39
MFCにあったかな?
なければスレ違い

181 :デフォルトの名無しさん:2009/01/14(水) 22:07:07
>>175
そもそもなんでOpenGLで描画したところにトラッキングしたいのか判らんが、
MFC側の問題じゃなくてOpenGL側の問題っぽいからOpenGLスレで聞いて味噌。

182 :デフォルトの名無しさん:2009/01/14(水) 23:26:05
質問させてください。
今MFC VC2005を使いプログラムを組んでいるのですが、あるメソッド内でint型配列array[21]の中身をsetwindowtextでタイトルに表示させたいと思っています。
setwindow(_T(""))で、array[i]をどのように記述すれば表示できるようになるでしょうか。下らないかもしれませんがお願いします。

183 :デフォルトの名無しさん:2009/01/14(水) 23:28:17
CString hoge;
hoge.format(_T("%d"), array[i]);
wnd.SetWindowText(hoge);

こんな感じかな

184 :182:2009/01/15(木) 02:24:13
>>183さん
そういう書き方をするんですね、、無事上手くいきました。ありがとうございました!

185 :175:2009/01/15(木) 02:48:28
>>181
今使ってるプログラムはもともと1年半くらい前の演習の時に先生から頂いたrawビューアで、
研究に使えそうだってことでその時のプログラムを改造しようとしてるんですが、
OpenGLは全く扱ったことがなくて(演習の時も処理部分しか触ってない)、
時間もないんで、OpenGLを勉強するより1から作り直した方が早いような気がしてきたんですが、
raw画像(320×320の輝度値のみのデータ)をMFCを使って表示させるには
ビットマップに変換するしかないのでしょうか。

186 :名無し募集中。。。:2009/01/15(木) 03:19:54
輝度データをDIBに変換すれば良い
BMPはLoadImageでDIBのハンドルを得られるが
自分で変換する場合はBITMAPINFOにサイズなどをセットしてCreateDIBSectionを使って
ハンドルと輝度データを入れる領域を得る(ここまでMFCなし

187 :175:2009/01/15(木) 11:33:23
>>186
アドバイスありがとうございます。
それで作ってみたいと思います。

188 :デフォルトの名無しさん:2009/01/16(金) 17:33:57
MFC6.0の参考書見ながらこつこつやってるんだけど別に支障はない?
1999〜2001年に出版されたものなんだが

189 :デフォルトの名無しさん:2009/01/16(金) 19:37:56
int iLength = m_Edit.LineLength(i)+1;
TCHAR *ptBuf = new TCHAR[iLength];
m_Edit.GetLine(i,ptBuf,iLength);
ptBuf[iLength]=0;
ar.WriteString(str);
delete[] ptBuf;
一行一行ファイルの保存させたいのでCEditの内容を取得して保存させるのに
上記の様なソースを書いたところdelete[]の所でエラーをはくのですがなぜでしょうか?

190 :デフォルトの名無しさん:2009/01/16(金) 19:47:37
>>189
ptBuf[iLength]=0;

ptBuf[iLength-1]=0;

191 :デフォルトの名無しさん:2009/01/16(金) 19:57:10
CWnd::GetWindowTextでCStringに纏めて取って、
CString::Tokenizeで分解したほうが手っ取り早くね?

192 :デフォルトの名無しさん:2009/01/16(金) 20:45:37

  int  i, nLineCount;
  CString strText;
  CStringArray bufArray;

  nLineCount=m_Edit.GetLineCount();
  for (i=0;i < nLineCount;i++)
  {
    int len = m_Edit.LineLength(m_Edit.LineIndex(i));
    m_Edit.GetLine(i, strText.GetBuffer(len), len);
    strText.ReleaseBuffer(len);
    bufArray.Add(strText);
  }

  CStdioFile file;

  if(file.Open(..略..))
  {
    for (i=0;i <bufArray.GetSize();i++)
    {
      file.WriteString(bufArray.GetAt(i));
      file.WriteString(_T("\r\n"));
    }
    file.Close();
  }

とかでよくね?

193 :デフォルトの名無しさん:2009/01/16(金) 21:25:28
CEdit::GetLine
戻り値
実際にコピーされたバイト数

戻り値使わないの?

194 :デフォルトの名無しさん:2009/01/17(土) 00:00:50
MFCでデバイスコンテキストで使われているフォントの高さを取得する方法ってありますか?

195 :デフォルトの名無しさん:2009/01/17(土) 00:05:43
GetTextExtent

196 :デフォルトの名無しさん:2009/01/17(土) 03:07:01
>>193
ここの使用例をテキトーに書き直しただけだから、

ttp://msdn.microsoft.com/ja-jp/library/s7zy7cwk(VS.80).aspx

細かい事気にすんな。 ハゲるぞ。(もうハゲてるかもしれんけど)

197 :デフォルトの名無しさん:2009/01/17(土) 04:18:10
GetLineの戻り値、、使わないなあ。 使いどころない。
>>193は、>>192でどう戻り値使うのだろうか?

198 :デフォルトの名無しさん:2009/01/17(土) 09:07:51
>>194
GetTextMetrics

199 :デフォルトの名無しさん:2009/01/17(土) 17:51:17
lineText..GetLine(iLine, strText.GetBuffer(iLength));
っていう風に関数を実行するとstrTextにその行が入る時と入らない時があるんですがなぜなんでしょうか?

200 :デフォルトの名無しさん:2009/01/17(土) 17:57:30
ReleaseBuffer してるか?

201 :デフォルトの名無しさん:2009/01/17(土) 18:01:19
行ってますし、デバッガでとめて一個一個通すと何故か全部入っていくんです。

202 :デフォルトの名無しさん:2009/01/17(土) 18:08:02
>lineText..GetLine(iLine, strText.GetBuffer(iLength));
こんなコード、有り得ないだろ。

203 :デフォルトの名無しさん:2009/01/17(土) 19:07:15
CEdit::GetLine(int nIndex, LPTSTR lpszBuffer)
だろ?EM_GETLINEのベタ実装なんだよな、これ。
昔から思っていたんだが、わざわざメソッドとして用意しておく必要性あるんだろうか。
普通バッファ長を指定できる方しか使わないと思うのだが。
わざわざこっちでバッファの先頭ワードにバッファ長代入とか暇人過ぎだろ。

204 :デフォルトの名無しさん:2009/01/17(土) 21:11:51
2つあるうちの一見楽そうに見える方が実は大変ということか

205 :デフォルトの名無しさん:2009/01/18(日) 15:22:20
>>199
>>203 が書いているように、引数が2つしかない CEdit::GetLine()を使う
時は、呼び出す前に、第二引数で渡すバッファの先頭に、バッファ長を
書いておく必要があるのに、それをやっていないからだろ?

  LPTSTR pBuf;

  pBuf=strText.GetBuffer(iLength);
  *((LPWORD)pBuf)=iLength;       // バッファ長をセット
  m_wndEditCtrl.GetLine(iLine,pBuf);
  strText.ReleaseBuffer(iLength);

自分でバッファ先頭にバッファ長をセットするのが面倒なら、引数が3つ
あるCEdit::GetLine()を使うことだ。

206 :デフォルトの名無しさん:2009/01/18(日) 16:01:41
日付や時間を取得したいけどエラーがでてしまうんです・・・
内容は
Run-Time Check Failure #3 - The variable 'newtime' is being used without being initialized.

afx_msg void CMainWin::OnTime()
{
char str[80];
CTime Curtime = CTime::GetCurrentTime();
struct tm *newtime;

newtime = Curtime.GetLocalTm(newtime); //ここが問題
wsprintf(str,asctime(newtime));
str[strlen(str) - 1] = '\0';
MessageBox(str,"Time and Date");
}

http://msdn.microsoft.com/ja-jp/library/fxy17zta(VS.80).aspx
ここ見る限りじゃ間違いないと思うんだけどなあ・・・
指摘と改善お願いします。。。

207 :デフォルトの名無しさん:2009/01/18(日) 16:57:35
>>206
突っ込みどころが大杉。釣りか?

C++やMFC以前に、ポインタも理解していないなら、C言語の基礎からやった
方がいいと思う。

MFCのサンプルは間違っているな。

  struct tm newtime;
  Curtime.GetLocalTm(&newtime);

でうまくいくだろう。

また、ワイド文字版のwsprintf()を使うなら「char str[80]」ではなく
「wchar_t str[80]」とすべき。MessageBoxもワイド版を使う。

> str[strlen(str) - 1] = '\0';

これもprintf()/wprintf()によって文字列末尾にNUL文字('\0')は付与され
ているから意味がないし、ワイド文字なら、strlen()ではなくwcslen()を
使うべき。

str[wcslen(str)-1] = L'\0';

第一、str[]がNUL文字で終端されていないと、strlen()/wcslen()は
文字列長さを判定できない。

208 :デフォルトの名無しさん:2009/01/18(日) 17:08:05
>>207
MSのサンプル間違ってるとか悲しいわな

これ、一応参考書のサンプルなんですけど捨てたほうがいいでしょうか
まあ2001年に出版されたものなんですけどね

209 :デフォルトの名無しさん:2009/01/18(日) 17:14:24
サンプルは間違っているとは言い切れないよ。
宣言と利用の間に、メモリ確保が隠されているかもしれないw

とは言え、2008用のページの方は訂正されているんだからそっちを見ればいい訳で。
ttp://msdn.microsoft.com/ja-jp/library/fxy17zta.aspx

210 :デフォルトの名無しさん:2009/01/18(日) 17:22:43
CTime Curtime = CTime::GetCurrentTime();
tm newtime;
Curtime.GetLocalTm(&newtime);
wsprintf(str,asctime(&newtime));

でできました!
参考書って年代で仕様も変わるけど図書館にはこれしかなくて・・・^^;
なんか疑いにくいんですよね、参考書って
どうもありがとうございました

211 :デフォルトの名無しさん:2009/01/18(日) 17:28:49
本に誤字脱字があるのは珍しいことじゃない

212 :デフォルトの名無しさん:2009/01/18(日) 17:33:05
おかしいと思ったら複数調べるのがいい。

213 :デフォルトの名無しさん:2009/01/18(日) 17:33:41
>>210
その参考書が何か知らんが、MSDNのサンプルをコピペしただけの悪書なんじゃないか?
いみじくも参考書を名乗るのなら、ちゃんと検証されたコードを載せるべきだと思うのだが。

214 :デフォルトの名無しさん:2009/01/18(日) 17:37:35
>>213
えっと・・・
ハーバート・シルト/フランク・クロケット著 「標準講座 MFC6.0」だそうです
結構分厚いからコピペではないと思います
ver間での使用の違いを疑わなかった自分のミスです

215 :デフォルトの名無しさん:2009/01/18(日) 17:40:25
いやこれ仕様の違いじゃなくてもともと間違ってるよ。
でもその本見る限り、コピペじゃなくて同じソースってことみたいね

216 :デフォルトの名無しさん:2009/01/18(日) 17:44:41
ってサンプルソースがダウンロードできるから見てみたけど、

struct tm *newtime;
newtime = curtime.GetLocalTm();

これなら旧仕様で合法だな。


217 :デフォルトの名無しさん:2009/01/18(日) 17:48:03
>>216を2008でコンパイルするとGetLocalTm()に引数がないことからエラーがでました
昔はよかった

218 :デフォルトの名無しさん:2009/01/18(日) 17:50:03
まあそれはMSDNのほうでも、_SECURE_ATLを未定義にすればいいみたいだけどね。

219 :デフォルトの名無しさん:2009/01/18(日) 17:50:40
>いいみたい
→いいと書いてるみたい

220 :デフォルトの名無しさん:2009/01/18(日) 17:56:33
昔は引数にNULL(省略化)を渡すことで、オブジェクト内部のstruct tmの
ポインタを返す仕様だったけど、NULLポインタを渡すのを許可しなくなった
ってことでは?

オブジェクト内部のstruct tmのポインタを取得できると、直接データを
書き換えて隠蔽化の意味がなくなるから。

221 :デフォルトの名無しさん:2009/01/18(日) 18:56:56
元のサンプルと全然違ってるし

222 :デフォルトの名無しさん:2009/01/18(日) 19:33:49
サンプルコードなんて使い方の雰囲気を感じ取るだけのもんで
コピペするもんじゃねぇ。
自分のプログラムに組み込むときは、引数・戻り値の意味と動作を理解し
自分の頭でコードを書くべき。

223 :デフォルトの名無しさん:2009/01/18(日) 20:41:17
サンプルコードをいじくりながら学ぶもんなんじゃねえの?
いじくる前に1回コピペするだろ

224 :デフォルトの名無しさん:2009/01/18(日) 21:26:46
いじくるのは勝手だけど、自分が間違ったのを本のせいにしない。

225 :デフォルトの名無しさん:2009/01/18(日) 22:59:29
>>207
wsprintf()ってワイド文字ではなくTCHARだけど。

226 :デフォルトの名無しさん:2009/01/18(日) 23:02:26
TCHARは_tsprintfみたいな名前だろ?
wprintfはwcharのはず
プリプロセッサで切り替わるだけだし

227 :デフォルトの名無しさん:2009/01/18(日) 23:05:43
wsprintfはWindowsのAPI
wprintfはprintfのワイド文字版

228 :デフォルトの名無しさん:2009/01/19(月) 00:15:16
>>210
手元の2004年初版第6刷発行では>>216のコードになってるな

>>225-227
wsprintf()は環境によってマルチバイトかUNICODEだよね。
>>206のコードだとマルチバイト環境のコードならばcharは間違えというわけではない。

それと
str[strlen(str) - 1] = '\0';
ってのはasctime()が改行文字を付加するからそいつを取っ払うため。

まぁ、あんまりよろしくないコードとは思うけどね。

229 :デフォルトの名無しさん:2009/01/19(月) 00:41:37
wsprintfとwprintfとswprintfは紛らわしすぎる

230 :デフォルトの名無しさん:2009/01/19(月) 05:48:07
処理をCPU使用率30%を上限に制限して実行させるにはどうすればいいんでしょうか?
そんなことは可能なんですか?

231 :デフォルトの名無しさん:2009/01/19(月) 08:47:51
なんでそんなことする必要があるのか疑問。
他のアプリの邪魔をしたくなければ、スレッドの優先順位を低くしとけばいいだけ。

232 :デフォルトの名無しさん:2009/01/19(月) 08:53:15
>>230
25%上限でよければ、簡単だよw

233 :デフォルトの名無しさん:2009/01/19(月) 09:23:00
>>232
Core2Duoですが簡単ですか?

234 :デフォルトの名無しさん:2009/01/19(月) 09:25:08
惜しいな、Core2Duo単体なら上限は50%だ。

235 :デフォルトの名無しさん:2009/01/19(月) 09:31:19
Core2Duo限定のソフトか!

236 :デフォルトの名無しさん:2009/01/19(月) 10:31:14
いえ、Qのほうで

237 :デフォルトの名無しさん:2009/01/19(月) 12:33:52
MFCと関係あるか?

238 :デフォルトの名無しさん:2009/01/19(月) 14:54:00
誰ですか。勝手に話を進めないでくださいw
アプリに重い処理を乗せたくて起動者全員CPU30%とか10%づつシェアするプログラムを組み込みたいんです
制限かけないとずっと自分が使ってなくてもずっと100%で熱暴走が心配なのでCPU10%を提供に制限したいんです。
どうすればいいと思いますか?

239 :デフォルトの名無しさん:2009/01/19(月) 15:36:17
MFCにそういうライブラリが存在しなければスレ違い

240 :デフォルトの名無しさん:2009/01/19(月) 17:17:46
>>238
熱暴走が心配ってどんな環境だよ。
「起動者全員」とか「シェアする」とかサーバーアプリなの?
どうしても心配ならユーザー数に応じてSleepでもさせたら?

241 :デフォルトの名無しさん:2009/01/19(月) 19:23:57
CPU使用率を求める処理でCPUを食うから無意味

242 :デフォルトの名無しさん:2009/01/19(月) 20:09:19
>>241
えっ?

243 :デフォルトの名無しさん:2009/01/19(月) 20:29:40
お前ら >>237 も >>239 も見えないフリか。

244 :デフォルトの名無しさん:2009/01/19(月) 20:50:46
熱暴走については、昔の焼き鳥こさえてたAthlonの時代ならともかく、
今のCPUは温度が上がりすぎると勝手にクロックとか落とすので、特に問題ないな。
CPU利用率については、WindowsServerならプロセスがどれだけフル回転していようと、
一定時間毎に容赦なく他のプロセスに明け渡すから、無難なレスポンスが確保できそうかな、と。

245 :デフォルトの名無しさん:2009/01/20(火) 06:57:04
優先度でいつでも明け渡せるとしても、気分的に窮屈な感じしませんか?
自分の作ったプログラムはいつも全力で走るんですが、CPU見てると常に20%ぐらいでなんかまわってたりするんですが
、タスクマネージャで確認してるだけなんですが、この%って一定時間内のCPU100%使用率ってことなんですか?
そうでないとしたら%制限の方法を教えてください!

246 :デフォルトの名無しさん:2009/01/20(火) 07:08:05
>>240
thx!
今ってCPUというかハードの性能がすごくてほとんどの処理がすぐ終わって待機時間がすごくもったいない気がしたので
そういう部分だけの汎用的なCOMとかで自由に独自のソフトに組み込めたらよくないですか?
10%シェアでも100人いればパソコン10台分ですよね。フリーでそういうのあれば教えてください。
Sleepでどうやるかじっくり考えます。
どうもです

247 :デフォルトの名無しさん:2009/01/20(火) 07:56:11
無駄。つーか、スレ違いだと。
そもそも>234辺りの理屈は判っているのだろうか。

248 :デフォルトの名無しさん:2009/01/20(火) 10:08:04
スレ違いだと何度指摘されても話を続ける奴って何なの?
知的障害者なの?死ぬの?

249 :デフォルトの名無しさん:2009/01/20(火) 18:56:45
ム板は初心者にとってスレチが紛らわしいと思うけどこれはわかるだろ、な?

250 :デフォルトの名無しさん:2009/01/21(水) 08:26:16
どこで聞けばいいんでしょうか?
どうやって実現するかわからないのでターゲットのスレもわからないです。

251 :デフォルトの名無しさん:2009/01/21(水) 09:10:06
>>250
>この板はプログラムを作る人のための板です。
>あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。


252 :デフォルトの名無しさん:2009/01/21(水) 09:38:27
thx

253 :デフォルトの名無しさん:2009/01/22(木) 08:41:42
MDIで一つのDocに複数のViewというのはなんとか判る。今回、
そのViewが一つ1枚とその他10枚が別のViewになる構成ってどうやるのがいいのだろう。
CMultiDocTemplateを11個AddDocTemplateすることになるのだろうか。
その場合、クラスを派生して10個にしておかないと10枚の区別がつかない気がするのだが。

ってことで、これから移動するからレスは夜になるが、誰かヒント頼む。

254 :デフォルトの名無しさん:2009/01/22(木) 09:50:02
Viewクラスだけ異なるDocTemplate作ればよいのではないか?
たしか複数のAddDocTemplateをすると新規作成時にテンプレ選択ダイアログが出るようになるな

255 :デフォルトの名無しさん:2009/01/22(木) 14:10:59
ドキュメントテンプレートはアイコン、メニュー、ツールバーみたいなリソース関係で
ドキュメントごとじゃなくてドキュメントタイプごとに違うリソース使えるようにする

256 :253:2009/01/23(金) 00:42:41
今(帰って)きた。レスTHX。つーか、>253は出掛けとは言え酷いなぁw
結局、一つの必ず必要なViewだけドキュメントテンプレートにして、
他の10枚分は全部そのViewから必要に応じて開くようにしてしまった。
考えてみたら、新規作成ならテンプレート選択ダイアログが開くけど
ファイルオープンだとどうせ最初のテンプレートでしか開かないしね。
それとも選択する手段があるのかな?
# うーむ、今更真面目にMFCの勉強し直すのも面倒だなぁ……

257 :デフォルトの名無しさん:2009/01/23(金) 10:35:20
同時に開く1個+10個が、常に同じファイル数でセットなのか、10個は
中身は異なるが同じクラスのオブジェクトなのか、そこらへんで全く
違ってくると思う。

開くファイルとビュー(ウィンドウ)を全てMDIのDoc-View構造に登録して
管理しなければならないかといえば、決してそうではない。

SDIだけど、ペイントブラシのように、開くのは1個の画像ファイルで、
一部を拡大表示するウィンドウを複数同時に表示できるなどというインター
フェースだって作れる。

例えばMDIベースでVisual Studio相当のアプリケーションを作成すると
して、独立した1個がプロジェクトファイル、残りのN個がプロジェクト
を構成するソース/ヘッダファイルだったとして、ソース/ヘッダファイル
はプロジェクトの一部としてだけでなく単独でも開ける。

プロジェクトの一部として開いたソース/ヘッダファイルは、プロジェクト
に相当するドキュメントクラスで管理することになると思う。ソース/ヘッダ
ファイルを単独で開いた場合、インターフェースに統一性を持たせるため、
一時的に無名のプロジェクトを作成し、それに管理させているような形に
なるのでは?

258 :デフォルトの名無しさん:2009/01/23(金) 11:33:53
CHtmlViewをMDIで使いたいんですが、
このビューを単独でプロジェクトに追加して開くにはどうすればいいですか?
ドキュメントテンプレートでAddにすると、使わないのに.Docも作らなければいけないとおもうんですが。

259 :デフォルトの名無しさん:2009/01/23(金) 13:07:32
>>258
クラスの追加もできない馬鹿は、MFCの参考書でも読んで勉強し直せ

260 :デフォルトの名無しさん:2009/01/23(金) 13:28:44
もとからあるMDIViewにCHtmlViewを張り付けられなくないですか?
ビューを切り替えるだけのときオープンドキュしなきゃいけないので.Docもセットなのが嫌なんですが


261 :デフォルトの名無しさん:2009/01/23(金) 13:50:47
>>260
Viewクラスの使い方ぐらい調べろ、阿呆が

262 :名無し募集中。。。:2009/01/23(金) 14:25:44
使わないDocがあってもいいじゃない
m_pDocTemplate->OpenDocumentFile(NULL) が楽なんじゃないかなぁ

263 :デフォルトの名無しさん:2009/01/23(金) 15:35:09
そんな書き方ができるんですね!ありがとうございます。
>>261
死ね

264 :デフォルトの名無しさん:2009/01/24(土) 10:50:59
viewじゃないコントロールもあるよ

265 :デフォルトの名無しさん:2009/01/24(土) 10:53:01
CDCクラスからウィンドウハンドル(hWnd)って取得できますかね?

266 :デフォルトの名無しさん:2009/01/24(土) 11:33:18
つ CDC::GetWindow

267 :デフォルトの名無しさん:2009/01/24(土) 11:34:22
AfxGetMainWnd()->GetSafeHwnd();

268 :デフォルトの名無しさん:2009/01/28(水) 16:11:14
Visual Studio 2008 SP1にてMFCアプリケーションを作るんだけど、
ダイアログにも"視覚スタイルと色"を反映させたいのですが、
無理でしょうか?

"視覚スタイルと色"を反映させたSDIでも、
ダイアログ(CAboutDlg)だけが浮いたデザインの気がするので、
知ってる方が居られればご教授願いたいです。



269 :デフォルトの名無しさん:2009/01/31(土) 00:02:52
MFCって今後衰退して、.NETがデファクトスタンダードになるんですか?
今更、MFCをやれなんて上長から言われたんだけど、MFCでガリガリ
かけるようになった頃にはVSから姿を消してたら淋しいな

270 :デフォルトの名無しさん:2009/01/31(土) 00:05:27
少なくともMSは、数年前まではそのつもりだったんだろうな

271 :デフォルトの名無しさん:2009/01/31(土) 02:02:34
MFCが消える頃に、やっとガリガリかける程度なら、
消えて当然のプログラマ。

272 :デフォルトの名無しさん:2009/01/31(土) 02:49:03
>>269
触ってみたけど変わんない
俺、ツリーのドラッグアンドドロップが簡単にできるとか
リストの更新関連がうまくできるようになってるとかそういうの期待したけど
結局、全然改善されてないところがアフォだと思った

今ならノウハウや情報がそろってるMFCのがいいよ
.NETは糞面倒臭い上に情報少ない

んでMFCやってから.NET入っても同じところに気を配らないといけないのは
まったく同じなので情報が豊富なMFCから入ったほうがいいと思う

273 :デフォルトの名無しさん:2009/01/31(土) 05:42:34
.NETの方が情報は豊富

274 :デフォルトの名無しさん:2009/01/31(土) 08:47:27
MFCでやってたらいざとなったら素APIに逃げるからな
って.NETでもP/Invokeに逃げたりするか

275 :デフォルトの名無しさん:2009/01/31(土) 16:12:58
時代はVB

276 :デフォルトの名無しさん:2009/01/31(土) 16:18:59
工エエェェ(´д`)ェェエエ工工



277 :デフォルトの名無しさん:2009/02/01(日) 03:21:56
というかC++/CLIで.NETは書きにくい
凄く汚くなる
C++/CLI単体は悪くないと思ってるけど

278 :デフォルトの名無しさん:2009/02/01(日) 03:27:28
.NETを使わないならC++/CLIを使う必要があるのか?

279 :デフォルトの名無しさん:2009/02/01(日) 16:47:36
CWinAppをCWinAppExに変えただけで、400KBから1800KBにexeファイルのサイズが大きくなった
MFCでかくなりすぎワロタ

280 :デフォルトの名無しさん:2009/02/01(日) 17:11:55
さらにリソース追加で3Mバ・イ・ト!

281 :デフォルトの名無しさん:2009/02/01(日) 21:00:50
スタティックリンクしてんのか?
ダイナミックリンクに直せよ

282 :デフォルトの名無しさん:2009/02/01(日) 21:19:17
やだよばか

283 :デフォルトの名無しさん:2009/02/01(日) 21:21:56
別にサイズなんかどうだっていいような気がするけどね
でかいとなんかヤバイの?

284 :デフォルトの名無しさん:2009/02/01(日) 22:22:36
>>283
デカくてなにかいいの?

285 :デフォルトの名無しさん:2009/02/01(日) 22:27:35
>>284
いや、勝手にでかくなるからさ

286 :デフォルトの名無しさん:2009/02/02(月) 07:24:22
>>272
ツリーの(略)とかはWPFではできるよ
ただ、C++/CLIじゃWPF使えないからC++のコードはバッサリ捨てなきゃならないけどね…

287 :デフォルトの名無しさん:2009/02/02(月) 20:33:41
はじめまして。
MFCのコレクションクラスにて質問があります。

MFCのコレクションクラスにCListとCByteArrayってのがあります。
これを使って、たとえば通信電文の様に可変長データをリストに置きたい場合

CList<CByteArray, &CByteArray>と書けば良いのでしょうか?
error C2955: 'CArray' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
ってのが出て、どうしていいかわからないです。

有効な宣言の仕方があれば、教えていただきたいですが・・・・



288 :デフォルトの名無しさん:2009/02/02(月) 21:12:11
>>287
そもそも&の位置が前後逆だな。
直したところでCByteArrayはoperator=の実装が無いからやっぱり駄目だけど。
MFC的には、CList<CByteArray*>って感じにポインタで持つしかないと思う。
これ以上はSTLの出番か?全然詳しくないから答えられないけど。

289 :デフォルトの名無しさん:2009/02/02(月) 22:56:09
C++で扱いやすい新しいフレームワークを作って欲しいのが本音だな
.NETと住み分けて

290 :デフォルトの名無しさん:2009/02/02(月) 23:11:43
WTLはそれなりに使いやすいだろメッセージハンドラもIDE上で追加できるし。
EEでは古いATLになっちゃうのが難だけどMFCじゃ使えないし。
eGUI++は使ったことないから判らないがstd::stringてのが嫌だな。

291 :デフォルトの名無しさん:2009/02/03(火) 08:17:48
>>288
やっぱりSTLで組むしかないのですか・・・
がんばってみたいと思います。

ありがとうございます。

292 :デフォルトの名無しさん:2009/02/03(火) 10:26:48
>>291
CByteArrayの派生クラスを定義して、そいつでoperator =を実装した上で、
CList<CMyByteArray, const &CMyByteArray>とすればいけると思う。


293 :デフォルトの名無しさん:2009/02/03(火) 10:37:34
つーか、STL のコンテナではなく
MFC のコレクションを使うメリットって何だろう。

294 :デフォルトの名無しさん:2009/02/03(火) 16:56:07
STLをリンクしなくて済む

295 :デフォルトの名無しさん:2009/02/03(火) 17:52:53
CObject からの派生していること


296 :デフォルトの名無しさん:2009/02/03(火) 21:35:34
MFCベースならMFCに統一したいっていうのはあるな

297 :デフォルトの名無しさん:2009/02/03(火) 23:03:50
CListCtrlのアイコンモードで
ラベルを複数行表示させる方法教えてください

298 :デフォルトの名無しさん:2009/02/03(火) 23:39:33
エクスプローラと同じだろ

299 :デフォルトの名無しさん:2009/02/03(火) 23:52:35
>>298
ってことは2行までしか表示できないって事?
省略されずに複数行を表示はだめか・・・

300 :デフォルトの名無しさん:2009/02/04(水) 03:09:18
>>293
デバッグ実行時にアサート出してくれる、とかMFC例外クラスのスローとか
ただ統一しないとめっちゃ不便

301 :デフォルトの名無しさん:2009/02/04(水) 09:21:26
>>297
ラベルってヘッダコントロールのテキストのこと?

302 :デフォルトの名無しさん:2009/02/04(水) 09:26:35
アイコンモードにヘッダコントロールはない!

303 :デフォルトの名無しさん:2009/02/04(水) 13:27:48
アイコンラベルのワードラップかな?

304 :デフォルトの名無しさん:2009/02/04(水) 20:35:39
今までEXEで作ってたのを、DLL化しようとしたけど
プロジェクト作り直すのに凄い苦労する。
なんかいい方法あるかね?

305 :デフォルトの名無しさん:2009/02/04(水) 21:38:23
aaa

306 :デフォルトの名無しさん:2009/02/04(水) 22:24:36
>>304
数個なら手で
たくさんあるならPowerShellスクリプトで設定を置換

307 :デフォルトの名無しさん:2009/02/04(水) 23:26:08
>>301
>>303
エクスプローラで言うとファイル名が表示されている部分です
そこに複数行の文字を表示したいと思っています
char sz[] = "AAAAAAAAAAA\nBBBBBBBBBBB\nCCCCCC\nDDDD\nEEEEE"
みたいな感じ、実際表示されるのは
AAAAAAAAAAA
BBBBBBBBBBBCCCCCC...
と表示されてしまっています
アイコンを選択するとちゃんと意図した改行位置で表示されるけど
選択していない状態でも全部ちゃんと表示したいです

308 :名無し募集中。。。:2009/02/05(木) 00:15:42
\nじゃなくて\015\012にして試してみて
と思ったけど、エクスプローラーでもファイル名が省略される場合があるから
自分で実装するしかないんじゃないかな

309 :デフォルトの名無しさん:2009/02/05(木) 08:16:03
>>307
アイコン間隔を変える事である程度は回避できるかもしれないが、複数行で
無制限に表示すると、左右両側のアイコンのラベルや、下側のアイコンに
テキストがかぶる。

しかも、自動改行せず、1行の文字数(ラベル領域の横幅)や行数(ラベル領域
の高さ)を無制限にすると、ラベル領域が重なるのは隣接するアイコンだけ
では済まなくなる。

表示上はそれでも済むけど、常にそういう状態で表示すると、任意のアイ
コンやラベルをマウスでクリックできなくなるから、非選択時は省略表示
するというユーザインターフェースになっているんだと思う。

CViewやCScrollViewなりから、仕様を満足する派生クラスを自分で作る
しかないね。

310 :デフォルトの名無しさん:2009/02/05(木) 18:49:10
2008のSP1入れてる人居たら教えてください。
SP1で初めてプログラム始めたのでSP1関係ないかもしれませんが、
テンプレートで作ったドッキングウィンドウの中にあるツールバーのボタンをコンボボックスに変えた後その中のエディット部分の文字列を
取り出すにはどうすればいいんでしょうか?

.h
CMFCToolBarComboBoxButton* m_ComboButton;

.cpp
// OnCreate
m_ComboButton = new CMFCToolBarComboBoxButton(ID_EDIT, GetCmdMgr()->GetCmdImage(ID_EDIT), CBS_DROPDOWN);
m_ToolBar.ReplaceButton(ID_BTN, *m_ComboButton);

// OnButtonClick
CString a;
a = m_ComboButton->GetText();

ヘルプにある手順と、サンプルも見て書きました。ボタンは置き換わるんですが、aが空なんです。GetEditからGetWindowなどもいろいろやりました
どうしても文字列を取得できません。お願いします!

311 :デフォルトの名無しさん:2009/02/05(木) 19:10:33
>>310
サンプルのだけど
CMFCToolBarComboBoxButton* pSrcCombo = NULL;
CObList listButtons;
if (CMFCToolBar::GetCommandButtons(ID_DUMMY_SELECT_ACTIVE_CONFIGURATION, listButtons) > 0)
{
for (POSITION posCombo = listButtons.GetHeadPosition(); pSrcCombo == NULL && posCombo != NULL;)
{
CMFCToolBarComboBoxButton* pCombo = DYNAMIC_DOWNCAST(CMFCToolBarComboBoxButton, listButtons.GetNext(posCombo));

if (pCombo != NULL && CMFCToolBar::IsLastCommandFromButton(pCombo))
{
pSrcCombo = pCombo;
}
}
}
if (pSrcCombo != NULL)
{
ASSERT_VALID(pSrcCombo);

LPCTSTR lpszSelItem = pSrcCombo->GetItem();
CString strSelItem = (lpszSelItem == NULL) ? _T("") : lpszSelItem;
AfxMessageBox(strSelItem);
}
else
{
AfxMessageBox(_T("Show \"Set Active Configuration\" dialog...."));
}
}

312 :デフォルトの名無しさん:2009/02/05(木) 21:14:49
調べてくれてありがとう。
一度LPCTSTRで取得してからCStringにしてみましたがだめでした。
コンボボックスのポインタのとり方もサンプルのように取得しましたが、だめでした。
CMFCToolBarComboBoxButtonのヘルプでGetTextは編集用のエディットのテキストを返すとあるのに
これで返ってこないのがつらいです。
MFCの常識から考えて何か根本的なところのアドバイスをお願いします!
他にツールバーに並んでるボタンはボタンのメンバで無効とかにできるので、ツールバー上のアイテムの取得は出来てると思うんです。


313 :デフォルトの名無しさん:2009/02/05(木) 21:27:43
>>312
アドバイスでいいのか。
ちゃんとドキュメントを読んで勉強しろ。
理解力があれば解決できるだろ。

314 :デフォルトの名無しさん:2009/02/05(木) 22:01:29
GetWindowTextを使えば?

315 :デフォルトの名無しさん:2009/02/05(木) 22:16:45
それもやったんですが、空でした。


316 :デフォルトの名無しさん:2009/02/05(木) 22:20:12
>>311のやり方でポインタを取得したら
GetEditCtrl()->GetWindowText
で取得できる。


317 :デフォルトの名無しさん:2009/02/05(木) 22:31:50
だめです。
pSrcCombo != NULL のelseの方に飛びます。
もうべた貼りしましたがだめでした。

キーでボックスに入力したあとそれを更新してメンバ変数に入れなくてはいけないんでしょうか?
GetText()の戻値がプロテクト変数を返すだけになっていたのですが、どこで入るのかがたどれません


318 :デフォルトの名無しさん:2009/02/05(木) 22:43:20
CMFCToolBar::IsLastCommandFromButton(pCombo)
を抜いたらいけるだろ?

319 :デフォルトの名無しさん:2009/02/05(木) 22:47:01
みんなSP1も結構すらすら分かってるんだな
俺は来月から久々にMFCの仕事やりそうだから、VC6レベルでさえかなり不安だ

320 :デフォルトの名無しさん:2009/02/05(木) 23:17:42
だめでした。
ID_DUMMY_SELECT_ACTIVE_CONFIGURATION
をID_EDITにすると
TRUEには飛びますが、
lpszSelItemが無効なポインタになります。

置き換えたボタンのポインタを取得するだけならGetButton(index)を使って
CMFCToolBarComboboxButton* m_box = (CMFCToolBarComboboxButton*)m_toolbar.GetButton(index);
CString str = m_box.GetItem();
これはどこが問題あるんでしょうか?

あと頻繁に出るんですが、ブレークポイントで、現在の設定ではヒットしません。このドキュメントのシンボルが読み込まれていません。
と出て、右クリで場所の許可で対応してるんですが、これなんですか?関係ありますか?

321 :デフォルトの名無しさん:2009/02/05(木) 23:24:30
もしかしてリリースビルドじゃないのか?それだとデバッグの変数モニタは出鱈目になるぞ

322 :デフォルトの名無しさん:2009/02/05(木) 23:29:37
リリースじゃないです。ncb消しとかクリーンも頻繁にやってるんですが、
なんどもここ挫折して後回しにして2か月ぐらいチャレンジしてるんですが、今だにTextが取得できません
取得できると教えてもらえただけでもありがとうです。なにか設定か、全然違うところが原因な気がしてきました。

323 :デフォルトの名無しさん:2009/02/05(木) 23:30:19
ちょっと説明が悪かったかもしれないけど、
>>311はドロップダウンリストの場合に、リストを変更した時に取得する方法。

任意のタイミングで取得する場合は、
任意なので「CMFCToolBar::IsLastCommandFromButton(pCombo)」は要らない。
よって、TRUEに飛んだら
pSrcCombo->GetEditCtrl()->GetWindowText
で取得する。


324 :デフォルトの名無しさん:2009/02/05(木) 23:41:33
>>308
>>309
ありがとう
時間的に厳しそうなのであきらめます
無制限に全部教示でなくても指定した行数だけは表示してくれるようになってると良かったなぁ
改行位置が結構重要なので省略された行は改行が無視されるのが痛いかった

325 :デフォルトの名無しさん:2009/02/05(木) 23:49:59
>>323
おーできました!ありがとうございました。感動しました。
調べてもらってすいませんでした。じっくり解析します
ありがとうございました!!!


326 :デフォルトの名無しさん:2009/02/06(金) 20:12:38
同僚に「CMutex, CEvent, CSemaphoreは欠陥がある」と主張してる人がいるんですが、本当でしょうか?
ググっても見付かったのは↓くらいで、裏付けに乏しいように思えるのですが。
ttp://www.flounder.com/avoid_mfc_syncrhonization.htm

327 :デフォルトの名無しさん:2009/02/06(金) 22:50:36
>>326
確かにそのページの主張には同意しかねるね。
CMutexについてはタイムアウトを特別視する用途以外(所有権が取得できたかどうかだけを知りたい場合)なら問題なさそうだし。
CSingleLockの再帰呼び出しはそもそも想定外の使い方だと思う。
CreateMutexの記述には待機関数を同じスレッドで繰り返し呼び出してもいいけど、
待機条件を満たす毎にReleaseMutexを呼べと書いてある。


328 :デフォルトの名無しさん:2009/02/06(金) 23:00:10
再帰でデッドロックするのは当たり前だろうと

329 :326:2009/02/07(土) 23:58:47
>327-328
ありがとうございます。
やはり欠陥と言うほどではないようですね。

330 :デフォルトの名無しさん:2009/02/08(日) 10:00:58
MDIでファイルを起動時に読み込むとき、pDocTemplate->OpenDocumentFileみたいな
ことをしますが、initInstance意外の場所でするときにpDocTemplate->OpenDocumentFile
を使うとき、newとかあたりをどうやってコーディングすればいいか分からないのですが
教えてください。


331 :デフォルトの名無しさん:2009/02/08(日) 10:58:25
素直に CxxxApp::OpenDocumentFile() を使え

332 :デフォルトの名無しさん:2009/02/08(日) 16:14:22
DrawTextで文字の背景を塗りつぶすのってどうやるんですか?
DT_NOCLIPだけで出来てるところもあるのでDT_NOCLIPを付けたんですが白で塗りつぶされてしまいます。
色を指定しなくてもいいんですが、文字ボックスが出来ないようにしたいんです

333 :デフォルトの名無しさん:2009/02/08(日) 16:30:44
CDC::SetBkMode() で OPAQUE 指定かな?
色はCDC::SetTextColor()
文字ボックスってなんだっけ。

334 :デフォルトの名無しさん:2009/02/08(日) 16:31:16
// CDC::DrawText
// このメンバ関数は、テキストを描画するために、デバイス コンテキストに現在選択されているフォント、テキストの色、背景色を使います。

ちゃんとマニュアル読めよ。

CDC::SetBkColor
CDC::SetBkMode

335 :デフォルトの名無しさん:2009/02/08(日) 16:32:33
ああ、背景の色だったな、すまん

336 :デフォルトの名無しさん:2009/02/08(日) 16:50:07
そうだったBKだった思い出した
Brushだと思い込んでた
thx


337 :デフォルトの名無しさん:2009/02/08(日) 18:13:27
ウィンドウの関係がわかりません。
CStaticのなかにCStaticを作った時
中のCStaticにクリックメッセージを送るには,Zオーダーをどうしようが外から中にメッセージを素通りさせるコードを書かない限り
届かないんでしょうか?
塗りつぶしの順序とか考えてたらわけわからなくなって来たんですが、
どうすれば整理できて自由に子、孫などにメッセージが届くようになりますか?

338 :デフォルトの名無しさん:2009/02/08(日) 18:32:58
SS_NOTIFY

339 :デフォルトの名無しさん:2009/02/08(日) 18:37:01
スタティックは特別だったんですね。なんで他のと出来たりできなかったりとわけわかんなかったんです
ありがとうございました

340 :デフォルトの名無しさん:2009/02/08(日) 19:03:40
特別というか「スタティック」なんだから、本来はそういう動的な目的では使わない。
スタティック=静的。


341 :デフォルトの名無しさん:2009/02/08(日) 19:08:47
CWndだとパラメータとかが複雑じゃないですか
だからなんか作る時はCStaticを基本にしてるんですが、もっといいのあるんですか?

342 :デフォルトの名無しさん:2009/02/08(日) 21:10:47
状況がよくわからない。
パラメータが複雑で嫌気がさすほど、メインウィンドウにいくつものウィンドウがあるのか?

343 :デフォルトの名無しさん:2009/02/08(日) 21:14:09
スタティックコントロールもウインドウには変わりないだろ
いらないメッセージが発生しないようにデフォルトで殺してるだけで、
デフォルト以外がアブノーマルな使い方とは思わないな

344 :デフォルトの名無しさん:2009/02/08(日) 21:15:02
カスタムコントロールとかは?

345 :名無し募集中。。。:2009/02/08(日) 22:40:54
スタティックコントロールにIDを振れば良いじゃない

346 :デフォルトの名無しさん:2009/02/08(日) 22:52:27
MFCってなんで、.NETみたいにポトペタ環境にしないの?
コントロールも.NETの1/10位しかないし・・・

347 :デフォルトの名無しさん:2009/02/08(日) 23:17:34
>コントロールも.NETの1/10位しかないし・・・

kwsk

348 :デフォルトの名無しさん:2009/02/09(月) 00:35:50
>>346
.netってツリーのドラッグアンドドロップとか
リストコントロールのウィンドウ枠の固定機能とかって楽にできるようになってる?
結構、客から要望くる機能で毎回作らないといけないんだけど・・・

349 :デフォルトの名無しさん:2009/02/09(月) 00:52:03
ウィンドウ枠の固定ってなんだ?
コンテナに貼り付けてDock指定するやつのことかな?

350 :デフォルトの名無しさん:2009/02/09(月) 01:03:02
>>349
エクセルを開くんだ

351 :デフォルトの名無しさん:2009/02/09(月) 05:58:17
SS_NOTIFYでCStaticの子どもにメッセージが届くようになりましたが
今度は子がある部分をクリックしたとき親のクリックが実行されなくなりました。
クリックした場所にある特定の全ウィンドウにクリックを送るにはどうすればいいんでしょうか

352 :デフォルトの名無しさん:2009/02/09(月) 07:24:24
MFCはAPIをラップしたようなコントロールしかないんだよな

353 :デフォルトの名無しさん:2009/02/09(月) 10:00:45
まぁそこから派生クラス作るわけだね 自作コントロール作るにはもってこいだ


354 :デフォルトの名無しさん:2009/02/09(月) 10:17:48
>子がある部分をクリックしたとき親のクリックが実行されなくなりました
親は「クリックされていない」からな。

クリックされた座標を含むウィンドウを列挙して、それらのウィンドウすべてにメッセージを送る関数を
自前で作るしかあるまい。

355 :デフォルトの名無しさん:2009/02/09(月) 14:24:33
CMFCMenuBar を使うと、例えば ファイル(F) とかの F の下にラインが引かれないんだけど、
これはどうすれば直る? 

TBSTYLE_NOPREFIX はつけていないんだけど・・・。

356 :デフォルトの名無しさん:2009/02/09(月) 16:01:07
>>355
当然、文字列は「ファイル(&F) 」ってやってるんだよな?

ところで、プルダウンメニューはCMenuだと思うけど、CMenuBarを使ってる
ということは、ツールバーのボタンのキャプションでアンダーバーが表示
されないってこと?

そもそもツールバーやダイアログバーに、そんな機能あったっけ?


357 :デフォルトの名無しさん:2009/02/09(月) 17:38:09
>>355
MFC内部で&を消して描画してるから無理。
&&Fとか&&&Fって書けば表示はされるけどAlt+Fに反応しなくなるからやはり無理。
フューチャーパックは問題だらけだから諦めろ。

358 :デフォルトの名無しさん:2009/02/09(月) 17:40:08
>当然、文字列は「ファイル(&F) 」ってやってるんだよな?
もちろん。

たとえば IE7 のメニューバー。あれもツールバーじゃん。そこにはアンダーバーがついてる。
他のアプリケーションでも同じ。
だけどCMFCMenuBar を使うと付かない。
Visual C++ 2008 Feature Pack のサンプル見ても付いてないんで仕様なのかなという気もするんだが、
何か見落としているよーな気もしてしっくりこないんだわ・・・。

359 :デフォルトの名無しさん:2009/02/09(月) 17:41:58
おっと、書いているうちに書き込みが。

>>357
やっぱ仕様ということね。ふむ。

360 :デフォルトの名無しさん:2009/02/09(月) 17:45:34
Feature Packなんてあるの初めて知ったわ まだベータ版なのか
でもおれのVSは2005(´・ω・`)

361 :デフォルトの名無しさん:2009/02/09(月) 17:47:25
と思ったら今はリリースverなのね、スマソ

362 :デフォルトの名無しさん:2009/02/09(月) 17:48:00
いやもうSP1に組み込まれてる。

363 :デフォルトの名無しさん:2009/02/09(月) 20:19:08
C++0x よりも 2008 SP1 のバグフィックスに力を入れて欲しいよな
バグがあるうちは業務で使えない

364 :デフォルトの名無しさん:2009/02/10(火) 18:54:11
Feature PackでCDialogBarって表示される?

俺だけなんかな?

365 :デフォルトの名無しさん:2009/02/10(火) 19:04:27
CPaneDialogを使えば CMFCxxxBar と連携できるのでは?

366 :364:2009/02/10(火) 19:31:47
>>365
CPaneDialogのCreateメンバで、IDを指定するのね。


おぉぉーできたwww

サンクスコ

367 :デフォルトの名無しさん:2009/02/11(水) 20:44:07
MDIでexeのアイコンにドラッグ&ドロップをするとファイルが開けるようにしたいのですが、
CString drag_file(m_lpCmdLine);
if (drag_file != _T("")) {
pDocTemplate->OpenDocumentFile(drag_file);
}
ではファイルが見つからないというメッセージボックスが出てうまくいきません。
MessageBox(drag_file);として見ても、ちゃんとドラッグしたファイルパスが拾えてるのですが・・・
どうすればイイですか?


368 :デフォルトの名無しさん:2009/02/11(水) 20:47:54
ちゃんと引数飛んできてるか?

369 :デフォルトの名無しさん:2009/02/11(水) 21:03:37
MessageBox(drag_file);で見えるのできてるハズですが・・・。

370 :デフォルトの名無しさん:2009/02/11(水) 21:21:37
デバッグのパラメータにパスを入れたら起動してますます理解に苦しんでいるのですが、
Unicodeで開発しているのですが、文字コードのせいとかありますか?

371 :デフォルトの名無しさん:2009/02/11(水) 21:46:47
MessageBoxじゃなくてデバッガでデバッグしろ

372 :デフォルトの名無しさん:2009/02/11(水) 21:49:21
>>367
CString drag_file;
drag_file.Format( _T("\"%s\""), m_lpCmdLine);
// To Do...


373 :デフォルトの名無しさん:2009/02/16(月) 21:37:19
すんません質問です。
VC2005で、CRichEditCtrlをもったダイアログベースのアプリを作っております。
CRichEditCtrlにShift_JISにないような文字(「もげる」を変換したらでる漢字とか)を
入れて、GetWindowTextWでその文字をCStringに取り込むと、その文字が?になって
しまいます。これを回避する方法はありませんでしょうか?

374 :デフォルトの名無しさん:2009/02/16(月) 22:20:44
CStringが実はCStringAでした、ってオチは嫌だなあ。
昔と違って、今は簡単にMBCS/Unicode変換しちゃうからなあ。

375 :373:2009/02/16(月) 22:47:35
http://soudan1.biglobe.ne.jp/qa4140782.html
↑で解決しました。お騒がせして申し訳ありません。

376 :デフォルトの名無しさん:2009/02/17(火) 00:33:49
リソーススクリプト上だと、常に"RichEdit20A"で固定なのが大元の原因か。
なるほどなあ。

377 :デフォルトの名無しさん:2009/02/17(火) 21:49:00
う〜ん、serialize中にファイルが壊れている事に気づき、
子ウィンドウを開くのをやめたい場合ってどうしてます?

378 :デフォルトの名無しさん:2009/02/17(火) 23:26:50
気づいたのなら開かなきゃ良い。
子ウィンドウとは何物?

379 :デフォルトの名無しさん:2009/02/18(水) 07:47:41
MDIのことか?

380 :デフォルトの名無しさん:2009/02/26(木) 00:55:42
メインウィンドウから起動するダイアログにラジオボタンを設置しました。
起動時に選択されているラジオボタンを(動的に)変更したいのですが、やり方がわかりません。

ダイアログのコンストラクタ中でSetCheckをしても、
コンパイルは通るのですが、デバック中に「Debug Assertion Failed!」
と落ちます。(まだ実体ができてない?)


381 :デフォルトの名無しさん:2009/02/26(木) 01:37:19
つ oninitdialog()

最近MFCやってないからあやふやだ・・・
来週からまた使うことになりそうだからリハビリせねば

382 :デフォルトの名無しさん:2009/02/26(木) 01:53:11
>>381

thx!できました。オーバーライドするのね。

↓参考にしました
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200504/05040016.txt

383 :デフォルトの名無しさん:2009/02/28(土) 12:26:30
>>382
既に見ていないかもしれないが ...

ダイアログ派生クラスに、ラジオボタンに対応するint型のメンバ変数を
割り当てて、DoDataExchange()内でDDX_Radio(pDX,...)でコントロール
に関連付けておけば、ダイアログウィンドウが生成されていないタイミ
ングでも、クラスのオブジェクトが生成された時点で、メンバ変数には
アクセスできるので、メンバ変数の初期値を変更してDoModal()すれば、
ラジオボタンの初期値を変更できるよ。

クラスウィザードでメンバ変数を割り当てると、コンストラクタで「-1」に
初期化されるコードが自動生成されるので、これを0〜の値にすればいい。

384 :デフォルトの名無しさん:2009/02/28(土) 19:36:04
>クラスウィザードでメンバ変数を割り当てると、コンストラクタで「-1」に
>初期化されるコードが自動生成されるので、これを0〜の値にすればいい。
VS2008 だと初期値は 0。修正されたのかな。

ちなみに、変数のカテゴリには Value を選ぶこと。

385 :デフォルトの名無しさん:2009/03/02(月) 10:18:58
MSDNのScribbleサンプルなんかを見ると、
リスト(m_strokeList)や配列(m_pointArray)などのメンバは堂々とpublicで、
描画時などは外から直接参照したり操作してるけど、
これってやはり手を抜いているだけでしょうか?
それとも、この程度のものはいちいちカプセル化しないものなのでしょうか?

386 :デフォルトの名無しさん:2009/03/02(月) 10:44:12
Scribbleサンプルって15年くらい前からあるよな・・・

387 :デフォルトの名無しさん:2009/03/02(月) 11:48:51
>>385
クラスウィザードでメンバ変数を作ると、意識して設定しない限り public になる。

388 :デフォルトの名無しさん:2009/03/02(月) 12:00:41
MSのサンプルは「動けばまだマシな方」くらいに思っとかないと。

389 :デフォルトの名無しさん:2009/03/02(月) 20:03:47
CPaneDialog型って、リサイズをさせたくない場合どうすればいいんでしょ?
知っておられる方、情報をお願いします。

390 :デフォルトの名無しさん:2009/03/02(月) 20:31:33
CBasePane::CanBeResized をオーバーライドして FALSE を返す

391 :デフォルトの名無しさん:2009/03/02(月) 20:32:21
「このメソッドは現在実装されていません。」だった。すまん

392 :デフォルトの名無しさん:2009/03/02(月) 20:34:25
実装すればいんだから、それでいい

393 :389:2009/03/03(火) 09:10:56
>>390-392
Visual Studio 2008のIDEでは、
派生元へのオーバーライドができないのね・・・手書きなのか・・・

できました!
ありがとうございます!

394 :デフォルトの名無しさん:2009/03/03(火) 14:23:17
むみません。
ダイアログ上でレイアウトされたグループボックスにて、
文字色をで変更しようとSetTextColorを使ったのですが、
反映されませんでした。

何かコツみたいなものがあるのでしょうか?

ちなみに環境はVS2008でMFC Feature Packを使っています。

395 :デフォルトの名無しさん:2009/03/03(火) 14:56:00
むみません。

396 :デフォルトの名無しさん:2009/03/03(火) 17:47:13
>>394
CWnd::OnCtlColor

397 :デフォルトの名無しさん:2009/03/07(土) 17:37:02
VC++ 6 でプログラミングしています。
ポップアップメニューを表示しています。
各行で文字位置を合わせたいので固定ピッチのフォント
を利用したいのですが、ポップアップメニューのフォント
はどのようにすれば変更できますか?

ポップアップメニュー作成は、TrackPopupMenuを使っています。

398 :デフォルトの名無しさん:2009/03/07(土) 17:53:49
>>397
OwnerDraw Menu にする

399 :デフォルトの名無しさん:2009/03/07(土) 21:48:22
ちと古いけど>>129の件、おれも悩んでたんで調べた結果を貼っとく。

afxGlobalData.SetMenuFontで設定するといいらしい。
他にもafxGlobalDataをいじるといろいろできるけど、
これ直接いじっていいんかな?

400 :デフォルトの名無しさん:2009/03/07(土) 22:37:04
それをいじる関数として、CMFCMenuBar::SetMenuFont() が用意されているんだが。

401 :デフォルトの名無しさん:2009/03/07(土) 23:27:13
あれ、CMFCMenuBarのヘルプを見てもFont関係が見あたらなかったから
MFCのソースを追っかけたのに・・・・

思いっきり見落としたらしい。

402 :デフォルトの名無しさん:2009/03/08(日) 00:56:41
ついでに言っておくと、WM_SETTINGCHANGE が飛んでくると
CMFCMenuBar::SetMenuFont() した内容はクリアされるから、再度設定しなおすこと。:-)

403 : ◆8x8z91r9YM :2009/03/09(月) 21:08:28
質問です。
VS2005 MFCでCrystalReport(PUSH型)を扱ってる
参考になりそうなサイトをご存知の方おられましたら
教えていただけませんでしょうか?

C#やVBなどは表示したいデータをDataSetでまとめて
Crystalreportに渡して表示できますが、
それをMFCでどのように実装すればいいのか悩んでおります。。
よろしくお願い致します。


404 :デフォルトの名無しさん:2009/03/11(水) 00:51:10
VS2008SP1のCMFCToolbarで、初期状態からアイコンの右側にテキストラベルを表示する方法は無いでしょうか。
ToolbarResetを発行してやると、文字は表示されるにはされるんですが、
カスタマイズ設定も消えてしまうので・・・

405 :デフォルトの名無しさん:2009/03/11(水) 02:04:50
横に表示できたっけ?
CMFCToolBar::EnableTextLabels() だと下に表示だよな。

CMFCToolBar::GetButton( nIndex)->m_bText = TRUE; あたりで試してみ。

406 :デフォルトの名無しさん:2009/03/11(水) 06:25:28
VS2005 WinInet で http Postを使ってファイルアップロードをするプログラムを書いているのですが
うまくいきません。 ソース 80行程度をアップしてアドバイスを頂いてもよろしいでしょうか?

1週間ぐらい頑張りましたが分からなかったもので・・・。

407 :デフォルトの名無しさん:2009/03/11(水) 08:02:46
それのどこがMFC?

408 :デフォルトの名無しさん:2009/03/11(水) 09:28:21
質問部分にCInternetSession等のMFCクラスを使ってれば質問は可
ただ「うまくいきません」としか説明できないんじゃ答えるつもりはない。

409 :デフォルトの名無しさん:2009/03/11(水) 10:47:21
406です。スレ汚し失礼します。

状態としてはデバッガ出力ではエラーは帰ってきていませんが
スニファツールで見ると サーバから501エラーが帰ってきています。
サーバ側のPHPテストプログラムの方は $_FILES["upfile"]["tmp_name"]
にも $_FILES['userfile']['error']にも 値が入ってきません。

多分ヘッダの送り方、設定の仕方がおかしいと思うのですが。。。

ソースは以下になります。

410 :デフォルトの名無しさん:2009/03/11(水) 10:49:25
80行貼るのかよ
ろだ使っては

411 :デフォルトの名無しさん:2009/03/11(水) 10:49:28
#define APP_NAME "PostTool"
#define BOUNDARY "hogehoge"
#define POST_FILE "C:\\TEST.DAT"
#define BUF_SIZE 2048

bool PostData(TCHAR* uri){
bool bRtn = false;
try
{
DWORD dwServiceType = 0, statusCode;
CString strServer, strObject, strBuf, strBoundary = TEXT(BOUNDARY);
INTERNET_PORT nPort;
char szBuf[BUF_SIZE + 1];

if (AfxParseURL(uri, dwServiceType, strServer, strObject, nPort) == false)
{OutputDebugString(TEXT("PostData() AfxParseURL失敗\n")); goto pd_End;}

CInternetSession session(TEXT(APP_NAME));
CHttpConnection* conn = session.GetHttpConnection(strServer,
CHttpConnection::HTTP_VERB_POST, nPort, NULL, NULL);

CHttpFile* file = conn->OpenRequest(CHttpConnection::HTTP_VERB_POST,
strObject, NULL, 1, NULL, NULL,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);

412 :デフォルトの名無しさん:2009/03/11(水) 10:59:43
すいません あっぷろだに置きました。
411の投稿すいませんでした。

ttp://www7.uploader.jp/dl/game/game_uljp00007.txt.html

413 :デフォルトの名無しさん:2009/03/11(水) 11:04:14
http://support.microsoft.com/kb/811262/ja
エラー メッセージ : エラー 501/505 - 未実装または未サポート

[HTTP 1.1 を使用する] チェック ボックスをクリックしてオフにし、[OK] をクリックします。
テストして問題が解決したかどうかを調べます。

2002 年 12 月現在、HTTP 1.1 は新しい Internet プロトコルです。
一部の Web サイトでは HTTP 1.0 が使用されているため、HTTP 1.1 を使用した場合、
接続の問題が発生することがあります。


414 :デフォルトの名無しさん:2009/03/11(水) 11:44:28
こういう場合
プログラムに問題がある
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある

みたいにありとあらゆる原因が考えられるわけだけど
いきなりプログラムのソース見ろと言われても
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある
だったら見るだけ無駄だろ

415 :デフォルトの名無しさん:2009/03/11(水) 11:49:36
サーバ側のhttpdのログ見たらわかると思うよ

416 :デフォルトの名無しさん:2009/03/11(水) 14:01:28
こういった感じでソース書いている人って多いのか?

・グローバル関数だし、
・コメントないし、
・goto ラベル使い放題だし、
・for(;;)だし・・・ (while() 使えよ)

417 :デフォルトの名無しさん:2009/03/11(水) 14:15:34
別に習作なんだし
そういう関係ないところつっこむからソース出したがらない質問者が増える

418 :デフォルトの名無しさん:2009/03/11(水) 17:29:12
Httpは手順が多くてネストが深くなるしエラー処理も多いからどうやっても汚くなる
手抜きしないできれいに書いてあるサンプルあったら見てみたい

419 :デフォルトの名無しさん:2009/03/11(水) 17:32:03
>>416
> ・グローバル関数だし、
> ・コメントないし、

コミュニケーション能力重視とか、ヒューマンスキル重視の現場では、
ありがちだ。 業務で引き継ぐと悲惨なパターン。

しかも極端な場合、グローバル変数の名前が「i」なんて場合もある。

> ・for(;;)だし・・・ (while() 使えよ)

個人的には「while(1)」の方が好みだけど、「for(;;)」の方が推奨
されているらしい。

しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
はやめてほしい。

420 :デフォルトの名無しさん:2009/03/11(水) 22:46:05
>>419
>しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
そりゃ無茶や。
全く脱出しないループで外部から殺してもらうってことなら兎も角、
ループ内の何かの事象で脱出したくなることくらいあるだろよ。

421 :デフォルトの名無しさん:2009/03/11(水) 22:52:57
>>416
while(1)はMS-C V6がwarning吐いてたから、おれはfor(;;)使うよ。

>>420
そういう場合forに脱出条件を入れろという説がある。
おれは基本的に嫌いだけどね。


422 :デフォルトの名無しさん:2009/03/11(水) 23:05:32
for (;;) {
...;
someStatus = someFunction();
if (someStatus) break;

...;
...;
}
--
よくありがちなこんなコードを否定するのかな?

423 :デフォルトの名無しさん:2009/03/11(水) 23:25:55
someStatus が いつか必ず TRUE になるという保証があるなら、かまわんのでは。

無限ループの可能性を残すコードを、おれ個人は書かないけど。

424 :デフォルトの名無しさん:2009/03/11(水) 23:30:58
for (;;)の正しい使い方が良くわからないからMFCのソースの中探してみたけど
やっぱfor (;;)とbreakはセットで使ってるね

以下VC6のMFC
SRC\AFXMEM.CPP(322): for (;;)
SRC\AFXMEM.CPP(371): for (;;)
SRC\APPUI1.CPP(172): for (;;)
SRC\ARCCORE.CPP(816): for (;;)


425 :デフォルトの名無しさん:2009/03/11(水) 23:35:02
下らない疑問かもしれませんが質問させてください。
MFCでコントローラに追加した文字列のメモリ管理ってどうなってるんでしょうか?

例えば、以下のような場合、FuncA()関数を抜けたときに
strのアドレス先のメモリが解放されて、コンボボックスで
strの文字列が参照できなくならないのでしょうか?
試したところ問題ないようですが、不思議です。

void FuncA() {
CString str;
m_pCmbBox->AddString(str); //メンバ変数であるコンボボックスに文字列追加
}

426 :デフォルトの名無しさん:2009/03/11(水) 23:45:01
コントロールが別のところでメモリを割り当ててるのさ。メモリの割り当てに失敗したら
CBN_ERRSPACE が通知されてくる。

これはMFCの質問じゃないな。

427 :デフォルトの名無しさん:2009/03/11(水) 23:50:26
>>426
すみません、もう一歩だけお願いします。
調べるなら、C++のメモリ管理で調べればいいでしょうか?

428 :デフォルトの名無しさん:2009/03/11(水) 23:51:14
フォントなんかが参照不能になるのは
描画のタイミングが関数抜けた後だから
文字列は渡し終わってるから問題なし

429 :デフォルトの名無しさん:2009/03/12(木) 00:10:04
>>426, 428
まとめるとこうでしょうか。
・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。
・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし
 ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能

コントローラのメモリ管理について調べてみます。
ありがとうございました。

430 :デフォルトの名無しさん:2009/03/12(木) 00:18:04
どうでもいいけど「コントローラ」ってなんだよ。
controllerじゃなくてcontrolだぞ。

431 :デフォルトの名無しさん:2009/03/12(木) 00:28:17
>>430
訂正thx。気をつけますw

432 :デフォルトの名無しさん:2009/03/12(木) 00:44:32
>ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
これは単にスコープの問題

433 :デフォルトの名無しさん:2009/03/12(木) 10:43:00
スコープの問題じゃなくて、寿命の問題。
スコープが外れても寿命が続くのなら大丈夫。
だから例えば、staticでも(一代限りは)使える。

434 :デフォルトの名無しさん:2009/03/12(木) 20:06:01
フォントって、CFontクラスやCBrushクラス等のGDIオブジェクトをローカル
変数で作成したなら、関数を抜けた時点で変数の寿命が尽き、DeleteObject()
を呼んでいなくてもデストラクタから(メンバ変数のm_hObjectを使って)強制
的にDeleteObject()が呼び出され、(GDIオブジェクトとそのハンドルが)破棄
される。

CFont *pFont=new CFont;

などとやった場合、ポインタ変数の寿命が尽きても、newしたオブジェクト
自体はdeleteはされないので、プロセス終了まで、紐が切れた凧のように
メモリ空間に残る。

95系だとプロセス終了でも解放されず、リソースリークになるんだっけか?

static で宣言したオブジェクトでも、

  if(s_FontStatic.GetSafeHandle())
    s_FontStatic.DeleteObject();
  s_FontStatic.CreateFontIndirect(...);

と破棄する手順を踏めば、何回でもリサイクルできる。

435 :デフォルトの名無しさん:2009/03/14(土) 02:34:29
CMFCToolbar上にStatic Textを作成できないですかねぇ・・・

436 :デフォルトの名無しさん:2009/03/14(土) 10:05:36
>>435
CMFCToolbar って、CDialogBar よりも美味しいの?

スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても
CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば
いいだけのような肝。


437 :デフォルトの名無しさん:2009/03/17(火) 23:37:17
>>435
つCStatic::Create

438 :デフォルトの名無しさん:2009/03/22(日) 15:54:16
ダイアログ上のコントロールのタブオーダーが一つ前のコントロールIDを調べるにはどうしたらいいんですか?
例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、
4番目のタブオーダーのコントロールIDを調べたいんですが。

"タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。
タブオーダーがらみのAPIって無いんですかね?

439 :デフォルトの名無しさん:2009/03/22(日) 16:23:08
CWnd* pWnd = wndEdit.GetWindow( GW_HWNDPREV):
if ( pWnd->GetStyle() & WS_TABSTOP) UINT nID = pWnd->GetDlgCtrlID(); // こいつがそう。

else pWnd = pWnd->GetWindow( GW_HWNDPREV);

以下繰り返しってな感じで取得できないかな。
実際には while ループするほうがお得だろうが。


440 :デフォルトの名無しさん:2009/03/22(日) 17:14:26
>>439
どうもありがとうございます。
GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、
Window上のコントロールのタブオーダー順でもあるんですね。

441 :デフォルトの名無しさん:2009/03/22(日) 21:59:09
C初心者スレで相手にされなかったので、質問させてください

MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、

_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。

普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?

442 :デフォルトの名無しさん:2009/03/22(日) 22:07:52
暴走するようなもの使うな

443 :名無し募集中。。。:2009/03/23(月) 09:08:39
MFCも使っているのかもしれないけど_cscanf_s関数ってMFCじゃないし
コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど
デバッグ表示だけならTRACEマクロが便利
値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか

444 :デフォルトの名無しさん:2009/03/23(月) 21:24:49
いまさらながら、mfcおもしろいお。

詳しい説明書ないかお?

445 :デフォルトの名無しさん:2009/03/24(火) 10:07:58
SP1以降の解説か、まだないかもな。

446 :デフォルトの名無しさん:2009/03/24(火) 17:14:26
>>444
SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」
Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる

447 :デフォルトの名無しさん:2009/03/24(火) 20:59:37
後はmfcのソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。

107 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)