■MFC相談室 mfc20d.dll■

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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
ウィンドウの中に子ウィンドウを作成して、子ウィンドウの中にボタンを配置すればいい。
で、子ウィンドウそのものをスクロールさせる。
ボタンは子ウィンドウの中に存在するから、親ウィンドウの領域を侵すことはない。
87: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 の初心者教室に帰って存分に熱い思いを語れ
4724: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
すいません。マージコピーが用意されてました
5547: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スレですよ
6151: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の関数でメニューを更新する方法はありますか?
7469: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
ありがとうございます
できないかと思っていましたが、おかげさまで実装できました
8882: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の範疇じゃないのかな?
177175:2009/01/14(水) 18:55:08
>>176
斜線が入るだけで、白く塗りつぶされたままです。
178デフォルトの名無しさん:2009/01/14(水) 19:52:53
エディットボックスでキー入力の入力方法を英語から日本語入力に自動的に切り替える方法を教えてください。
179178: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);

こんな感じかな
184182:2009/01/15(木) 02:24:13
>>183さん
そういう書き方をするんですね、、無事上手くいきました。ありがとうございました!
185175: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なし
187175: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
ドキュメントテンプレートはアイコン、メニュー、ツールバーみたいなリソース関係で
ドキュメントごとじゃなくてドキュメントタイプごとに違うリソース使えるようにする
256253: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
再帰でデッドロックするのは当たり前だろうと
329326: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 と連携できるのでは?
366364: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変換しちゃうからなあ。
375373: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
実装すればいんだから、それでいい
393389: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のソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。
448デフォルトの名無しさん:2009/03/27(金) 13:56:06
ちょっと質問よろしいですか?
CDialogを継承したCxxxDialogというクラスを作って、
そこにWM_UNINITMENUPOPUPというメッセージが来たときのハンドラを作成したいのですが、
VC++の開発環境から追加しようと思っても、CxxxDialogクラスのプロパティのメッセージのリストには出てきません。
クラスのプロパティのメッセージの一覧には、限られたメッセージしか扱ってないようです。
ここにないメッセージのハンドラを追加したい場合はどうしたらいいのでしょうか?
449デフォルトの名無しさん:2009/03/27(金) 13:57:48
↑開発環境はVC++2005です。
450デフォルトの名無しさん:2009/03/27(金) 14:10:54
メッセージマップに、
ON_MESSAGE( WM_UNINITMENUPOPUP, &OnUnInitMenuPopup)

xxxDialog.h に
afx_msg LRESULT OnUnInitMenuPopup( WPARAM wParam, LPARAM lParam);

xxxDialog.cpp に

LRESULT CxxxDialog::OnUnInitMenuPopup( WPARAM wParam, LPARAM lParam)
{
// ToDo...

return 0L;
}
451デフォルトの名無しさん:2009/03/27(金) 14:58:19
>>450
できました!感謝です。
452デフォルトの名無しさん:2009/03/28(土) 00:16:42
しばらくBCBを使ってたんで今どうなってるか知らないけど
BCBのTDrawGridみたいなものないでしょうか
条件はwin+exeのみで実行出来てCListView(だったかな)以外です
453デフォルトの名無しさん:2009/03/28(土) 00:21:43
>>452
TDrawGirdとやらに充分近づいたと納得できるまで、CListCtrlを拡張する。
454デフォルトの名無しさん :2009/03/28(土) 19:29:06
TypeがPICTYPE_ICONであるCPictureHolderオブジェクトからHICONオブジェクトを作成するにはどうすればいいでしょう?
455デフォルトの名無しさん:2009/03/28(土) 20:34:31
>>454
作成というか、ハンドルを取得するなら、
m_pPictメンバにIPictureインターフェースのポインタが入っているから、
ここからget_Handleで取り出すのが一番早いかな。
456デフォルトの名無しさん:2009/03/29(日) 00:07:59
>>455
thx

@get_Handleでハンドル取得
AHICONでキャスト
BCopyIconで複製

でいけた
457デフォルトの名無しさん:2009/03/31(火) 20:43:19
MFCは一人せっくすより面白いな。
458デフォルトの名無しさん:2009/03/31(火) 20:46:19
それは「たいして面白くない」という意味の例えだね
459デフォルトの名無しさん:2009/03/31(火) 20:49:56
やり方によるだろ
460デフォルトの名無しさん:2009/03/31(火) 20:51:05
ActiveXでIPictuDisp*型で画像ファイル読み込んでんだけど
ここからファイルパスってとれないかな?
461デフォルトの名無しさん:2009/03/31(火) 20:51:53
ミス、IPictureDisp*型です
462デフォルトの名無しさん:2009/04/01(水) 00:53:27
>>460
IPictureDispって、デバイスコンテキストみたいな感じで
データソースがファイルとは限らないんじゃない?
ファイルパスの保持はこのオブジェクトの役目ではないような気がする。
463デフォルトの名無しさん:2009/04/02(木) 21:39:41
ですよね、あきらめます
464デフォルトの名無しさん:2009/04/06(月) 09:20:30
ウィザードを使わないMFCの入門サイトってありませんか?
ウィザード使うと訳が分からなくなるので、手動で最低限必要なところだけ書いてMFCを使いたいのですが
465デフォルトの名無しさん:2009/04/06(月) 09:35:48
入門を卒業してから、ウィザードを使うのをやめればいいと思います。
466デフォルトの名無しさん:2009/04/06(月) 09:44:11
書籍の標準講座MFCのソースが落とせるからそれで勉強
467デフォルトの名無しさん:2009/04/06(月) 10:04:13
>>466
ありがとうございます!
標準講座MFCという本を買ってみようと思います。
468デフォルトの名無しさん:2009/04/06(月) 21:59:32
CRichEditCtrl::GetSelTextで複数行にわたるテキストをCStringに取り込み、
そのテキストにある改行を Find(_T('\n', 0) と書いて検索したのですが-1しか
返ってきません。文字セットはUnicodeを使っていますが、マルチバイトでも
結果は同じでした。
地味にwcsstrとかを使わないと駄目でしょうか?
469デフォルトの名無しさん:2009/04/06(月) 22:29:44
CStringに取り込んだデータの内容確認してないのか?
470デフォルトの名無しさん:2009/04/06(月) 22:38:18
ちゃんと返ってくるよ。 CStringの中身を確認してみ。
471デフォルトの名無しさん:2009/04/06(月) 23:21:52
Unicodeだと\nじゃなくて\rでした。お騒がして申し訳ありません。
472デフォルトの名無しさん:2009/04/07(火) 00:06:49
>Unicodeだと\nじゃなくて\rでした。
\nと\rの違い、解ってる?
473デフォルトの名無しさん:2009/04/07(火) 00:09:24
ワロタwwwwww
474デフォルトの名無しさん:2009/04/07(火) 00:44:17
判りませんが、何か?
CStringをメモリダンプしたら0dだけだったので\rにしただけです。
475デフォルトの名無しさん:2009/04/07(火) 00:47:37
それはよかった
476デフォルトの名無しさん:2009/04/07(火) 01:33:03
ダメだこりゃ。
477デフォルトの名無しさん:2009/04/07(火) 17:00:26
>>474
その問題解決で合ってる。

煽ってる人はおかしいね。
478デフォルトの名無しさん:2009/04/07(火) 17:31:07
Unicodeは\rでそれ以外は\nと言ってるように見える
479デフォルトの名無しさん:2009/04/07(火) 19:14:27
思い込みまたは深読み
480デフォルトの名無しさん:2009/04/07(火) 19:23:56
文字セットもエンコードも関係ないのに、>>471 で
>Unicodeだと
と明示しているわけだが。

>>477
>煽ってる人はおかしいね。
あまり親切ではないが、教えてくれてるんだろう。
481デフォルトの名無しさん:2009/04/07(火) 21:35:21
Unicodeなんかより先にWindowsの勉強した方がいいんじゃね?w
482デフォルトの名無しさん:2009/04/07(火) 21:52:44
VC++6.0で、人の作った既存のMFCのプログラムを改修しています。
以下の手順で、ダイアログと関連付けられているはずのクラスが
ClassWizard上からは参照できなくて困っています。
1.リソースのダイアログ上で右クリックしてClassWizardを選択
2.新規クラス名を求められるので、「既存のクラスの選択」を選ぶ
3.「クラスに関連付けられていません」と表示される上、クラスを選ぶ
リストにクラス名がひとつも表示されないので、選択できない。
(今、手元にVC++がないので、多少手順がちがうかもしません。)

プログラムを実行すると問題なく動きます。
また、ダイアログに関連付けられているはずのクラスのヘッダファイルを見ると、
ClassWizardで生成したと思われる関数("//{{AFX_MSG"コメント内にOnXXX関数がある)
が書かれています。

原因や対処法などわかりましたらよろしくお願いします。
483デフォルトの名無しさん:2009/04/07(火) 22:18:39
>>482
とてつもなく昔の話なのでうろ覚えだが、VC6ではクラスウィザードはしょっちゅう破損するから
いつも何かのファイルを消して対応してたような気がする。
なんだっけなぁ、拡張子がclwみたいやつだったかなぁ・・・
484デフォルトの名無しさん:2009/04/07(火) 22:34:06
>>483
ありがとうございます。
clwファイルは、問題のダイアログの箇所が、Class=?になってました。
(普通は関連したクラス名が書かれているような)
試しに手でクラス名を書いたら、reloadのエラーメッセージが半永久的に…
clwを削除して、ビルドすれば再作成されるのでしょうか?
485デフォルトの名無しさん:2009/04/07(火) 22:37:02
やってみりゃいいだろ。
バカが。
486デフォルトの名無しさん:2009/04/07(火) 22:37:57
>>484
やってごらんよ。必要ならバックアップをとった上で
487デフォルトの名無しさん:2009/04/07(火) 22:39:37
どうもです。明日やってみます
488483:2009/04/07(火) 22:44:44
VC6使ってた人、ここにはあんまいないのかな?
当時は、周りの人たちはみんな知ってたしMLやWeb上でもFAQ扱いだったから
正確な情報知ってる人が颯爽と現れてくれないかなと思ってたんだけど。
489デフォルトの名無しさん:2009/04/07(火) 23:12:59
VC6使ってたけど、クラスウィザードは使ってなかったな
490デフォルトの名無しさん:2009/04/07(火) 23:19:25
>488
そこまでヒントでてたら自分で調べるもんだろ
しかも職業プログラマに手取り足取り無料サポートする必要あるのか?
491デフォルトの名無しさん:2009/04/08(水) 01:04:59
ははは
492デフォルトの名無しさん:2009/04/08(水) 01:23:22
ひひひ
493デフォルトの名無しさん:2009/04/08(水) 01:28:05
ふぉーっ
494名無し募集中。。。:2009/04/08(水) 01:54:05
MFCじゃなくてVisualStudioのネタになるけど
昔からncbを消したりclwを消さないと変な挙動になる事はあるよね
495デフォルトの名無しさん:2009/04/08(水) 07:04:29
少なくともプロジェクトorソリューションをアーカイブするときは必ず消しているなぁ
496482:2009/04/08(水) 23:13:46
皆さん、ありがとうございます!
clwを削除してリビルドしたところ、ClassWizardが直りました。
VC++自体に不慣れで、ファイルを消すということは盲点でした。
>>495
次からそうします。
497デフォルトの名無しさん:2009/04/09(木) 18:02:47
MFCのSDIで、ChildView(クライアント)のサイズが640x480なウィンドウを作りたいのですが
CChildView::PreCreateWindowの
cx.cx を変えてもサイズが変わらず

CMainFrame::PreCreateWindowの
cx.cx を変えても外枠のサイズが変わり、クライアント部分が小さくなり、

CRect rect = CRect( 0,0,640,480 );
AdjustWindowRectEx( rect , cs.style , TRUE , cs.dwExStyle );
cs.cx = rect.Width();
cs.cy = rect.Height();

と、書いてみたのですが、
ステータスバーやツールバーの部分が計算に入れられてないので
やや狭いという感じになるのです。

なにか、いい方法はありませんか?
498デフォルトの名無しさん:2009/04/09(木) 18:25:42
void CFrameWnd::RecalcLayout() をオーバーライド
499デフォルトの名無しさん:2009/04/09(木) 18:55:07
クライアント領域のサイズ調べて差分だけ外側のサイズ変更みたいな単純な話じゃないのか?
500デフォルトの名無しさん:2009/04/09(木) 19:18:22
MFCおもしれえお( ^ω^)

でも、むずかしめなサンプルが載ってる本がすくないんだお( ^ω^)
VC++6のころの本をあさるしかないんだお( ^ω^)おまけにネットワークをカバーしてる本もすくないんだお( ^ω^)

Impressの赤い分厚い本のシリーズでMFCの本があればよかったとおもうんだお( ^ω^)

ハーバーと汁とのMFCの本はあまりおもしろくないお( ^ω^)
501デフォルトの名無しさん:2009/04/10(金) 13:57:34
いまさらMFCの本を出しても売れなさそう
502デフォルトの名無しさん:2009/04/10(金) 18:05:02
ドトネト本なら売れるのか?
503デフォルトの名無しさん:2009/04/10(金) 18:12:12
馬鹿なSEが
何も分からず.NET.NETうるさいから
そういう人に売れてるんじゃね
504デフォルトの名無しさん:2009/04/10(金) 18:14:09
リボンを付けたい人にMFCが大人気!
という事実はない。
505デフォルトの名無しさん:2009/04/10(金) 18:29:12
そのうち、.NETを超える何かが出て中途半端な存在になるのさ
506デフォルトの名無しさん:2009/04/10(金) 19:04:20
>>505
.Netの何を超えるの?くそ加減?
507デフォルトの名無しさん:2009/04/10(金) 20:25:52
>>506
うん
508デフォルトの名無しさん:2009/04/10(金) 23:32:50
509デフォルトの名無しさん:2009/04/10(金) 23:50:15
WPFに触れた後だと、MFC(というかWin32コントロール)を使ったUI構築がものすごく面倒に感じる。
510デフォルトの名無しさん:2009/04/11(土) 00:38:18
MFCも.NETもWPFもどれでもけっこうだが、Javaだけはくそ。あんな糞言語二度とやりたくない。
ただより高いものなし。12万打して、VSPRo買ったほうがはるかに有益。
511デフォルトの名無しさん:2009/04/11(土) 01:03:06
CRichEditCtrl::FindTextで日本語のテキストを検索しようとしても-1しか返ってきません。
文字セットはUnicodeで、第一引数にFR_DOWN、第二引数にはFINDTEXTEXWを使っています。
chrg.cpMinに0、chrg.cpMaxに-1、lpstrTextにCString::GetBufferの戻り値を入れてます。
何か足りないものがあるんでしょうか?
512デフォルトの名無しさん:2009/04/11(土) 01:45:04
>>511
脳みそ、知識、技術、考える力。
好きな物を選べ。
513デフォルトの名無しさん:2009/04/11(土) 02:09:38
全部足りないんでご教示ねがいます。
514デフォルトの名無しさん:2009/04/11(土) 03:15:43
lpstrTextの中身が空だったなんてオチはなしにしろよ
515デフォルトの名無しさん:2009/04/11(土) 03:27:41
CStringには文字列が入っていて、デバッグでFindTextの呼び出し時にも空に
なっていないことは確認できています。
516デフォルトの名無しさん:2009/04/11(土) 09:45:32
VS2008だと普通に機能するなあ、とか色々試しているうちに思い出したのだが、
VS2005だと、リッチエディットコントロールは
常にクラス名が"RichEdit20A"に固定されていた気がする。
で、VS2008のMFCだと、FindTextはEM_FINDTEXTEX呼び出しに変換されていたので
それ以前のVer.でも同じなんじゃないかなあ。

で、何が言いたいかと言うと、クラスとメッセージに妙な関係があるわけで。
x64Vista SP1/VS2008 SP1 でテストしてみた結果は下記の通り。
Unicode-ANSI変換時に化けちゃってるのかねえ。
ちなみにANSI/Unicode、x86/x64で違いは無かったので省略。

・RichEdit20A
OK : SendMessageA/EM_FINDTEXTEX
NG : SendMessageA/EM_FINDTEXTEXW
NG : SendMessageW/EM_FINDTEXTEX (VS2005?)
OK : SendMessageW/EM_FINDTEXTEXW
・RichEdit20W
NG : SendMessageA/EM_FINDTEXTEX
NG : SendMessageA/EM_FINDTEXTEXW
OK : SendMessageW/EM_FINDTEXTEX (VS2008)
OK : SendMessageW/EM_FINDTEXTEXW

今時ANSIビルドも無いだろうし、EM_FINDTEXTEXWを直接呼んだほうが早いか。
クラス名弄るよりよっぽど楽だし。
517デフォルトの名無しさん:2009/04/11(土) 12:06:37
すみません、VCのバージョンかいてませんでした。XP SP3/2005 SP2です。
指摘の通り、SendMessageWでEM_FINDTEXTEXWで呼び出してみましたが、やはり-1しか返って
きませんでした。
あと、CRichEditCtrl::FindTextの宣言を調べてみたら、#ifdef UNICODEでFindTextWになっていました。
518デフォルトの名無しさん:2009/04/11(土) 17:28:05
>>517
ダメだ。
おまえは、いろいろ分かってなさ過ぎる。
519デフォルトの名無しさん:2009/04/11(土) 19:02:33
AfxInitRichEdit2してないというオチだったりして
520デフォルトの名無しさん:2009/04/11(土) 19:19:45
AfxInitRichEdit2はしています。
何がわかっていないのか、ご教示願えれば幸いです。
521デフォルトの名無しさん:2009/04/11(土) 21:41:37
CStringW strFind(_T("探す文字列"));
FINDTEXTEXW ft;
ZeroMemory(&ft, sizeof(ft));
ft.chrg.cpMin = 0;
ft.chrg.cpMax = -1;
ft.lpstrText = strFind;
long pos = richEditCtrl.SendMessage(EM_FINDTEXTEXW, FR_DOWN, (LPARAM)&ft);

richEditCtrlはCRichEditCtrlクラスの変数。
これで動作しないなら現ソースを全てupするしかないな。
俺が調べた限りでは、EM_FINDTEXTEXWが最強っぽいのだけどなあ。
522デフォルトの名無しさん:2009/04/11(土) 21:48:25
richEditCtrl.SendMessageのところ、::SendMessageにしていてました。
期待通りの動きが確認できました。ありがとう御座いました。
523デフォルトの名無しさん:2009/04/12(日) 13:01:42
CRichEditCtrl::FindTextもrichEditCtrl.SendMessageも
中の人が::SendMessageしてるだけだから、どれ使ってもできない方がおかしい。
524デフォルトの名無しさん:2009/04/12(日) 13:03:53
送り先間違ってたんじゃないの
525デフォルトの名無しさん:2009/04/13(月) 17:08:02
Visual Studio 2008からMFCアプリケーションを開発するとき、
スプラッシュスクリーンをどうしています?
自作ですか?
それともCSplashWndに代わるクラスがありますでしょうか?
526デフォルトの名無しさん:2009/04/13(月) 17:21:11
必要性がないからつけていない。
527デフォルトの名無しさん:2009/04/13(月) 18:27:52
MFC開発の初心者ですが、質問させてください。
MFCアプリケーションにて、
ダイアログ操作による選択を行う場合、
CDocument派生クラスのポインタを
対象のダイアログの引数で参照させることは一般的でしょうか?

それとも、AfxGetApp()の様なグローバルな関数があるのでしょうか?

528デフォルトの名無しさん:2009/04/13(月) 18:54:21
view以外では参照しない
529527:2009/04/13(月) 19:55:27
>>528
ではCViewから派生したクラスを参照させるのですか?
530デフォルトの名無しさん:2009/04/13(月) 20:21:00
まず、MFCの想定しているダイアログの使われ方としては、
1.ダイアログのインスタンスを作成
2.必要に応じてインスタンスに現在の設定内容を渡す
3.表示
4.インスタンスから変更された設定内容を取り出す
こんな感じ。
UIとメンバ変数の内容交換はDDX/DDVでやれ、と。
そこらへんは、コントロールに対して「変数の追加」とかやれば勝手にやってくれる。
531527:2009/04/13(月) 20:25:03
>>530
やはりそうか・・・
引数などで参照させて
ダイアログ内でCDocument派生系を操作するのではなく、
ダイアログによる操作後、手前でCDocumentを操作するのですね?

プログレスダイアログ風な事を考えるのは邪道だと、、、
532デフォルトの名無しさん:2009/04/13(月) 22:09:13
>>531
俺なら、こんな風にやっちゃったりするけど。

class CMyDlialog : public CDialog
{
...
private:
MyData& mydata;
public:
CMyDlialog(MyData& mydata, CWnd* pParent = NULL)
: CDialog(CMyDlialog::IDD, pParent), mydata(mydata)
{}
...
};

あとアプリケーション共通データは、CDocumentに無理に持たせず
シングルトンクラスにしてどっからでも参照できるようにしたりもする。
これは賛否分かれるかもしれんが、意外とその方がメンテナンス性よかったりする。
533デフォルトの名無しさん:2009/04/13(月) 22:31:06
アプリケーション共通のデータは CxxxApp に持たせる。
theApp そのものがグローバルなのだから。
534527:2009/04/13(月) 23:21:37
>>532
>>533
あぁーなるほど。
システム共通なものはCWinAppに持たせるのも手ですね。
考えて見ます。
535デフォルトの名無しさん:2009/04/13(月) 23:24:34
なぁーーーーーるほど
536デフォルトの名無しさん:2009/04/14(火) 00:21:59
>>アプリケーション共通のデータは CxxxApp に持たせる。 

一理ある。でも他アプリでも使う可能性が0.1%でもあるなら
CxxxAppではなくCxxxAppが保持する独立したobjectの方が
良いと思う今日この頃。532に一票。
537デフォルトの名無しさん:2009/04/14(火) 00:40:41
あとはデータの性質によりけりだったりする。
変更後に必ずUpdateAllViewsしたくなるようなデータだったらCDocumentに持たせるのが妥当だし。
538デフォルトの名無しさん:2009/04/14(火) 01:10:11
>CxxxAppではなくCxxxAppが保持する独立したobjectの方が
>良い

それも CxxxApp のデータであることに変わりはあるまいw
539デフォルトの名無しさん:2009/04/14(火) 01:12:49
いや、MFCプログラムではCxxxAppに保持させておいて
MFC以外に移植するときはそのオブジェクトを使いまわせるように、って意味でしょ
540デフォルトの名無しさん:2009/04/14(火) 01:13:46
いや、MFC以外って意味じゃないか。
まあとにかくCxxxAppのメンバには変わりないが、まるごと切り取れるように、ってこと
541デフォルトの名無しさん:2009/04/14(火) 08:46:34
プログレスダイアログ風な事の意味がわからないけど
ファイルの読み書きをするプログレスバーのようなものをイメージすればいいのかな
542デフォルトの名無しさん:2009/04/15(水) 16:48:14
ねーよw
543デフォルトの名無しさん:2009/04/15(水) 17:05:06
おそ
544デフォルトの名無しさん:2009/04/16(木) 14:23:37
545デフォルトの名無しさん:2009/04/16(木) 21:29:03
質問です。

VisualStudio2005でVC++のプログラムを書いていて、
GUI操作可能なプログレスダイアログを作ろうと思ってます。

そこでVisualStudioヘルプのGetImageサンプルコードに含まれる
ProgressDlgを参考にしようと思ってるんですが、この実装方法だと
独自に派生したコモンコントロールのクラス(例えばCButtonから
派生したCMyButtonのような)をプログレスダイアログ上に配置する
にはどうすればいいんでしょうか。
ダイアログプロシージャ内でDDXを呼び出すのかと思ったのですが
どのメッセージをどう受ければいいのかがわかりません。

あるいはもっと使いやすくて安全なサンプルコードがあれば、
それを紹介していただくだけでも構いません。

よろしくお願いします。
546デフォルトの名無しさん:2009/04/16(木) 22:36:47
あぁーなるほど。
547デフォルトの名無しさん:2009/04/16(木) 22:39:00
そんなサンプルあるのか
548デフォルトの名無しさん:2009/04/16(木) 23:00:55
CButtonが使える所なら派生したCMyButtonも使えるはずだけど
何か使えないような特殊な事情でもあるんだろうか?
それとも単純に派生したクラスの使い方がよくわからないということ?
549545:2009/04/16(木) 23:19:46
>>548
いつも自分がやってる方法は下記のとおり。

(1) リソースエディタでダイアログの外観を適当に編集した後、
右クリック→クラスの追加でそのダイアログに相当するクラス
(CDialogの派生クラス)を作る。
(2) リソースエディタ上に戻ってダイアログ上のボタンを右クリック→
メンバ変数の追加を選び、CButtonクラスの変数として(1)のクラスの
メンバに追加する。
(3) (1)のクラスのヘッダにCMyButtonの宣言を含むヘッダを#include
した上で、(2)の型宣言をCButtonからCMyButtonに書き換える。

こうすることで、DoDataExchange関数の中のDDXがリソース上の
ボタンのIDとCMyButton型のメンバ変数を結び付けてくれるから、
後は何もしないでもCMyButtonの挙動になります。
550545:2009/04/16(木) 23:22:28
でも、>>545で挙げたサンプルコードの場合、CProgressDlgが
そもそもCDialogの派生クラスじゃないんですよ。
HWND型のメンバ変数を持っておいて、クラスが作られるとき
リソースIDを指定してダイアログを作成し、そのメンバ変数に
結びつけるという、いわばダイアログの簡易実装みたいなこと
をやってて、ボタンの挙動なんかはそのクラス内で走らせてる
プロシージャでIDCANCELとかのメッセージを直接受け取って
処理してるんです。
こういう場合、ボタンのリソースIDとCMyButtonクラスとを
どうやって結びつければいいのかわからない、というのが
質問の中身です。
551545:2009/04/16(木) 23:40:24
まあ操作可能なプログレスダイアログが作れれば
それでいいので、もっと使いやすくて安全なコードが
あるなら、このサンプルには取り立ててこだわらない
んですけど。
552デフォルトの名無しさん:2009/04/16(木) 23:54:51
CMyButton::SubclassWindow( ::GetDlgItem( hDlg, nIDResource));
553デフォルトの名無しさん:2009/04/17(金) 08:01:36
おたずねします。

CDialogBarを使っていて、メインウィンドウの左右どちらかにドックできるようにしています。
そために、そのダイアログバーのリソースは縦長でデザインしました。

上下にもドックできるようにしたいのですが、上下にドックしたときには横長になるようにしたいのです。
ドックする位置によってリソースを使い分ける方法ってあるのでしょうか。
554デフォルトの名無しさん:2009/04/17(金) 10:03:27
動的にレイアウトし直す
555デフォルトの名無しさん:2009/04/17(金) 11:21:13
タブでダイアログの中味切り替えたりできるんだからできないはずがない。
556デフォルトの名無しさん:2009/04/17(金) 16:45:02
そういうえばダイアログバーはコントロールの派生しても使えなかったな
557デフォルトの名無しさん:2009/04/17(金) 21:54:23
CodeGuruのソースを参考にしてCDialogBarでDDXを使えるようにしたっけ
あんまり関係ないけど
558545:2009/04/18(土) 01:59:06
>>552
ありがとうございます。
WM_INITDIALOGのメッセージを処理する箇所で
その関数を呼び出すことで、結びつけることが
できました。
559デフォルトの名無しさん:2009/04/19(日) 10:54:49
諸先輩方、すみませんがお知恵を拝借させてください。

・CSplitterWndで静的分割ウィンドウが複数分けられていて、
 あるペインではCTreeViewが貼り付けられている。
・別のペインで何らかのUI操作中に、このCTreeViewの表示を
 排他をかけずに更新させたい。
・CTreeViewのオブジェクトをスレッド化?しなければならないと思うけど
 どのようにすればよいのでしょうか?
AfxBeginThreadとかRUNTIME_CLASSとか使用するものと思っていますが、
実装のしかたがよくわかりません(;_;)
560デフォルトの名無しさん:2009/04/19(日) 11:08:46
>別のペインで何らかのUI操作中に、このCTreeViewの表示を
>排他をかけずに更新させたい。
すまんが解りやすく言ってくれ。「排他をかけずに」とはどういう意味か
561デフォルトの名無しさん:2009/04/19(日) 11:28:02
>>560
日本語下手ですみません。

今の処理は、CTreeViewのペインと別ペインはシーケンシャルに動作しています。
というか、CTreeViewのペインの処理とその結果表示が終わるまで、画面全体が
グレイ表示になってしまい何も操作できないようになっています。
これを「排他している」と表現しました。

今回任された対応は、CTreeViewの処理&結果表示を実行している最中でも、
他ペインの操作をできるようしたいため、「排他をかけずに」と表現しました。

対応としてCTreeViewのオブジェクトをどうにかしてスレッド化して、
非同期で処理しなければならないのでは?と推測していますが、
なにぶんMFCのスレッド化がよく理解できていません。
(AfxBeginThreadとかRUNTIME_CLASSとか使用する?)
562デフォルトの名無しさん:2009/04/19(日) 11:38:16
了解した。
そういうことなら、CTreeViewのオブジェクトを別スレッドにするのではなく、CTreeViewでおこなっている処理を
別スレッド(ワーカースレッド)にすればいい。
詳細はヘルプの「マルチスレッド : ワーカー スレッドの生成」を読むといいだろう。
ヘルプがなきゃ↓を参照。(同内容)
http://msdn.microsoft.com/ja-jp/library/69644x60(VS.80).aspx
563デフォルトの名無しさん:2009/04/19(日) 12:03:12
>>562
ご指導感謝いたします。
ご提示のURL拝読いたしました。

AfxBeginThreadで、クラスのスレッドではなく、関数のワーカースレッドを
作成して、また、その関数にCTreeViewのオブジェクトを渡して処理させてみます。

なんだが、光明が差した気分です。
貴重なご意見ありがとうございました。
564デフォルトの名無しさん:2009/04/19(日) 18:03:44
>その関数にCTreeViewのオブジェクトを渡して
別スレッドにMFCオブジェクトは渡さない方が良いです。
ハンドルで渡してスレッドの中で作成したCTreeViewオブジェクトにアタッチするか、
ハンドルを渡しといてPostMessageなどでメインスレッドに処理させて下さい。
詳しくは下記参照
http://msdn.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx
565デフォルトの名無しさん:2009/04/19(日) 22:14:03
>>564
アドバイス感謝いたします。

>別スレッドにMFCオブジェクトは渡さない方が良いです。
>ハンドルで渡してスレッドの中で作成したCTreeViewオブジェクトにアタッチするか、
>ハンドルを渡しといてPostMessageなどでメインスレッドに処理させて下さい。

現在の実装は、CTreeViewをメインフレーム内に作成していますので、
後者のCTreeViewのハンドル(m_hWnd?)をワーカースレッドに渡しておいて、
そのワーカースレッド内でPostMessage/PostThreadMessageなどを使用して、
メインフレームへ処理させるようにしてみます。

ありがとうございました。
566デフォルトの名無しさん:2009/04/23(木) 13:11:56
質問です
MFCアプリケーションにて、自作でメッセージを定義し、
メッセージハンドルによる関数呼び出しを考えています。

呼び出される関数のハンドラに向けてメッセージを送信する場合で、
WPARAM, LPARAMにGlobalAlloc関数で生成したHGLOBALをキャストして送る事は
一般的にありえるんですかね?

それともタブー?
567デフォルトの名無しさん:2009/04/23(木) 13:47:52
HGLOBALをWPARAM,あるいはLPARAMにキャストするということは一般的。

ただ、自身にGlobalAllocして送るというのは設計的にどうだろう。
解放のタイミングを考えると、送った先でGlobalAllocすることも視野にいれるべきかと。
568566:2009/04/23(木) 14:57:53
>>567
返答ありがとうございます。
ご意見をもとに検討してみます。
569デフォルトの名無しさん:2009/04/23(木) 15:51:04
すみません。もしあれば、VC++スタンダード版を買おうと思ってるんですが、
MfcでC#とかにあるDataGridViewコントロールはありますか?FlexGridは使いにくくていやです。
570デフォルトの名無しさん:2009/04/23(木) 16:05:03
MFCにはない
571デフォルトの名無しさん:2009/04/23(木) 19:35:58
>>569
そう思っている奴は世界中に居るだろうから、
CodeGuruを探せば似たようなのがいくつか見つかるはず。
572566:2009/04/23(木) 20:01:08
>>567

結局、vectorコンテナを基とするHGLOBALを管理するクラスを作成し、
CWinApp系クラスのメンバとしました。
間接的にGlobalAlloc/GlobalFreeを行い、
同時にハンドルをvectorに登録したので、
最悪開放し忘れても、対処できるようにしました。
この構成で、しばらく実験してみようと思います。
ご意見、ありがとうございました。
573デフォルトの名無しさん:2009/04/25(土) 01:43:26
質問です
ActiveXのMicrosoft ImageList ControlからHIMAGELISTに登録した複数のアイコンの情報を渡したいと思っています
環境はVS2005です。どなたかご教授よろしくお願いします

尚、以下のことを試してみましたが、できませんでした
ImageList_GetImageCountでイメージの数を調べた所0となっていました

// HIMAGELISTに変換(m_imagelistはMicrosoft ImageList Controlの変数)
HIMAGELIST hImage = (HIMAGELIST)m_imagelist.get_hImageList();

// INDEXを指定してアイコンを取得
m_hIcon = ::ImageList_GetIcon(hImage, 2, ILD_TRANSPARENT);
574573:2009/04/25(土) 01:47:35
・MFCアプリケーションをダイアログベースで作成
・「ActiveXコントロールを挿入」→「Microsoft ImageList Control 6.0」でコントロール追加
・16*16、24bitの適当なアイコンを3つ挿入
・「変数の追加」で変数名m_imagelistにしてラッパークラス作成
575デフォルトの名無しさん:2009/04/25(土) 14:45:07
>・16*16、24bitの適当なアイコンを3つ挿入
どこに挿入したのかさっぱり判らない。
576デフォルトの名無しさん:2009/04/25(土) 14:59:20
>ActiveXのMicrosoft ImageList ControlからHIMAGELISTに登録した複数のアイコンの情報を渡したい
「誰が」「なぜ」「いつ」「どこで」「何を」「どのようにして」
577573:2009/04/25(土) 16:17:25
>>575
以下のようにして挿入しています
1. デザイナ上で「ActiveXコントロールを挿入」→イメージリストコントロール追加
2. コントロールを選択→プロパティページを開→プロパティページダイアログボックスが表示
3. 「イメージ」タブを選択→「ピクチャの挿入」ボタンクリック→図の選択ファイルダイアログから画像を指定

>>576
説明不足で申し訳ありません。以下になります。

私が
ボタンコントロールに表示しているアイコンを変更するため
ボタンクリック時に
Microsoft ImageList Controlから
「ピクチャの挿入」で挿入した複数のアイコン情報を
(どのようにして)←今模索中です
ボタンコントロールに渡したい



578デフォルトの名無しさん:2009/04/25(土) 22:48:17
最近MFC使ってないから忘れたけど
MFCのイメージリストじゃなくてActiveXのイメージリスト使うと何かいいことあるんだっけ?
MFCの画像つきのボタンクラスじゃなくて、そういう方法だと何か意味があるんだっけ?
579デフォルトの名無しさん:2009/04/26(日) 00:46:12
>ボタンコントロールに表示しているアイコンを変更する
その最初のアイコンはどうやって表示したんだ?
580デフォルトの名無しさん:2009/04/26(日) 01:23:10
>MFCのイメージリストじゃなくてActiveXのイメージリスト使うと何かいいことあるんだっけ?

コードをいじらずに画像の追加やマスクの設定ができるからです
利用者の負担を減らしたいと思いまして

>MFCの画像つきのボタンクラスじゃなくて、そういう方法だと何か意味があるんだっけ?

自作のボタンコントロールにアイコンを表示する機能をつけようというのが前提なので・・

581デフォルトの名無しさん:2009/04/26(日) 01:26:34
>>579
最初のアイコンはイメージリストとは別にファイルから読み込んで表示しています
582デフォルトの名無しさん:2009/04/26(日) 01:39:14
PowerDVD 9 体験版を入れると、VC2005ランタイム入れさせられた・・・
583デフォルトの名無しさん:2009/04/26(日) 01:41:16
>>573で挙げたコードはVS2008のMicrosoft ImageList Controlでは動くことを確認しました
環境によって動かないというのも困りますので
利便性は落ちますがMFCのイメージリストを使って実装することにします
ありがとうございました
584デフォルトの名無しさん:2009/04/26(日) 07:35:54
>>583
「Microsoft ImageList Control」って
MSCOMCTL.OCXに含まれているやつを指しているんだよな。
これはVB6.0用だから、VC6.0ならともかくそれ以降で使用される事は一切考慮されていない。
あくまでVB6.0の互換目的でOSに付属しているだけだから、当てにしないほうが良い。
585おれ:2009/04/26(日) 15:14:33
ちょいと質問

CDialog を継承したクラスを
Create() すると、以降の処理が重くなるってあり得る?

class CMyDialog : public CDialog
{
...
}

を、

CMyClass::func()
{
...
CMyDialog *dialog = new CMyDialog();
dialog->Create(); // *1

*1の行をコメントアウトする/しないで、処理が重いんだ。でもCPU使用率とかI/Oに差はない。
なんでだろう。。。
586デフォルトの名無しさん:2009/04/26(日) 18:59:47
>>585
*1の行をコメントアウトする/しないで、何がどう変わるか理解しているか?
587デフォルトの名無しさん:2009/04/27(月) 00:31:38
質問です。
あるコントロールのウインドウハンドルが分かっていて、
それがエディットコントロールかどうかを知るにはどうしたらいいんでしょうか?
588デフォルトの名無しさん:2009/04/27(月) 01:44:46
GetClassName()
589デフォルトの名無しさん:2009/04/27(月) 06:48:31
それはハンドルじゃない気もするがMFCだからいいか
590デフォルトの名無しさん:2009/04/27(月) 09:26:18
ウインドウハンドルだが?
しかもMFCじゃなくてwin32apiだが?

int GetClassName(

HWND hWnd, // handle of window

LPTSTR lpClassName, // address of buffer for class name

int nMaxCount // size of buffer, in characters

);

591デフォルトの名無しさん:2009/04/27(月) 12:34:36
>>588, 590
ありがとうございました。うまくいきました。
592おれ:2009/04/30(木) 20:45:06
>>586
Dialogを表示する/しない
の差だと思っているが間違ってる?

表示してもイベント待ちになるだけで、処理が重くなるってことはないかと思ってたんだが。。。
593デフォルトの名無しさん:2009/04/30(木) 21:09:25
>>592
間違っている。ダイアログ(ウィンドウ)を作成する/しないの違い。
CMyDialog *dialog = new CMyDialog();
はオブジェクトを生成するだけでウィンドウは作成しない。
594デフォルトの名無しさん:2009/04/30(木) 22:09:30
CFileDialog dlg(FALSE, _T("jpg"), NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        _T("JPEG (*.jpg)|*.jpg|BMP (*.bmp)|*.bmp||"), this);
if (dlg.DoModal() == IDOK) {
AfxMessageBox(dlg.GetPathName());
}

というテストルーチンを実行し、
「BMP (*.bmp)」を選択した状態で拡張子を付けないで「保存」を押すと、
「bmp」の拡張子が付加されたファイルパス名が表示されます。

CFileDialogのコンストラクタをMSDNで読む限りは、
lpszDefExtに入れてある文字列「jpg」が付加されるのではと思ったのですが、
この引数はなんのためにあるのでしょうか?

もちろん、この動きのほうが、
「BMP (*.bmp)」を選択してるのに拡張子に「jpg」が付いてしまう
というような動きにならずに便利だとは思うのですが、
lpszDefExtがなんのためにあるのかわからず、
上記のような選択式の場合には何を入れておけばよいのか
わからなくなったため、質問させていただきました。
よろしくお願いいたします。
595デフォルトの名無しさん:2009/04/30(木) 22:13:27
すべてのファイル(*.*)|*.*|
を追加してみ
596デフォルトの名無しさん:2009/05/01(金) 17:05:12
VC2003のリソースエディタで
Toolbarを編集するとき
セパレータを追加するにはどうすればいいでしょうか?
597デフォルトの名無しさん:2009/05/01(金) 17:06:12
マウスでボタンを右にずらす
598デフォルトの名無しさん:2009/05/01(金) 17:07:22
>>597
できました!
ありがとうございます!
599デフォルトの名無しさん:2009/05/01(金) 21:17:39
>>595
「すべてのファイル (*.*)|*.*|」を選択した状態で
「保存」を押してみたところ、「jpg」が自動で付きました。
ここで使われるものだったのですか。

ということは、「*.*」を入れないときには、
lpszDefExtには何を入れても無意味ということになるのですね。
600デフォルトの名無しさん:2009/05/01(金) 21:29:19
>「*.*」を入れないときには、
>lpszDefExtには何を入れても無意味
そうではなく、君がフィルタでlpszDefExtとは別に「*.bmp」と「*.jpg」の拡張子を指定しているから。
フィルタを指定する場合は、lpszDefExtは NULL で足りる。
601デフォルトの名無しさん:2009/05/02(土) 09:15:19
Default Extension(拡張子初期値)
602デフォルトの名無しさん:2009/05/02(土) 14:38:29
タブコントロールで三つのダイアログをタブ操作可能なようにしたのですが
タブAについてるボタンを押された時と同じ処理をタブCでもしたい場合は
タブCにつけたボタンで同じ処理をかかなければいけないのでしょうか?
603デフォルトの名無しさん:2009/05/02(土) 14:51:01
そんなレベルのやつでもMFC使えるんだ
604デフォルトの名無しさん:2009/05/02(土) 15:01:24
そんなレベルのやつでもMFC使えるんだ (プゲラ
605デフォルトの名無しさん:2009/05/02(土) 15:13:04
>>602
両方から同じ関数を呼べばいいだろ
606デフォルトの名無しさん:2009/05/02(土) 15:36:27
ああ、いやプログラムスレはどこも一緒だなぁと思っただけだ
あふぉな質問したらどう返すんだろうなぁと思っただけでw
607デフォルトの名無しさん:2009/05/02(土) 22:33:45
誰?
608デフォルトの名無しさん:2009/05/03(日) 03:28:33
イベントを自動で追加したときにできる
END_MESSAGE_MAP()
の後ろの
urn 0;
ってどういう意味ですか?
609デフォルトの名無しさん:2009/05/03(日) 10:54:41
>urn 0;
ウチでは見たことがない。
消し忘れた return 0; のゴミじゃないのか?
610デフォルトの名無しさん:2009/05/03(日) 13:03:44
めちゃくちゃはずかしい><
611デフォルトの名無しさん:2009/05/03(日) 21:16:28
ダイアログベースのプログラムにてダイアログバーを表示するプログラムを作ってます。
このダイアログバーの右上にある×(閉じる)ボタンを押した時のイベントはどうやって検知すればいいのでしょうか?

WM_CLOSEやらWM_DESTROYやらWM_KILLFOCUSやらありえそうな大体のイベントに対応した
プログラムを書いてTRACE文で出力させるようにして試しましたが、
検知出来ませんでした。(最初の数回のみシステムの挙動によってイベント発生しているようですが、
その後自分で閉じたり出したり何回しても検知してません。)

ダイアログバーを×ボタンで消して再表示すると前回移動させた位置に表示してくれるってことは
非表示にしているだけなのでしょうか?

なんにせよ検知方法が分かりません。
誰か教えてくださいお願いします。
612デフォルトの名無しさん:2009/05/03(日) 21:21:54
まずソース読んで見ようとか思いつかないんだろうか
613デフォルトの名無しさん:2009/05/03(日) 21:30:57
Spy++ してみようとも思わんのだろう
614611:2009/05/03(日) 23:59:08
>>612
すいません。初心者なものでよく分からないのですがどこのソースを見ればいいんでしょうか?

>>613
Spy++使うと、自分のPCが固まってしまってctrl+alt+delも効かなくなり、
パソコン強制リセットボタンするしかなくなることが多々あるので怖くて使ってません。
615デフォルトの名無しさん:2009/05/04(月) 00:20:34
>どこのソースを見れば
MFCのソース。HDDにインストールされているからそれを読め。
616デフォルトの名無しさん:2009/05/04(月) 16:01:28
ドキュメントビューアーキテクチャで、リストビューを利用したプログラムなんですが、

デスクトップPC3台では問題なく動くのに、
ノートpc(EeePC701)だと、起動時ウインドウが表示される前にエラー終了します。

エラー報告のウインドウをみると、エラー著名のmodnameにcomctrl32.dllと表示されてます。

debugビルドのプログラムだとエラーになりません。

vs2005で、OSはすべてXPproSP3です。
ノートはメモリ2GでHDDも要領あまってます。

どんなところに問題ありそうですか?

617デフォルトの名無しさん:2009/05/04(月) 16:04:23
dllのバージョンの違いとか
つーかcomctrl32.dllを使わないMFCアプリではどうなの?
618616:2009/05/04(月) 16:06:55
>>617 レスありがとうございます。

昨日その辺でいろいろ調べたんですが、
debugビルドのexeファイルだと動きますし。
XPsp3が入っているのでそれはないかと。
619デフォルトの名無しさん:2009/05/04(月) 16:10:38
で、ListViewを使わないRelease版のやつは動くのか?
620デフォルトの名無しさん:2009/05/04(月) 16:16:05
>どんなところに問題ありそうですか
ノートPCとデスクトップPCでの相違点(ハードウェア・ソフトウェア環境双方)をピックアップしてみる。
どちらか一方にインストールされているソフトがあるとかね。
デバッグ版で動くなら、最適化なしでビルドしてみるという手もある。
621616:2009/05/04(月) 16:21:33
リストビューを使ってるプログラムを3つ作っているのですが、
他の2つは動きます。

動かないプログラムも、改良途中の今はソースがないバージョンのやつは起動します。

622デフォルトの名無しさん:2009/05/04(月) 16:40:44
バグっててたまたま問題起きないで動く場合もあるだけだろ
623616:2009/05/04(月) 16:49:19
>>622
そうですよね。もっと大きくて複雑な市販のソフトは通常に動作するわけですから。
やっぱりバグってたまたま動くのって、ポインタの初期化してないとか、その他、どんなところ見るのが普通でしょうか。
624デフォルトの名無しさん:2009/05/04(月) 17:16:43
ウィンドウも出ないんだろ?
どこまで実行できたか確認しようぜ。
あとイベントビューアは当然チェックしてるんだろうな
625デフォルトの名無しさん:2009/05/04(月) 17:17:58
あー同じやつでも動くのと動かないのとあるのか。
なら>>620の言うとおり、最適化はずしてみ。
626616:2009/05/04(月) 17:30:20
レスありがとうございます。

どこまで動くかコード削りながら探してます。
イベントビューアのエラー内容は、エラー報告に書いてあるのと同様でした。comctl32.dllのバージョンとエラー発生アドレス
が書いてあって、ググっても調査すすまなかったです。

ビルドの最適化設定は、動くプログラムと同じ設定なんですよ。バグをやっぱり見つけたい感じです。
627名無し募集中。。。:2009/05/04(月) 17:38:18
MFCライブラリをスタティックリンクすれば解決しそうな気がする
628デフォルトの名無しさん:2009/05/04(月) 17:42:57
>>623
>やっぱりバグってたまたま動くのって、ポインタの初期化してないとか、その他、どんなところ見るのが普通でしょうか。

ポインタだけでなく変数の初期化もチェック
リストビューなら構造体も色々使ってるだろうし。
629デフォルトの名無しさん:2009/05/04(月) 17:46:13
>>626
そうじゃねーだろ、切り分けのためにやってみろって言ってるんだよ。
何でも試してみて違いから何かを得られないなら何日デバッグしても見つからんだろうよ
630616:2009/05/04(月) 17:53:00
切り分けですよね。原因特定うまくいきました。
リストビューのソートで、三角形のソートマークを上下に切り替えているんですけど、
ソートマークの部分をすべて削ったら、動きました。
コードの内容をすぐに思いだせないので、とりあえず、内容は後で検証してみます。

前バージョンのやつは、ソートマーク付いているのに、なんでエラーにならないのか、ちょっと不思議なんですが。
ソートマークの部分なんて最近は点でいじっていなかったのに・・・

631616:2009/05/04(月) 17:53:30
//////////////////ソートマーク
m_pHdrCtrl = ListCtrl.GetHeaderCtrl();
m_pHdrCtrl->SetImageList(&m_imageH);

for(int i=0;i<5;i++)
{
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
for(int i=5;i<8;i++)
{
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= LVCFMT_RIGHT | HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
632デフォルトの名無しさん:2009/05/04(月) 17:53:38

if((SORT_ITEM_DATA.iSubItem)<5)
{
m_pHdrCtrl->GetItem(SORT_ITEM_DATA.iSubItem, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.iImage= SORT_ITEM_DATA.blSortFlag;
curItem.fmt= HDF_BITMAP_ON_RIGHT | HDF_IMAGE | HDF_STRING;
m_pHdrCtrl->SetItem(SORT_ITEM_DATA.iSubItem, &curItem);
}
else
{
m_pHdrCtrl->GetItem(SORT_ITEM_DATA.iSubItem, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.iImage= SORT_ITEM_DATA.blSortFlag;
curItem.fmt= LVCFMT_RIGHT | HDF_IMAGE | HDF_STRING;
m_pHdrCtrl->SetItem(SORT_ITEM_DATA.iSubItem, &curItem);
}
633デフォルトの名無しさん:2009/05/04(月) 18:05:39
>>631-632
細かく見てないので、ぱっと見で。
curItem はどこで宣言して、初期化はどうなってる?
あと、GetItem()する前にmaskにフラグ設定していないのは拙いんでは?
634616:2009/05/04(月) 18:06:14
m_pHdrCtrl = ListCtrl.GetHeaderCtrl();
int i=0;
m_pHdrCtrl->GetItem(i, &curItem);


これだけでノートPCだけエラーになります。

なんなんだ。
635616:2009/05/04(月) 18:11:58
public:
CImageList m_imageH;//ヘッダー用
HDITEM curItem;

curItemは、リストビューのメンバ変数として、ヘッダーファイルで、上のように書いてあるだけで初期化してないです。

勉強してきます。
636616:2009/05/04(月) 18:28:03
中途半端な理解ですが、とりあえず、
curItem.pszText が無効値になっていたので、 = NULL;をいれたら、ノートPCでも動くようになりました。
ありがとうございました。

for(int i=0;i<5;i++)
{
curItem.pszText = NULL;
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
for(int i=5;i<8;i++)
{
curItem.pszText = NULL;
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= LVCFMT_RIGHT | HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
637616:2009/05/04(月) 22:29:51
curItemをゼロメモリで初期化して、
Getitemなんかせずに、変えたいところだけをmaskで選択して、setitemすればよかったんですね。
かなりいい加減なことしていたな・・・
638デフォルトの名無しさん:2009/05/04(月) 22:39:38
基本ができていない証拠
639デフォルトの名無しさん:2009/05/05(火) 03:58:22
シングルドキュメントで((CMainFrame*)AfxGetMainWnd())でメインフレームを取得して子インスンタンスにアクセスしていきたいんですが
IsWindowでアクセス違反アサートで止まってしまいます。
マルチドキュメントのときはうまくいっていたんですが、シングルのときは違いがあるんでしょうか?他に違いがわからないんです
640デフォルトの名無しさん:2009/05/05(火) 08:17:13
シングルドキュメントが何を意味してるか知らないけど、
SDIのことだったら当然メインフレームは存在する。
子インスンタンス〜IsWindowでアクセス違反アサートの部分は
何について語ってるのか理解不能。
641デフォルトの名無しさん:2009/05/05(火) 10:01:44
>子インスンタンスにアクセス
って何?
642デフォルトの名無しさん:2009/05/05(火) 10:07:17
具体的に該当行書いてみりゃすぐわかるんだが
643デフォルトの名無しさん:2009/05/05(火) 12:45:12
位置関係はこれです。

class CMainFrame : public CFrameWndEx
{
CFileView m_wndFileView;
}

class CFileView : public CDockablePane
{
CThumbnailStatic m_ThumbnailStatic;
}

class CThumbnailStatic : public CStatic
{
void OnCreate{ASSERT(((CMainFrame*)AfxGetMainWnd())->m_wndFileView != NULL};
}

((CMainFrame*)AfxGetMainWnd())だけでもエラーになるんです。
644デフォルトの名無しさん:2009/05/05(火) 12:55:29
CThumbnailStatic のクラス定義で OnCreate() しているのか?
ならば、(CMainFrame*)AfxGetMainWnd() するとエラーになるのは当然。

なぜか?
AfxGetMainWnd() の実体がまだ存在していないからだ。
645デフォルトの名無しさん:2009/05/05(火) 13:42:10
宣言の中というかON_WM_CREATE()に対応したところの.cppに書いてます
OnCreateつながりで一通りの子が全てCreateされてからトップのMainFrameの実体ができるってことですか?
ということは、子のOnSizeとかOnPaintはMainFrameが出来る前に一度呼び出されているってことなんでしょうか?
フラグを立てて初回は実行しないようにしたんですが、同じエラーでます。MainFrameが出来上がるまでに
何回スルーしなきゃいけないんでしょうか
646デフォルトの名無しさん:2009/05/05(火) 13:53:06
>ON_WM_CREATE()に対応したところの.cppに書いてます
なぜちゃんとしたコードを示さない? 二度手間だろーが。

>MainFrameが出来る前に
親がいないのに子が生まれるわけないだろ。

ちゃんとしたコードを示せ
647デフォルトの名無しさん:2009/05/05(火) 14:09:50
コード適当だなあ・・・
このm_ThumbnailStaticはどこでCreateしているの?
648デフォルトの名無しさん:2009/05/05(火) 19:12:36
ThumbnailStaticはCFileViewのOnCreateで作ってます。

どこがいけないのか見当もつかないので
最小コードで再現しました。
MFCのSDIウィザードのひな形に3行追加しました。

//MainFrm.h
class CMainFrame : public CFrameWndEx
{
 CString path;
}

//MainFrm.cpp
CMainFrame::CMainFrame()
{
 path = _T("aaaaaa");
}

void CClassView::AdjustLayout()
{
 CString aaa = ((CMainFrame*)AfxGetMainWnd())->path;
}

これはIsWindowで引っかかるんじゃないんですがじゃないんですがエラーでます
CStringData* GetData() const throw()
{
return( reinterpret_cast< CStringData* >( m_pszData )-1 );
}
ここに飛んで止まります
何がいけないんですか?
649デフォルトの名無しさん:2009/05/05(火) 19:40:03
それで他人に何が伝わる?
650デフォルトの名無しさん:2009/05/05(火) 20:03:27
>>648
おまえの頭
651デフォルトの名無しさん:2009/05/05(火) 20:34:56
CString aaa = ((CMainFrame*)AfxGetMainWnd())->path;
の次はmfc90ud.dllの
//cstringt.h
// Copy constructor
CStringT( const CStringT& strSrc ) :
CThisSimpleString( strSrc )
{
}
//atlsimpstr.h
CSimpleStringT( _In_ const CSimpleStringT<BaseType, !t_bMFCDLL>& strSrc )
{
CStringData* pSrcData = strSrc.GetData();
CStringData* pNewData = CloneData( pSrcData );
Attach( pNewData );
}
//atlsimpstr.h
CStringData* GetData() const throw()
{
return( reinterpret_cast< CStringData* >( m_pszData )-1 );
}
ここで最後止まるんです。これはどういうエラーですか?
mfc90ud.dllでハンドルされていない例外
0xC0000005場所0x000003f4読み込み中アクセス違反
とでます。
652デフォルトの名無しさん:2009/05/05(火) 21:01:33
そもそも 他人には CClassView が何の派生であるのかも CMainFrame と
どういう関係にあるのかもわからんのだよ。
653デフォルトの名無しさん:2009/05/05(火) 21:05:04
VC++9からひな形に追加されたCDockablePane派生のCClassViewです。
654デフォルトの名無しさん:2009/05/05(火) 21:08:25
Paneの派生にViewとかつけるな、アホが。
655デフォルトの名無しさん:2009/05/05(火) 21:13:31
すいませんそれはMSに言ってください
656デフォルトの名無しさん:2009/05/05(火) 21:18:15
MFCのソース見るとこういう風に
AfxGetMainWndでNULL帰ってくる可能性を考慮して作ってあるから
真似しとけば問題ない

CWnd* pMainWnd = AfxGetMainWnd();
if (pMainWnd != NULL &&
657デフォルトの名無しさん:2009/05/05(火) 21:22:43
結論から言えば、AfxGetMainWnd() が NULL を返しているのがエラーの原因。
なぜなら、CWinApp::m_pMainWnd に値が代入される前にも CClassView::AdjustLayout() が呼ばれるから。

if ( AfxGetMainWnd() != NULL) CString aaa = ((CMainFrame*)AfxGetMainWnd())->path;

とすればエラーは生じないはずだ。
658デフォルトの名無しさん:2009/05/05(火) 21:37:31
うおーーーーーできました!ありがとう!!!
いつもフラグで初回実行回避とかやってました
勉強になりましたどうもです!
659デフォルトの名無しさん:2009/05/05(火) 21:39:26
660デフォルトの名無しさん:2009/05/05(火) 21:44:27
MFCの仕組みが詳しくわかる本ってありますか?
最初、林本で動くけど意味はわからない状態で、次に標準MFC本で大まかな流れはわかるが細かい挙動がわかるようにはなりませんでした
もっと徹底的な本はありますか?
661デフォルトの名無しさん:2009/05/05(火) 21:48:48
MFCつかわないでWinAPIのみでプログラム組んでみれば?
662デフォルトの名無しさん:2009/05/05(火) 21:52:27
すでに君は徹底的なものを手に入れている。HDDにインストールされているMFCのソースだ。
細かい挙動は、ソースを遡ればわかるようになる。これは冗談ではない。
663デフォルトの名無しさん:2009/05/05(火) 22:27:02
林本読んでるような相手にソース嫁って厳しすぎないか?
664デフォルトの名無しさん:2009/05/05(火) 22:41:23
「MFC の学習のための必要条件」
・Windows のプログラミングについての知識があること
・C++ によるプログラミングの基礎知識があること
・オブジェクト指向プログラミングの基礎を理解していること

これは http://msdn.microsoft.com/ja-jp/library/e4y1ezf5(VS.80).aspx に書いてあることなんだが、
これができてるならソース読めば内容はわかるだろ?
つまりは、MFCを勉強する前にこれを勉強しなきゃダメってことだ。
665デフォルトの名無しさん:2009/05/06(水) 01:26:38
CRichEditCtrl::GetLineのMFCコードってどこにインストールされているんですかあ
666デフォルトの名無しさん:2009/05/06(水) 04:19:07
Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxcmn.inl(650):
Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winctrl4.cpp(77):
Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winctrl4.cpp(132):

VS2008での話だがな
667デフォルトの名無しさん:2009/05/06(水) 16:11:24
MFCのウインドウプロシージャってどういう過程でAfxWndProcBase()に登録されるの?
AfxEndDeferRegisterClass()の中からRegisterClass()で登録している関数は
 wndcls.lpfnWndProc = DefWindowProc;
こんな風になっているんですが?
#こんな関数を登録しているのも謎なんが・・・
#DefWindowProcを登録したらWM_*をうけれなくなるんじゃないの?
668デフォルトの名無しさん:2009/05/06(水) 16:19:17
ウィンドウハンドルと CWnd(あるいはその派生)オブジェクトとの関連付けがなされる際に
サブクラス化され、メッセージはサブクラスプロシージャによって処理されている。
だから、クラス登録時のプロシージャは DefWindowProcでもいっこうにかまわない。

MFCだけでなく、独自のクラスライブラリを作る際にもよくあるパターン。
669デフォルトの名無しさん:2009/05/06(水) 16:41:10
ってことはRegisterClassしてからCreateWindowするまでにサブクラス化している?

あれ?CreateWindowして初めてサブクラス化する時に使うHWNDが取得出来るんじゃないの?
それにCreateWindowした時に発生するWM_CREATEはなんでサブクラス化したプロシージャにくるんだろ?
670デフォルトの名無しさん:2009/05/06(水) 19:35:20
ソース読め
671デフォルトの名無しさん:2009/05/06(水) 19:38:06
あんまり関係はないが、CreateWindow() した時に発生する最初のメッセージは WM_CREATE ではない
672デフォルトの名無しさん:2009/05/06(水) 20:28:25
>>669
SetWindowsHookExのWH_CBTで受け取るコールバックに、
HCBT_CREATEWNDというのがある。
673デフォルトの名無しさん:2009/05/06(水) 20:33:07
拡縮が必要で一度CDCに描画した元画像のBMPをサムネイル画像としてクラスに保持するためにCBitmapに入れ直そうと思ったのですが
これどうやればいいんでしょうか
674デフォルトの名無しさん:2009/05/06(水) 20:48:21
>一度CDCに描画した元画像
この元画像は、もともとCBitmapで読み込んでいるんじゃないのか?
675デフォルトの名無しさん:2009/05/06(水) 20:48:58
メモリDCにビットマップを選択した後にそこへ描画すれば、
そのビットマップの内容は更新される。
676デフォルトの名無しさん:2009/05/06(水) 20:53:08
そうだったんですか!
CBitmapを保持するだけで次にそのままDCに送れば拡縮された状態ってことですね
ありがとうございました
677667,669:2009/05/07(木) 00:52:26
あぁ!フックってこういうものなのか。単語は聞いた事あったけどどういうものか知らなかった。
なるほどね。イベントに引っ掛けるから"フック"ね。
確かに、_AfxCbtFilterHook中にウインドウプロシージャをセットするコードがあった。

勉強になった。ありがとう
678デフォルトの名無しさん:2009/05/07(木) 02:42:21
StretchBltで縮小した後もCBitmapのインスタンスにロードされている画像のサイズが変わりません
SRCCOPYの指定がおかしいんでしょうか?
679デフォルトの名無しさん:2009/05/07(木) 03:43:45
StretchBltは「元の画像」を描画先に拡縮して表示する関数であって「元の画像」そのものを拡縮する関数ではない
680デフォルトの名無しさん:2009/05/07(木) 04:24:40
CDC.StretchBltから
CImage.StretchBltに変えてCImageに書き込まれるように書き換えたんですがエラーがでます。
この考え方はおかしいですか?コンパイルは通るんです

あとSelectOblectの戻り値が現在のオブジェクトとなってるので違う方法も試したんですが詰まりました
これもコンパイル通るんですがAttachで止まります。元画像を縮小したサムネイルだけを画像系のインスタンスで保持しておきたいんです

CImage imgSave;

void CStaticBox::OnPaint()
{
 if(imgSave.IsNull){
  CPaintDC dc(this);
  CDC m_memDCMain;
  CBitmap m_bmpMain;
  m_memDCMain.CreateCompatibleDC(&dc);
  m_bmpMain.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
  m_memDCMain.SelectObject(&m_bmpMain);
  m_memDCMain.SetStretchBltMode(HALFTONE);

  CDC myDC;
  myDC.CreateCompatibleDC( &m_memDCMain );
  CImage img;
  img.Load(activeFullPath + fileName);
  myDC.SelectObject( img );
  m_memDCMain.StretchBlt( left+10, top+10, width-20, height-20, &myDC, 0, 0, img.GetWidth(), img.GetHeight(), SRCCOPY );
  HBITMAP* imgBMP = ( HBITMAP* )m_memDCMain.SelectObject( CImage() );
  imgSave.Attach( *imgBMP );
 }
}
681デフォルトの名無しさん:2009/05/07(木) 05:57:29
すいませんめちゃくちゃ頭悪いことしてました忘れてください
bmpMainを外に書くだけでした
682デフォルトの名無しさん:2009/05/07(木) 13:15:18
>bmpMainを外に書くだけ
オブジェクト指向プログラミングするなら、グローバル変数はあまり使わないほうがいい。
683611:2009/05/07(木) 22:28:50
ようやく解決しました。MFC閉じるボタンで検知とかのキーワードでググると
このスレが真っ先に出てくるので後続の人の為に残しときます。

×ボタンを押すとダイアログバーでWM_WINDOWPOSCHANGINGイベントが発生し、
void ダイアログバーのクラス::OnWindowPosChanging(WINDOWPOS* lpwndpos)
の追加した関数に渡される変数を判定し
if(lpwndpos->flags & SWP_HIDEWINDOW)

  この部分に閉じるボタン押下時処理を書きます。


これはShowControlBarをフレームウィンドウで使用して閉じた時にも発生しますが、
アプリケーション終了時は発生しません。


>>612
>>613
親切丁寧なアドバイスありがとうございました!!
684デフォルトの名無しさん:2009/05/07(木) 23:52:42
いやさ〜。前の人に文句言うわけじゃないけど、MFCなんてJavaかC#やったことあるひとなら、
C++ならこう書くのか〜って辞書引きながらやれば、一挙に2つ覚えちゃうよね。ついでにC++も余分なページよんだりしながらさ。
685デフォルトの名無しさん:2009/05/08(金) 00:27:54
JavaやC#が先な辺りに時代を感じる。
俺がMFC始めた頃なんて、Javaは生首が回り始めた頃だったからな。
686デフォルトの名無しさん:2009/05/08(金) 05:33:39
CImage folderImg;
folderImg.LoadFromResource(AfxGetInstanceHandle(), _T("folder.png"));
これ実行したらExpression:hBitmap != 0;
とかいうエラーが出ました
リソースファイルに.pngファイル入れるだけじゃだめなんですか?
687デフォルトの名無しさん:2009/05/08(金) 07:43:08
>>686
そもそも本当に"folder.png"というリソースIDなのか?
CImage::LoadFromResourceは::LoadImageを呼び出すので、
結局PNG画像の読み出しには対応できないのだけどね。
IStream経由で読み込ませるようにお膳立てしてやる必要がある。
あと、リソースハンドルの取得用にAfxGetResourceHandleというのがある。
688デフォルトの名無しさん:2009/05/08(金) 13:16:33
pngリソース 読み込み
あたりでググれば、いくらでもでてくるだろーに。
689デフォルトの名無しさん:2009/05/10(日) 06:19:55
できません
CImage img;
img.LoadFromResource(GetModuleHandle(NULL), IDB_PNG1);

GetModuleHandle(NULL)でも
AfxGetApp()->m_hInstanceでも
AfxGetInstanceHandle()でも
AfxGetResourceHandle()でも
この行でエラーになります
どいういうことですか?
IDB_PNG1はリソースビューでPNGフォルダの中に入ってるんです
ソリューションエクスプローラの中のリソースファイルフォルダの中にもfolder.pngが入ってます
690デフォルトの名無しさん:2009/05/10(日) 07:22:14
>>689
687をもう一度よく読みなおせ。
691デフォルトの名無しさん:2009/05/10(日) 12:35:32
>>689
VSのバージョンとかOSとかは何なん?
692デフォルトの名無しさん:2009/05/10(日) 12:58:31
PNGイメージは LoadFromResource() できない。VS、OSの種類とは無関係。
693デフォルトの名無しさん:2009/05/10(日) 15:04:56
ぐぐればでてきたぞ

1. FindResource関数でリソースハンドルを取得
2. SizeofResource関数でサイズを取得
3. LoadResource関数でリソースを読み出しLockResource関数でをロック
4. GlobalAlloc関数でメモリを確保
5. GlobalLock関数でメモリをロック
6. CopyMemory関数でリソースを確保したメモリにコピー
7. CreateStreamOnHGlobal関数でストリームを作成
8. Bitmap(またはImageクラス)のFromStreamメソッドでBitmapオブジェクトを作成
694デフォルトの名無しさん:2009/05/10(日) 15:08:56
>>688 にそう書いてあるだろ
695デフォルトの名無しさん:2009/05/11(月) 00:24:26
チンポの先の我慢汁をとるプログラムを作成してください><;
696デフォルトの名無しさん:2009/05/11(月) 10:05:03
          ;' ':;,,     ,;'':;,
         ;'   ':;,.,.,.,.,.,,,;'  ';,
        ,:'           : :、
       ,:' /  ,,. 、.\  ノ( ::::::::',
       :'  ∩     ∩ ⌒   :::::i.
       i  ''' (_人_) '''' *   :::::i      
        :    {+ + +}      :::::i   
       `:,、   ̄ ̄      ::::::::: /    
        ,:'        : ::::::::::::`:、
        ,:'         : : ::::::::::`:、
697デフォルトの名無しさん:2009/05/14(木) 22:34:35
 
698デフォルトの名無しさん:2009/05/15(金) 00:44:51
MFCをやる人はMVC構造とかを意識しない人が多いですね。
Document/Viewでもイヤな感じなのに、
ダイアログクラス上で全部やってるソースとか見ると発狂しそうになる。
699デフォルトの名無しさん:2009/05/15(金) 01:32:52
MVCはよくてDocument/Viewがイヤ?
それはあれか、FireWireはよくてi-Linkはイヤとかいう類か?

ともかく最後の一行だけは共感できる。 MFCあんま関係ないけど。
700デフォルトの名無しさん:2009/05/15(金) 12:43:27
>>699
Control と View を分離しる!という御意見なんじゃね?
知らんけど。
701デフォルトの名無しさん:2009/05/15(金) 13:26:26
[MVCの場合]

M-C-V1
   |-V2
   |-V3

[Document/Viewの場合]

M--VC1
  |-VC2
  |-VC3

Controllerの処理は、Viewがちゃんと抽象化されていれば一つにまとめることができるはずなのに、
Document/Viewの場合は同じようなControllerの処理をViewごとに重複して書くので無駄。
702名無し募集中。。。:2009/05/15(金) 17:06:32
> 同じようなControllerの処理をViewごとに重複して書く
抽象化したViewを作って派生させれば良いんじゃないの
703デフォルトの名無しさん:2009/05/15(金) 18:37:47
ダイアログベースのプログラムを作っています。
環境はVC++.NETです。

ダイアログ上に配置したピクチャーボックスの中でLBUTTONDOWNを検知した時に、
setCaptureして、カーソルをドラッグすることで別ウィンドウの内容を変化させ、
LBUTTONUPを検知したときにReleaseCaptureするプログラムを作ろうとしているのですが、
イベントハンドラを追加しようとしてもピクチャーボックスにはマウスクリックイベントしか追加できません。

ピクチャーボックス内のマウスダウンイベントを検知するのは不可能なのでしょうか?

可能であれば出来るだけそれを使いたいと思ってますが不可能であれば、ダイアログにたいするマウスダウンイベントを
検知して、マウス座標をGetMessagePosやScreenToClientなどを使って、該当ピクチャーボックス範囲内かどうかを
判定して代用するしかないのでしょうか?

よろしくお願いします。
704デフォルトの名無しさん:2009/05/15(金) 18:48:20
SS_NOTIFY スタイルつけているか?
705デフォルトの名無しさん:2009/05/15(金) 20:33:44
[クラスで使用可能なメッセージ用フィルタ] ボックスでは、
特定の種類のクラスまたはウィンドウだけに適用されるメッセージを指定するためのフィルタを変更できます。

でできなかったっけ?
706703:2009/05/15(金) 20:48:30
>>704

リソースエディタから該当ダイアログ(厳密にはダイアログバー)上のピクチャーボックスのプロパティを開き、
表示カテゴリの「Notify」をTrueに設定しましたが状況は変わりません。
これとは別物でしょうか?

該当ダイアログを生成しているCreate文にSS_NOTIFY スタイルを付けて見ましたが、
やはりイベントハンドラの追加で指定できるメッセージは
STN_CLICKED
STN_DBLCLK
STN_ENABLE
STN_DISABLE
NM_THEMECHANGED
のみです。
707デフォルトの名無しさん:2009/05/15(金) 20:55:40
>ピクチャーボックス内のマウスダウンイベントを検知するのは不可能なのでしょうか?
CStaticの派生にして、そこにマウスイベントのメッセージハンドラを追加すれば?
708703:2009/05/15(金) 21:11:35
>>707

いまいちCstaticの派生にするという意味が分からないのですが、
ダイアログ上のピクチャーボックスのみの為に新たにクラス作成するという事でしょうか?
その場合、新たに作ったクラスはそのままでは機能しないかと思いますが、
(サブダイアログクラスであれば、Createメソッドで実体を作りますが、コントロールのクラスは良く分かりません)
上記認識が正しいのであれば、簡単な説明のあるURLか検索キーワードを教えていただけないでしょうか?
709デフォルトの名無しさん:2009/05/15(金) 21:24:51
1. CStaticの派生クラスを作成する ex.「CMyStatic」
2. リソースエディタで、当該ピクチャーボックスを「CMyStatic」のメンバ変数として追加する。


710デフォルトの名無しさん:2009/05/15(金) 21:27:26
日本語としてわかりにくいかもしれないので修正
>「CMyStatic」のメンバ変数として追加する。

「CMyStatic」型のメンバ変数として追加する。

711デフォルトの名無しさん:2009/05/15(金) 21:41:16
>>709-710
と俺も思ったのだが、VS2008だと派生クラスが選択肢に出なかった。
とりあえずCStaticで追加しておいて、
クラス名だけ派生クラスのものに直接書き換えておけばOKだと思う。
712デフォルトの名無しさん:2009/05/15(金) 21:45:05
>>711
選択肢はでないけど、「変数の種類(V)」のコンボボックスに直接書き込めるだろ。
このコントロールはドロップダウンコンボであって、ドロップダウンリストじゃないんだから。
713703:2009/05/15(金) 21:58:11
いまいちよく分からないのですが、
ピクチャーボックスをDDX変数にするということでしょうか?
714デフォルトの名無しさん:2009/05/15(金) 22:03:20
そうだよ。
念のため言っておくが、そのピクチャーボックスのIDは、もちろん IDC_STATIC 以外だろうな。
715703:2009/05/15(金) 22:08:44
>>714
IDは一応全部オリジナルに設定しています。

まだプログラム歴浅くて、DDX変数などを使い慣れてません。
(リソースエディタで右クリックから変数追加してもコントロール変数とか
チェック出来なくなってる・・・)
とりあえず色々あがいて見ます。
ありがとうございました。
716703:2009/05/15(金) 23:40:59
結局ピクチャーボックスの所属するダイアログのマウスダウンイベント時に
CRect myrec;
this->GetDlgItem(IDC_PICT_1)->GetWindowRect(myrec);
ScreenToClient(myrec);

後はpoint.x point.yがmyrec.left right top bottomの中に所属するか判断して
コード記述することにしました。
717デフォルトの名無しさん:2009/05/15(金) 23:45:03
>後はpoint.x point.yがmyrec.left right top bottomの中に所属するか判断
myrec.PtInRect( point);
718703:2009/05/15(金) 23:49:37
if( myrec.PtInRect(point) )
これでいけた。
719703:2009/05/20(水) 20:57:53
703です。またですすいません。
もう一歩ごとに躓いてます。

ダイアログバー(ツールバー)でのドラッグなどのアクションを検知して、
ビュークラスでの表示内容をリアルタイムに変化させたいのですが、
ダイアログバーからビュークラスの関数を起動する方法が分かりません。

・最初に考えた案
ダイアログバークラスにメンバとしてビュークラスオブジェクトのポインタを持たせる。

コンパイル時にヘッダファイルなどが循環参照してしまう。色々調べて見ても、
仮に無理やりやれたとしても、あまりプログラムとして美しくない作りなんではないか?

・次に考えた案
どうしても無理だったらsendmessageみたいなものを調べて使って、メッセージをやりとりする
プログラムにすべきなのか?

なんとなく、有り得ないんじゃないかと却下。

・現在の最終有力候補
よく見たらアプリケーションクラスの変数参照できてる(theApp)。
アプリケーションクラスで関数作ってダイアログバーからアクションしてビューに反映したい場合は、
アプリケーションクラスを中継すればいいのではないか?

これが、MFCのプログラミングにおいて正しい方法、定石的な方法なのかアドバイスお願いします。
720デフォルトの名無しさん:2009/05/20(水) 21:24:12
>コンパイル時にヘッダファイルなどが循環参照してしまう
記述法がまずいんだと思う。

>メッセージをやりとりする
ダイアログバーとビューで直接メッセージをやりとりするなら、
どちらかのポインタがどちらかに必要になる。つまり、「最初に考えた案」に戻ることになる。

>現在の最終有力候補
最も簡単ではあるが、バーの挙動をCWinAppクラスが知っている必要はない。
中継方法でやるとすれば、バーとビュー双方のポインタを取得できるフレームウィンドウクラスあたりか。

僕なら最初の案でやるか、フレームウィンドウを中継するか、かな。
721デフォルトの名無しさん:2009/05/20(水) 23:26:19
ツールバーと同じ動きが定石だろ
722703:2009/05/20(水) 23:28:04
>>720

すばやい回答ありがとうございます。
たしかにAppクラスが行うべき処理というよりはフレームウィンドウクラスがやるべきかと思います。
また、Viewクラスのポインタを持つのはオブジェクト志向なプログラムという点では好ましくないかとも思いました。

で、問題はダイアログバーからフレームウィンドウクラスのメンバ関数を実行する手段で、
フレームウィンドウクラスのヘッダファイルをダイアログバーのクラスでインクルードすると色々エラーがでてコンパイルできず、
かといってフレームウィンドウクラスをインクルードしなければメンバ関数なんて実行出来ない・・・。
関数ポインタを使うのか・・とか言う以前に、Viewクラスのポインタ持つのとやってることが同じ・・・。

やはり諦めてアプリケーションクラスにViewコントロール用の新規オブジェクトを持たせるほうがよいか・・・。
いやそれならフレームウィンドウクラスに持たせるべきか・・。
足掻いて試行錯誤してみます。
723703:2009/05/20(水) 23:33:25
>>721
ググって見てもツールバーは大抵イベントハンドラを追加して、
フレームウィンドウでクリックイベントを受けているのですが、
自分の場合マウスムーブイベントを取りたいのにそれの追加方法が調べてもイマイチ分かりませんでした。
ためしにフレームウィンドウにマウスムーブメッセージ取得する内容を入れてみてもどうも検知してる様子が無い。
マウスムーブはビュークラスかサブダイアログクラスじゃないと取れないんじゃないかと自分は勝手に結論付けています。
724デフォルトの名無しさん:2009/05/20(水) 23:37:28
// ダイアログバークラスにて
CFrameWnd* pFrame = (CFrameWnd*)AfxGetMainWnd(); // フレームウィンドウオブジェクトのポインタを取得
CMyView* pView = (CMyView*)pFrame->GetActiveView(); // ビューオブジェクトのポインタを取得

>フレームウィンドウクラスのヘッダファイルをダイアログバーのクラスでインクルードすると色々エラーがでてコンパイルできず、
ヘッダにインクルードする必要は生じない。やはり記述法がおかしい。
725703:2009/05/20(水) 23:53:01
>>724

記載の方法であっさりいけました。
ただ自分がダイアログバーのクラスのヘッダにインクルードするのにこだわってたのは、
一度取得したポインタを一度読んだ後はずっと保持したかったからですが、

マウスムーブイベントだと瞬間的に無数にポインタの設定と破棄が何千何万と繰り返される事になると思いますが、
心配するほど影響は無いのでしょうか?
726デフォルトの名無しさん:2009/05/21(木) 00:18:37
>一度取得したポインタを一度読んだ後はずっと保持したかったから
保持するのは「ポインタ」なんだから、ヘッダにインクルードする必要はないんだ。
クラスの前方宣言、あるいは先送り宣言と呼ばれるものについて一度調べてみ。







727703:2009/05/21(木) 00:22:33
グローバル変数としてやってみます。
ありがとうございました。
728703:2009/05/21(木) 00:23:33
>>726
ありがとうございます。
調べて見ます。
729名無し募集中。。。:2009/05/21(木) 00:27:33
ヘッダのクラス定義前に class hoge;としておいて
クラス内にhoge *m_pHogeというメンバ変数を記述するのはエラーにならない
cppのほうでclass hogeのヘッダをインクルードして、m_pHogeを使えばいい
730デフォルトの名無しさん:2009/05/21(木) 00:39:07
ポインタの保持はプログラム設計的には大罪だから
なるべく使わない方法を心がけるほうがいいぞ
731デフォルトの名無しさん:2009/05/21(木) 00:43:16
もっとも、MFCは山ほど保持しているけどな(笑)
732デフォルトの名無しさん:2009/05/21(木) 06:24:13
MFCはしょうがねぇんだよな
この継承して作っていく方式がどうしてもポインタ保持をしなければいけない仕組みにしてしまう
そうでなかったらなかなかやらないんだけどね
733デフォルトの名無しさん:2009/05/21(木) 21:45:43
>>730
>ポインタの保持はプログラム設計的には大罪だから
お前は何を言っているんだ
734デフォルトの名無しさん:2009/05/21(木) 22:43:43
>>733
インスタンス消えても気づかないで爆死確定だぜ
保持はしないで引数で渡すのが正しいプログラム
735デフォルトの名無しさん:2009/05/21(木) 22:46:39
>インスタンス消えても気づかないで爆死確定
それはプログラマの個人的な大罪
736デフォルトの名無しさん:2009/05/22(金) 06:29:33
>>735
でもこれスマートポインタとか使って逃げると今度は構造的な不具合が酷い
死なないだけで値やステータスが知らずに変わってることで起きる不具合に
悩まされる
俺的結論としては保持しないのが一番
737デフォルトの名無しさん:2009/05/22(金) 06:30:29
ただし、MFCは構造的に仕方がないとしている
もう保持しまくり
738デフォルトの名無しさん:2009/05/22(金) 11:01:57
>>736
>でもこれスマートポインタとか使って逃げると
逃げるなよ。立ち向かえよ。
>俺的結論としては
ヘタレめ。
739デフォルトの名無しさん:2009/05/22(金) 13:28:52
>>736
それはおまえの頭の欠陥だよ。
どんな仕様で実装しようが、問題なく組むのがプログラマの仕事だ。

結論として、おまえにはポインタさえ使いこなせないということだ w
740デフォルトの名無しさん:2009/05/22(金) 17:18:55
スマートポインタを使えば「問題なく組む」ことになるのか?
741デフォルトの名無しさん:2009/05/22(金) 17:29:53
手を抜きたいだけでしょ
742デフォルトの名無しさん:2009/05/22(金) 20:50:44
>>740
スマポ使っても落ちないだけ
知らない間に値が変わってるバグは放置状態になる
743デフォルトの名無しさん:2009/05/22(金) 21:20:31
DeepCopyが基本

って結構前に誰か書いていた記憶がある。
.NET出た頃か、もしかするとそれより前かもしれない。
744デフォルトの名無しさん:2009/05/26(火) 08:26:42
…これ以上突っ込んだらスレ違いだから黙っとく。
745デフォルトの名無しさん:2009/05/29(金) 04:30:21
>>13

・・・ やべぇ この人 コナンみたいな推理力だ・・・ 世の中には、こんな鉄人がおるのか!!!
746デフォルトの名無しさん:2009/06/01(月) 20:46:06
>>740
スマートポインタ使ったところで結局参照数の管理しなきゃいけないからな
通常のポインタ使いこなせずリーク起こすような奴は
スマートポインタでも問題起こすだろ

>>743
そんな基本はねえよ
どう考えてもケースバイケースだ
747デフォルトの名無しさん:2009/06/02(火) 03:02:47
>>746
「参照数の管理しなきゃいけない」って意味がよく分からないのだけど。
748デフォルトの名無しさん:2009/06/02(火) 07:22:35
shared_ptr/weak_ptr/intrusive_ptrでググってくれ
749デフォルトの名無しさん:2009/06/02(火) 12:11:34
>>747
そいつは真性のヴァカだ。スマポ自体理解してないと思われ。ほっとけ。
そもそも、気にくわないなら、スマポを自分で実装するなんて発想もないに違いない。
750747:2009/06/02(火) 16:04:33
いや、boost::shared_ptrとかが内部で参照数をカウントしてるのは知ってるよ。
いまの話って、そういうスマートポインタを使用する側の話じゃないの?
>>749が言ってるのはよく意味が分からん。普通は自分で実装しないだろ。
751デフォルトの名無しさん:2009/06/02(火) 16:16:37
>>747>>746はほっとけって言ってるんでしょ。
自分で実装した場合どんなふうにするか、を考えるのも内部を理解する一つの手だと思うけどね。
752デフォルトの名無しさん:2009/06/02(火) 16:18:46
あ、理解した。
まあ、俺もshared_ptrの中身を覗いてみたことはあるよ。自分で完璧に作るのは大変そうだなとは思ったが。
753デフォルトの名無しさん:2009/06/02(火) 18:51:51
shared_ptrとweak_ptrを正しく使い分けることを
参照数を管理する、・・・とは言わんか
754デフォルトの名無しさん:2009/06/02(火) 19:00:09
スレタイ読めないやつ
755744:2009/06/03(水) 03:23:03
折角スルーしてたのに >>746 ときたら…
756デフォルトの名無しさん:2009/06/06(土) 17:18:51
 
757デフォルトの名無しさん:2009/06/09(火) 21:28:46
MFCのCTreeCtrlについて質問があります。
CTreeCtrlを継承して自作のチェックボックス付きツリーを作成しようとしています。
特定アイテムのみにチェックボックスを付けたいのですが、スタイルを指定するとすべてのアイテムに対して
チェックボックスが付きます。
1階層目はチェックボックスなし、2階層目は有りなど、個別にチェックボックスを付けることは可能でしょうか?

758デフォルトの名無しさん:2009/06/09(火) 21:32:24
自分で描画すれば可能
759757:2009/06/09(火) 21:47:30
>>758
返信ありがとうございます。
自分でチェックボックスのイメージを作成して、アイテムに付けるということですよね。
すべての階層のアイテムにチェックボックスとは別にイメージをつける必要があります。
2個のイメージを並べて表示させることは可能ですか?

イメージとしては、エクスプローラー風のディレクトリツリー(絵付き)で特定アイテムのみにチェックボックスを付ける
ことをやりたいと思っています。 
760デフォルトの名無しさん:2009/06/10(水) 18:37:54
自分で描画すれば可能
761デフォルトの名無しさん:2009/06/10(水) 18:51:03
MFCを捨ててWPFでやる
762デフォルトの名無しさん:2009/06/11(木) 12:06:54
ちょっとしたことなのですが、
ダイアログアプリで、タブコントロールを使ってます。
なので、タブ指定時に子ダイアログの作成、操作を行います。

子ダイアログの操作(ボタン選択)をした時に、 親のダイアログのオブジェクト操作
(例えば、親ダイアログのボタンのグレーアウトなど)を行うときは、
1,子から親のウィンド(GetParent())を取得して、直接操作を行う。
2,子から親にSendMessege()でメッセージを送り、親側で操作を行う。

1,2のどちらが定石なのでしょうか? それともどちらでも問題ないとか?
763デフォルトの名無しさん:2009/06/11(木) 12:37:19
どっちでもいいのでは?
手間を省こうとすれば、子ダイアログオブジェクトの作成時に親ダイアログのthisポインタを渡すので、
GetParent() せずに、それをそのまま使うかな。
764デフォルトの名無しさん:2009/06/11(木) 16:29:52
>>763
以前、先輩から、子ダイアログから親を操作するのは、あまり良くないという
話を聞いたので、一般的な定石はどちらなのかな??と思い質問しました。
765デフォルトの名無しさん:2009/06/11(木) 16:48:32
例えばメニューを選択したりツールバーのボタンを押したときに
ダイアログのボタンをグレーアウトしたいと思ったら
グレーアウトする処理をどこに書くか考えればわかるだろ
766デフォルトの名無しさん:2009/06/11(木) 18:33:48
親ダイアログと子ダイアログを分けて考えるのが変
767デフォルトの名無しさん:2009/06/11(木) 18:53:35
ボタンを Enable/Disable する関数(コード)そのものはそのボタンをもつダイアログクラスに書く。
「子ダイアログの操作(ボタン選択)をした時に」とあるので、その関数のトリガーを引くのは子ダイアログ。
768デフォルトの名無しさん:2009/06/11(木) 19:11:08
>>766
クラスの巨大化とSRP違反を避けるために
分けるのは普通だろ

Oberverパターンで子からの呼び出し受けとるのが最も標準的だな
769762:2009/06/11(木) 19:16:47
レスありがとうございますm(_ _)m

>>766, 767
タブコントロールを使用した場合、
タブの切り替えを、現状のダイアログの上に子ダイアログ(枠なし)を新たに作成して、
表示、非表示で切り替えています。 ↓これを参考に作成しました。
ttp://www.g-ishihara.com/mfc_ta_01.htm

例えば、タブ内のダイアログ(子) の"実行"ボタンを押した場合、
親ダイアログの一部のオブジェクト(ボタンやエデットボックスなど)を使用不可にしたいと思っています。

767さんの言われるとおりなら、親のボタンは親の関数で実行する。
子から親の関数を直接的に呼ぶのではなく、メッセージを送信して間接的に処理依頼をする方法の方が
良いとのことですよね?
770名無し募集中。。。:2009/06/11(木) 19:44:34
親ダイアログに「オブジェクト操作」関数を用意して、子ダイアログから親の関数を呼ぶくらいは良いんじゃないかな
メッセージが適切な場合もあるが、煩雑になって見難いソースになるほうがイヤだが
親のボタンのグレーアウトまで子ダイアログクラスに記述するのは美しくない、かな。
771767:2009/06/11(木) 20:59:31
>メッセージを送信して間接的に処理依頼をする方法の方が
>良いとのことですよね?
パブリックな親オブジェクトの関数を子オブジェクトから呼ぶ、という意味。>>770氏の書いてるのと同じだね。

メッセージ送信は「ウィンドウ」に対しておこなうわけだから、今回のようにオブジェクトを確定的に取得できる
場合は迂遠な方法になってしまうよな。
772デフォルトの名無しさん:2009/06/13(土) 07:16:10
複数のチェックボックスのBool型メンバ変数の値を読み込み、そのパターンから値を一つ返す関数を作りたいと考えています。
例えばチェックボックスが3つなら、8パターンあり、返す値としては8個になります。4つなら、16個です。

こういう関数を実現するにあたり便利な関数などあれば教えていただければ幸いです。
773デフォルトの名無しさん:2009/06/13(土) 08:48:08
とりあえずmfcの関数にはないからmfc以外で探せ
ということで以下終了
774デフォルトの名無しさん:2009/06/13(土) 16:08:57
シフト演算でいいんじゃ?
775デフォルトの名無しさん:2009/06/14(日) 02:16:01
どのビットがどのチェックボックスなのかの紐付けがエグいことになりそうだ。
わざわざ返り値でやる意味あんのかね?

まぁ、俺の感知するところではないから、>>773が正しいでやっぱ終了だな。
776デフォルトの名無しさん:2009/06/14(日) 03:37:31
? 簡単にできると思うがね。
777名無し募集中。。。:2009/06/14(日) 13:12:20
UpdateData();
value = ( m_Check1 ? 1 : 0 ) + ( m_Check2 ? 2 : 0 ) + ( m_Check3 ? 4 : 0 ) ;
778デフォルトの名無しさん:2009/06/14(日) 13:16:32
汎用的な関数の話じゃなかったのか?
779デフォルトの名無しさん:2009/06/14(日) 20:21:16
普通の整数使ったフラグの処理
普通過ぎて、そういう「便利な関数」があるかと言われれば無い
て事でしょ
780デフォルトの名無しさん:2009/06/16(火) 12:11:16
MFCで可変配列を使いたいときって、
CArray , vector(STL) , その他 どれを使うのが普通ですか?
特にシリアル化は必要ないです。
781デフォルトの名無しさん:2009/06/16(火) 12:24:39
使い方が容易なので C*Array をよく使うが、「どれを使うのが普通」がというものはない。
用途に応じて使い分ければいいだけ。
782デフォルトの名無しさん:2009/06/16(火) 12:26:11
各クラスには、それぞれ長所・短所。自分の用途に合わせて使い分けろ。
それが分からんなら、動くことを優先して、どれでもいいから使え。
あと、くだらん質問しに来るな、ドアホゥ
783デフォルトの名無しさん:2009/06/16(火) 12:47:12
とまぁ、STLを使う常識に馴染めないMFC使いも多いので、職場なら空気を読みましょう。
784デフォルトの名無しさん:2009/06/16(火) 13:30:11
プログラマってのは、いろいろ使うことを経験して、自分で考えるもんだ。
何を使うのか教えてもらえなきゃ組めないなら、設計通りに組むただのオペレーター。
おまえ、プログラマには向いてないよ>>780
785デフォルトの名無しさん:2009/06/16(火) 22:34:23
>>783 は優れた反面教師ですねw
786デフォルトの名無しさん:2009/06/17(水) 01:25:18
VS2005でMFCのダイアログで開発しています。
このダイアログにClass Nameを設定したいのですが、グレーアウトしていて出来ません。
どうすればよいのでしょうか?
ヒントだけでも下さい。お願いします。
787デフォルトの名無しさん:2009/06/17(水) 07:11:49
>>786
http://support.microsoft.com/kb/251059/en-us
探せば案外簡単に見つかるものだね。
788デフォルトの名無しさん:2009/06/22(月) 22:02:29
 
789デフォルトの名無しさん:2009/06/23(火) 18:33:02
MFCメインフレームのひ孫で作ったマルチスレッド内で
if( (CMainFrame*)AfxGetMainWnd() != NULL )
をしてもずっとTRUEにならないんですが、どうすればメインフレームを取得できるんですか?
790デフォルトの名無しさん:2009/06/23(火) 18:54:20
theApp.m_pMainWnd
791デフォルトの名無しさん:2009/06/23(火) 19:05:22
出来ました。違いがわかりませんがありがとうございました
792デフォルトの名無しさん:2009/06/23(火) 19:32:53
>違いがわかりませんが
・・・orz
793デフォルトの名無しさん:2009/06/24(水) 18:35:38
あるダイアログクラスからCClientDCをnewし
別のダイアログクラスからnewしたCClientDCを使用し
表示などを行っても問題はないのでしょうか?
教えてください。
794デフォルトの名無しさん:2009/06/24(水) 18:47:36
問題はないか、だって? 
それぞれのデバイスコンテキストがどのウィンドウのものであるか、把握できているのかね?
795793:2009/06/24(水) 19:02:32
newしたダイアログクラスのみで使用するものだと思いますが
別のダイアログクラスで使用しても正しく表示できているので
問題がないのならば使用したいと思っています。
796デフォルトの名無しさん:2009/06/24(水) 19:08:10
その君の思考はオブジェクト指向ではない。
そこがおおいに問題。
797793:2009/06/24(水) 19:10:46
その問題以外は問題がないんですね?それならば問題ありません。
798デフォルトの名無しさん:2009/06/24(水) 19:19:45
よ〜し、パパCSingleLockをnewしちゃうぞ〜。
799793:2009/06/24(水) 19:50:08
教えていただきありがとうございました。
800名無し募集中。。。:2009/06/24(水) 20:55:27
それが自分のものか親から受け継いだものかはともかく、自分の資産に関してアクセスするのは構わないが
人のものに対して勝手にアクセスするのはよろしくない。
人からいじられる事を想定した切り口(関数とか)を用意してあげるとか、方法はいくつかある。
801デフォルトの名無しさん:2009/06/25(木) 01:19:18
>それならば問題ありません。
こういう考え方だと、いつまでたってもスパゲティ的なプログラムしか組めなくなるから注意されたし。
802デフォルトの名無しさん:2009/06/26(金) 09:28:05
>スパゲティ的なプログラム
フェットチーネにすると、クリーム系じゃないソースは絡み難くなるよ。
803デフォルトの名無しさん:2009/06/26(金) 12:53:56
簡単な確認ダイアログを作成して、数秒後に自動クローズをするモーダル・ダイアログを作成したのですが、
ダイアログを終了するところで落ちます。
以下の、コードはダメなのでしょうか?
OnInitDialog()時にワークスレッドを作成して、そこでダイアログの描写処理、
処理後にスレッド側でOnOk()などでダイアログを終了します。

//簡単な例(大分省いています・・)
class CTestDlg : public CDialog {
public:
  virtual BOOL OnInitDialog(){
    //初期化時にワークスレッド作成
    AfxBeginThread( CTestDlg::BeginTread, this );
  }
  //ワークスレッド
  bool TreadFunc() {
    //ここでダイアログの描写処理()
    //例えば30秒間タイマーを表示するなど・・

    //ダイアログを閉じる
    OnOk();        //<-うまくモーダル・ダイアログを閉じることができない・・・・
  }
  
  static UINT AFX_CDECL BeginTread(LPVOID pParam) {
    CTestDlg* pObj = (CTestDlg*)pParam;
    pObj->TreadFunc();
  }
};

//呼び側
  CTestDlg cDlg;
  cDlg.DoModal
804デフォルトの名無しさん:2009/06/26(金) 12:59:58
>>803
・なぜ別スレッドにしているの?
・なぜOnInitDialog()内で処理しようとするの?
・何もせず、単に数秒後に閉じるだけのダイアログをサンプルとして作ってみた?
805デフォルトの名無しさん:2009/06/26(金) 13:35:09
この程度の内容を自分で解決できないなら、真剣にプログラムをやめることを検討すべき
806デフォルトの名無しさん:2009/06/26(金) 13:47:32
プログラムを止める必要はないけど、プログラマは辞めて欲しいな。
趣味のプログラミングなら勝手にしてくれ。
807名無し募集中。。。:2009/06/26(金) 14:04:41
スレッドの中からOnOkを呼ばずに、自分にWM_CLOSEをpostしてみては?
808デフォルトの名無しさん:2009/06/26(金) 14:35:45
>>803
それはメインスレッドで閉じないとだめだ。
ダイアログが表示されたぞ→メインスレッドでワーカーの終了を待つ→メインスレッドでOnOK()
ところで、「ダイアログが表示された」って、いつわかるんだっけ・・・

CWinThread* thread;

BOOL CTestDlg::OnInitDialog() {
 thread = AfxBeginThread(.・・・);
}

void CTestDlg::ダイアログが表示されたあとにメインスレッドで実行される何か()
{
 //スレッドの終了までブロック
 ::WaitForSingleObject(thread->m_hThread, INFINITE);
 //ダイアログを閉じる
 OnOK();
}
809803:2009/06/26(金) 14:35:50
>>804
>・なぜ別スレッドにしているの?
>・何もせず、単に数秒後に閉じるだけのダイアログをサンプルとして作ってみた?
本当は、数秒かかる処理(複数回)を確認するために、プログレスバーを使用して
状態確認を行い、処理終了後に自動でダイアログが閉じることが目的です。
ダイアログクラスに処理を埋め込むのも微妙だと思いますが・・

>・なぜOnInitDialog()内で処理しようとするの?
DoDoModal()時に確実に呼ばれるみたいなので、とりあえずここに入れてみました。
他に適切なイベントハンドラがありますか?


一応、趣味で作成しています。MFCは初心者です。

>>807
WM_CLOSEでうまくダイアログが閉じましたありがとうございます
810デフォルトの名無しさん:2009/06/26(金) 14:46:31
>処理終了後に自動でダイアログが閉じることが目的です。
処理のみを別スレッドとし、処理が終了したらダイアログに「終わったよ」と教えてやる。
それを受けて、ダイアログは自身で閉じるようにする。

別スレッドでダイアログを閉じてはダメ。
811デフォルトの名無しさん:2009/06/26(金) 14:49:33
>>809
途中経過のプログレスバー表示もPostMessageを使ったほうがいいよ。
ワーカースレッドから進行状況をWindowにPostMessageして、
メインスレッドでは、ポストされた進行状況に従ってプログレスバーを更新するようにする。

ワーカースレッドでプログレスバーを更新するとはまるよ。
812デフォルトの名無しさん:2009/06/26(金) 20:16:21
メインスレッドはワーカースレッド終了を待っているのに、
ワーカースレッドはメインスレッドがメッセージを処理してくれない為に
SendMessageから帰って来れなくてデッドロックとか、良くあるパターン。
813デフォルトの名無しさん:2009/06/26(金) 20:25:55
そこでPostMessageだぜ
814デフォルトの名無しさん:2009/06/26(金) 20:41:26
>ワーカースレッドはメインスレッドがメッセージを処理してくれない
これを称して自業自得という。
815デフォルトの名無しさん:2009/06/26(金) 22:54:44
普通はワーカースレッドではpostmessage以外は一切ダイアログをいじらないもんだろ
ダイアログを閉じる以外の操作でも必ずといっていいほど何らかの不具合がおきる
816名無し募集中。。。:2009/06/27(土) 00:52:59
ワーカーっていうぐらいだからな
817デフォルトの名無しさん:2009/06/28(日) 00:37:19
おまえら、スレッドの使い方を1から勉強し直せ
818デフォルトの名無しさん:2009/06/28(日) 00:39:38
GUIスレッドについて知ることが先ではないか
そうすれば自ずと分かる
819デフォルトの名無しさん:2009/06/29(月) 03:05:48
GUYについても知ってほしい。
820デフォルトの名無しさん:2009/06/29(月) 15:26:54
もちろん、GAYについてもな
821デフォルトの名無しさん:2009/06/30(火) 23:03:34
CStringを引数で渡すとき
CString$ sz
ってやる人いるけど
CString* sz
じゃだめなの?
822デフォルトの名無しさん:2009/06/30(火) 23:07:04
CString&
でした
823デフォルトの名無しさん:2009/06/30(火) 23:14:58
>>821-822
ケースバイケース。単純に LPCTSTR として渡す場合もある。
824デフォルトの名無しさん:2009/06/30(火) 23:23:51
どっちでもいいんですね
825デフォルトの名無しさん:2009/06/30(火) 23:38:38
Windowsのサービス作りたいんだけど、MFC使ってサービスって作れる?
リソースキットについてるサービス化ツールを使えばいいのかな?
826デフォルトの名無しさん:2009/07/01(水) 00:26:35
>>825
まずやってみろ、屑
827デフォルトの名無しさん:2009/07/01(水) 07:22:47
>>821
ポインタ渡し → 受け取った関数でnullチェックが必要
参照渡し → nullはこない
828デフォルトの名無しさん:2009/07/01(水) 10:00:49
>>827
void Hoge(CString& rStr)
{
  if (&rStr == NULL) {
    TRACE("NULL\n");
  }
  else {
    TRACE("%s\n", rStr);
  }
}

CString* pStr = NULL;
Hoge(*pStr);
829デフォルトの名無しさん:2009/07/01(水) 10:17:12
>>828
NULLをデリファレンスしようとした時点で花から悪魔。
830デフォルトの名無しさん:2009/07/01(水) 10:53:05
何とかの一つ覚え
831デフォルトの名無しさん:2009/07/01(水) 18:41:43
参照渡しを
&でアドレスとってNULLチェックなんて
誰もしないよね
832デフォルトの名無しさん:2009/07/01(水) 21:11:05
>>827
代わりに何がくるの?
833デフォルトの名無しさん:2009/07/01(水) 22:06:37
代わりって……実体がくるんじゃん
834デフォルトの名無しさん:2009/07/01(水) 22:18:10
もうヴァカにかまうなよ。
かまって欲しいだけだろ。
スルー推奨。
835デフォルトの名無しさん:2009/07/01(水) 22:27:00
GetWindowTextとかでしょっちゅう使うだろ
いちいちgetbufferしなくていいから便利だよな

CWnd::GetWindowText
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;
836デフォルトの名無しさん:2009/07/01(水) 22:39:31
素直にCStringを返しても良かったんじゃないかとは思うけどね。
CStringが参照カウント管理されていなかった時代の名残かな。
837デフォルトの名無しさん:2009/07/01(水) 22:55:19
余計なコンストラクタを実行させないためだろ。
838デフォルトの名無しさん:2009/07/01(水) 23:32:33
>>833
いや、nullの場合だってあるじゃん
unko=NULL;
hoge(unko);
こんなん?
839デフォルトの名無しさん:2009/07/01(水) 23:39:10
>>838
お前はそもそもを間違えてる
840デフォルトの名無しさん:2009/07/01(水) 23:45:16
>>839
さらっと説明してくれマジで
841デフォルトの名無しさん:2009/07/01(水) 23:57:04
>>840
おまえの書きたいのはこうだろ
Foo* unko=NULL;
hoge(*unko);
>>838じゃポインタ渡しだ
全然会話の流れに乗れてない
842デフォルトの名無しさん:2009/07/02(木) 00:17:22
>>841
それで渡すと中身には何がくるわけ?
843デフォルトの名無しさん:2009/07/02(木) 00:25:54
void GetWindowText( CString& rString )
void GetWindowText( CString* rString )
違いわからん
844デフォルトの名無しさん:2009/07/02(木) 00:39:23
>>842
0アドレスへの参照
845デフォルトの名無しさん:2009/07/02(木) 00:56:58
>>843
// GetWindowText( CString* rString ) の悪例

int n;
CString* p = (CString*)&n;
GetWindowText( p);      // コンパイルエラーにならない




846デフォルトの名無しさん:2009/07/02(木) 01:03:30
>>844
結局、チェック必要になるんと違うのん?
847デフォルトの名無しさん:2009/07/02(木) 01:22:35
チェックしようがしまいが0アドレスを参照した時点で大抵落ちるんじゃないかな
848デフォルトの名無しさん:2009/07/02(木) 07:40:54
>>846
チェックが必要なのは
*演算子をやる前
849デフォルトの名無しさん:2009/07/02(木) 07:46:01
他のスレでも話題になってたが
Foo* unko=NULL;
hoge(*unko);
というコードは、hogeとは無関係に、このコード自体が不正。
なので「これで正しく動くかどうか」等は、hoge関数が責任を持つことではない。
850849:2009/07/02(木) 07:46:51
ごめん。他のスレだと思ってたがこのスレ自体で既に出てたみたいだ。
ずっと同じ話題だったのか。
851デフォルトの名無しさん:2009/07/02(木) 09:32:34
>>838そのものは
NULLで初期化した実体を渡してるだけ
あほすぎる
852デフォルトの名無しさん:2009/07/02(木) 19:03:41
>>849
そうかなぁ?
仮にその関数100回呼び出すとしたら
必ず100回同じチェックすることになるでしょ?
非効率じゃない?
必ず同じチェックがてめーで必要になるならてめーの中でやれよ
ってのが俺流
853デフォルトの名無しさん:2009/07/02(木) 19:51:57
ポインタがあふれているなら、ポインタでわたせばいいじゃん。

CString や std::string のように、普通はポインタを使わないようなオブジェクトを渡すときに、
foo(CString*)のような、ポインタ渡しの関数を書くのはヘタクソ。
854デフォルトの名無しさん:2009/07/02(木) 20:17:15
でもそれだと面倒なんでしょ?
実用的じゃねぇもの使ってもしょーがねーじゃん
855デフォルトの名無しさん:2009/07/04(土) 17:05:08
CArrayとvectorってどっちを使えばいいんですか?
動的配列の違いがわからないんですが
856デフォルトの名無しさん:2009/07/04(土) 17:22:49
857デフォルトの名無しさん:2009/07/05(日) 17:36:10
SDIでCViewをCHtmlViewと切り替えて使いたいんですが
どういう構造で組めばいいんでしょうか?
858デフォルトの名無しさん:2009/07/05(日) 18:05:46
双方とも動的に作成して切り替えるか、静的に作成して一方を非表示にしておく。
859デフォルトの名無しさん:2009/07/05(日) 20:40:06
>>587
MSDNのkb99562にサンプル載ってるよ
860294:2009/07/05(日) 20:43:28
587じゃなくて857だった
orz
861デフォルトの名無しさん:2009/07/05(日) 21:27:21
>>859
thx!
862デフォルトの名無しさん:2009/07/08(水) 03:28:04
MFCでツールを作っています。
ダイアログバーを使用してツールバーのような物を作り、そのダイアログバーにツリーコントロールを配置したのですが、
ダイアログバーゆえになのか、通常のダイアログに配置したコントロールのように自動でDDX変数を追加する事が出来ません。
その為、CTreeCtrlクラスオブジェクトのメンバ変数を作ってもそのコントロールと関連付け出来ず、アクセス出来ません。

色々悩んで調べた後に辿り着いたのが
(ツリーコントロールのメンバ変数).Attach( this->GetDlgItem(IDC_TREECONTROL1)->GetSafeHwnd() );
を実行後にメンバ変数から操作し、最後に
(ツリーコントロールのメンバ変数).Detach();
とすることで一応動かせたのですが、これがベストなのでしょうか?
もしくは偶然動いただけで想定外動作を起こしかねない方法なのでしょうか?

ダイアログバーに配置したツリーコントロールが表示されているということは
MFCプログラムのどこかの段階でそのコントロールをCreateしているはずで、
どこかにその時のオブジェクトがあるんじゃないかとは思ったのですが未熟な自分には
どこなのかまったく分かりませんでした。

どなたかアドバイスお願いします。
863デフォルトの名無しさん:2009/07/08(水) 09:18:12
>>862
ttp://support.microsoft.com/kb/185672/ja
CDialogBarを派生させてOnInitDialogやDDXが使えるようにしている。
864名無し募集中。。。:2009/07/08(水) 12:28:19
ダイアログバーでDDXを有効のコードはcodeguruを参考にして作ったけど
MS謹製の方法もあるんだな
865862:2009/07/08(水) 20:52:03
>>863

ありがとうございます。
教えて頂いたURLを参考にした結果、アタッチやデタッチ無しで無事成功しました。
866デフォルトの名無しさん:2009/07/10(金) 20:19:12
2008で作ったアプリって
再頒布可能パッケージをインスコしないと
他のPCで実行できないのですか?
867デフォルトの名無しさん:2009/07/10(金) 21:12:45
>>866
自分で試せ、バカ
868デフォルトの名無しさん:2009/07/10(金) 23:47:05
>>867
バカいうなアホ
869デフォルトの名無しさん:2009/07/11(土) 11:37:45
/MTにしたうえでスタティックリンクにすればredistなしでいけるかもね
870デフォルトの名無しさん:2009/07/14(火) 01:33:45
リストボックスで複数列を表示したいのですが、
そのような事は可能でしょうか?
871デフォルトの名無しさん:2009/07/14(火) 02:51:44
絶対無理
872デフォルトの名無しさん:2009/07/14(火) 10:23:18
オーナードローとか

昔NT3.5対応させなきゃならなかったから
ListViewとTreeViewをListBoxサブクラス化して作ったなあ・・・
873デフォルトの名無しさん:2009/07/14(火) 13:17:44
>>871
ありがとう
874デフォルトの名無しさん:2009/07/14(火) 14:17:27
リストコントロールならできる
875デフォルトの名無しさん:2009/07/15(水) 16:14:46
独自に作ったダイアログ(CDialogから派生)を
複数のプロジェクトで使い回したいのですが、
リソースが絡んでいるため、ソースとヘッダだけのときのように、
共通の場所に置いたものを各プロジェクトに追加するような使いかたができません。

このような場合、どのような方法があるのでしょうか。
おとなしくプロジェクトごとのrcファイルに
ダイアログ部分を毎回記述していくことになるのでしょうか。
876デフォルトの名無しさん:2009/07/15(水) 16:26:23
>>875
.rc2ファイルにしておいて、インクルードすれば?
.rcファイルの終わり近くに、

#include "res\\***.rc2" // Microsoft Visual C++ 以外で編集されたリソース

とあるでしょ?
877デフォルトの名無しさん:2009/07/15(水) 17:25:19
リソースファイルは個別に設定できるようにしてほしかった
もしかしてできる?
なんでプロジェクトで1枚なんだ?
ほかの人と被ったときにやたらと編集が面倒くせぇよ
878デフォルトの名無しさん:2009/07/15(水) 17:34:00
dllにリソース入ってたりする。
879デフォルトの名無しさん:2009/07/15(水) 23:06:53
>>877
リソースは個別にリソースエディタ(外部ツール)で編集し、>876のように.rcでインクルードすればいいよ。
880デフォルトの名無しさん:2009/07/15(水) 23:12:50
>>879
マジすか?
881デフォルトの名無しさん:2009/07/15(水) 23:38:40
ソースファイルと似たような扱いでいいだろ
名前の衝突さえ起こらなければ
いくらでも追加できるんだから

リソースエディタも複数リソース対応してるぞ
882デフォルトの名無しさん:2009/07/16(木) 08:57:41
>>879
その場合、ダイアログ自体や各コントロールのIDはどこに記述するのですか?
通常ならresource.hに勝手に入ってしまうのですが。
883デフォルトの名無しさん:2009/07/16(木) 09:00:00
外部のリソースエディタが作ってくれるべさ。
あ、番号が競合しないように、そこだけは要注意ね。
884デフォルトの名無しさん:2009/07/16(木) 09:12:59
>>883
根本的な質問で申し訳ありませんが、
外部のリソースエディタというのはそもそも何ですか?
885デフォルトの名無しさん:2009/07/16(木) 13:43:33
>>884
リソースエディタがなんなのか、よく考えていろいろググって、それから氏ね
886デフォルトの名無しさん:2009/07/16(木) 18:55:30
// リソースエディタ http://www.resedit.net/
887デフォルトの名無しさん:2009/07/16(木) 21:15:51
ダイアログ生成時にコントロールの大きさや位置を指定するにはどうしたらいいでしょうか?
888デフォルトの名無しさん:2009/07/16(木) 21:41:34
>>887
CDialog::OnInitDialog() をオーバーライドして、そこに必要なコードを書く。
889デフォルトの名無しさん:2009/07/18(土) 13:09:29
ありがとうございますコントロールの変更はできました
でもダイアログの変更ができません、OnInitDialog()内でコントロールと同様に
MoveWindow()で変更しようと思ったのですが
動作させるとエラーが出てしまいます
890デフォルトの名無しさん:2009/07/18(土) 13:40:08
>>889
どんなエラー?
891デフォルトの名無しさん:2009/07/18(土) 13:44:18
T.exe の 0x004058f5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000050 を読み込み中にアクセス違反が発生しました。

winocc.cppのここで止まります
if (m_pCtrlSite == NULL)
::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
892デフォルトの名無しさん:2009/07/18(土) 15:42:41
アクセス違反か。実体が存在しないオブジェクトのメソッドを実行している可能性ありだな。

CWnd* pWnd = NULL;
pWnd->MoveWindow( 0, 0, 0, 0); // アクセス違反
893デフォルトの名無しさん:2009/07/18(土) 15:58:09
// TODO: ここに初期化を追加してください
CWnd* ttdlga = GetDlgItem(IDD_TTDLG);
ttdlga->MoveWindow(0,0,PictWidth,PictHeight+80,1);

IDは間違ってないと思うんですけど
894デフォルトの名無しさん:2009/07/18(土) 16:11:13
>>893
>IDは間違ってないと思うんですけど

CWnd* ttdlga != NULL をチェックしてみ。
それと、IDD_TTDLGが自身のダイアログなら、このコード自体不要。

MoveWindow(0,0,PictWidth,PictHeight+80,1); // これだけでいい。= this->MoveWindow(0,0,PictWidth,PictHeight+80,1);

それとも、別のウィンドウでこのコードを実行しているのか?
895デフォルトの名無しさん:2009/07/18(土) 16:24:42
>MoveWindow(0,0,PictWidth,PictHeight+80,1); // これだけでいい。= this->MoveWindow(0,0,PictWidth,PictHeight+80,1);

これでできましたありがとうございます。よく考えたらそうですよね・・・助かりました
896デフォルトの名無しさん:2009/07/20(月) 15:57:56
先輩方に質問させて下さい。
ダイアログ上に配置したスクロールバーの場合はできるのですが、
WS_HSCROLL | WS_VSCROLLを追加して作ったビューにくっついてるスクロールバーのハンドラ(?)の取得方法が分かりません。
CScrollbar *pCScrollbar = ************;
***********←ここの部分はどうやって書けばよいのでしょうか。
よろしくお願いします。
897デフォルトの名無しさん:2009/07/20(月) 16:31:02
>>896
独立したスクロールバーではないので、バー単体でのハンドルは存在しない。
GetScrollPos / SetScrollPos 等の、CWnd のスクロール関数を使って操作されたし。
898デフォルトの名無しさん:2009/07/20(月) 19:15:51
>>897
迅速なご回答本当にありがとうございます。
エラーエラーで困っていたので万感の思いです。
899デフォルトの名無しさん:2009/07/21(火) 12:57:53
この程度で万感とは、随分安い思いだな。
900デフォルトの名無しさん:2009/07/21(火) 13:25:56
>>899,900
この際、無駄なレスは不要。
901デフォルトの名無しさん:2009/07/21(火) 16:20:05
>>900
>>898 が他所で恥かかないようにとの心配りじゃないかw
902デフォルトの名無しさん:2009/07/23(木) 22:32:57
CHeaderCtrlでオーナードローをしようとしています。
itemにHDF_OWNERDRAWをつけて、DrawItemをオーバーライドしたところ、
item自体は描画できるんですが、item枠や、item間の区切りが、
DrawItem抜けた後で勝手に上書きで描画されてしまうようです。
これをやめさせる方法ってないでしょうか?

別案で、OnPaintオーバーライドして全部自前描画、ってのもやってみました。
こちらだと区切りまで含めて自分で描けるんですが、
OwnerDrawの時は引数として渡されてくる、Itemのhoverやpushの状態等
を取得する方法がわからず、詰まってしまいました。

どなたか、助言をお願いします。
903デフォルトの名無しさん:2009/07/28(火) 12:36:58
MFCのダイアログベースで作成しています。
初歩的なことで申し訳ありませんが、ダイアログがサイズ変更可能な状態で、
指定以下のサイズに縮小できないようにするには、どのようにすればよいでしょうか?
ご教授お願いいたします。
904デフォルトの名無しさん:2009/07/28(火) 12:40:06
WM_GETMINMAXINFOを適当に処理する
905903 :2009/07/28(火) 13:59:58
>>904
ありがとうございます。
解決しました(^^
906デフォルトの名無しさん:2009/08/01(土) 22:31:01
VisualStudio2008、ダイアログベースでプログラムを書いてます。
ダイアログAとダイアログBを準備しておいて、
・アプリケーションを起動するとダイアログAが開く
・ダイアログA内の『次へ』というボタンをクリックするとダイアログBが開く
・ダイアログBが開くとダイアログAは非表示になる
というセットアップウィザードのようなプログラムを作成したいです。
ボタンを押した際の処理に、
m_pDlgB = new CダイアログB;
m_pDlgB->Create(IDD_ダイアログB, this);
m_pDlgB->ShowWindow(SW_SHOW);
ShowWindow(SW_HIDE);
と書いているのですが、これだとタスクバーからアイコンが消えてしまいます。
タスクバーにアイコンを残す方法は何かありますか?
それとも、セットアップウィザードのように画面が切り替わるプログラムの場合
は何か他に方法があるのでしょうか。
907デフォルトの名無しさん:2009/08/01(土) 22:39:21
>>906

>タスクバーにアイコンを残す方法
CダイアログBのOnInitDialog() で SetIcon( hIcon, FALSE) する。

>何か他に方法があるのでしょうか。
ウィザード形式のプロパティシートを利用する。
908906:2009/08/02(日) 11:40:28
>>907
>CダイアログBのOnInitDialog() で SetIcon( hIcon, FALSE) する。
やってみたのですが、この方法でもタスクバーからアイコンは消えてしまうようでした。

>ウィザード形式のプロパティシートを利用する。
これでできました!ありがとうございます。

それと、単純にリソースのプロパティのApplicationWindowの項目を
Trueにすればよかったみたいです。

ありがとうございました!
909デフォルトの名無しさん:2009/08/04(火) 11:15:42
Visual Studio 2008 + MFC Feature Packの環境にて、
アプリケーションの種類:SDI,プロジェクト形式:MFC標準のフレームワークで、
ツールバーのアイコンを大きい/小さいを入れ替えたいと思っています。
※大きいアイコンと小さいアイコンは別々にリソースを用意するつもりです。
また、この時メニューバーの
[表示(V)]→[ツールバーとドッキングウィンドウ(T)]→[カスタマイズ...]
で表示される「カスタマイズ」ダイアログ内、「オプション」タブにある、
「大きいアイコン」チェックボックスに対応させて入れ替えたいと思いますが、
そんな事可能なんでしょうか?

もし、可能であれば、オブジェクト名とそのメンバ。
もしくはサンプルを教えていただけませんか?
910デフォルトの名無しさん:2009/08/04(火) 11:29:15
MFC Feature Packのソースを読んで、適切なタイミングでリソースを入れ替えれば?
今、ソースを読んでる時間ないから思いつきだけど。:-)

あるいは、大きいアイコンのツールバーと小さいアイコンのツールバーを別個に用意して
表示/非表示で切りかえるとか。
911デフォルトの名無しさん:2009/08/04(火) 13:24:35
>>909
やりたいことだけ考えて、あとは教えてもらおうとか、プログラマとしては屑だな。
普通は試行錯誤して自分で組むもんだ。
氏んだ方がいいんじゃないか。つか、氏ね。
912909:2009/08/04(火) 13:34:01
>>911
おいおいwww
俺がプログラマって言ったか?
残念wwww


913デフォルトの名無しさん:2009/08/04(火) 13:37:54
>>910
すり替えの方法で、
サンプルのIEDemoとかで調べてみます。

>>911
そうですね。
くれくれではなく、少しは精進します。
914デフォルトの名無しさん:2009/08/04(火) 13:38:14
プログラマ:プログラムを組む人。プロの職人という意味にあらず。
915デフォルトの名無しさん:2009/08/04(火) 17:12:24
なんか、>>909=>>913っぽいんだけど、>>912は真性の馬鹿?
916デフォルトの名無しさん:2009/08/04(火) 17:19:26
夏の太陽が >>912 をダメにした
917デフォルトの名無しさん:2009/08/04(火) 17:31:13
それは冤罪
918デフォルトの名無しさん:2009/08/06(木) 06:05:52
他人を装ってレスするのはム板では日常茶飯事
919デフォルトの名無しさん:2009/08/06(木) 10:26:40
質問です。
サーバー側からクライアント側にCSocketを使用してCString配列のデータを送信しているのですが、
送信途中でPunpMessage関数に入ってしまい、送信速度が遅くなってしまいます。
一つ配列を送信するごとにSleep(1);をはさめばうまくいくこともあるのですが、
やはり不安定ですし、送信速度も遅くなってしまいます。
どうやったらPunpMessage関数に入らず、すばやく送信できるのか教えてください。
また、そのような問題を解決するサンプルプラグラム等ありましたら教えていただけると助かります。
920919:2009/08/06(木) 10:28:22
>一つ配列を送信するごとに
↑は一つCString配列を送信するごとにの誤りでした。すみません。
921デフォルトの名無しさん:2009/08/06(木) 10:38:26
>>919
>PunpMessage関数
そもそもこういった関数は存在しない。スペルミスであることはわかるが、
CSocket::PumpMessages() なのか CWinThread::PumpMessage() なのか不明。

ま、いずれにしろメンバ関数なので、無効化だけを狙うならオーバーライドしてしまえばよい。


922919:2009/08/06(木) 10:58:12
>>921
CSocket::PumpMessagesでした。すみません。
やはりオーバライドが良いですよね・・・
ただ、オーバーライド自体よく解っていないので、がんばってやってみますけど、
もし解らなかったらもう一回質問に来るかもしれません。その時はよろしくお願いします。
あと、自分で調べて原因っぽいものを見つけたので、一応貼っておきます。↓
http://support.microsoft.com/kb/154649/ja
923デフォルトの名無しさん:2009/08/06(木) 13:39:58
CResourceException が発生するのですが、原因は何?
解決するにはどうしたらいいの?
924デフォルトの名無しさん:2009/08/06(木) 14:21:59
Windows が要求されたリソースを見つけられないか、割り当てられないときに発生
925デフォルトの名無しさん:2009/08/06(木) 15:05:12
解決するにはその例外で止まった時点で、その場所を見るとか呼び出し履歴を見るなりなんなりして
直接の原因を調べることだろうな
926デフォルトの名無しさん:2009/08/06(木) 22:24:26
24文字のテキストを百万回連結して最後にテキストボックスに表示する操作をやろうとしているのですが、
どうやったら一番早いでしょうか?
毎回CStringで連結してたらあまりに遅かったので、
char配列のバッファAに16kBまで書き込んで、次にCStringのバッファBで16回連結し、
それを16回分たまるごとにCStringのバッファCで連結して最後にテキストボックスに出すようにしたら
少しは早くなりましたが…
927デフォルトの名無しさん:2009/08/06(木) 23:41:35
なんでバッファ分けるんだ
小分けにする理由はあるの?
928デフォルトの名無しさん:2009/08/06(木) 23:58:14
はなくそとMFCは同じくらいうまい。
929926:2009/08/07(金) 00:43:38
>>927
やはり大きい領域で連結操作すると重いみたい。
CString一段から二段に増やしたら時間短縮した。
それ以上増やしてもあんまり変わらなかったけど。
930デフォルトの名無しさん:2009/08/07(金) 00:50:06
10000文字あったとして連結して10001文字にしたら多分
10001文字の領域を確保して10000文字の領域からコピーして
10000文字の領域を破棄してるから遅くなると考えてなるべく小分けするって
手法をとったんだろ?

javaでも似たような動作したな
毎回こういう文字列オナニークラスみるたびに思うけど
汎用設計下手糞すぎる奴がなんでこんなもの手をだすんだろね
931デフォルトの名無しさん:2009/08/07(金) 06:50:06
>>929
なんかズレてるな

>char配列のバッファAに16kBまで書き込んで
これを24MBのchar配列にして
CStringの連結を一回も行わずに
テキストボックスに渡すのは駄目なのか?
932デフォルトの名無しさん:2009/08/07(金) 17:22:25
CStringも中の人はchar配列だし、
最初から大きめに領域取っておけば、
不足するたびに何度も領域増やすような頭の悪い状況は避けられる。
933デフォルトの名無しさん:2009/08/07(金) 17:34:39
連結してテキストボックスに出力する程度のことでわざわざ CString 使わなくても
char 配列で十分だろーに。

使いたいなら CFixedStringT というのもある。
934デフォルトの名無しさん:2009/08/07(金) 18:09:03
タスクバーに表示されない常駐プログラムを作成しています。
いろいろとサイトを拝見してたところ簡単な方法で、

OnSysCommand()内で、最小化時に
ShowWindow(SW_HIDE)で本体を隠し、CDialog::OnSysCommand()が呼ばれる前に
終了する方法を見つけましたが、この方法で特に動作的に問題は無いでしょうか?
サンプルを作成してみたところ、正常に動作しているように見えます。


void CTest::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
switch(nID){
case SC_MINIMIZE:
//ここで終了
ShowWindow(SW_HIDE);
return;
}
CDialog::OnSysCommand(nID, lParam);
}
}
935デフォルトの名無しさん:2009/08/07(金) 18:21:40
>>934
CDialog::OnSysCommand() が何をしているのか調べるとわかる。
936デフォルトの名無しさん:2009/08/07(金) 19:02:30
>>935
アプリ主なシステムコマンド(最小化、最大化、クローズなど)のデフォルト処理を行っているんですよね。
それを飛ばして、勝手にウインドを隠すこと自体、問題ないのか少し不安になり質問しました。
クローズボタンの無効化などで、OnSysCommand()を呼ばずに終了する方法は見たことはあるのですか・・・・





937デフォルトの名無しさん:2009/08/07(金) 19:18:29
>>936
難しく考えなくていい。
CDialog::OnSysCommand() は メッセージを DefWindowProc() に渡しているに過ぎない。
DefWindowProc() は処理されないメッセージを処理する関数。
原則として、処理をしたメッセージをこの関数に渡す必要はない。
938934,936:2009/08/08(土) 09:39:20
>>937
ありがとうございます。参考になりました。
メッセージ処理を行っているだけで、特に必要なければ、
飛ばしてもよいのですね。
939926:2009/08/09(日) 01:36:51
>>931-933
いや、十分な大きさの配列宣言したら実行時エラーが出てしまって…
(その後、malloc系の関数で別途メモリを確保したら一応できましたが)
240万文字を保持するにはCStringとかにするしかないのかなと思ってしまっていました。

それに、毎回240万文字出さなくちゃいけないわけではなくて、
そのプログラムをある特定の目的で使ったときのみその必要があるだけで、
通常は24文字が数十からせいぜい数百くらいしか生成されないんです。
そして正確な必要量は、確率で決まるので実行するまで不明という仕様。

で、926の書き込みの後さらに試行錯誤した結果、文字列の生成・連結の実行時間は既にかなり短縮できていて、
現状では実行時間のほとんどがCEditのSetWindowTextに費やされていたことがわかりました。
ちょっと私の実力ではCEditに代わるものをなんとかするとか無理なので、あきらめることにします。
お騒がせしました。
940デフォルトの名無しさん:2009/08/09(日) 14:10:34
>十分な大きさの配列宣言したら実行時エラーが出てしまって
>そして正確な必要量は、確率で決まるので実行するまで不明

char* lpString = new char[必要量];
// to do ...
delete [] lpString;
941デフォルトの名無しさん:2009/08/09(日) 16:00:27
>そして正確な必要量は、確率で決まるので実行するまで不明
これはおかしい
上限は仕様で決めなければならない
だってランダムで明らかにPCのスペックを上回る量だったらどーすんだよ
HDDに一時的に保存しておく必要だってでてくるし
本当は上限はあるにはあるんだけど概算を出すのが面倒だからやってないだけだろ
嘘をつくな
嘘をつくと後で大変なことになるぞ
自分にとってもよくない
942デフォルトの名無しさん:2009/08/09(日) 16:04:29
・・・お前、そこだけ読んでるだろ。
943デフォルトの名無しさん:2009/08/09(日) 16:14:56
>>942
内容変わらないじゃん
944デフォルトの名無しさん:2009/08/09(日) 18:57:31
>>939
そもそも数メガのテキストを渡すとか
まともなパフォーマンスにならなかった気がする

テキスト渡すだけでフリーズしかけ、
スクロールする度にフリーズしかけ・・・
945デフォルトの名無しさん:2009/08/10(月) 01:10:03
1MB越えると処理しきれないよね
一文字増えるだけで大変なことになる
946926:2009/08/10(月) 02:33:26
>>941
その辺はOSに丸投げですが何か。
947926:2009/08/10(月) 04:08:59
失礼。ちょっと勘違いしてました。

仕様上の上限は>>926にある通り2400万字。
24文字のテキストが生成されるルーチンは、理論上は果てしなく続く可能性があるけれど、
100万回で強制的に打ち切る仕様です。

24文字のデータを生成するルーチンだけに関して言えば、「必要量」は不明です。
その「打ち切る」処理まで含めて言えば24MBが必要量の上限となりますが、
それってむしろ必要量というよりは十分量のような気が。
948デフォルトの名無しさん:2009/08/10(月) 10:51:46
>>947
MFCからはほど遠い内容になってきているから、もうそのくらいにしとけ。
949デフォルトの名無しさん:2009/08/10(月) 16:25:29
C++相談室でこちらを紹介されたので、移動しました。

VS2008のVC++MFCで
ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。

以下ソース
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
img2.Destroy();

jpgファイルが変わる毎に、画面上の画像も切り替えたいので
上の処理を呼び出して、画面を切り替えてます。
しばらく動かしていたところで気付いたのですが、
メモリの使用量がかなり多くなっていました・・・
ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか?
わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。
950デフォルトの名無しさん:2009/08/10(月) 16:50:43
>>949
メモリの使用状況との関連は不明だが

>img2.Detach();
>img2.Destroy();

この場合、img2.Detach() によってオブジェクトに関連付けられている HBITMAP が切り離されてしまうので、
img2.Destroy() は何も機能しない。
したがって、m_xcPic01 に関連付けた HBITMAP をどこかで DeleteObject() してやる必要がある。
951デフォルトの名無しさん:2009/08/10(月) 16:57:51
>>950
レスありがとうございます。

つまりは以下の様にすれば・・・とのことでしょうか?
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
//img2.Destroy();   //コメントアウト
::DeleteObject(img2); //追加

まずは、コレで動作を確かめてみます。
ありがとうございます。
952デフォルトの名無しさん:2009/08/10(月) 17:05:13
>::DeleteObject(img2); //追加
すでに Detach() されているのだからこれも無意味。

m_Bitmap = img2.Detach(); // m_Bitmap は HBITMAP 型のメンバ変数として宣言する
m_xcPic01.SetBitmap( m_Bitmap);

// 不要になった時点で
::DeleteObject( m_Bitmap);

953デフォルトの名無しさん:2009/08/10(月) 17:38:00
>>952
ありがとうございます。
さっそく動作を確かめてみます。
954デフォルトの名無しさん:2009/08/12(水) 13:48:47
ダイアログバーにスクロールバーのコントロールを貼り付けて、
ダイアログバーのOnVScrollなどでスクロールイベントを拾ってます。
動かして見るとスクロールバーをいくらスライドさせてもドラッグしているボタンを
離すと元の初期位置に戻ってしまいます。

スクロールイベント検知時にはSetScrollPosでnPosの値をちゃんと設定しています。
念のために直後にGetScrollPosで値をTRACE出力して確認しましたが、ちゃんと設定されています。

このGetScrollPosで取得した値をTRACEで出しながら確認したのですが、ドラッグ中は正しい値がちゃんと取れています。
でもドラッグを中断してボタンを離した瞬間に、何故かスクロールイベントがnPosが0で発生し、
その0によって上書いてしまします。
苦肉の策でnPosが0の時は上書き処理をしない条件式を入れると期待通り動きます。

初期処理としてSetScrollRangeで最大値500を入れたのに、GetScrollLimitでみると勝手に501にしてくれています。
これはnPosが0が来たら無視するプログラムを作れというマイクロソフトの意図なのでしょうか?
それとも自分が何か間違っているのでしょうか?
955954:2009/08/12(水) 14:18:08
他にもスライダーコントロールのレンジをー300〜100に設定し、
初期値をSetposで0にすると、最初に描画された画面では意図した場所にスライダーが
設定されてません。

でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます。
MSDNの説明には1からスタートで0は無効ともマイナスを設定しては駄目ともありませんし、
プログラム中はマイナスになっても機能してます。
マイクロソフトのプログラマーがsetposの引数が0だったら処理しないみたいな
バグを仕込んでいるのではないかと邪推してしまいます。
956デフォルトの名無しさん:2009/08/12(水) 15:08:09
>>955
nSBCodeはちゃんとみてる?
957954:2009/08/12(水) 16:33:29
>>956
ページ移動や左右クリックによって細かい処理変更を行う意図はなく、
純粋に値だけ正しければいいと思ったので、nPosの値のみみて
nSBcCodeは意識していません。

これが関係しているのでしょうか?
958デフォルトの名無しさん:2009/08/12(水) 16:52:57
>>957
いらないnSBcCodeは無視するようにしないとnPos=0で何回も飛んでくるだろ
959デフォルトの名無しさん:2009/08/12(水) 16:53:21
該当部分のコード貼れよ
TBM_SETRANGE に当たるもんな

TBM_SETRANGE
wParam = (WPARAM) (BOOL) fRedraw;
lParam = (LPARAM) MAKELONG(lMinimum, lMaximum);

ちなみに設定時のMAKELONGってWORD指定じゃね?
WORD指定って
16ビット符号なし整数(unsigned short型/2バイト)
ってことはマイナスなしじゃね?

っていい加減なこと言ってたらスマンコ
960954:2009/08/12(水) 20:53:17
void CMyDialogBar::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

this->UpdateData(TRUE);
if( *pScrollBar == m_ddxHScroll && nPos != 0)
{
m_ddxHScroll.SetScrollPos(nPos);
}
this->UpdateData(FALSE);
CDialogBar::OnHScroll(nSBCode, nPos, pScrollBar);
}

今はこんな感じになってます。
スクロールバーの矢印クリックだろうが直接指定だろうが、左右の隙間クリックだろうが、
ショートカットキーだろうがnPosにはその時の実際の値が入っているという理解は間違いでしょうか?
961デフォルトの名無しさん:2009/08/12(水) 21:26:16
>>960
間違い。
nPos の値を使うのは、nSBCode == SB_THUMBPOSITION or SB_THUMBTRACK のときだけ。
詳しくは http://msdn.microsoft.com/ja-jp/library/e14hhbe6.aspx あたりを読め。
962デフォルトの名無しさん:2009/08/13(木) 00:11:26
>>955
>他にもスライダーコントロールのレンジをー300〜100に設定し、
>初期値をSetposで0にすると、最初に描画された画面では意図した場所にスライダーが
>設定されてません。
>でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます。

ウチでは問題なく設定される。
おそらく君は、スライダの再描画フラグをTRUEにしていない。

m_wndSlider.SetRange( -300, 100, TRUE);  // 再描画フラグはTRUE。
m_wndSlider.SetPos( 0);

スライダーコントロールの、そもそものスライダの初期値は 0。
再描画フラグをFALSEにしたまま範囲を変更して、その後初期値を 0 に設定しても、
スライダの値そのものは変化していないのだから、再描画されないのは当然と言えば当然。
よって「意図した場所にスライダーが設定されてません」なとど言わなきゃいけないハメになる。

初期値を 50 にすれば、もともとの値から変化しているのだから、再描画フラグが FALSE でも
スライダの位置は再描画されるので
「でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます」
などとのたまうコトになる。

バグを仕込んでいるのではないかと邪推する前に、道理を考えるべし。
963954:2009/08/13(木) 01:05:11
ご指摘の通りでした。
修正すると全て上手く動きました。
この問題だけに一日悩みました・・・。
ありがとうございました。
964デフォルトの名無しさん:2009/08/19(水) 01:02:27
独自のコマンドライン引数に対応する実行コードを記述する場合、
CWinApp::ProcessShellCommand
をオーバーロードすればいいんでしょうか?
965デフォルトの名無しさん:2009/08/19(水) 01:23:59
>>964
CCommandLineInfo::ParseParam() を「オーバーライド」する。
966デフォルトの名無しさん:2009/08/19(水) 01:37:16
msdnを読む限り、デフォルトの動作では、CCommandLineInfo::ParseParamは
CCommandLineInfoオブジェクトのデータメンバに値をセットしてるだけで
実際の動作はCWinApp::ProcessShellCommandの方で行われてるようなんですが
(設定はCCommandLineInfoクラスで、実行はCWinAppクラスで、という形になっている)
CCommandLineInfoクラスの中で処理コードを書いちゃってもいいものなんでしょうか…。
というよりも、CWinAppオブジェクトを参照できないから
theAppのパラメータ等に依存するコードはかけないような・・・。
967デフォルトの名無しさん:2009/08/19(水) 02:14:38
>>966
独自のコマンドライン引数の処理をするには CCommandLineInfo::ParseParam() をオーバーライド
して CCommandLineInfo::m_nShellCommand に独自の値をセットし、その値の時には独自の処理をおこなうように
CxxxApp でコーディングする。言いかえると、CCommandLineInfo::m_nShellCommand が既定の値のときだけ
CWinApp::ProcessShellCommand() が実行されるようにする。

>msdnを読む限り
CCommandLineInfo::ParseParam() の解説に
「ほかのフラグやパラメータ値を処理するには、派生クラスでこの関数をオーバーライドします。」と書いてある。

面倒くさければ、CWinApp::ProcessShellCommand() 相当の関数を自作して、コマンドライン引数に対する
すべての処理を自分で書けばよい。

>というよりも、CWinAppオブジェクトを参照できないから
>theAppのパラメータ等に依存するコードはかけないような・・・。
意味不明。

蛇足ながら、CWinApp::ProcessShellCommand() は仮想関数ではないから
オーバーライドは成立しない。( だから >>964 は不可)
968デフォルトの名無しさん:2009/08/19(水) 03:19:40
__argc と __argvのが好きだ
969デフォルトの名無しさん:2009/08/19(水) 04:01:18
Win7RCで自作MFC GUIアプリ動かしたらどうもtheApp::OnIdleが呼び出されないっぽい
どうやって解決したものか、自分で直接呼び出してもいいけど正式リリース版待ったほうがいいか
970デフォルトの名無しさん:2009/08/19(水) 11:06:17
ウチでは呼び出されているが?
971デフォルトの名無しさん:2009/08/19(水) 12:12:05
>>969
すげぇ、ヴァカすぎるwww
こんなヴァカでもプログラム組んでるのか。
もう少し勉強して出直してこい。少なくともOSのせいでOnIdleが呼ばれないとか、
そんな発想してるうちはダメだろw
972デフォルトの名無しさん:2009/08/19(水) 13:02:32
>>970
少し突っ込んで調べたらちゃんと呼ばれてたわ
どうもOnIdle内で起こすイベント待機スレッドが起きてなかっただけだった これはこれで問題だが

>>971
今OSごとの動作チェックしてて7以外はまともに動いてたんだよ(・ω・)゙許せハゲ
973デフォルトの名無しさん:2009/08/20(木) 14:39:58
MFCのSDIアプリケーションで、起動後最初の一回のみ自作のモーダルダイアログを表示したいのですが、
上手くいきません。
リソースエディタでFormViewのダイアログを作成編集し、それを右クリックして、
CDialogを基本クラスとしてクラス作成(仮:CMyDialog)をしています。

そしてCMainFormのヘッダにてCMyDialog MyDialog;と宣言し、
同OnCreate関数最後にて
MyDialog.Create(該当ダイアログID,this);
MyDialog.DoModal();
すると「Debug Assertion Failed!」という内容のダイアログが出て
File:dlgcore.cpp
Line:450
という内容が表示されます。Createを省略するとエラーダイアログは出ませんが、
何事も無かったかのようにDIALOGがまったく表示されません。
モードレスとして表示すろと(CreateしてShowWindow)SDIのフォーム内部に
ドッキングした感じで表示されますがダイアログとして機能していません。

ただ単にアプリケーション開始直後にモーダルダイアログを出したいだけなのですが、
どうすれば良いのでしょうか?
またダイアログ表示を仕込む箇所(OnCreate)は適切なのでしょうか?
ネットで調べてもいまいち解決に繋がるものが見つかりませんでした。
また書いてある通りいやっても上手くいきませんでした。
どなたか教えてくださいよろしくお願いします。
974973:2009/08/20(木) 14:54:32
もう少し調べて見ました。
dlgcore.cppの450行目はすでにモードレスとして作られた物をモーダルとして
動かそうとしているという感じの内容っぽいです。やはりCreateは要らないのだと思います。
そして戻り値を見るとどうもIDOKがこっちが一切ダイアログ触ってないのに
返されてスルーされているみたいです。
975デフォルトの名無しさん:2009/08/20(木) 15:04:57
>>973,974
>ただ単にアプリケーション開始直後にモーダルダイアログを出したい
>MyDialog.Create(該当ダイアログID,this);
>MyDialog.DoModal();

MyDialog.DoModal() が要らない。
MyDialog.Create() して、MyDialog.ShowWindow( SW_SHOW);
976975:2009/08/20(木) 15:05:55
>>975
あ、モーダルか。スマン。
MyDialog.Create(該当ダイアログID,this); が要らない。
977975:2009/08/20(木) 15:10:37
>>973
斜め読みしてたから、書き忘れた。

>起動後最初の一回のみ自作のモーダルダイアログを表示したいのですが、

メインウィンドウが表示される前に、メインウィンドウとの関連性がないものであれば、
CxxxApp::InitInstance() 内で表示すればいい。
978973:2009/08/20(木) 15:19:43
すばやい回答ありがとうございます。

しかし、ためしにAppクラスのInitinstanceの最後でDoModalでやってみましたが、
起動後本の一瞬だけやはりフォームの左上にドッキングしてはりついた感じでチラっと見えた後、
すぐに見えなくなりました。
しかしその後フォームをマウスクリックなどしようとするとモーダルダイアログが出ているときに
下の画面を触ろうとする時の「ポンッ」という音だけが聞こえるが一切操作できず、
相変わらずダイアログは見えていない状態になります。
979973:2009/08/20(木) 15:45:00
自己解決しました。

表示しようとするダイアログのプロパティのスタイルを「子」から「ポップアップ」
にすれば意図通りに動きました。
果たしてこれが正解は分かりませんが、こんな秘密コマンドみたいな仕様普通分かりません・・・。
ただ単にダイアログ表示したいだけなのに・・・。物凄い基本機能なのに・・・。
980デフォルトの名無しさん:2009/08/20(木) 15:49:22
普通に説明見ながら作れば何の問題もないのに
それさえもすっ飛ばして勘でやるからそういうことになる。

そんな基本中の基本もわからないで秘密コマンドとか笑われるぞ。
981デフォルトの名無しさん:2009/08/20(木) 15:54:04
>ただ単にダイアログ表示したいだけなのに・・・。物凄い基本機能なのに・・・。

MFCというのは文字通り Foundation Class だから、WindowsAPIの上に分厚い化粧(=Foundation)を
塗りたくったものにすぎない。だから、MFCの基本はWindowsAPIにあって、
WindowsAPIによるWindowsプログラミングの基礎ができていないと使いこなすのは難しいかもな。

逆に言うと、WindowsAPIによるWindowsプログラミングの基礎をマスターしていると、MFCを解するのは
すごく楽になる。
982デフォルトの名無しさん:2009/08/20(木) 21:23:14
>表示しようとするダイアログのプロパティのスタイルを「子」から「ポップアップ」
>にすれば意図通りに動きました。

スタイルプロパティを「子」にして使うほうが用途的には少ないんだけど、なんで
こんなところで躓くのかな? 不思議。
983デフォルトの名無しさん:2009/08/20(木) 21:47:45
えーと、foundationて化粧じゃなくて基礎って意味。
化粧品におけるファンデーションてのは化粧の下地って意味だから、
MFC=化粧じゃなくて、MFC=基礎クラス。

まぁ、MFCは慣れれば強力だけど敷居は高いから、始めたばっかのヤシが
ダイアログ表示するだけで「秘密コマンド」とか言い出すのも無理ないな。
984デフォルトの名無しさん:2009/08/20(木) 22:02:49
MFCなんてカスみたいに簡単じゃん^^
985デフォルトの名無しさん:2009/08/20(木) 22:16:30
>化粧品におけるファンデーションてのは化粧の下地って意味
ちょっと違う。ファンデーションのつきをよくするためにその下に塗るのが化粧下地。
986デフォルトの名無しさん:2009/08/20(木) 22:24:33
ボタンのOnCtrlColorでブラシ指定してんのに再描画が遅い
色々悩んだ結果
UpdateWindow();
Invalidate();
とかやらないとすぐに再描画されないらしい
と半日かかったw

なんか俺、こういうのばっかだ
987デフォルトの名無しさん:2009/08/20(木) 22:32:10
そのカスみたいなMFCについて質問です。
CMFCToolBar上のボタンをコンボに置き換えたいということで以下の様にコードを追加しました。

CMainFrame::OnCreate()にて

if( !m_wndToolBarReplace.CreateEx( this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC ) ||
     !m_wndToolBarReplace.LoadToolBar( IDR_TOOLBAR_TEST ) )
{
  TRACE0( "ツールバーの作成に失敗しました。\n" );
  return -1;
}
・・・
m_wndToolBarReplace.EnableDocking( CBRS_ALIGN_TOP );
EnableDocking(CBRS_ALIGN_ANY);
DockPane( &m_wndToolBarReplace );
・・・

CMainFrame::OnToolbarResetにて
UINT nToolBarID = ( UINT )wp;
if( nToolBarID == IDR_TOOLBAR_TEST )
{
  m_wndToolBarReplace.ReplaceButton( ID_BTN_1, //先頭のボタンのID これを置き換えたい
  CMFCToolBarComboBoxButton( ID_BTN_1, GetCmdMgr()->GetCmdImage( ID_BTN_1 ), CBS_DROPDOWNLIST ) );
}
とやってもボタンが置き換わらないのですが、他に何が必要なのでしょうか。
「ツールバー上のボタンを置き換える」についてのヘルプとMFCFeaturePackのサンプルについても見てみたのですが、
ボタンの置き換えについての手順はこれ以外に見当たらず、足止め状態です。
識者の方何とぞご指導くださりませ。
988デフォルトの名無しさん:2009/08/20(木) 22:52:43
俺にはむつかしすぎる!
989デフォルトの名無しさん:2009/08/20(木) 23:16:52
>>987
コード変更後にレジストリはクリアした?
してないなら一度すべて削除する。
990デフォルトの名無しさん:2009/08/20(木) 23:26:32
>>987
おそらく >>989 が正解。
CWinAppExをベースにしていると、LoadState / SaveState のおかげで
レジストリを削除しないとその後に変更した部分が反映されない。
991デフォルトの名無しさん:2009/08/20(木) 23:39:45
>>989-990
レジストリですか。。クリアしてませんでした。
確かにツールバーの位置については最初から保持してるなぁとは思っていましたが。。
ありがとうございます。感謝!
992デフォルトの名無しさん:2009/08/21(金) 00:07:10
>>991
ちなみに、CMainFrame::OnViewCustomize内でも置き換え処理してる?
ここでも置き換え処理しておけば、カスタマイズダイアログ上でもコンボボックスになるよ。
993987:2009/08/21(金) 00:29:45
>>992
OnViewCustomizeについては操作できないようにするつもりなので何もしていなかったのですが、
ついさっきテストプロジェクトで試してみたところツールバーもカスタマイズダイアログ上でも置き換えできました。
置き換えたコンボがDisableだったけど・・・ようやく一歩進めました。
感謝です!
994デフォルトの名無しさん
MFCのツールバーはCControlBar派生でちょっと他とちがうんだよね
CControlBarは独自のドッキングバー作るのに散々格闘したわ
CDockBarとCDockContextのドキュメントをなぜ出さなかったMSめ( ´ω`)