1 :
デフォルトの名無しさん :
2005/07/13(水) 05:28:44
2 :
デフォルトの名無しさん :2005/07/13(水) 10:42:13
では、早速質問でつ。 CParentDialog::OnShowWindow(BOOL bShow, UINT nStatus) { ChildDialog.Create(IDD_CHILD, this); ChildDialog.ShowWindow(true); } として動作していました。 が、ChildDialogに値を渡したいので、 ChildDialog.Create処理だけをParentDialog.DoModal()の前に移動して、 ChildDialogのプロパティを参照するようにしました。 そうしたところ、ChildDialog.ShowWindow(true)でエラーになりました。 回避方法教えて下さいでつ。
3 :
2 :2005/07/13(水) 10:47:26
事故解決しました。 処理変えなきゃ良いんでつね。 >ChildDialog.Create(IDD_CHILD, this); これがnewだと勘違いしてます他。
4 :
デフォルトの名無しさん :2005/07/13(水) 15:15:44
DoDataExchangeの動くタイミングを教えて下さい。 非表示では動作しませんか?
>4 非表示でも動きます。 UpdateData(TRUE); UpdateData(FALSE); が実行されれば。
6 :
4 :2005/07/13(水) 15:59:26
サンクツ
>>5 ただ、CWnd::UpdateDataの中の1行目「ASSERT(::IsWindow(m_hWnd));」でコケまつ。
7 :
デフォルトの名無しさん :2005/07/13(水) 16:19:00
>>6 アプリがどういう作りかわからんが、
ウィンドウが作られる前にUpdateData動かしてるからだろ。たぶん。
ダイアログのコンストラクタでUpdateData呼び出したら、
同じエラーになるぞ。
8 :
4 :2005/07/13(水) 16:38:19
サンクツ
>>7 Dlg.DestroyWindow();
Dlg.Create(IDD_DLG, this);
でウィンドウ作るようにしてみましたが、
今度は、
CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
の出だしの、
「ASSERT(HIWORD(lpszTemplateName) == 0 || AfxIsValidString(lpszTemplateName));」
でこけてまつ。
変な記述してるわけじゃないんだけどな...
9 :
4 :2005/07/13(水) 16:45:08
>Dlg.Create(IDD_DLG, this); >CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd) 先頭の引数は数値なのにLPCTSTRに入ってる時点で不思議。 なんか明示的に書いてやる必要があるのかな?
10 :
4 :2005/07/13(水) 16:47:27
UpdateData呼び出すのも難しいYO
11 :
デフォルトの名無しさん :2005/07/13(水) 16:52:12
>4 つか、いったい何がしたいのか?
12 :
4 :2005/07/13(水) 16:56:23
Dlg.DestroyWindow(); >Dlg.m_Control.SetCaption("データ"); //////←これをやりたい! Dlg.DoModal(); コントロールに文字列を設定したい。 なぜかというと、Dlgの中のメソッドの人に、 コントロールの文字列を使って動作する処理が入ってるから。 それを直すのも怖いし。
>4 環境書いてくれい VC6.0++とかか? あと、Dlg.DestroyWindow();で ダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・
14 :
4 :2005/07/13(水) 17:04:42
Yes.>VC6.0++とかか? >あと、Dlg.DestroyWindow();でダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・ え”~困ります。 既に出来てるDlgがグローバル変数になってて、一旦初期化しないと...
15 :
4 :2005/07/13(水) 17:12:22
Dlg.DestroyWindow(); Dlg.UpdateData(FALSE); >Dlg.m_Control.SetCaption("データ"); //////←これをやりたい! Dlg.DoModal(); でも、UpdataDataでエラーですね。。。 UpdateDataを外してもデータのセット時にエラーだし。
>>15 CDialog::OnInitDialogの中で
UpdateData(TRUE)
17 :
16 :2005/07/13(水) 17:15:50
上のは UpdateData(TRUE)じゃなくてUpdateDate(FALSE)です
18 :
4 :2005/07/13(水) 17:20:18
>CDialog::OnInitDialogの中で っていつコールされるんでしたっけ???
19 :
デフォルトの名無しさん :2005/07/13(水) 17:21:02
dlg.Create(IDD_DIALOG1, NULL); //わざと作る dlg.DestroyWindow(); //破棄する dlg.Create(IDD_DIALOG1, NULL); //も一回作る dlg.m_ctltext="aiueo";//ダイアログのメンバにセット dlg.UpdateData(FALSE);//変数からコントロールに更新 dlg.ShowWindow(SW_SHOW);//表示 これなら動いたぞ
20 :
デフォルトの名無しさん :2005/07/13(水) 17:25:49
dlg = new CNewDlg(); dlg->m_ctltext="aiueo"; dlg->DoModal(); dlgはCNewDlg*型 これならUpdateDataいらんな
21 :
16 :2005/07/13(水) 17:31:53
>>18 >っていつコールされるんでしたっけ???
CreateまたはDoModalしたとき。
そのCDialog::OnInitDialogの中で
自動でUpdateData(FALSE)が呼ばれるようになってる
MFCのソース見てごらん。
19の書いてくれてるのは
dlg.m_ctltext="aiueo";//ダイアログのメンバにセット
dlg.Create(IDD_DIALOG1, NULL); //も一回作る
dlg.ShowWindow(SW_SHOW);//表示
としてもOKだと思うよ。
中でUpdateDataしてくれるはず。
22 :
4 :2005/07/13(水) 17:34:33
>これなら動いたぞ
>>19 ですよね?
自分もそれに近いコールで動いてる箇所もあるような気がするし、
今のフォームはASSERTにひっかかるし、キョドってる。
MFCのCDialogのASSERTってトラップっていうか邪魔。
23 :
19 :2005/07/13(水) 17:37:42
>21 あ~ほんとだ、動くね。
24 :
4 :2005/07/13(水) 17:48:25
>dlg.Create(IDD_DIALOG1, NULL); //わざと作る >dlg.DestroyWindow(); //破棄する >dlg.Create(IDD_DIALOG1, NULL); //も一回作る 19路線でやってみたいと思いましたが、 Createの中の、 BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst) の中の、 hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate, pParentWnd->GetSafeHwnd(), AfxDlgProc); この行でエラーダイアログが出ます。
25 :
4 :2005/07/13(水) 18:00:19
>dlg.Create(IDD_DIALOG1, NULL); //わざと作る >dlg.DestroyWindow(); //破棄する >dlg.Create(IDD_DIALOG1, NULL); //も一回作る ごめんなさい、ここまでOKでした。 間違いは、2回目のCreateのID間違いでした。 が、この後のDoModal()でエラー。 DoModal前にCreateは禁止だったかなぁ?????
26 :
4 :2005/07/13(水) 18:03:04
Createをやめて、UpdateDataに差し替えたところ、 BOOL CWnd::UpdateData(BOOL bSaveAndValidate) { ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal? の出だしのASSERTで爆発。 もっと自由にコールできるメソッドにして欲しぃ。
27 :
19 :2005/07/13(水) 18:06:49
>4
Createの後でDoModalは俺もエラー
だからとりあえずShowWindowにした。
DoModalでなきゃヤダとか言うなら
>>20 の方法なら
問題なくDoModal出来る。
表示されるダイアログがクラス化されていればの話だが・・・
他に方法あったっけ?
29 :
4 :2005/07/13(水) 18:11:03
thx
>>27 >DoModalでなきゃヤダとか言うなら
>>20 の方法なら
>表示されるダイアログがクラス化されていればの話だが・・・
Dlgがグローバル変数で、かつ、実体宣言されてるので、
こうするためには激しい書換えが発生しまつ。
一部のメンテなんで激しい書換えは予定外でつ。厳しい...
>>28 そういうMFCでのモーダルとモードレスの制限が知りたいんじゃなく回避方法が必要なんでわ?
31 :
28 :2005/07/13(水) 18:19:35
>>29 そういう問題じゃない。
Createの後で何でDoModalするんだよ。
モードレスダイアログなら19の書いてくれてるように
CreateしてShowWindowでいいの!
>>30 何を回避?
4がモーダルとモードレスを混同しているとしか思えないが。
>4がモーダルとモードレスを混同しているとしか思えないが。 アタマワリー 別のライブラリなら、 TCustomForm *Form = new TForm(NULL); Form->PropA = "aaa"; //値をセット Form->ShowModal(); //モーダル Form->Show(); //モードレス という感じで自由にコールできるぞ。
33 :
31 :2005/07/13(水) 18:46:01
>>32 意味不明。
このスレはMFCの話だろ。
Createするってことはモードレスを意図してるんだろ。
その後でDoModalする必要性は如何に?
34 :
19 :2005/07/13(水) 18:54:14
>4 表示ダイアログの書き換えムリなら、 ShowWindowでモードレス表示して、 親ダイアログは制御を取らないように・・・って なんか面倒なような気が・・・ 俺なら問答無用に表示ダイアログ作り直すw
>Createするってことはモードレスを意図してるんだろ。 これが読み間違いだろ。 このクリエイトの目的は値をセットするためであってモードレス意図じゃないだろ。
36 :
4 :2005/07/13(水) 18:56:55
>>34 やっぱ難しいんですね。
MFCのDoModalとそれ以前のコントロールの設定の組み合わせは。
ダイアログ直して、コントロールに依存しないようにしてみまつ。
37 :
19 :2005/07/13(水) 19:00:31
ていうか、表示ダイアログの使い方って言うか、 仕様が変。 DoModalしたきゃ、表示ダイアログクラス化して、 パブリックなメンバ変数にアクセスして設定するとかしなきゃダメ。 そうすりゃ何でもあり。自由自在!!
38 :
4 :2005/07/13(水) 19:02:27
>>37 変なものをメンテしてるんだから、そんなこと言われても...
やっぱ、MFCのCDialogがもう少し使いやすくなるべきでわ。
ライブラリが色々強要してくると面倒。
39 :
33 :2005/07/13(水) 19:04:50
>>35 値をセットしたいなら
[モーダル]
dlg.m_hoge="abcde";
dlg.DoModal(); ※
[モードレス]
dlg.m_hoge="abcde";
dlg.Create(); ※
dlg.ShowWindow();
でいいだろ。(引数は省略)
UpdateData(FALSE)はそれぞれの※の後で、
CDialog::OnInitDialog()の中で自動で呼ばれる。
CreateとDoModalを一緒に呼び出す意図が分からないのだが。
40 :
4 :2005/07/13(水) 19:09:28
>>39 あるグローバルのダイアログが色んな用途に使われてて(←ここが破綻の元。せめて、1リソースに複数クラスにしといてくれたら何とかなったかも)、
モーダル/モードレスで開いたり閉じたりします。
で、
dlg.DestroyWindow(); //破棄する
が必要なんです。
で、破棄後に、
[モーダル]
dlg.m_hoge="abcde";
するとエラーになる。
41 :
19 :2005/07/13(水) 19:18:36
>4 ねぇ、そのグローバルのダイアログってクラス化されてないの? dlg.DestroyWindow();のdlgってあくまでCDialogなのか? 宣言部教えて
42 :
4 :2005/07/13(水) 19:24:34
19はシツコイ。 何を言いたいのか分かっているというか、 ダイアログのコントロールに直接入出力するのがおかしいことくらい誰でも知っている。 とりあえず、自分は19を必要としてない。
43 :
4 :2005/07/13(水) 19:32:28
ごめんなさい42を取り消します。 19さんは色々教えて下さった方でした。 「モーダルとモードレスと知らないのか?」と煽った人と勘違いしました。
44 :
19 :2005/07/13(水) 19:36:46
>4 うぇ~あぶねぇ・・・ ムカついて煽りの一文書くとこだったw
45 :
19 :2005/07/13(水) 19:40:59
>あるグローバルのダイアログが色んな用途に使われてて どんな使い方してる? DoModalで表示?それともShowWindowで表示? 必ずCreateしないと使えないの?
46 :
4 :2005/07/13(水) 20:01:03
>>45 今までずっとShowWindowでモードレスされてたウィンドウですが、
今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。
ダイアログを別インスタンスにしようと思ったら、
グローバルなダイアログ同士が参照しあってて、
正直ガクブル
47 :
33 :2005/07/13(水) 20:02:28
>>42 俺に対して言ってるんだろうなぁ。
16以降の俺の全レス読んで欲しい。それでも煽りと捉えられてしまうなら残念。
簡単なコードで試してみたが動いたことだけ報告しておくよ。
(ダイアログ作成と廃棄のタイミングまで細かく見てないので、これでは問題あるかも。
あと、それぞれの関数はボタンのコマンドハンドラでdlgはCDialog派生です)
void CTestApp::OnModal()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
dlg.DestroyWindow();
dlg.m_str = "Modal";
dlg.DoModal();
}
void CTestApp::OnModeless()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
dlg.DestroyWindow();
dlg.m_str = "Moeless";
dlg.Create(IDD_HOGE, NULL);
dlg.ShowWindow(SW_SHOW);
}
48 :
4 :2005/07/13(水) 20:06:24
thx
>>47 煽りに対して憤ってるんじゃありません。
前スレで感じたんだけど、MFCスレは上手く会話を流さないとやヴぁい流れになるんで。
dlg.DestroyWindow();
dlg.m_str = "Modal";
dlg.DoModal();
この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。
でもまぁこれはMFCの制限と捕らえました。
自演の悪寒
50 :
デフォルトの名無しさん :2005/07/13(水) 20:10:54
二つのプログラムA,Bで双方向に非同期で通信したかったので、 A,BをそれぞれDDEサーバーかつDDEクライアントにして プログラムを書いたら、どうにか動いたのですが、それをLinuxに 移植したいと考えています(できればWindowsでも動かしたいです)。 DDEの代わりになるお勧めの方法はありますか? 交換するデータ量は、たとえばAのプログラムでボタンをクリックした ときに、数バイト程度の文字列をBに送るとか、その逆です。 よろしく。
51 :
47 :2005/07/13(水) 20:13:28
>>48 dlg.m_ctrl.
dlg.Create(...)
こうすると確かにエラー
Createの段階ではコントロールウィンドウが作成されてないためでしょう
dlg.Create(...)
dlg.m_ctrl.
ならOKでしたよ。
>>46 MFC の window = CWnd は、
Windows の window HWND のラッパ。
CWnd は C++ 的 object。そのまんまの lifetime。
HWND は Cretate から Destroy までの lifetime。
もしくは DoModal() の開始から終了までの lifetime。
dialog 上の control (dialog から見て child control) は HWND 的には
dialog (control から見て parent window) と lifetime を共にする。
53 :
19 :2005/07/13(水) 20:26:26
>4 ちょーとまて >この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。 って事は実はクラス化されているのか?DoDataExchangeも使ってるし・・・ dlg.DestroyWindow(); のdlgって CDialogの派生でCXxxxDlgなのかな? dlg.DestroyWindow(); //今までの削除 CXxxxDlg dlg2;//新しく宣言 dlg2.DoModal(); //表示 まずこれで動くか?
>>46 ご愁傷様。そこで回避案。
class IInitDialogHandler
{
public:
>>46 >今までずっとShowWindowでモードレスされてたウィンドウですが、
>今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。
AfxGetMainWnd()->EnableWindow(FALSE); してから dlg.ShowWindow() すると
おおむねモーダル風になるよ。
>>46 class IInitDialogHandler
{
virtual void Do() = 0;
};
class 問題のDialog
{
IInitDialogHandler* m_initDialogHandler;
void OnInitDialog()
{
if (m_initDialogHandler) {
m_initDialogHandler->Do();
}
}
};
問題のDialog dlg;
class 問題のDialogのClient : public IInitDialogHandler
{
virtual void Do()
{
dlg.m_control.SetWindowText("modal");
}
void OnModal()
{
dlg.DestroyWindow();
dlg.DoModal();
dlg.CreateWindow(...);
}
}
ダイアログクラスのインスタンスを何度も使いまわすなら CWnd : : Detach()でも使えないかね… DestroyWindow()はなんか大げさな希ガス。
実は>55が一番素直じゃないかって気もしないでもないな。
60 :
4 :2005/07/14(木) 08:42:33
>>53 あ、DoDataExchangeってそういう使い方するんですか。
コントロール生成の前に値を変数に入れとくわけですね。
って超基本を誤解してた悪寒。
>>51-59 各種破棄メソッドとlifetimeの関係、
このあたり、ずっと知りたいとこでした。¢(ーー;メモシトク・・・
61 :
デフォルトの名無しさん :2005/07/14(木) 13:58:17
CDC dcWork,dcScreen; dcWork に描画された内容を 指定したRGB値を透明色にして 全体を半透明に dcScrren にBitBltしたいのですが、 このようなことはできるのでしょうか?(自前でアルファブレンドや透明色のコードを書かないで) CDC::AlphaBlendとCDC::TransparentBltの2つの機能をあわせたような処理を実現したいのです。 自前でピクセルを全て操作するような処理を実装すると、すこぶる遅くなるので、MFC(API)に任せたいのです。 (DirectXとかOpenGLとかは使いたくないです。) 賢者の方よろしくご教授下さい。お願いします。
少なくともMFCにそんな機能は無い。
63 :
61 :2005/07/14(木) 14:22:23
>>62 そうなんですかがっかり・・・・
他にこのAPIが使えそうとか、こういう風な実装をすれば、高速に処理できるとかヒントや参考になるリンクでも
知っている人がいましたら、ぜひお教え下さい。お願いします。
GDI+とかでもできなさそうでしょうか?Graphicsクラス?
素直にDirectX使った方がいいかと
MFCにDirectXのラッパ無いんでしたっけ?
そんなの要らん
67 :
16ほか :2005/07/14(木) 19:19:35
>>60 今ごろになって何言ってんの?
まともにデバッガ使ってないだろ。
ついでに、俺の全レスは
>>16 >>21 >>28 >>31 >>33 >>39 >>47 >>51 >>57 。
それでも42-43のような発言をした挙句に撤回もせずに
すっとぼけて出てくる気が知れん。
-----------------------------------------------------
あまりにも目に余るので一言言わせてもらいました。
他の回答者&質問者の方々、スレ汚しになり申し訳ありません。
68 :
デフォルトの名無しさん :2005/07/14(木) 19:21:13
CListCtrlを継承したクラスでカスタムドローを使って描画しています。 リストのアイテムを選択した際の描画をフックするためにOnCustomDrawの中で LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; switch( lplvcd->nmcd.dwDrawStage ) { case CDDS_PREPAINT: *pResult = (CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT); break; case CDDS_ITEMPREPAINT: *pResult = (CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYPOSTPAINT); break; case CDDS_ITEMPREPAINT | CDDS_SUBITEM: *pResult = (CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYPOSTPAINT); break; case CDDS_POSTPAINT: break; case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: case CDDS_ITEMPOSTPAINT: if ( (lplvcd->nmcd.uItemState & CDIS_FOCUS) != 0 ) { // ... (*) } break; default: *pResult = CDRF_DODEFAULT; break; } としていまして、アイテムをマウスでピックした際には(*)に来るのですが、 プログラムの中から以下のようにアイテムを選択状態にしても来ません。 SetItemState( iIndexInVisible, CDIS_SELECTED | CDIS_FOCUS, CDIS_SELECTED | CDIS_FOCUS ); 何が問題かわかりますでしょうか。。。
69 :
68 :2005/07/14(木) 19:24:27
わかりにくくてすみません。
>>68 の(*)の位置で選択状態にあるアイテムの描画をしているのですが、
マウスでアイテムをピックした場合にはうまくいくものの、プログラム内の他の関数から
SetItemStateを読んでアイテムを選択状態にしても(*)の場所に処理が来ずに描画ができないという状況です。
>>68 Listコントロール自体がフォーカスを持っていないからでは?
>>69 選択状態のアイテムの強調表示を常に行いたいのなら、ListViewのスタイルに
LVS_SHOWSELALWAYS を追加して、uItemState & CDIS_SELECTED を見るのが
正しげに思える。
>>69 フォーカスと選択に関する例です。解っているなら無視してください。
例えば List Control の代表的な例としてエクスプローラでファイルがいくつか入った
フォルダを開いて、アイテムをクリックすると、リストコントロールとアイテムが選択され、
かつそのアイテムにフォーカスが移動する。
ここでCtrl+矢印でフォーカスだけ移動させてみると、フォーカスを示す点線の矩形が
ファイル名を囲むように表示される。他のウィンドウをクリックするなどして、リストコント
ロールがフォーカスを失うと、アイテムのフォーカスを示す矩形は非表示になる。
>>68 SetItemStateの引数に渡すのはCDIS_じゃなくてLVIS_の方だと思う。
それぞれ以下のようにdefineされてるので、確認。
CommCtrl.h
#define LVIS_FOCUSED 0x0001
#define LVIS_SELECTED 0x0002
#define CDIS_SELECTED 0x0001
#define CDIS_FOCUS 0x0010
74 :
デフォルトの名無しさん :2005/07/15(金) 00:05:26
エディットボックスがあってコントロール変数CString m_Editがあるとします。 そしてWM_USER_ADD_STRINGというメッセージを受けるとメッセージハンドらで CXXXDlg::OnAddString(WPARAM wParam, LPARAM lParam) { m_Edit += (LPCTSTR)lParam; UpdateData(FALSE); } とやってm_Editに文字列を追加していきます。 そしてたくさん追加するとスクロールバーが出てくるのですがこいつを一番したに自動で行かせたいのです。 つまり最後に追加した奴を見るのにいちいち人手でスクロールさせるのは面倒くさいので自動にしたいわけです。 いい方法はありませんか?
あります。
>>74 MSDNのCEditクラスメンバー辺りを矯めつ眇めつする。
77 :
デフォルトの名無しさん :2005/07/15(金) 01:42:18
ちなみに UpdateDataの次の行から CEdit * pWnd = (CEdit *)GetDlgItem(IDC_EDIT); int lines = pWnd->GetLineCount(); int pos = pWnd->LineIndex(lines - 1); pWnd->SetSel(pos, pos, FALSE); とかやってみるとそれっぽく動いたのですが、どうも落とし穴がありそうな気が。 さらにIDC_EDIT2を追加してこちらも同様にWM_USER_ADD_STRING2で テキストを追加、行を最後に移動と言う処理をさせると IDC_EDITとIDC_EDIT2のどちらかしかスクロールバーが最後に来てくれないのです。 なぜでしょうか?
>>77 SetSel()は表示されることを保証しないからねぇ。
ちなみに私が使っている最終行を表示させる関数はこう。
void showLastLine(CEdit & edit)
{
edit.SetRedraw(false);
edit.LineScroll(edit.GetLineCount());
edit.LineScroll(-1);
edit.SetRedraw();
}
>>78 ありがとうございます!!!
明日早速試してみます。
本当に夜分遅くありがとうございました!
80 :
61 :2005/07/15(金) 06:21:33
>>61-64 ふぅ時間がかかりましたが自己解決しました。DirectXもOpenGLも使わずにすみました。
81 :
デフォルトの名無しさん :2005/07/15(金) 13:40:58
質問です。 ViewのOnCreateでダイアログを作成してモードレスで表示しています。 ソフトが立ち上がったときにこのダイアログのエディットコントロールに すでに入力フォーカスがあるようにしたいのですが、 OnInitDialogでSetFocusをやったけれどうまくいきませんでした。 どこでSetFocusをすればいいのでしょうか?
82 :
デフォルトの名無しさん :2005/07/15(金) 13:43:07
質問です。 ViewのOnCreateでダイアログを作成してモードレスで表示しています。 ソフトが立ち上がったときにこのダイアログのエディットコントロールに すでに入力フォーカスがあるようにしたいのですが、 OnInitDialogで GetDlgItem(ID)->SetFocus() をやったけれどうまくいきませんでした。 どこでSetFocusをすればいいのでしょうか?
あっ、書き込めてないと思って2重カキコしてしまいました。すいません・・・
>>82 OnInitDialog()のテンプレートにはコメントがついていると思うのだが、
そこには何と書いてあるかな?
とりあえず自己解決策を見出してみたのですが、 >84さんのやり方のほうが簡単だとおもって 戻り値をFALSEに代えてみたけどちょっと動作が不安定なのです・・・ 入力フォーカスが行ったり行かなかったりします。(大概いかない) もしよければ詳しく教えてもらえませんか? OnInitDialogで GetDlgItem(ID)->SetFocus(); return FALSE; とやると、一旦はフォーカスが行くようですが、 そのあとKillFocusが呼ばれ、フォーカスは目的の場所には行っていません。 当然SetFocusをやらなければKillFocusも呼ばれないのですが。
viewのOnInitialUpdate()のタイミングでViewがアクティブになり ダイアログからフォーカス奪うからだめでしょう。 そのタイミングでダイアログをアクティブにするため PostMessageすればよろし。
87 :
デフォルトの名無しさん :2005/07/15(金) 19:44:30
こんばんわ。 MFCで、リソースからダイアログを生成したのですが、 再描画がうまくされない不具合があります。 なぜなのでしょうか? ちなみに、再描画されないリソースダイアログは、親のダイアログの子としてCreate生成しております。
再描画がうまくされないとは?
89 :
87 :2005/07/15(金) 20:26:31
かいけつしました
90 :
87 :2005/07/15(金) 20:28:37
ありがとうございます。 具体的には、親のダイアログの子としてCreateすると、 子ダイアログの後ろにある、親の背景が透けて見えるという 感じです。コンパイルは成功するのですが、描画だけおかしくて。 問題点を教えてもらえればありがたいです。
それは、ダイアログリソースの可視にチェックを入れている せいだろう。チェックを外してみるが良し。
92 :
87 :2005/07/15(金) 20:31:07
>>91 さん
ビンゴでした。どうもありがとうございました。
93 :
87 :2005/07/15(金) 20:58:52
可視を消したら全部消えちゃった
強制的に対象ダイアログに対してInvalidate()なりUpdateWindow()なり RedrawWindow()なりやってみる。
97 :
74 :2005/07/16(土) 01:24:20
さっそくためさせていただきました。
結論から言うと
>>77 でも
>>78 さんのやり方でもできましたが、
>>77 で書いた問題はどちらもありました。
で、その問題はなぜ起きるかと言うと、UpdateDataの契機でIDC_EDITもIDC_EDIT2も
最初の行にスクロールして戻ってしまうからでした。
よって
CXXXDlg::OnAddString()
CXXXDlg::OnAddString2()
のいずれのハンドラでもIDC_EDIT、IDC_EDIT2の両方に対し、最後の行に移動する処理を書く必要があったみたいです。
もっとうまい方法がある気がしますが、自分はこの辺でやめときます。
(キャレットを最後に移動させておくとかするとUpdateDataで最初の行に戻らないのかも??)
98 :
78 :2005/07/16(土) 01:47:39
>>97 あー、そりゃDDXで全てやろうとするからだ。
私の場合は処理速度の問題もあったからReplaceSel()で追加しているんで
UpdateData()までは気付かなかったよ。
100 :
74 :2005/07/16(土) 09:49:33
>>98 ReplaceSel()を使うのですか。またひとつ勉強になりました。
101 :
82 :2005/07/16(土) 11:54:45
>86 そうか。PostMessageもありましたね。 自分の解決策は、Appのイニシャライズで無理矢理SetFocusをする方法でした。 なぜフォーカスを奪われてしまうところの解決策はなさそうですね。 とりあえず解決しております。分からないこともありますが・・・ ありがとうございました。
102 :
78 :2005/07/16(土) 14:05:56
>>100 それじゃ折角だから追加するロジックも貼っておこう。
--
int pos = edit.LineIndex(edit.GetLineCount() - 1);
edit.SetSel(pos, pos);
edit.ReplaceSel("foo\r\n");
質問です。 mfcを使ってWinXPで動作するアプリケーションを組もうと思っています。 開発にはVC++ 2003を使います。 アプリの内容は、インターネット上のサーバーから、値段の情報が10くらい 一度に送られてきて(送られてくる頻度は10値段/3秒くらい)、 それをリアルタイムに折線グラフを画面上に表示するものです。 リアルタイムの株価グラフアプリを思い浮かべて頂くとよいです。 質問の内容は、「上記アプリで「グラフを描画する」際に、最も適当な手段はなにか」を教えて頂きたいのです。 例えば、 mfcの機能のみでゴリゴリ書く グラフライブラリを使う ←そもそもあるのか? グラフクラス集を使う ←そもそもあるのか? とかです。 私がググったところ、それっぽいのは発見できませんでした。 将来的にはOpenGLとかを使ったグラフの3次元化も考えています。 エロイ人おながいしまつ。
CDC
>>103 つ[諦める]
世の中にはグラフのためのライブラリなんて山ほどあるのにそれを見つけられないようなら、ね。
私は3Dグラフも必要だったからTrueWinChartを使ったけど、そんなに高くなくても
追記型のグラフ作成に向いたのがいくつもあるよ。
106 :
103 :2005/07/19(火) 00:11:46
>>105 レスありがとうございます。
>世の中にはグラフのためのライブラリなんて山ほどあるのにそれを見つけられないようなら、ね。
以前ググったときの検索ワードがよくなかったみたいです。
教えて頂いたTrueWinChartのHPのいくつかのワードでググりましたら、下記他がHitしました。
MSChart、Chart Builder 5.0J、UltraWinChart for .NET、@GKitOCX Chart V2、@GKitOCX Graph V2、SCIENCE VIEW V1.0
中でも、Rogue Wave Stingray Studio 2004 の Objective Chartは
C++で書かれた100%MFC コンパチブルなコンポーネントで、
カスタマイズ可能(ソースで提供)なので今回の用途には一番適していました。
もし、このObjective Chart以外にも、こういうソフトもあるよ、とか、検索ワードにはxxがあるよ、
とかありましたら、お教え下さい。
つか、折れ線グラフくらいならライブラリ使わなくても自力でいけるだろ。
印刷ダイアログと印刷プレビューの機能を実装したいのですが、 分かりやすいサンプルコードはないですか?
109 :
デフォルトの名無しさん :2005/07/19(火) 15:26:51
質問なのにsageちゃったのでageます。
どういうレベルの話かわからんが、印刷サポート付きのMFCアプリケーションを ウィザードに作らせれば、MFCの持つその機能の使い方はわかる。
スレッドを作成する関数に"AfxBeginThread"って言うのがありますが、 ゴチャゴチャしてて面倒くさそうなので、process.hの_biginthreadを使用し ています。 _biginthreadに対するにAfxBeginThreadのメリットって、簡単に言うとどう いうことでしょうか?
訂正:_biginthread -> _beginthread 結構はずかしい。
>>111 に答えようと思いましたが、ゴチャゴチャしてて面倒くさいのでやめます。
114 :
1/2 :2005/07/19(火) 19:42:53
すみませんがだれか知恵を貸してください。 SDIアプリケーションで、新しくウインドウを開きたくて、「マニュアルが教えないMFC」 に書いてあった方法で、MainFrm.cppに #include "GraphFrame.h" //CFrameWndから派生したクラス static CGraphFrame* pframe2 = NULL; void CMainFrame::OnGraph() //メニューのコマンドハンドラ { // TODO : ここにコマンド ハンドラ コードを追加します。 if (pframe2 == NULL) { CTEAnalyzerDoc* pDoc = (CTEAnalyzerDoc*)GetActiveDocument(); //-----F1:新しいFrameの生成 -------------- pframe2 = new CGraphFrame; pframe2->Create(NULL, "Graph"); //-----F2:新しいViewを生成してFrame/Documentと結びつける ------ CRuntimeClass* pNewViewClass; pNewViewClass = RUNTIME_CLASS(CGraph); CCreateContext context; context.m_pNewViewClass = pNewViewClass; context.m_pCurrentDoc = pDoc; CView* pNewView = STATIC_DOWNCAST(CView, pframe2->CreateView(&context)); //-----F3:新しいViewの初期化 -------- pNewView->OnInitialUpdate(); //-----F4:新しいFrameの初期化 ------- pframe2->ShowWindow(SW_SHOW); pframe2->RecalcLayout(); } } と追加したところ、新しい窓が表示されました。
115 :
2/2 :2005/07/19(火) 19:43:28
また、GraphFrame.cppでOnCreate()をオーバーライドして m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.LoadToolBar(IDR_MAINFRAME); m_wndStatusBar.Create(this); m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); これでツールバーとステータスバーが出ましたが、メニューは表示されません (当たり前といえばそうですが) これから自作のリソースを使って新しいウィンドウにメニューを出すにはどうしたらいいでしょうか。 CMenu m_wndMenuを定義して HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu(); m_wndMenu.Attach( hmnu ); m_wndMenu.LoadMenu(IDR_MAINFRAME2); とやってもデバッグアサーションになりました。
アサーションに失敗すると、次のテキストがメッセージ ボックスに表示されます。 assertion failed in file <name> in line <num> Abort Retry Ignore <name> にはソース ファイルの名前、<num> にはエラーが発生したソース ファイルの行番号が入ります。 [中止] をクリックすると、プログラムの実行が停止します。 [無視] をクリックすると、プログラムの実行が再開されます。 [再試行] をクリックすると、ASSERT の後でも、デバッガに移行できます。
117 :
デフォルトの名無しさん :2005/07/19(火) 21:17:08
>>115 なんでAttachした後にLoadMenu()するんだ?
115 OnCreate()のタイミングではどうやっても無理。 CHogeApp::InitInstance()で CSingleDocTemplate( IDR_・・・ とするか CMainFrame::PreCreateWindowで cs.hMenu = LoadMenu(NULL, MAKEINTRESOUCE(IDR_・・・ とする。
>>111 AfxBeginThreadではMFCの初期化処理が行われている。
つまりスレッドでMFCを使うのならAfxBeginThreadを使わないといけない。
そうでもないぞ。MSDNのMFCマルチスレッドのサンプルでは AfxBeginThreadなんて使ってないよ。なぜ使ってないかは ソース見れば分かるが。
121 :
115 :2005/07/20(水) 19:16:36
>>120 > なぜ使ってないかは
分かったぞ、ゴチャゴチャしてて面倒くさそうだからだ。
MSDNのサンプルって昔のバージョンのやつを使いまわしてるからな
124 :
103 :2005/07/20(水) 20:17:16
折線グラフで書く線分に、アンチエイリアスとアルファブレンディングしたいのですが、 MFC上で使うには、どのように指定すればいいですか? OpenGLとか使わなければできないのでしょうか?
アンチエイリアスとアルファブレンドについて小一時間調べてからこい。
127 :
103 :2005/07/21(木) 06:11:41
>>125 ,126
小一時間調べました。DirectXや .NET Frameworkを使えば出来そうです。
が、MFC以外の仕組み(Direct~やOpenGLやその他のライブラリ様のものや .NET Framework)は出来れば使いたくなく、
アンチエイリアスとアルファブレンドのアルゴリズム等も実装せずに使いたいのです。
どのようにすれば出来ますか?
>>127 たかがリアルタイムトレンドみたいなものにしては要求仕様が無駄に高いな。
TrueWinChart(orTrueWebChart)のようなそういう目的で作られたようなライブラリでさえ
そこまでしてなかったような気がするんだが。
にも関わらず、それらを使わずアルゴリズムも実装しないって、何舐めてんの?
手間をかけずに無から有が得られるわけないじゃない。
営業といっしょにクライアントに頭下げに行ってきたら?
>>127 GDI+ 程度で十分過ぎると思うけど・・・
MFC以外は使いたくないんだとさ。 ほっとけよ。
MFCのCStringは可変長ですが、 初期状態で、代入できる文字列の長さの制限はありますか? なぜか、デバッグで調べたところ、文字が途中で切れているみたいなのですが。
解説 どのコンストラクタも指定されたデータで新しい CString オブジェクトを初期化します。 各コンストラクタは入力データを新しく確保した領域にコピーします。したがって、メモリ不足の例外に注意する必要があります。
CListCtrlのSetItemTextで設定できる文字列の長さに制限はありますか?
134 :
103 :2005/07/21(木) 17:11:59
>>129 情報ありがとうございます。
GDI+について、小二時間くらい調べました。
.NET Frameworkに組み込まれているGDI+は、
VC++のマネージコードから呼び出すように作られていると思います。
VC++マネージコードで書かれた、GDI+を使ったクラスを、
MFCを使ったVC++ネイティブコードから呼び出すことは出来ますか?
また、出来るとしたら、どのようにすれば出来るか、
その方法を知ってる方、回答お願いします。
gdi+ってXP以上しか使えないんじゃなかったっけ? 俺のとこMeなんだけど。
137 :
103 :2005/07/21(木) 17:56:48
>>135 的確な情報ありがとうございます。
本当に助かりました。
>>136 gdiplus.dll をアプリケーションと供に配布すればOK。
ただし、セキュリティの問題で1度改版されているので、
SDK に入ってる奴とかを安易にコピーしないで最新のを
配布する必要があります。
それでもgdiplus.dllはWin95には対応していないと書いてあったような。
>>131 64KByteだと記憶していたが、その記載が見当たらんな。
CEditと勘違いしたかな・・・
CListCtrlのSetItemTextで、設定できる文字列数の制限ってあります?
テキストファイルにStdioFileのWriteStringで書き込むと 上書きされてしまいます。 追加で書き込む方法はありませんか?
最後まで移動してから書け。
自己解決しました。 >最後まで移動してから書け。 これだと途中に追加できないでしょ。 解決策は、書き込む部分以降の文字列を \nも考慮してバッファに一時退避して、 あとからWriteStringで一発。
途中に入れるのは追加と言わず挿入というんだ。
147 :
143 :2005/07/22(金) 21:39:29
確かにわかりにくいですね。 教えてくれたのにえらそうにしてすみませんでした
コンパイルしたexeが実行されているpathを得るにはどうしたらいいですか? 後、システムのtmpフォルダのpathを得る方法は、どのようにすればいいでしょうか?
GetModuleFileName GetTempPath
>>148 それぞれGetModulePathName,GetTempPathかな
151 :
150 :2005/07/22(金) 22:35:01
先越された上に間違っとる。 149のが正しい。 ちゃんと調べてから答えねば・・・
152 :
148 :2005/07/22(金) 22:36:46
どうもありがとうございました。
作業フォルダが実行ファイルの位置と同じかどうかは ユーザーの良識に任せられてるから気をつけませう
誰も作業フォルダの話はしていないが、作業フォルダにユーザの良識なんか関係ない。
.NETやらでプログラマーへの負担が減ってきている中で、MFCみたいなもんを使わないといけないというのが不憫でならない。
MFCってヌルポインターの例外処理クラスってあるか?
>>155 MFCの一番嫌なのは慣れてないことしようとすると調べる時間が大半を占めるところだと思う。
それといちいちドキュメント見なきゃ引数を渡せないのも痛いと思う。
>>157 基本的なことをするのには簡単なのはわかるが、応用が利かない。
ちょっとでも変形すると、言うこと聞かなくなる。
>それといちいちドキュメント見なきゃ引数を渡せないのも痛いと思う。 なんだってそうだと思うが。
160 :
デフォルトの名無しさん :2005/07/25(月) 11:10:01
ダイアログのwindowにBMPを貼り付けているんですが(タブ切り替えなどで画像 が切り替わります)、このwindowを最小化、またはMFCとは全く別のwindow、 たとえばIEのブラウザのwindowや全く別のソフトのwindowなどで、 この画面を覆ってから再度元のMFCのwindowを表示させるとBMPが別の画像に 変わってしまいます。 このような再度画面を表示させたときに呼び出されるイベントハンドラがあれば その中で適切に処理して、問題解消できるのですが、そのイベントがわかりません。 試した中でそれっぽい物はOnInitDialogやSetActiveなんですが、 どちらも反応しませんでした。 現状を説明するのが難しくてわかりにくい質問になってしまうのですが、 ご理解できる方で何かアドバイスがあればよろしくご指導お願します。
>>160 画面に描画するのはいつもOnPaint。
でもほかに原因がありそう。
いや、「WM_PAINTに対応していない」がすべての原因だと思う。 そして、この後ダイアログのOnPaintを作ったけどどーにもならんという相談が続く。
KSPIN_LOCKのエラーが出るのですが、、これはいったい何なのでしょうか?
コンパイルエラーでしょう。
165 :
デフォルトの名無しさん :2005/07/25(月) 16:11:52
CFindFile::FindFileでフォルダを列挙しています。 FindFileの引数に入れる検索する文字列の中に、たとえば 「"C:\news.2ch.net\*.*"」というようなかんじでいれていますが、 検索フォルダ名に"."が入っていると FindFile() = 0 が返ってきてその下層のフォルダの列挙ができません。 もちろんnews.2ch.netフォルダもありますし、その下にはフォルダがまだあります。 "."を手動で消して試してみたらできました。 これの原因、対処方法など知っている方がいましたら教えてください。
よもや'\\'の呪縛ではなかろうな。
167 :
デフォルトの名無しさん :2005/07/25(月) 16:36:48
「指定したドライブのセクタをダンプ表示するプログラム」 を作っているのですが、ドライブのアクセス方法がわからなくてのっけからつまずいています。 どなたかご存知の方いましたらご教授お願いします。 環境はXP、VC++6.0、MFCダイアログベースです。
物理ドライブ番号 read でぐぐったらみつかりそうだけど
169 :
165 :2005/07/25(月) 16:44:10
>166 それも確認済みです。 今もう一度確認しましたが、大丈夫です。 ワイルドカードを"*.*"→"*"に変えてみましたがだめでした。 GetLastErrでは「指定されたパスがみつかりません」と出ました。 もうちょっといろいろやって試してみますが・・・ 原因知っている方いませんか~
念のためFindFileに渡してる文字列をMessageBoxやTRACEで表示してみ。
171 :
165 :2005/07/25(月) 16:54:34
アイター。原因がわかりました。 CFindFile::GetFileTitle()から取得したフォルダ名をつかって さらにその下のフォルダを取ろうとしていたので、 GetFileTitle() = "news.2ch" となっており、 ".net"部分が拡張子とみなされたのか、入っていませんでした。 すみません。ありがとうございました。確認って大切ですね・・・
>>167 read CreateFile() page in MSDN.
>162 ダイアログだと特定のイベント受け取らないとか、 (メニュー反応しないとか、そういうやつ) あの意味不明な仕様は一体なんなんでしょうね。 MFCの謎仕様に振り回されて気が狂いそうです。
MFCじゃなくても普通ダイアログにメニューつけるなんてしないしなあ。
起動時に最大化という設定はどうすればいいんでしょうか? AppWizardの設定で通常にしていたのですが、途中で起動時に最大化にしたくなりまして・・・
SW_MAXIMIZE
ウインドウ関係はCWndだと知ってれば済む問題
178 :
こん :2005/07/26(火) 11:52:44
ウィンドウのタイトルやフレームを消す方法って、どうするんですか? アプリケーションの起動時に消す方法は、PreCreateWindowっやつの中で CREATESTRUCTをいじくればいいってことはわかったんですが、いったん 表示してしまった後で変更する方法(たとえばメニューから操作して)が わかりません。 どういう方法をとればいいかご存知の方、教えてくださいませ。
180 :
こん :2005/07/26(火) 13:18:04
>>179 そこまでは大体予想がつくんですが、どのメソッドをどういじくるのか
もしご存知なら、もう少し具体的に教えてください。
MFCプログラミングをはじめてまだ1週間なんで、MFC流儀の法則性のような
ものが良くわからないんです。
普段なら「これは好機」と何時間(何日?)もかけて片っ端から
試しまくるところですが、今回は少し急いでいるんです。
どうか、あなたのお時間をお分けください。
181 :
こん :2005/07/26(火) 13:24:07
ちなみに現在のところ、AppWizard(SDI)が作ったドキュメント/ビュー アーキテクチャで進めています。
>>180 タイトルやフレームの無いスタイル(style)に修正(modify)する。
183 :
こん :2005/07/26(火) 14:21:00
やっぱりそいつでしたか。確信を持たせていただいたおかげで かなりの時間をカットできました。ありがとうございます! 途中でCWnd::SetWindowPosで試してみたり、ビュークラスに付けてみたりして で時間がかかりましたが、メインフレームクラスに付けて何とかできました。 最後にもう一つ、甘えさせてください! これを即時反映するには、どうすればよいのでしょうか、教えてください。 InvalidateRect()とかUpdateData()みたいな感じのものがあるのでしょうか?
184 :
デフォルトの名無しさん :2005/07/26(火) 15:05:12
CScrollViewを基本にテキストファイルを表示するプログラムを作ったのですが、 MFCで最初から提供されている印刷機能で印刷するとすっごく縮小されたものが印刷されてしまうのですがどうしたらいいですか?
187 :
こん :2005/07/26(火) 15:34:47
>>185 180に書いてある通り、今回はその時間がないからお願いしてるんですよ。
(それでもかれこれ、列挙できなくらい色々な方法を試しましたが。)
どうもあせっていると説明を読んでも上滑り・誤解しがちなので(特に英語)、
実は正解だった方法をスルーしてしまっているのかもしれません。
誰かご存知の方おられましたらよろしくお願いします。
188 :
こん :2005/07/26(火) 16:26:35
>>186 ありがとうございます(レスいただいているのにしばらく気づきませんでした)。
SetWindowPos と ShowWindowでそれらしい動作を得ることができました!
動作が微妙な部分もありますが、それはおそらくフラグの整合性(ほかの部分でも
いじってるし)の問題だと思います。
結果的には、この小さな機能を実装するだけで3時間も食ってしまいましたが、
皆さん(お1人?)のお時間をいただけなければもっとかかるところでした。
ありがとうございました。
189 :
こん :2005/07/26(火) 16:42:23
>>188 訂正w
3時間→8時間
右手の中指と左手の中指間違った。
おまえ調査に時間かかりすぎ。才能ないからプログラマ辞めた方が身のためだよ
これは向いてないね。 人生設計見直してみたら?
>>188 気にするな。俺もウインドの中のウインドの位置をプログラムから
自動調整したり親ウインドをそれにあわせて広げたり縮めたりするだけで子一時間悩む。
194 :
デフォルトの名無しさん :2005/07/26(火) 19:56:17
お世話になっております 質問です リストビューのタイトルバーに、 2行の文字を入れたい場合,、リストビューに どのように記述すればいいでしょうか? 1 山田 田中 太郎 一郎 のように、第2、3カラム目を2行表示にしたいのですが。
195 :
こん :2005/07/26(火) 20:20:53
190-191 AppWizard使ったのは今日が初めてだったんっす。 したら、なんかそっくりなコードがいっぱい作られて大変だったんす。 マジで今日はMFCの仕様に面食らいました。 ちなみに、僕はプログラマではないので、それが唯一の救いです。
こんってベリューションにいる奴? うぜーから消えてくれ
右手の中指と左手の中指間違ったってのがすげぇ笑った。
201 :
デフォルトの名無しさん :2005/07/28(木) 13:56:16
スクリーンショット取りたいんだけど、 デスクトップ全体はGetDesktopWindow()を使えばいいのはわかったんだけど 他のアプリケーションの領域だけ取得するにはどうすればいいんでしょうか?
>>201 GetDesktopWindow()を、対象アプリのウィンドウハンドルを得るコードに置き換える。
203 :
デフォルトの名無しさん :2005/07/29(金) 00:26:09
CPrintDialogの使い方がイマイチ分かりません。 印刷ダイアログで変更した用紙サイズ/用紙方向を出力に反映させるにはどうやったらいいの?
>>203 用紙サイズ/用紙方向の情報を元に
自前で出力
205 :
デフォルトの名無しさん :2005/07/29(金) 01:21:48
MyTrashCanのmfc70.dllを解凍したいんですが、 うちにある解凍ソフトでは解凍できませんでした。 何で解凍できますか?教えて下さい。
206 :
デフォルトの名無しさん :2005/07/29(金) 01:28:25
207 :
デフォルトの名無しさん :2005/07/29(金) 10:06:03
>204 印刷ダイアログで設定しプロパティを拾うにはどうしたらいいんでしょうか?
DEVMODE
どのソースからもアクセスできるインスタンスを作るにはどうすればいいの?
>>209 MFC なら WinApp の派生クラスのメンバ変数にでもして、
((CMyApp*) AfxGetApp())->hoge とかする程度でいいんじゃない?
プロパティーシートのボタン「OK」「適用」「キャンセル」「ヘルプ」を使えない(無効)ようにしたいのですが、 どうすればよろしいでしょうか? よろしくお願いします。
マルチ氏ね
TVゲームみたいにメインループを無限ループさせたいんだけど 別スレッド作ってそっちを無限ループさせてもいい?
>>215 ありがとうございます。
ただ、プロパティシートのボタンの場合、自動的に付加されるものなので、
どうやってウィンドウクラスポインタを取得すればいいのかがわかりません。
その辺、おしえていただけないでしょうか。
217 :
214 :2005/07/30(土) 23:01:28
実行すると Debug Assertion Faild! Program: 実行ファイルのアドレス File: f:\...\afxwin1.inl(俺のパソコンにFドライブなんぞ無い) Line: 548 ってダイアログが出る デバッガで追うと、winfrm.cppの BOOL CFrameWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, LPCTSTR lpszMenuName, DWORD dwExStyle, CCreateContext* pContext) の中の if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext)) の判定文で上のダイアログが3回出る 検索したけど同じような症状は見つからなかった どうしたらいい?
ビットマップを表示するルーチンをソースに加えると なぜか起動直後のCFrameWnd::Createの時点でエラーが出る それまでは普通に表示出来てた 何がきっかけでエラーが出るようになったかはわからない 今の所エラーが出たり出なかったりしながら原因になる部分探し中
わかったわかった 関数が実行される順番を勘違いしてたから dcとbmpを初期化してから使うはずなのに 初期化する前に使おうとしてた
223 :
デフォルトの名無しさん :2005/08/01(月) 16:26:51
Visual C++ .NET です 最初 MFC dll でプロジェクトを作り, MFC は使わないつもりだったので stdafx.h から MFC の関係の記述を削除してしまいました ところが MFC を使う必要が出たため stdafx.h の記述を元に戻して 開発環境から [プロジェクト]-[クラスの追加] より MFC クラスを選択すると > MFC クラスは MFC プロジェクトにのみ追加できます。 とメッセージが出て MFC クラスを追加できなくなってしまいました 手書きで追加することもできるのですが たとえば CDialog のように, リソースを使うものだと 辻褄があわなくなって うまく動かなくなります [クラスの追加]でウィザードがちゃんと動くように するにはどうしたらいいのでしょうか?
新しくMFC dllのプロジェクトを作って、必要な部分をこぴぺしたら?
225 :
デフォルトの名無しさん :2005/08/01(月) 23:36:20
サブクラス化が(クラスの継承に加えて)何故必要なのかわかりません。 例えばCEdit内で右クリックを無効にしたいとします。 この時、CEditを継承した新クラス作って、右クリックイベントのハンドラを 何もしない関数に置き換え、このクラスでエディットボックス作るだけで問題解決 な気がするのですが、違うのでしょうか? 実際、ダイアログにそのコントロールをSubclassDlgItemせずに貼り付けても うまく右クリックで沈黙してくれているようでした。 というわけで、クラスの継承に加え、CWnd::SubclassXXXする意義を教えて頂けないでしょうか?
>>225 自分でcppソース上で貼り付ける分には関係ない。
リソースエディタで作った各コントロールのオブジェクトは、通常
フレームワーク側で作成されるが、そのオブジェクトをユーザソ
ース側で管理したいときにサブクラスとして指定する。
>>225 の例だとリソースエディタでエディットボックスを作成し、そ
のコントロールを自分でCEditを継承して作ったクラスで管理した
い場合、オブジェクトを作成しSubclassDlgItemで関連付ける感じ。
MFC使わずにWin32APIだけで組んでみるとよく分かるかも知れんよ。<サブクラス化
228 :
225 :2005/08/02(火) 11:25:02
>>226 なるほど、理解できました。「前もって配置したリソースIDのあるコントロールを
メンバ変数に関連付けたい人用」メソッドなんですね。最初っからnewしてCreate
するのが好きな人はそちらをドゾ-というわけですな。
// 最初はnew/Createで試し、次はダイアログで一旦CEditのDDX変数を作って
// その後宣言部をCEditから自作クラスに差し替え、つー(邪道な)テストをしてました。
// そんで「何だ、動くじゃん。Subclass関数不要じゃん!」と・・・orz
>>227 調べてわかりました。イチからCreateWindowするのは面倒なので
ウィンドウプロシージャだけを差し替えよう、ということなんですね。
サブ「クラス」といわゆる"class"は別、つうことらしいですが、考えは継承と似てますな
お二方、ありがとうございました。ひとつ賢くなれました
1ダイアログに1リソースファイルにしたいんですが、 V$2005とかでMFCのバージョンがあがってそうならないんでつか?
VS6同様、できますよ。
>>228 C++から使うとは限らないからC++の継承とは別のアプローチが採られていると思えばいい。
#実際は、逆だけど。
>>225 OS開発からあぶれたMFCデザイナたちも最初そう思った。
MFCの継承機構自体がサブクラス化で実装されているにもかかわらず
(全てのウィンドウはこっそりサブクラス化されている!)、
Win32のサブクラス化をユーザーに提供しなかった。
しかし、人々は、左クリックを無効にしたクラスとホイールクリックを無効にしたクラスを何個も
作るにつれ、MFCの継承がガラクタだと分かり始めた。(Win32デザイナは何年も前に分かっていた。)
そこで、1997年にPaul DilasciaがMFCのためにCMsgHookというのを作った。
Win32 APIのサブクラス化を素直に利用するものだ。
http://www.microsoft.com/msj/0397/mfcp2/mfcp2.aspx MFCを使うひとは、このライブラリが8年前に失格の烙印を押されたものであることを
心に留めて、距離を置いて開発すべきだ。
>>230 1プロジェクトに1リソースじゃなくて、
1プロジェクト内部に複数ダイアログがあって、
1ダイアログに1リソースでつよ?
234 :
230 :2005/08/02(火) 14:45:28
はい。 現にやってますが何か。 #まともに質問されているわけでもないし面倒だから解説せんが。
解説お願い。 自分もそうしますから。
俺はあまりこった使い方しないから、次期MFCなどより、各メンバ関数の簡潔な チュートリアルを充実してくれた方がありがたいんだけどなぁ。
EmbeddedWindowsXPにはフレームワークがインストールされていないので フレームワークを使うアプリケーションを開発しても実行できないと 説明されたのですがフレームワークと言うのは具体的に何を指すのでしょうか?
.Netじゃないの?
Javaという可能性も。 まあどっちにしろスレ違いの予感
ダイアログでテキスト・画像混在の情報を見たいです。(多め) CScrollViewを配置できればよいのですが、やり方がわかりません。 Google先生にお伺いはたてたのですが、聞き方が悪いのか情報を得られないままです。 差し支えなければ、方法を伝授して頂けないでしょうか? あるいは、情報(勉強)へのポインタを示して頂けないでしょうか?
243 :
241 :2005/08/03(水) 20:22:29
>>242 お返事ありがとうございます。
質問の仕方が悪かったようで申し訳ないです。
「ビューをダイアログ上に配置するのはどうするか?」
ということだったのです。コントロールなんかはCreateすれば
張り付いてくれますが、ビューではどうやったらいいのだろう?ということでして・・・
# テキスト+画像表示用途でCHtmlViewはほぼbestなんですが、
# 「一旦ファイルに書き出す」必要がないということで、CScrollViewを選択したのです
わちにんこ~! CListCtrl間でリスト項目(item)をDrag&Dropしたいのですが、 どうすればいいのでしょうか。 簡潔に教えていただければ、あとはGoogleで調べます。 よろしく。
死ね
246 :
244 :2005/08/04(木) 13:27:19
わらわら
すみません。教えてください。 MFCのダイアログベースのアプリを作りました。 なぜか急にダイアログ起動時にダイアログの一部が緑色になってしまいました。 緑の部分を他のダイアログなどで一度隠すと、元の色に戻ります。 OnInitDialog中でInvalidateRect(NULL)しましたが直りません。 もちろんOnCtlColorはチェックしました。 どう解決したらいいんでしょうか?
取り敢えずリブートしてみようか。
人生をリブートしたい.。
250 :
247 :2005/08/06(土) 11:38:58
>248 アプリのリブートですよね? 毎回起こります。
やだなぁ、リブートととは再ブート、つまりブートを再度行なうことじゃないですか。 このブートとは本来ブートストラップを掛けること、つまりシステム立ち上げのことなんですが。 #つーか、アプリのリブートなんて初めて聞いた。
他の関数からは見えないけどサブルーチンからだけは見える変数って作れる? 関数{ 変数宣言 サブルーチン呼び出し } サブルーチン{ 呼び出し元の変数使用 } みたいに
どっちでもいいよ
それはMFCの相談なのか?
そうだよ
258 :
257 :2005/08/06(土) 21:17:43
うそです。ごめんなさい。 もう二度とここへは来ません。
言いたいことがあるならはっきり言えよ 7時からずっと待ってるんだぞ
260 :
247 :2005/08/06(土) 21:34:24
252 >#つーか、アプリのリブートなんて初めて聞いた。 私も初めて言いました。すみません。勝手に飛躍してました。 どのみち直りません。 あまりこういう例ってないんでしょうか? 以前まで平気でしたので、更新分をチェックして自己解決目指します。 どうもでした。
つーか、MFCプログラミングって使いにくいと感じるのはオレだけですか?
どう使いにくいかわからんが、Doc/View形式のアプリを作る場合は楽できていい。 DDXなんかも便利。
リストビューに関して、質問させてください。 アイテムを選択された時の処理を「WM_LBUTTONCLICK」を使って やってるのですが、これだと「一回クリックして選択→もう一度クリックして処理」と なってしまいます。そうではなく、例えばOEなどの「メールを選択されると、 クリックしないでもそのメール内容が表示される」という風にしたいです。 どのようにすれば宜しいでしょうか。 宜しくお願いします。
TVN_SELCHANGEDかな?
268 :
266 :2005/08/07(日) 10:13:04
>>267 LVN_ITEMCHANGEDで出来そうですね。
「CHANGED」がヒントになりました。ありがとうございます。
ごめん。TVN_はツリービューの方だったorz
270 :
デフォルトの名無しさん :2005/08/10(水) 19:17:25
ピクチャのくぼみを実行時に付けたいのですが、どうしたらよいでつか?
271 :
デフォルトの名無しさん :2005/08/10(水) 20:08:07
実行時にプッシュボタンに「クライアント境界線」を付ける方法を教えて下さい。
272 :
デフォルトの名無しさん :2005/08/11(木) 08:42:35
ヨロ!
273 :
デフォルトの名無しさん :2005/08/11(木) 11:03:02
?
274 :
デフォルトの名無しさん :2005/08/11(木) 17:43:45
ボタンを押すと、指定したファイルを開いて表示させて、編集する事ができる・・・ って操作をしたいんですけど、どうすれば? fopenとかだと、画面上に表示させられないので。
そもそもfopenは画面表示用の関数じゃないし。
>>276 これはまた随分とハイレベルな質問ですな・・・
>>276 ボタンを押すと、あらかじめ指定したファイルが、あたかもダブルクリックされたように開かれたら、
ということでよろしいか。
a.txtならメモ帳が、b.htmlならIEが開く、というぐあいに。
もしそうなら、ShellExecute関数だね。
あ、そうなの? てっきりエディタを自作してるのかと
Microsoft Forms 2.0のCommandButtonが凹んだように見せれますか?
厨な質問しか無い点について。
MFCのダイアログリソースのプロパティで、「透過」とありますが、 これはウィンドウスタイルでいう、何にあたるのでしょうか? おそらく、下記のいづれかだとおもいますが。 WS_CLIPSIBLINGS WS_CLIPCHILDREN よろしゅうねがいます。
WS_EX_TRANSPARENT
透過とCLIPが関連あると思う発想がすげぇ。
287 :
284 :2005/08/12(金) 12:54:44
リストビューに表示されたアイテム上で右クリックすると、ポップアップメニューが 出るようにしたいと思ってます。 ところが、WM_RBUTTONUPで処理するとアイテムが表示されていない場所では 期待の動作をするのですが、アイテムが表示されている部分では動作してくれません。 RBUTTONDOWNを使うと出来るのですが。 原因や対策など、出来ればお願いします。
CDRomで配布するexeファイルを、 そのCDRom以外から起動できないようにしたいのですが、 何かこれを実現するAPIやロジック等ありますでしょうか?
>>290 GetModuleFileNameで自exeのパスを取り
ドライブレターを切り出し
GetDriveTypeでCD-ROMドライブか調べる。
森永のココアより甘いチェックだな
仮想ドライブから動かなかったらnyユーザーとか困るじゃん
>>291 ありがとうございます。
そのロジックで実装します。
すいません。 質問失礼します。 現在、タスクトレイプログラムを作成中です。 トレイのアイコンを右クリックして、メニューを表示するまでは出来たのですが、 右クリック時に動的に登録したメニュー項目が ID=0 以外選択不可能(グレイ表示)になってしまいます。 選択可能にし、OnCommandのLOWORD(wParam)でIDを取得する為にはどうすれば良いのでしょうか? ソースは以下の様にして、動的にn個のメニューを登録しています。 ------------------------------------------------------------------ loCnt= 0; pclProfile= theApp.m_pclProfile; while(pclProfile){ clName= pclProfile->GetName(); pclOpenMenu->AppendMenu(MF_STRING, loCnt, clName); //pclOpenMenu->InsertMenu(0, MF_BYPOSITION, loCnt, clName); //pclOpenMenu->EnableMenuItem(loCnt, MF_ENABLED | MF_BYCOMMAND); loCnt++; pclProfile= pclProfile->GetNext(); } ------------------------------------------------------------------ 環境は、 Win2000 VC++ 6.0 です。 分かる方、よろしくお願いします。
>>295 対応するハンドラが無いと自動的にグレイになった希ガス。
ON_COMMAND_RANGE使えば?
297 :
295 :2005/08/14(日) 17:11:29
>>296 レスありがとうございます。
ON_COMMAND_RANGEは知らなかったので、調べて試してみたら一応解決しました。
が、予め静的にIDの範囲を決めるって所が、どうしようかと悩んでいます。
「動的にn個」に対応するやり方って無いのでしょうか?
無いなら、ON_COMMAND_RANGEで行きます。
298 :
デフォルトの名無しさん :2005/08/16(火) 19:41:11
Janeのスレ一覧のように、データをテーブル表示させたいのですが、 どのコントロールを使用すればよいでしょうか?
はじめまして 初心者なのに、 CHtmlViewでシンプルなブラウザ作成に挑戦してみました。 普通に動いた(当たり前!?)んですケド サイトのタイトルが表示されずに悪戦苦闘してます。。 CDocument::SetTitle() って、使えばOKみたいなんだけど、 現在のサイトタイトルがドコにあるかわかりません。 って事で、教えてもらえんスか? そいか、ブラウザ作成の講座みたいなサイトないでしょーか? よろしくです★
質問投下します。 CDC::BitBltってデバイス依存しますか? 「画面のプロパティ」→「色の設定」で「32bit」に設定した環境でビルドしたものを 「24bit」に設定した環境で動作させると画面表示が乱れます。 これを解消する方法ありますか? それともBitBltではしょうがないのでしょうか?
使い方がおかしい。 以上 追伸 スレ違い
304 :
デフォルトの名無しさん :2005/08/17(水) 11:38:50
トグルボタンで、 かつ、 トグル動作はマニュアルで行える というコントロールはありまつか?
VC++始めたばかりの超初心者です。 CListCtrl::Scrollの使い方がわかりません。 使用例とか探してるのですが見つからず。。。orz よろしければ教えてくださいm(_ _)m 現在↓のようになってますが、 error C2227: '->Scroll' : 左側がクラス、構造体、共用体へのポインタではありません。 というエラーが出てしまい、対処できない状態です。。 void CConnLst::OnBnClickedBuTest() { IDC_LST_CL->Scroll(10); }
>>305 CSize size(x,y);
this->Scroll(size);
で行けそうな。
そしてやりたいことは多分
EnsureVisibleの方じゃないのか?
>>304 CButtonをBS_CHECKBOXで作ったチェックボックスではどう?
>>305 コントロールに変数を割り当ててダイアログクラスのメンバにしてやるか、
GetDlgItem(IDC_LIST_CL)をCListCtrlにキャストしてやらないと呼び出すことはできない。
Scroll()よりもEnsureVisible()の方が便利だと思うのは>306に同意。
つーか、いきなりListCtrlなんかじゃなくて、入門本かなんかを見ながら
一般的なコントロールの使い方を勉強すべきかと。
308 :
305 :2005/08/17(水) 13:01:51
>>306 レスありがとうございます。
>CSize size(x,y);
>this->Scroll(size);
でやってみたのですが、
error C2039: 'Scroll' : 'CConnLst' のメンバではありません。
とでてしまいました。
私は今、リストコントロールをスクロールを使わずに
他にボタンを用意して、ボタンを押下するごとに1行ずつスクロール
するという処理を作成しています。
EnsureVisibleについて調べてみます。
310 :
306 :2005/08/17(水) 13:24:23
>>308 ごめんCConnLstはCLitsCtrlの派生かと思ってた。
>307の言うとおりGetDlgItem(IDC_LIST_CL)をキャストしないと無理だね。
最初書いていたけど別に要らないかなと消しちゃった。
CLitsCtrlは高機能でバージョンによる機能の違いが多いし
MSDNだけじゃ理解しにくい部分が多いから
基本的な事の勉強ならCListBoxとかのほうが良いけどね。
データが多いときにオーナーデータとか使いこなせると便利すぎるけど。
thx
>>307 チェックボックスのプッシュボタンライクで良さそうで津。
312 :
305 :2005/08/17(水) 13:44:05
>>307 307さんの言うとおり、入門本などを見てコントロールの勉強をすべきですよね。
今までVBしかやったことがなく、突然CListCtrl::Scrollについて調べてといわれたもので。。。
とりあえず↓の処理でやってみました。
エラーは出なくなりましたが、動きませんでした。
void CConnLst::OnBnClickedBuTest()
{
CListCtrl* pmyListCtrl;
int nCount = pmyListCtrl->GetItemCount();
if (nCount > 0)
pmyListCtrl->EnsureVisible(nCount-1, FALSE);
}
ここからまたいろいろ調べていこうと思います^^
313 :
デフォルトの名無しさん :2005/08/17(水) 14:07:48
CButtonに着色する方法教えて下さいでつ。
>>312 おいおい、そのポインタに値がセットされていないじゃないか。
CListCtrl * pmyListCtrl = static_cast<CListCtrl *>(GetDlgItem(IDC_LIST_CL);
>>313 CButton::DrawItem()をオーバーライドして自前で描画するか、画像を張ってしまう。
>>314 一々下らんレスすんなや。
>>316 CButton::DrawItem()をオーバーライドして自前で描画するか
このオーバーライドってリソースエディタでベタベタ貼った後にも出来るんでしたっけ?
318 :
316 :2005/08/17(水) 14:41:25
>>317 コントロールに変数を追加するときに、CButtonの代わりに派生クラスを指定すればいい。
カラー程度で派生するのおかしくなぁい? 基本クラスがカラー・プロパティ持っとけば良いじゃん。
画像貼ると、キャプションの文字が消えちゃうよー
323 :
302 :2005/08/17(水) 22:13:22
MFCじゃなかったかスマソ
SDIアプリケーションを起動した時に、モーダルダイアログを出して、 ファイルを新規作成するか、既存のファイルを開くか、を選択させたいのですが、 この処理はどこに書けばよいですか?
>>324 InitInstanceで。
適切なパラメタをCCommandLineInfoに設定して
ProcessShellCommandを呼べばよろし。
326 :
デフォルトの名無しさん :2005/08/18(木) 11:40:45
あるボタンに合わせて、あるコントロール(m_BAR_R)を動かします。 RECT rtMove; switch (iIndex) { case 0: m_R1.GetWindowRect(&rtMove); break; case 1: m_R2.GetWindowRect(&rtMove); break; case 2: m_R3.GetWindowRect(&rtMove); break; case 3: m_R4.GetWindowRect(&rtMove); break; } int iTop = rtMove.top; m_BAR_R.GetWindowRect(&rtMove); rtMove.top = iTop; m_BAR_R.MoveWindow(&rtMove, false); でも、あるコントロール(m_BAR_R)が変なとこに移動しちゃう。 何で?
328 :
326 :2005/08/18(木) 11:49:32
>>327 GetClientRectにすると、画面から消えちゃうよ?
どんな値が取れているかくらいデバッガ等で調べろよ。
330 :
デフォルトの名無しさん :2005/08/18(木) 11:57:46
MDIのプロジェクトでCDialogBarを使用しています。 そのダイアログバーにはコンボボックスをリソースエディタで配置してあります。 このコンボボックスにフォーカスがある時に エンターキーを押されたことを知りたいのですがどうやったらいいでしょうか? CMainFrameにOnKeyDown関数を定義してもメッセージが飛んできません。 CDialogBarの派生クラスを無理矢理作ってもOnKeyDownは呼ばれませんでした。
コンボボックスの派生で夜路死苦
>>331 それでやってみます。ありがとうございました。
ダイアログにリストコントロールを貼り付けて、プロパティで表示を 「レポート形式」にして使っています。 で、スクロールは外部から Scroll メソッドを呼んで行うので、 スクロールバーを表示させたくないのです。 プロパティで、「スクロールをしない」を選ぶと、ヘッダーが消えてしまい、 Scroll メソッドを呼んでもスクロールしなくなってしまうし・・・ ヘッダーは表示したいので、困っています。 ShowScrollBar(SB_BOTH, false) を呼んでも駄目でした。 もしかして、なにかもの凄く基本的なところ(?)で間違っているのでしょうか?
334 :
デフォルトの名無しさん :2005/08/18(木) 14:40:42
※同じ内容の質問を他のVC関連の掲示板にもUPしてます。 広く情報を収集したいためすみませんが勘弁してください。 質問内容: スレッド(CWinThreadクラス)上でタイマの制御したい場合、 一般的にどのような手法で行うのでしょうか? 環境:Windows2003Server :VC++6.0 + SP5.0 質問の意図: 現在、スレッドのInitInstance内で、自前のタイマ制御クラス*1 のインスタンスを生成しそのタイマ制御クラス経由で、 タイマイベントを受け付けるような処理を行っているのですが、 やっかいなことに、ごく稀*2にタイマ制御クラスのコンストラクタ内で行っている、 CWnd::CreateEx()の処理で、 Runtimerエラーが発生します。 (Runtimeエラーのポップアップが表示される*3) 色々調べているのですが、なかなか原因が特定出来ない状況にあります。 もしかしてスレッドでこのような方法でタイマを使用するのは イリーガルなことなのか?等と思い質問しました。 続く
335 :
デフォルトの名無しさん :2005/08/18(木) 14:43:50
続き *1: ↓タイマ制御クラスのソース CTimerManager::CTimerManager() { // ダミーウインドウの作成 CWnd::CreateEx(0, AfxRegisterWndClass(0), _T("TimerManager"), WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL) ; m_bTimerFlag = false; } CTimerManager::~CTimerManager() { DestroyWindow(); } BEGIN_MESSAGE_MAP(CTimerManager, CWnd) //{{AFX_MSG_MAP(CTimerManager) ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() 続く
336 :
デフォルトの名無しさん :2005/08/18(木) 14:45:20
続き UINT CTimerManager::setTimer(CWinThread *hThread,UINT nIDEvent,UINT nElapse) { m_pinThread = hThread ; m_bTimerFlag = true; return (CWnd::SetTimer(nIDEvent,nElapse,0)) ; } UINT CTimerManager::killTimer(UINT nIDEvent) { m_bTimerFlag = false; return(CWnd::KillTimer(nIDEvent)) ; } void CTimerManager::OnTimer(UINT nIDEvent) { m_bTimerFlag = false; m_pinThread->PostThreadMessage(TIMER_MANAGE_WMID,WM_TIMER,(long)nIDEvent) ; CWnd::OnTimer(nIDEvent); } 続く
337 :
デフォルトの名無しさん :2005/08/18(木) 14:46:43
続き *2: 現在同じ環境(同じハード、ソフトウェア環境)で合計24台のマシンが 稼動しているのですが、10~20回の(全台)起動で、 1回はRuntimeエラーが発生します。 (発生するマシンは固定ではなくその都度変わります) #1台のマシンの場合でコツコツと再現テストを行ってみたのですが、 なかなか再現しない状況にあります。 *3: Runtimeエラーポップアップの表示内容 タイトルバー部 Microsoft Visual C++ Runtime Library メッセージ Runtime Error! Program: This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. [OK] 以上、ポップアップの内容です。 Program:の後になにも出ていないのが気になりますが。。。 長文失礼しました。 以上、宜しくお願いします。
>>334 それだけ長文ならアップローダ使えよ。
で、長いから面倒なんで読む気がしない。
寧ろ、プロジェクト一式(中間ファイルは除く)上げた方が検証しやすいのでは?
>>333 自前でスクロールしたい場合にもスクロールバーは必要では?
でないとスクロール可能にならない気がする。
#なるようなら御免。
どうしてもスクロールバーを見せたくないならカスタムドローか他のパーツで隠すとかで誤魔化すとか。
#でもどうせ矢印キーか何かでスクロールできてしまう罠。
そもそもなんでスクロールバーを見せたくないの?
339 :
333 :2005/08/18(木) 15:56:12
>>338 スクロール見せたくない理由なんですが、
現在2つのリストコントロール(AとBとします)を表示していて、
Aでスクロールした場合、Bも連動してスクロールするという
処理を作成しているためです。
(Bでは、自分でスクロールできないようにスクロールを隠したいだけなのです。)
説明がへたくそでスミマセン。。。(>_<;)
>どうしてもスクロールバーを見せたくないならカスタムドローか他のパーツで隠すとかで誤魔化すとか。
もしできなければ、↑の方法で、丸めこんぢゃおうと思います★
一日中プログラム組んでる奴ってキモオタなんじゃない?
きもはしらんがおたのかのうせいはたかい
VC++6.0のMFCで生成されるバージョン情報のダイアログのアイコンのように、 ダイアログに画像(できればJPEGファイル)を表示させたいのですが、 どのようにすれば良いのでしょうか。
>>342 アイコンならリソースと僅かなコードだけで張り付きますが、
jpeg画像は自前で描画する必要があります。
メモリリークっぽいんですが、どう読めば良いんですか? クラス名とか教えてくれるのかなぁ? Detected memory leaks! Dumping objects -> {4305} normal block at 0x05CAF318, 104 bytes long. Data: <( > 28 00 00 00 80 02 00 00 E0 01 00 00 01 00 18 00
>>344 40、640、480、1、24
ってデータが入っている構造体っぽいね。
サンクス。
>>345 HeapAlloc、LocalAlloc、realloc等各種コールしてるみたいなんですが、
特定する方法無いでつか?
>>343 そうなんですか。。。
がんばってみます。ありがとうございました。
>>344 メモリリークはいいんですが、共同作業をしている人のせいにしないように(笑)。
>>344 VSS使ってるなら、ダブルクリックすれば該当個所に飛んだはず
>>349 ファイル名と行番号が入ってないと飛ばないと思ったが。
>>344 デバッグ版のmallocやfreeがあって(C++のnewでも低レベルではmallocやfreeで実装される)
こいつらをリンクしてないとファイル名や行番号は表示されないよ。
DLLのhとlibとdllモジュールだけもらって動かしてるような場合で、そいつが犯人の場合、
場所が表示されなくて困るだろう。
>>344 はデータからするとRGB24のVGAの画像かなんかか?
>>351 >こいつらをリンクしてないとファイル名や行番号は表示されないよ。
それだけでは駄目で、mallocを_malloc_dbgにマクロ等で置き換え
__FILE__, __LINE__を引数に渡さないと表示されない。
すごいエスパーがいるスレ。
>>355 _CRTDBG_MAP_ALLOC使うと、自クラスメンバにfree関数とかあるとそれも置き換わっちゃうんだよなあ。
CRTと同じ名前使わなきゃいいんだけどな。
ドキュメントクラスのSerialize関数に、データを保存・読み取りするよう コードを追加しました。実際にはCObjectから派生したデータクラスの Serialize関数を呼ぶようにしてあります。 プログラムを動かすと、データの保存はできるようですが、 「開く」で選択すると「ドキュメントを開くことに失敗しました」という 警告ダイアログが出てそれっきりです。 ヘルプでメッセージを検索してもなにも出てきません。 まず何を調べたらよいでしょうか?
質問です。XP、Visual C++ .NET です。 MFC には WinMain がありませんが、 コマンドラインでの引数はどのようにして取得するのでしょうか? お願いします。
360 :
359 :2005/08/22(月) 16:58:50
・・・自己解決しました。 m_lpCmdLine ってのを見つけました。ありがとうございました。
APIもあるし、VC++.NETなら(他は知らん)__argvもある。
ID_FILE_NEWなどのコマンドを送りたい場合は、どうすればいいですか?
>>362 それはプロセスからイベントを発生させたいということですか。
俺も知りたい。
MFCの各クラスから、ハンドルを取り出すことはできるのでしょうか? MFCは使いにくいので、ハンドルを使いAPIで操作したいのですが。
366 :
デフォルトの名無しさん :2005/08/23(火) 13:45:52
同じコードなのにCPrintDialogで表示されるダイアログが2つのプロジェクトで異なるのですが、 どこの設定を変えればいいのでしょうか? プロジェクトA = プリンタ選択(コンボボックス)/印刷範囲/部数 プロジェクトB = プリンタ選択(アイコン選択)/印刷範囲/部数/タブがいっぱい
いろいろと調べたのですが、分からないので質問させていただきます。 CWnd* m_wndCtrl = m_wndCtrl.GetWindow(GW_CHILD); このようにして得られる子ウィンドウに対して、WM_RBUTTONDOWNをマップする事は可能でしょうか? WM_RBUTTONDOWNイベントが得られれば、WindowProcの実装でも構わないです。 アドバイスよろしくお願いします。
Attach/Detach
370 :
367 :2005/08/23(火) 20:12:23
すいません。上手く動かないのでもう一度アドバイスお願いします。 下の通り作業でAttachの使い方はあっていますか? CWndを継承したCCtrlWndクラスを作って、 CCtrlWnd::OnRButtonDownにWM_RBUTTONDOWNをマッピング。 CFormViewExクラスのCCtrlWnd m_wndCtrlメンバに対して、該当のコントロールのHWNDをAttach。 m_wndCtrl.Attach(::GetWindow(hwndCtrl,GW_CHILD));
Attachの使い方自体はそれでいい。 m_wndCtrl.GetWindow(GW_CHILD); ~~~~ とか GetWindow(hwndCtrl ~~~~ が気になるんだが、コントロールの子ウィンドウを取りたいのか?
DLLにコンパイル済みの(コモンでない)コントロールを使用していて、 右クリックがコントロールの外に伝わらない状態なのです。 作者にメールを送ったら、 現状だとWM_RBUTTONDOWNが発生しないので、 HWND hwndCtrl = ::GetWindow(hwndCtrl,GW_CHILD); このhwndCtrl を元に、WM_RBUTTONDOWN を処理してほしい、という回答でした。 そのHWNDをMFCでどう処理するのか分からなかったので、質問した次第です。 Attachの使い方が正しいとするとDLL側の問題かもしれないので、もう一度作者に問い合わせてみます。
サブクラス化してしまえ。
375 :
362 :2005/08/24(水) 07:37:02
自己解決しました。 もっとスマートな方法もあるかもしれませんが、とりあえず下の方法でコマンドの発生に成功しました。 AfxGetMainWnd()->SendMessage(WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), NULL);
376 :
367 :2005/08/24(水) 13:10:41
>>373 ありがとうございます。
Attachではなく、
CWind::SubclassWindowで無事成功しました。
377 :
デフォルトの名無しさん :2005/08/24(水) 16:18:49
MS Forms 2.0 CommandButtonのボタンがクリックされると、ダイアログが閉じます。 他人が作成したプログラムの修正中なのですが、 ダイアログを閉じる処理みたいなのは見当たらないのですが...
378 :
377 :2005/08/24(水) 16:50:51
ついでに、CDialogを閉じる方法の一覧教えて下さい。 EndDialogは知ってます。
379 :
377 :2005/08/24(水) 17:01:49
this->ShowWindow(SW_HIDE); ってのがあった。これかな?
void CDialog::OnOK() { (略) EndDialog(IDOK); } に飛んで来たけど、これって何ぃ?
IDOKを戻り値としてモーダルダイアログを終了させる
OnCancel() OnOK()
質問です。 ドロップダウンリストのコンボボックスがあるダイアログを作って、それを何かしらの関数から CMyDialog dlg; //コンボボックスの選択項目を設定 if( dlg.DoModal() == IDOK ){ //色々 } みたいに、AddStringとか使って動的に項目を変更したいんですけど、エラーになります。 どうすればダイアログを出す前に初期化できますか?
誰かVC++が自動生成するドキュメント/ビューアーキテクチャについて語ってくれい。 「Documentクラスがデータを管理/Viewクラスが画面表示」という役割説明をよく目にするんだが、 データやりとりのラクさを考えると、 AppクラスかViewクラスにデータ保持してもいいんじゃまいか? Docでデータ管理する利点・欠点を教えれ。 そろそろスパゲティプログラムを脱したい俺にコメントプリズorz
>>383 >//コンボボックスの選択項目を設定
この時点ではまだダイアログは作成されてない。
そのダイアログに載ってるコンボボックスも当然作成されてないからエラーになる。
OnInitDialogで初期化汁。
386 :
383 :2005/08/24(水) 21:00:46
>>385 DDXとかで生成した変数の場合なら、ダイアログを見せる前に初期化しても大丈夫のようですが・・・
そういうしようなんですね・・・
つーことは、あらかじめダイアログクラスにデータを保持させるポインタメンバを宣言しといて、
そこに初期化データを持ったオブジェクトのポインタ放り込んでDoModal実行・・・って感じですか?
>>386 DDXでもやってることは同じで、OnInitDialogでメンバ変数からコントロールにデータを設定
っていう事をフレームワークが自動でやってる。
388 :
デフォルトの名無しさん :2005/08/25(木) 14:57:34
DDXって苦肉の策であって、newして値設定を素直に出来る方が絶対コーディングしやすい!
_, ._ ( ゚ Д゚) …
391 :
384 :2005/08/25(木) 19:23:23
ぶっちゃけMDI形式の画像エディタを作るとき、画像データはどこで保持するのがいい? って話なんだがね… 現在グローバル変数使いまくりで実装orz 時間かかるがあれこれ試してみる。
>>391 >ぶっちゃけMDI形式の画像エディタを作るとき、画像データはどこで保持するのがいい?
ドキュメントクラス
>>391 プログラマに向いてない。
あきらめろ。
>>393 391はなんとかしようと努力しているみたいだからまだ見込みがあると思うぞ。
努力してスパゲッティを作って周りに迷惑かけるヤツのどこに見込みがあるんだ。
スパゲッティと認識してるだけマシじゃないか
>>384 MVC モデルなんか知ったことか、というスタンスであれば
View に持たせればいい。
MFC のフレームワークがそれを許すかどうかは別だけど。
CWinThreadから派生したスレッドの処理は、 InitInstance()の中でやるんでしょうか? Run()というやつでやるんでしょうか? それとも、messageを使わなければCWinThreadから 派生するのはムダですか?
>>398 InitInstance
>それとも、messageを使わなければCWinThreadから派生するのはムダですか?
ケースバイケース
>>399 ありがとうございます。InitInstance()の中でやります。
あと、AfxBeginThread()で渡した引数って、どこに格納されるんですか?
402 :
400 :2005/08/26(金) 15:21:57
CREATE_SUSPENDEDでスレッドをサスペンド状態にし、 クラスのpublicメンバに値をわたしてやってからResumeThread();することでできました。
403 :
384 :2005/08/26(金) 18:30:59
( ´△`)アァー いろんな意見ありが㌧ プログラム書くの好きだけど、人のプログラムに比べると明らかに中身が汚い… 自分でもプログラマに向いてないかなと思ったりorz しかしいつかスマートなコードを書けるようガンガル
質問です。 XPビジュアルスタイルを適用してCEditを使用しています。 そこで日本語を入力して再変換を行うと文字が化けます。 ・ATOCKでは発生しません。 ・コンテキストメニューから再変換を選択しても発生しません。 _UNICODEを宣言しないで回避する方法ってありますか?
せっかくだが、それはCEditじゃなく、エディットコントロールの話ではないのか? APIスレへどうぞ
VC++6.0です。 CFormView クラスを使用して生成したフォームの背景色は どうやったら変えられるんでしょうか。
407 :
デフォルトの名無しさん :2005/08/29(月) 22:00:09
MFCを効率的に勉強したいのですが、どうすればよろしいですか? みんなやっぱ独自の勉強方法? 自分の中じゃとにかくプログラムを作るのが一番だと思っているが・・・ てかC C++ APIと勉強してきて、MFCだけやたら難しく感じるのは私だけですか。。。 いい学習方法求ム
408 :
デフォルトの名無しさん :2005/08/29(月) 22:01:58
155 名前: デフォルトの名無しさん 投稿日: 2005/08/29(月) 21:52:38 MFCで初期ウインドウを作って、最終的にはエクスプローラーを作りたいのですが、 左のペインにツリービューをつくるにはどういう流れになるのですか? ツリーが自分のパソコンのフォルダを読み込むにはどうすればいいのですか?
system("explorer");
>>407 このスレでこんなことを言うのはアレだが、
今さらMFCを勉強する必要はないんじゃないか?
まぁ、仕事とかでどうしてもMFCを使わないといけないのなら仕方ないが。
411 :
デフォルトの名無しさん :2005/08/29(月) 23:04:40
>>410 いやぁ仕事で使うからってことで今勉強中なんですが、
どうにも難しくて。。。
今までは自分でプログラミングしていたのを、途中まで完成されたものに
手を加えるのって、結構スキルが必要ですね。
>>411 チュートリアル全部目を通して、クラス図とクラス一覧とユーティリティ関数類にも
ざっと目を通さないと、既にきっちり用意されている定番の処理を自前で再実装したり、
Command routing とか View の Update とか使わずにメンドクサイことしたりとか
うっとおしいことになるので気を付けた方がいいですよ。
MFCとかやたらと細部隠蔽がすきなんだが でも結局細部を理解するはめになるんだよな。
415 :
デフォルトの名無しさん :2005/08/30(火) 19:28:20
CTime*型のメンバm_pTimeをSerializeで処理したいのですが、 どういう風に書けばよいですか? CTimeはCObjectを継承していないので、以下のような書き方はダメですよね? if (ar.IsStoring()) ar << m_pTime; else ar >> m_pTime;
すいません、メンバを調べたら CTime::Serialize64が用意されていました。
417 :
デフォルトの名無しさん :2005/08/30(火) 23:13:16
たとえば最初のAppWizardでSDIのエクスプーラ風で作って、左のツリービューに class CLeftView : public CTreeViewというのができると思うのですが、 この左のペインに実際項目を挿入するにはどういう流れになりますか? 初心者ですいません。。。
>>417 GetTreeCtrl()でツリーコントロール取って、後は好きなように。
419 :
デフォルトの名無しさん :2005/08/30(火) 23:58:14
>>418 ありがとうございます。
そのGetTreeCtrlというのはどこに書けばいいのですか?
>>406 ViewクラスのOnCtlColorで対応する。
422 :
デフォルトの名無しさん :2005/08/31(水) 13:51:53
ツリービューにCドライブを挿入するにはどうしたらいいですか?
423 :
デフォルトの名無しさん :2005/08/31(水) 13:55:49
まんまんにちんちんを挿入するにはどうしたらいいですか?
424 :
デフォルトの名無しさん :2005/08/31(水) 21:13:16
MDIで複数のChildFrameの切り替えに MDIActivateを使うと非クライアント領域(枠の部分)が一瞬表示されます。 MDINextで切り替えを行うとそんなことにはならないんだけど、 指定したChildFrameをアクティブにはできません。 どうすればいいのですか?
ちょいと質問、というか情報収集。 VC7.1で、 char * p = new char[10]; strcpy(p, "foo"); CString foo = p; delete p; みたいなコードを書いたらCStringの代入で例外が発生した。 実際にはnewするサイズもコピーする文字列も毎回違うのだけど、 特定の組み合わせの時には必ずといっていいほど再現する。 デバッガで追おうとVisualStudioから起動すると再現しない。 なんだろ、これ。
426 :
デフォルトの名無しさん :2005/09/01(木) 00:18:07
delete [] p; とかいうオチでは無いよな
pはちゃんとNULLが終端に来てるはずだよね。
よく見ると char * p = new char(10); だった、とか
429 :
425 :2005/09/01(木) 00:42:15
>>426 >425が書き間違い。ついでに言えば、落ちるときはそこまで来ない。
>>427 それも大丈夫。
>>428 ないない。
つーか、試しに
CString foo = p;
を
CString foo = "asdfasdfasdf";
とかにしても落ちるときは落ちる。
そうそう、一旦std::stringに入れてもそこからCStringにコピーするときにやはり落ちる。
現在はとりあえず、CString foo;char * p = foo.GetBuffer(10);strcpy(p, "foo");foo.ReleaseBuffer();している。
どっかで領域壊してるんじゃね?
だれかがCStringTのソースを書き換えちゃったんじゃね?
実はVCじゃないとか
433 :
425 :2005/09/01(木) 11:42:06
うーん、レスしてくれるのはありがたいが。
>>430 これはとりあえず、なさそうとしかいえない状態。
>>431 ないない。そんなノウハウ持ってるのは私だけ。
>>432 えーと……
今疑いが出ているのはこのコード。
// 文字列の加工(要はダイアログタイトルの一部の文字列を書き換え)
CString foo;
GetWindowText(foo);
char * str = new char[buf.GetLength()];
sscanf(foo, "%*s[^0-9]%*d", str);
foo.Format("%s %s%d", someString, str, someNumber);
delete[] str;
SetWindowText(foo);
これから再現できる条件を探すけど、どうも、newとCStringのメモリ確保がバッティングしているような悪寒が。
#「デバッグビルドでは再現しない」、「デバッガで起動すると再現しない」他には何かあるかなぁ……
>>433 buf.GetLength()はいくつを返してるんだ?
>>433 上のコードなら、buf.GetLength() が小さい、とか?
CString 関係で初心者にありがちなバグ
・SetAt() で 0 入れる等して長さを変えようとする
・GetBuffer せずにバッファを書き換える
・GetBuffer した後、ReleaseBuffer せずに文字列操作
CStringもnewも全然悪くない悪寒
%*s[^0-9]%*d"もおかしくないか?
438 :
425 :2005/09/01(木) 12:23:05
>>434 未調査。午後から調べる。ダイアログのタイトルだから少なからず入っているはず。
#つーか、タイトル文字列長は変わらないことになっているらしい。
>>435 SetAt()もGetBuffer()も書き換えもないよ。
昨日>429で書いた通り、GetBuffer()/ReleaseBuffer()にすれば再現しなくなるらしい。
>>436 漏れもそうは思うのだけど。
>>437 タイプミス。%*s%[^0-9]%*dだ。
#最後の%*d要らないじゃん(苦笑)。
> %*s%[^0-9]%*d 入力がどんな文字列かわからんけど、最初の%*sに全部食われないか? sscanfの戻り値は?
>>438 >>buf.GetLength()はいくつを返してるんだ?
>ダイアログのタイトルだから少なからず入っているはず。
GetWindowTextで取ってるfooの方じゃないの?
>>433 >char * str = new char[buf.GetLength()];
は
char * str = new char[foo.GetLength()];
の間違い?
急速に425が信じられなくなってまいりました
sscanf(foo, "%*s%[^0-9]%*d", str); これでstrには何が入るの?
444 :
425 :2005/09/01(木) 12:42:46
>>440-441 あ、>441で正解。
bufをfooに書き換えてたの忘れてたらしい。
>>439 最初の空白で切れるよ。だからこそ、Format()で組み立てるときには空白が入っている。
漏れを信用しないのは判るし、だとすればこっちのコードの粗を探したくなるのも当然だけど……
まぁいいか、午後は再現条件探しするから。
%[^0-9]って何ですか?
char * str = new char[foo.GetLength()+1]; じゃだめなの?
sscanfにいきなりCStringを渡してもよいの? CStringに十分なバッファを確保してからなら大丈夫そうだが
450 :
425 :2005/09/01(木) 23:12:05
結局、当初からの問題の方はGetBuffer()/ReleaseBuffer()で問題が再現しない模様。
現状、原因不明というのが頭痛の種。
ダイアログタイトルの方は、タイトルの形式が違うときに誤動作した模様。
#%*sで期待した空白が2バイト文字だったとさw
なので、sscanf()の戻り値で逃げるか2バイト空白に対応するかと言う落ちに。
>>446 >>449 タイトルの一部を切り抜くのが目的だから、タイトル(foo)から文字列を一個読み飛ばしたりすうちを読み飛ばすから
それだけの長さは必要ないというロジック。従って、+1する必要はない。
>>448 CStringはconst char *へのcastオペレータを持ってますから。
つーか、なんか勘違いしていない?
結論。一部ヒントになった以外は情報収集にはなりませんでしたとさ。
協力感謝。
>>450 const char *じゃなくてLPCTSTR(つまりconst TCHAR *)じゃないか?
sscanfの戻り値チェックもしていなくて、かつ失敗していたってことは、 char* p = new char[...]; CString s = p; // GPF! delete [] p; ということ?原因不明も何も・・・
スゲー結論書いてるな 原因解明協力してた人カワイソス
>>453 だなw コンパイルオプションも書いてねーしどでもいいがな
こういうクサクサした雰囲気は次の質問でスカッと解消しよーぜ。
彼女がいるわけでもないのですが、いざというときのために財布にコンdo^ムを 忍ばせておいたほうがいいのでしょうか?友達に聞いたら財布によっては跡がつくから 気をつけるべしと言われました。 環境はXP SP2、VC++6.0、DirectX SDK9.0 Summer2004です。
MFCの質問と言うかVCの質問と言うか。 VC++7.1でnewで得たポインタの0チェックをしているソースがあるのですが、 ダイアログを生成している元の関数ではbad_allocを受け取るように書かれています。 MFCでは(あるいはVCでは)ただnewと書いた場合にはどっちになるのでしょう。 0を返すならbad_allocに落ちてこないと思うのですが・・・
>>458 MFCならどっちも間違い。
CMemoryException*が投げられる。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」 ―――――――――――――‐┬┘ ____.____ | | | | | | | ∧_∧ | | | |( ・∀・)つ ミ | | |/ ⊃ ノ | | CMemoryException*  ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ | |
461 :
458 :2005/09/02(金) 13:00:09
>>459 レスTHX。
なるほど、どっちみち0チェックは無駄ですね。
どっちの例外も受け取るように作るのが正解かな・・
モードレスダイアログについてです。VC6です。 やりたい事は一応できるのですが、解せないことについて御教示下され。 [できてる事] 呼出し元でダイアログをnewして ->Create(...)。 ダイアログをバツ(OnClose)で閉じ、PostNcDestroyでdelete thisし自殺 [わからない事] 呼出し元のメンバでダイアログのオブジェクト(実体)を保持し、.Create。 ダイアログをバツ(OnClose)で閉じる。この時、OnCloseをオーバーライド して、CDialog::OnClose()の前にDestroyWindow()を呼んでおくとOK。 CDialog::OnClose()のみだと、再度ダイアログ開く時にDebug assertion failed。なぜ? MSDNを見るとデフォルトのOnCloseがDestroyWindowを呼ぶとあるので、 (IDOKやIDCANCELでなく)バツで閉じる限りはオーバーライド + DestroyWindowの挿入は 不要かなと思ったのですが、なぜこの場合はあえて挿入する必要があるのでしょう? それとも、挿入するとたまたまうまくいってるように見えてるだけなのでしょうか?
>>462 createしたものをdestroyせずに再度createはできないってことでは。
あとバツで閉じてもOnCancelが呼ばれる。
>>462 MSDNのCDialogの頁にOnCancelでDestroyWindowを呼べと書いてある
私はいつも [親側] メンバ変数 CChildDlg *m_pChild=NULL; 子を呼ぶところ if(m_pChild == NULL) { m_pChild = new CChildDlg; m_pChild->Create(IDD_DIALOG); } [子側] void CChildDlg::OnClose() { m_pChildDlg=NULL; CDialog::OnClose(); } void CChildDlg::PostNcDestroy() { // TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 CDialog::PostNcDestroy(); }
途中で書いちゃいました。 void CChildDlg::PostNcDestroy() { // TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 delete this; CDialog::PostNcDestroy(); } とやってます。 エラーになることはないが、画面を起動するたびに領域が取られて、 アプリ終了時に一気に開放されるので、あまりいいやり方とは思っていないけど。
delete this; した後にメンバを呼ぶな。
469 :
デフォルトの名無しさん :2005/09/04(日) 21:07:01
チュートリアルって何ですか?どこにあるんですか?
エスパーさん大忙し
>チュートリアルって何ですか? tutorial で英和辞書(英々でもいいが)を引くヨロシ。 >どこにあるんですか? ヘルプを「チュートリアル」で検索したりするとザクザク出てくるね。
472 :
462 :2005/09/05(月) 20:38:21
みなさまコメントありがとうございます。お返事遅れてすみません。
>>463 その通りだと思うのですが、MSDNにはデフォルトのOnCloseが
destroyするとあったので、むしろ自分では何もすべきではないのかな、と。。。
>>464 こちらにDestroyWindow()を記述する(CDialog::OnCancel()は削除)と
うまくいってるようです。確かにOnCloseから呼ばれておりました。
>>465 そちらを見たのですが、「親のいない独立ウィンドウの場合」という風に
読めませんか?まあ上記の通り、そうすると確かにうまくいくのですが。
>>466 ご丁寧にありがとうございます。web上のサンプル含め、new/deleteされる
方が多いみたいですね。私もこちらの方法だとうまくいくのですけれども。。。
>>472 まあ意図する動作は実装できたのけど、MFCの設計の意図がよくわからんという
ことですね。DestroyWindow()をオーバーライドしてブレークポイント張って監視しても
OnClose()からはDestroyWindow()は呼ばれないことがわかります。MFCではよくある
ことですがMSDNの説明は怪しいですね。多分CDialog以外のCWndではそうだという
ことなのでしょう。結局はCWnd::Default()のようですし。
またまたお返事ありがとうございました。
>>473 > DestroyWindow()をオーバーライドしてブレークポイント張って監視
なるほど!まさにやりたかった操作です。OnCloseにブレークポイント
挿入してステップインでなんとかしようと思ったが、大量のアセンブラコード
に阻まれてあきらめてしまったのでした。確かにDestroyWindow()は呼ばれてないですね。
> MFCではよくある ことですがMSDNの説明は怪しいですね。
そうなんですか・・・肝に命じておきます。
お返事頂いた皆様ありがとうございました。ひとつ賢くなれました
ウィンドウスタイルについて質問です CFrameWndで作ったウィンドウのPreCreateWindowで cs.style = WS_VISIBLE | WS_POPUP; としていますが、くぼんだ境界線がでちゃいます。 cs.dwExStyle &= ~WS_EX_WINDOWEDGE; としても消えてくれない… 消すことってできますか? ちょうどVBのフォームでBorderStyleを0にしたようなウィンドウにしたいのです 環境はW2k、VC++6.0、MFCダイアログベースです、 よろしくおねがいします
>>472 親ウィンドウがある時は親ウィンドウでDestroyWindowするかもしれない。
つーか、親に通知して親がDestroyWindowするようにした方が親の管理が簡単。
477 :
デフォルトの名無しさん :2005/09/06(火) 23:23:20
MFCで作成したダイアログクラス内で CRect rect; GetWindowRect(&rect); と実行するとうまくいくのですが、 共通処理をするために、グローバル関数として別ファイルで同様に書くと 静的でないメンバ関数の呼び出しが正しくありません。 といわれます。 環境はWinXP、VC++2003、MDIアプリです。 識者の方、よろしくお願いします。
478 :
477 :2005/09/06(火) 23:24:29
すいません、追加です。 APIと区別するためにCWndで名前解決は行ってあります。
>>477 そのGetWindowRectはCWndのメンバなんだから、
よそから呼ぶはウィンドウを指定しないとだめだろ。
MFCでモードレスダイアログのオブジェクトを構築した際、 ウィンドウを表示させる前に、表示させる予定の場所の座標をひろうことってどうやってやるのでしょうか? 表示させている状態であればGetWindowRectでひろえるのですが・・・
>>481 ウィンドウを表示させる前ってCreateする前?
483 :
482 :2005/09/07(水) 09:34:06
そうです。Createする前です。 もちろん、オブジェクトは生成してあります。 欲しい情報は幅と高さだけなので、それだけひろえれば十分です。
484 :
デフォルトの名無しさん :2005/09/07(水) 09:34:37
すみません、481でした。
>>481 「予定の場所の座標」は表示させようとするときにWindows側が決めるんじゃないだろうか。
「幅と高さ」はリソースから計算できそうだけど。
>>483 Createする前じゃ、GetWindowRectで拾うのは無理だよ。
すべてのCWndのメンバ関数はCreateされた後じゃないと無効だからね。
Createしても
ShowWindowするまでは表示されないから、
その間でGetWindowRectでとる、というのではダメなわけ?
487 :
481 :2005/09/07(水) 11:08:00
皆さん、ありがとうございます。
>>485 さんの通り、リソースから計算できれば解決なのですが・・・
やりたいことは、メニューバーからモードレスダイアログを表示、非表示の選択をできるようにしたいのです。
フォトショとかにありそうなやつの簡易版とでもいいますか。
そのまま何もしないと毎回位置がリセットされるので何とかしたいのです。
iniファイルを利用し、位置は記憶できますが、再表示の際その位置に表示するのにSetWindowPos関数を使っていますが、
この引数に幅と高さが必要なので、何かいい方法はないか、と思ってます。
>>487 >表示するのにSetWindowPos関数を使っていますが、 この引数に幅と高さが必要なので
SWP_NOSIZE指定すりゃいいじゃん
489 :
481 :2005/09/07(水) 11:50:34
>>488 そうでした・・・完璧に忘れてましたorz
その部分は解決したのですが、今度はSetWindowPos自体が落ちます。
たぶん原因は
>>486 さんのいうようにCreateする前にセットしてることだと思うのですが・・・
かといってCreateした後だと一瞬(0, 0)に表示されてしまうので、これは避けたいです。
>>489 非表示でCreateして、位置設定した後表示すりゃいいじゃない。
>>489 OnInitDialogの中で位置を設定すれば、表示される前にその位置になるよ。
疑い深い人やOnInitDialogの中でやりたくない人は
>>490 。
492 :
481 :2005/09/07(水) 16:41:22
皆様、ありがとうございます。
>>490 さんの方法で成功しました。
続けて質問なのですが、この方法で作成すると、表示するたびにメンバ変数がクリアされてしまいます。
インスタンスの生成、消滅はビュークラスのコンストラクタ、デストラクタで行っているので、消去されいていることはないと思うのですが・・・
よろしくおねがいします。
エスパーさん出番ですよ
ソース出せ。
質問です。XP、.NET です。 基本的なことではずかしいのですが・・・。 MFC を利用しています。 プロジェクト名を Hoge とします。 グローバル変数はどこでどのように定義すればいいでしょう? というのも、CHogeApp が定義されている Hoge.h で定義したとしても、 Hoge.h を include している全てのヘッダファイルで定義されてしまい、リンクエラーになります。 extern 宣言をすると、逆に本宣言(?)がなくなり、リンク時に未解決エラーとなります。 Hoge.h のメンバとして用意し、 CHoge* pApp = (CHoge *)AfcGetApp(); pApp->~ として呼び出すのが普通なのでしょうか。 もしくは、何か他に方法があるでしょうか。 よろしくお願いします。
>>495 グローバル変数は関数と同じように.hファイルでexternをつけて宣言し、どこかのcppファイルで定義をする必要がある。
>>495 お前のプロジェクト内にある「theApp」というグローバル変数がどうなってるか見てみろ
498 :
495 :2005/09/07(水) 18:10:25
>>496-497 そっか・・・theApp を例にするのは全く思いつきませんでした。
理解できました、ありがとうございます。
CPropertyPageクラスから派生したプロパティ画面で、 そこでの変更をドキュメントクラスに保存したいのですが、どうやってドキュメントクラスを呼び出せばいいのでしょうか。 GetDocumentはもちろん使えないですよね。 なお、制作は.NET2003+MDI環境です。 とても初歩的な何かを忘れてるとは思うのですが思い出せません。
プロパティから戻った後にViewから保存すれば?
501 :
デフォルトの名無しさん :2005/09/08(木) 19:03:11
画面閉じる前に、閉じるかどうか聞くコードはどうなりますか?
>>501 // for example.
void cSomeDialog::OnCancel()
{
if (AfxMessageBox("閉じるかどうか", MB_ICONQUESTION | MB_YESNO) == IDYES) {
CDialog::OnCancel();
}
}
503 :
247 :2005/09/08(木) 19:46:26
一月前の話題ですが、 画面が緑になる問題は、どうやら.netのバグではないか。という結論になりました。 アドバイスどおり、リブートしてからリビルドしたら直りました。 忘れた頃にまた緑になることもありますが、そのときはまたリブート、リビルドで対応してます。 またタイマで起動の1秒後にInvalidateRect(NULL)して、悪くても1秒後には解決するようにしてます。 近況報告でした!
自分の思い通りにならないと、すぐ開発環境のせいにするのはいかがなものかと
どう考えたってお前のコードのバグだろうが。 起動時の処理のタイミングで症状が出たり出なかったりするだけ。
506 :
503 :2005/09/10(土) 19:52:06
そうですね。 安易な責任転嫁は良くないですね。 じゃよければ理由を教えていただけるとありがたい。
ソースも晒さずにこういう事言うからなぁ。 どんなダイアログかも分からんし。
>507 まあそうだと思うんですが、どこが悪いのかわからないので、 晒せないんですよ。OnInitDialogだけでもかなり長いし。 でも、「どう考えても」っていうぐらいだから多少の心当たりはあるのかなと思ったので。 >508 やっぱりそうですかね。 まあ1秒後には消せるので、これでいいかなとも思います。 いろいろありがとうございます。
バグなら公式サイトに情報が乗るはず
MFCで動画再生はできますか?
MFCにそういう機能はないが動画再生は可能
MFCにvideo for windows あるいは DirectShow を組み込むということですよね?
一例をあげると HTMLViewにしてプラグイン入れればほとんどの静止画、動画が再生可能
ありがとうございます。 プラグイン探しましたけど、いいのがなくて… フリーのやつですかね?
518 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 23:28:09
すいません。初心者です。。。 MFCを使っていくにあたって、こうセオリーみたいなのってありますか? プログラムによってはソースを書く場所がちがくても 同じ実行だったりするじゃないですか。 ようするに今わからないのは、どの動き方だったらどこに入れるって いうのがいまいちわからないんです。 なので、もしそういうセオリーみたいなのをわかるサイトもしくは本でも あれば、教えていただきたいです。
「ちがくて」とか言う奴に用はないな
セオリーなんて無い。心で感じるんだよ。茶化しているように 見えるかもしれないが、MFCを使いこなせるようになって来たら 確かに心で感じるものだと実感出来るようになるだろう。
ソースの書き方は人それぞれでいいよ。 でもMFCは基本的な作りが決まってるから 誰が作ってもだいたい同じような感じになってしまう。 でたらめに作るとビルドできないし動かないからね。
522 :
518 :2005/09/12(月) 19:35:23
ありがとうございました。心で感じられるようにがんばってみますです。
523 :
518 :2005/09/12(月) 20:42:05
524 :
518 :2005/09/12(月) 21:16:30
525 :
518 :2005/09/12(月) 22:00:09
>>522 ,523,524
成りすましはやめて下さい。
>>520 ,521
ありがとうございました。
初心者はMFCを使わないほうが良い。
誰でも最初は初心者なんだが
MFCは初心者でも、C++言語自体やWin32くらいは習得しないとどうしようもない。
530 :
デフォルトの名無しさん :2005/09/13(火) 13:47:07
MFCでよく見るソースですが, void CPenDlg::DrawPen(void){ CPenp(PS_SOLID, 1, RGB(255,255,255)); CPen*oldp=dc.SelectObject(&p); … dc.SelectObject(oldp); } このoldpを保存して,最後にSelectObject(oldp)する操作は必要なのでしょうか? このdcはこの関数終了後に破棄されるので,もとのペンに戻す必要がないように見えます
532 :
デフォルトの名無しさん :2005/09/13(火) 14:42:29
CMenu menu; menu.LoadMenu(IDR_~); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); このmenuをポップしたときに、ディセイブルにするにはどうしたら良いでつか?
535 :
デフォルトの名無しさん :2005/09/13(火) 15:15:37
サンクス
>>534 menuのアイテムをディセイブルにする側のコードはどうなるんでしょう?
>>535 マニュアル持ってないのか?
CMenuのメンバ関数調べろ
537 :
デフォルトの名無しさん :2005/09/13(火) 15:52:07
メンバ関数見ましたが無さげでつが...
ヒント: disableで見つからなければenableで探す
サンクス
>>538 menu.EnableMenuItem(ID_MENU_~, MF_GRAYED | MF_BYCOMMAND);
でできますた。
540 :
デフォルトの名無しさん :2005/09/16(金) 17:40:42
GetTextExtent や GetOutputTextExtent で文字列が描画されるサイズを 求めたいんですが、複数行の文字列のサイズを求める方法が分かりません。 各行のサイズを自前で求めるしかなかですか?
そもそも行という単位は君が決めることだ。WindowsやMFCの知ったことではない。
542 :
カラス :2005/09/16(金) 18:04:49
みんな・恋のノマノマエイってしってる?>-<
540 CRect rect( 0, 0 ,1024 ,0 ); pDC->DrawText("test\nテスト\nテスト", rect, DT_CALCRECT|DT_WORDBREAK ); rect.bottomに高さが
サイズを求めるためにGetTextExtent や GetOutputTextExtentするんだろ それでサイズがわからんとはどういうこと?
>>543 どうもありがとうございます。
DT_CALCRECTに見覚えがあるとに、すっかり忘れとりました。ボケてきたかな。
>>544 改行を含む文字列の場合、1行に繋がった横長のサイズが求まるとです。
546 :
デフォルトの名無しさん :2005/09/16(金) 19:55:17
ツールボタンにポイントしたときに出る肌色のウィンドウを ダイアログベースのMFCで出したいのですが、どのようにすれば そのウィンドウを出せますか? このウィンドウがどういう名前なのかがわからないので、 検索キーワードだけでもかまわないので教えていただけるとうれしいです。
CToolTipCtrl
548 :
546 :2005/09/16(金) 20:12:45
>>547 これ!これです!!
ありがとうございます。これで幸せになれました。
549 :
カラス :2005/09/16(金) 20:25:00
何の話?
>ツールボタンにポイントしたときに出る肌色のウィンドウ ノストラダムスの大予言ですか?
>>550 お前は何を言いたいんだ? ポツダム宣言か?
>>551 エスパーじゃないと答えられないような表現と言いたいんだろう
エスパーでなくても答えられそうな気がするが。
皆さんに質問です。 モードレスダイアログで変更された項目をドキュメントクラスに反映させたい場合、どうしますか? モーダルならば戻ってきたときにできますが・・・
ダイアログはドキュメントクラスに関係あったっけ?
>>554 変更があったらダイアログからメッセージ投げれば?
ドキュメントにメッセージを送る方法が分からないんだろうな。
モーダルならできると言ってるから 自分で更新するだけのような気がするけど
559 :
デフォルトの名無しさん :2005/09/19(月) 02:04:05
プロパティページの中に プロパティページを入れることは可能ですか? またそれが不可能な場合、 プロパティページの中にタブコントロールを入れることになると 思うんですが、 タブコントロールの中に子コントロールを入れるのって リソースエディッタ等で無理やり入れるのと ソースコードに配置情報を埋め込むのと どっちが主流なんですか?
CPropertyPage CPropertyPageDialog CPropertyPageEx CPropertySheet CPropertySheetEx
561 :
559 :2005/09/19(月) 02:20:25
CPropertyPageにCPropertyPageを入れるには CPropertyPageとCPropertySheetから派生したクラスを作るで良いですか?
ダイアログで、プッシュボタン風のラジオボタンを作成したとき、 ボタンの外観を普通のボタンと同じようにできますか? XP標準のLunaを適用させた場合、ボタンの周りにオレンジ色?の枠がついてしまいます。 うまくボタンと同じようにする方法はないですか?
>>563 キャーまさにそれです。
ありがとうございました!
>>563 すいません、そうではなくて、
同じLunaでもボタン風ラジオボタンとプッシュボタンは外観が若干違うんですよ。
どうやら何もしてなくてもマウスオーバー時みたいなボタンになってしまいます。
デバッガの「値」欄の表示を編集するには、どうすれば良いですか? ここに主なメンバを表示させて、ぱっと見でデバッグできるようにしたいのですが。
CPU使用率を取得する関数ってあるのですか? ググっても全然見つからないので・・・
MFCには関係なさそうな話だな
複数のモードレスダイアログがある状態で、あるダイアログから他のダイアログの変数を参照する方法はないでしょうか? ダイアログはビュークラスで宣言しているのでビューにあるダイアログのポインタ経由は ビューを完全に宣言していないのでエラーですよね?
ビューを完全に宣言していないので って何?
573 :
571 :2005/09/20(火) 01:25:10
一言で言えば、メンバ変数が内部で親クラスを呼び出すことはできないってことらしいです。 実際にコンパイルはエラーになります。
エスパー召還
親→ダイアログ、ダイアログ→親 まずこれができないと話にならんぞ それができたら当然これもできるだろ ダイアログ→親→ダイアログ
グロバール変数使えば?
577 :
デフォルトの名無しさん :2005/09/20(火) 12:35:53
ビットマップボタンを四角以外の形というのは可能ですか?
579 :
577 :2005/09/20(火) 13:20:00
ありがとうございます。 要は丸いボタンの絵のところだけ反応するようにしたいのですが、やはり座標を使うのでしょうか?
580 :
デフォルトの名無しさん :2005/09/20(火) 13:39:08
>>577 それは見た目だけかえるのではないのですね?
581 :
577 :2005/09/20(火) 13:56:47
その通りです 見た目だけではなく、実際の動作も丸いビットマップのボタンのところだけでしたいのです。しかも楕円などいろんな形を作りたいのです。 ありがとうございます
リージョン
>569 Pdh~調べてください。 パフォーマンスモニタのカウンタから取得できます。
MFCと関係ない
MFCってなに?
Memorial Fantastic Chinco
>>585 お前のせいでバカが来ちゃったじゃないか
UTF-8とSHIFT_JISの文字コード変換をしたいのですが、 MicroSoftが用意しているAPIってありますか?
Shift_JIS→UnicodeならMultiByteToWideChar()だな。
MultiByteToWideChar()のCP_UTF8フラグでUTF-8もできる。
良かったな。 二度と来るな
>MicroSoftが用意しているAPIってありますか? MFCに関係ない質問ってわかってそうなもんだが わざとか?
596 :
デフォルトの名無しさん :2005/09/21(水) 17:02:20
質問です。 CFileFindでファイルの列挙を行っています。 ショートカットも列挙したいのですが、 if( !IsDots() && IsDirectory()){ // ファイルを列挙するための処理 } とすると弾かれてしまいます。どうすればいいのでしょう。
597 :
596 :2005/09/21(水) 17:09:28
あ、すみません、勘違いしました。 出直してきます・・・
ガンガレ
599 :
カラス :2005/09/21(水) 17:32:30
ナー相談うけるんでしょ?
600 :
デフォルトの名無しさん :2005/09/21(水) 17:36:24
542 名前:カラス:2005/09/16(金) 18:04:49 みんな・恋のノマノマエイってしってる?>-< 549 名前:カラス:2005/09/16(金) 20:25:00 何の話? 599 名前:カラス:2005/09/21(水) 17:32:30 ナー相談うけるんでしょ?
Manco Fucking Chinco
>>585 お前のせいでバカがもっと来たじゃないか
Mentucky Fried Chicken
そろそろ飽きられてるのだが
まじでMFCってなんなんだ。
608 :
デフォルトの名無しさん :2005/09/22(木) 10:52:16
WinXP VC6++ SetLayeredWindowAttributesを使うには、 何をどういう手順でインストールすれば 使えるようになりますか? VC6++だけでは使えないということはわかったのですが、 PlatformSDKやToolkitなどを落とすみたいで、 ただmicrosoftが全部英語でわかりません。 どなたかご教授願います。。。
ググることもできないような奴には何を教えても無駄。
MFCと関係ないし
CWnd::SetLayeredWindowAttributes つーのはあるんだけど、 まあ質問内容からすればそーいう話では無さそうだな。
なんなんだMFCって。。こんなに隠してるところを見ると怪しいな。。
616 :
612 :2005/09/23(金) 00:49:33
>>614 ハァ? 英語だと分からないかと思って和訳してやったのに
隠すどころかオープンだろうが
コンボボックスに登録するものってたいてい、自分の都合で決めたIDと、 そのIDの文字表現としての文字列のセットじゃない? するとその文字列とIDをいっぺんにコンボに持たせるというのが便利ですよね? 自分がよくやるのは m_cbFoo.SetItemData(cbFoo.AddString("hoge"), 10); m_cbFoo.SetItemData(cbFoo.AddString("hoge2"), 20); とかやります。 んで、あるIDが現在選択されている場合、コンボの現在の選択は次のようにSetCurSelします。 for(int i = 0 ; i < m_cbFoo.GetCount() ; i++) { if(m_cbFoo.GetItemData(i) == curr_id) { m_cbFoo.SetCurSel(i); break; } } とか。なんかすっごい無駄なことをしている気がする今日この頃。 皆さんならどんな風にしますか?
IDは0からの連番にすればループまわさねーでいいじゃん
すみません。 「自分の都合で決めたID」というのは表現が激マズでした。 正しくは何らかの事情に引っ張られて飛び飛びの値をとらざるを得ない。 と読み替えてください。
激マズっつーか・・・まあいいや んじゃAddStringの戻りでIndexが返ってくるから、それと自前のIDでmapでもつくりゃええがな
まるほど。。マップというのもありありですね。 普通はどんな風にやるのがいいのかなぁ。。 人気のある方法を教えてください。
人気投票でも設置しとけ。
固定じゃなくて可変にしたいから 起動時にファイルから読んで 終了時にファイルへ保存 コンボボックスなら行単位 リストビューならCSV
MFCで円を「中心座標+半径」で描画する方法(関数)ってありますか? ArcにしろEllipseにしろ外接する四角形で指定するのはめんどくさいです。 ググってもなかなかいいものがないもので。。。 よろしくお願いします。
んな程度なら自分で軽くラップすりゃええがな
626 :
デフォルトの名無しさん :2005/09/24(土) 03:33:43
>>624 君はプログラムを組むのをやめたほうがええ
idip.exeのソースくれ。もしくは同じ動作をするソースを書いてくれ。全ては俺のために。。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | | コンナモンイラネ
| | ∧_∧ | |
| |( ´∀`)つ ミ |
| |/ ⊃ ノ | |
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ | ∧_∧
(
>>627 )
⊂ ⊂ )
⊂ ⊂ ,ノo
629 :
デフォルトの名無しさん :2005/09/28(水) 10:45:40
VC++6/MFCを使ってますが、InputBoxみたいなものはありまつか?
631 :
デフォルトの名無しさん :2005/09/28(水) 11:17:38
VB/InputBoxで、 エディット1つとOk・キャンセルのボタン2つのダイアログ、 でつ。
MFCとは?
また 不潔極まりない チンカス野郎か
まだ何も言ってないのに・・・
637 :
デフォルトの名無しさん :2005/09/28(水) 21:30:40
非 MFC DLL として作成したDLL、CStringなど(ダイアログは用いない)を 内部で使用するDLLに改造しています。 ひとまずCStringなどを使うことは出来るようになったのですが、そこから先、 リソースを追加してストリングテーブルに登録した文字列をCString::LoadString() しようとしたら、Debug Assertion Faildしてしまいました。 #afxwin1.inl の22行目、AfxGetResourceHandle() でASSERT コンパイルオプションなどをひねくり回してみたりしたのですが、どうにも うまくいきません。どなたか、うまい手順についてご存じないでしょうか? 環境はVC++6.0sp5 です。
638 :
637 :2005/09/28(水) 21:31:44
一文字抜けてた orz 1行目:非 MFC DLL として作成したDLL、CStringなど(ダイアログは用いない)を →「非 MFC DLL として作成したDLLを、CStringなど(ダイアログは用いない)を」
>>637 グローバルオブジェクトのコンストラクタとかでCString::LoadString()してないか?
640 :
613 :2005/09/28(水) 22:08:34
>639 いえ、普通の関数の中です。
>>637 ウィザードでMFC拡張DLLとレギュラーDLLを作って比べた方がよかよ。
MFC拡張DLLにしかない処理のあるけんね。
AfxInitExtensionModule
AfxTermExtensionModule
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
とか。
642 :
641 :2005/09/28(水) 22:14:59
orz オートコンプリートなんてキライ……
644 :
637 :2005/09/28(水) 22:34:11
>641 ご指摘ありがとうございます。 実はMFC拡張DLLとの比較は行っていまして、実証としてミニマムなコードを 作成して試したのですが、こちらでも同じ箇所で止まりました。 #resource.hをincludeして、export関数1個作成、中でCString::LoadString()した。 元のDLLは空のDLLプロジェクトから作っていったものなので、そもそもMFCを 用いることに無理があるのかもしれません。 指摘の点について調べてわからなければ、プロジェクト新規作成からやり直す ことにします。
もうMFC使いたくないよ・・・
慣れると結構楽でいいぞ。
647 :
デフォルトの名無しさん :2005/09/29(木) 01:23:29
コモンコントロールのMFCのスタイルに関してですが、 WTLの場合、こういう書き方が可能なのですが CComboBox cmb = wnd.GetDlgItem( IDC_COMBO_XXX ); MFCでも同様に書こうとするとMFC内部でアサーションエラーが出ます。 CComboBox cmb; cmb.Detach(); cmb.Attach( wnd.GetDlgItem( IDC_COMBO_XXX )->GetSafeHwnd() ); MFCではコントロールを扱いたいとき、その都度 一時的なCWnd*を取得するのが正しいやり方なのですか? void func0(){ CComboBox* pcmb = wnd.GetDlgItem( IDC_COMBO_XXX );} void func1(){ CComboBox* pcmb = wnd.GetDlgItem( IDC_COMBO_XXX );}
648 :
デフォルトの名無しさん :2005/09/29(木) 01:30:17
いくら何でもマニュアルくらい読め。 CWnd::GetDlgItem 戻り値 指定されたコントロールまたは子ウィンドウへのポインタ。パラメータ nID で指定される整数の ID を持つコントロールが存在しない場合は、NULL を返します。 返されるポインタは、一時的なポインタです。後で使用するために保存しておくことはできません。
649 :
647 :2005/09/29(木) 01:50:27
>>648 コピペミスでIDが重複していてアサートに引っかかっていただけでした。
スレ汚し失礼しました。
650 :
デフォルトの名無しさん :2005/09/30(金) 10:00:47
突然すんません、 ディレクトリ操作関数が含まれている MFCのクラスってございますか?
無い
CFileなど使うことによって間接的にディレクトリを操作することになるクラスなら
653 :
デフォルトの名無しさん :2005/09/30(金) 11:41:55
OnDrawでクライアント領域に描画したものを印刷しようとすると 非常に小さくなってしまうのですが、 どうすれば大きくできるのでしょうか?
COleVariantに入っている値は、構造体に変換してとかじゃないと直接参照できないんでしょうか? 適当に探すとCStringに変換して使う例はよく見かけるんですが、実数の集計がしたいのです。 できて当たり前なはずなので無いはずはないと思ってるんですがわからない。 すいません。教えて下さい。
>>654 COleVariantはVARIANTから継承しているからVARIANTのメンバをそのまま読み書きすればいい。
COleVariant::ChangeTypeで型を変換してから触るほうが楽だと思う。
エクスプローラみたいなものを作っています。 CImageListにSHGetFileInfo()でシステムのイメージリストのハンドルを取ってきて CListCtrlに関連付けて表示しています。 このCListCtrlにオリジナルのアイコンも表示したいのですが、 CListCtrlにアイコンを表示させるにはCImageListしか見当たりません。 関連付けてあるのはシステムのだし、そこに追加もできないし。 なにかいい方法はありませんか。 というか、IEのアイコンがSHGetFileInfo()で取得できません。 ぐぐったらOfficeXPがはいっているととれないことがある、 ということまではわかったのですが・・・ なのでHTMLファイルをオリジナルのアイコンで表示しようかと思っているのです。
>>655 ありがとうございます。
で、ChangeTypeを見てたんですが、型を変換するとVARIANTで参照できるようになる?
有効な(?)型を変更しているのかなとか思ったので、ChangeTypeをするメリットがよく
わからないのです。
というか、多分書いてもらった事が全然理解できてないかもですが。
明らかに実数が入っているなら COleVariant::dblVal を参照すればいいんだけど。
>>657 658のいうとおりメンバCOleVariant::dblValからはdouble型で読み取れるんだけど、
当然COleVariantの値がdouble型で格納されている場合にしか使えない。
VARIANT(COleVariant)には値が整数型やdecimal型で格納されていたり、doubleへのポインタが格納されていたりするかもしれない。
そこでそういった内部の型の違いを吸収して指定された型に変換させるのがChangeType。
元が何型であっても、これでdoubleに変換しておけばその後は絶対にメンバdblValからdouble値を読み取れるようになる。
受け取ったMessageによって、マウスカーソルを砂時計にしたり(操作不可)、戻したりする機能を作りたいんだけど、 メッセージ受け取って呼び出される関数内で砂時計にする処理を入れても、関数を抜けるとカーソルが戻ってしまう… 解除処理なんて入れてないのに… 関数抜けちゃダメならと、スレッド立てて、その中で砂時計にしようとしたら、thisポインタ渡しても一瞬たりとも砂時計にならず… どなたかヘルプミー!orz
まず砂時計のカーソルを用意しろ それからだ
具体的には、どうやって砂時計にしてるの。
>>663 AfxGetApp()->DoWaitCursor(1);
を使ってみたり、
SetCursor(LoadCursor(NULL,IDC_WAIT));
を使ってみたり、
CWaitCursorクラスを使ってみたりしました。
関数抜けるとカーソルが戻っちゃう・・・ なんていってんだから CWaitCursor でも使ってんだろ MSDN読め スコープ外れたらデストラクタが以前のカーソルに戻すって書いてあんだろ
>>665 CWaitCursorはスレッドで使えるかな?
と思ったけど、へたれな俺じゃ無理らしい。
どんなプログラムかわからんけどCCmdTarget::BeginWaitCursorとかどうよ
OnSetCursorでカーソルを設定する。 はい次の質問↓
>>658 >>660 ありがとうございました。
やっと理解できてきた気がします。
聞いた事覚えつつ、とりあえずもっかいCOleVariantあたりのヘルプを読み直してみます。
*.DLLから*.libを作成することは可能でしょうか? 可能なとき、どのようにして作成すれば良いのでしょうか?
VC+6.0を使っています。 基本クラスにHtmlViewを選択して、プロジェクトを作成しました。 リソースに組み込んだHTMLファイルを、起動と同時に表示させたいと思っています。 OnInitialUpdate内に記述するのかと思っているのですが、 どうすればよいのでしょうか。
>>670 DLLを生成する新規プロジェクトを作って練習しなさい。
>>671 もっともがき苦しみなさい。
CHtmlView::LoadFromResource
指定されたリソースを WebBrowser コントロールに読み込みます。
BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);
673 :
デフォルトの名無しさん :2005/10/02(日) 07:15:38
VC++7です。 CStaticのサブクラスに関する質問です。 CStaticをオーバーライドしてCMyStaticをつくります。 CMyStaticに対してOnPaintをオーバーライドして全体を黒く塗ります。 DialogにCStaticを貼り付け、そのIDにメンバ変数のCStaticを割り当てます。 コイツをCMyStatic型に書き直して実行すればCMyStaticはCMyStatic::OnPaintの処理でその窓は黒く塗りつぶされるはずですよね? でも実際にはCMyStatic::OnPaintには処理が着ませんでした。 自分は実はメッセージがどんな風に配られるのかよく分ってません。 CMyStatic::OnPaintが呼ばれるには何が不足してるのでしょうか? 教えてください。
>>673 コード見ないとよく判らないけど、IDはIDC_STATIC以外のUniqな値にしている?
初めからCMyStaticに割り当てなかったのは何故か知らないけど、全部書き直した?
675 :
673 :2005/10/02(日) 08:53:17
おはようございます。 IDはID_MYSTATICとしています。あとプルダウンからCMyStaticが出てこなかったのでCStaticで作成しておいて それをCMyStaticにしました。
すみません。問題がわかりました。 class CMyStatic : CStaticという宣言のためpublic派生でないと判断され、 その結果DDX_Control(pDX, IDC_MYSTATIC, m_MyStatic);のところで CMyStatic * _64がCStatic&に変換できないとかなんとか怒られていて つい、DDX_Controlをコメントアウトにしていたのを忘れてました。 コイツを復活させてpublic派生にしたらちゃんときました。 ゴメンナサイ
>>675 そこはプルダウンに出ないから自分で書けばいいはず。
そうすればそのクラスのあるファイルを指定できる。
>>675 おはよう。
CMyStaticの作り方に問題がある。
一覧に出すためのおまじないが欠けている。
679 :
653 :2005/10/03(月) 09:39:11
680 :
デフォルトの名無しさん :2005/10/04(火) 18:29:03
文字列をURLエンコードするメソッドとそのクラスを教えてください
MFCにはありません。
>>680 自分で作りなさい。
最近は探せない上に、自分で作れない子が多いね。
683 :
680 :2005/10/04(火) 20:28:22
なさそうなんで作った。解決。
Win32APIにあるやん
MFCでCOMポートって操作できるのでしょうか? MSDNだとポートじゃない方のCOMしかでてこないのですが・・・
しーファイルでオープンしたれや だめか? やまかんや
CreateFileだべ
ここはMFCスレだべ
COMでRXCHARが到着してからReadFileすると、その間にもう一バイト到着してしまい ReadFileで2バイト読み込んじゃうんだけど、そのことにきがつかずに 次にCOMのイベントチェックするとRXCHARが発生しているのでReadFileしようとするけど さっき読んじゃったから次のバイトがくるまで固まるっていう不具合を避けるために1バイト づつ読めっていう話があったけどいまだにそういうことに気をつけて作らないといけないの?
もっちろんWin32!
こらむしすんな
>656
695 :
デフォルトの名無しさん :2005/10/06(木) 23:46:55
MFCで、SDIのプログラムです。 ダイアログバーにボタンを貼り付けてそのボタンにたいして GetDlgItem(ID_BTN1)->EnableWindow(TRUE);とやってあげます。 確かにウインドがEnableになるのですが、その後フレームワークにより Disableにされてしまいます。 フレームワークはどういう条件でそんなことをしちゃうのでしょうか? ちなみにソースはあまりキレイなものではなく(引き継いだ) 結構手作業でON_COMMANDやらON_UPDATE_UIやらを追加・削除なんかしてて それなりに怪しいのですが。
そのON_UPDATE_UIが関係している。
そう思ってON_UPDATE_UIとON_UPDATE_UI_RANGEをみんなコメントアウトにしてみたけどダメでした。
馬鹿だな。関係していると言ってるのに。
ってことは逆にON_UPDATE_UIが削除されちゃってるのがまずいのですか?
MFCで動画(aviかmpg)を読み込みフレームごとキャプチャして静止画にすることなんて できますか?そのようなアプリケーションを探しているのですがないので 自作しようと思っています。
MFCでもそういうプログラムは作れるが、 MFCの機能じゃないからスレ違い
CWnd::MessageBoxの説明に、 「アプリケーションにメッセージ ボックスを実装するには、このメンバ関数ではなくグローバル関数 AfxMessageBox を使用してください。」 と書いてありますが、なぜなんでしょうか。 使ってはだめということじゃなくて、AfxMessageBoxの方が便利ですよ、ということだけなのかな?
たぶんモードレスとモーダルの違い
と思ったけどそういうことではないな
AfxMessageBoxはCWinAppのm_pMainWndを親にした・・・ような希ガス。 まあ頑張ってソース読んでみては。
アプリの中で複数のフレームウィンドウを使っている場合、 メインじゃないフレームウィンドウでAfxMessageBoxを使うと、 メインフレームを親にしちゃうからなぁ。 AfxMessageBox使えねー。
707 :
デフォルトの名無しさん :2005/10/07(金) 16:53:29
AfxMessageBox()のソース見てから言え。 AfxMessageBox()もCWnd::MessageBox()も内部で::MessageBox()を呼ぶが、 CWnd::MessageBox()よりもはるかに複雑なことをやってるから。
ちと教えてください CDateTimeCtrlでエディットコントロール部分の 文字の色とか背景の色とか変える方法ってありますか? google様によれば文字の色だけはあるっぽいのでつが・・・
710 :
デフォルトの名無しさん :2005/10/07(金) 23:41:44
教えてください!!ダイアログにボタンを貼り付けてクラスウイザードで メッセージハンドルを追加する際に「クリックされた時」か「ダブルクリックされた時」しかなく 「ボタンが押されている時」と「ボタンが離された時」のメッセージを 取りたいのですが何か良い方法はありませんか?なるべく簡単な方法で…(^-^A;
_. -ッ'"  ̄ ̄`' ー-、
/、.....!......._,,::;;:'::::::::::::::ヽ
i´厂`''''"´ `ー、‐::-::;;l
}ノ-、 ,. -‐-、 ヽ;::::::::l
l ̄二'ー 'フ,ニニ.ーrー}-レ ''7
l : i.__゚〉r、::..ヽ.__゚ノ レ''}ノf´/
`''r-- ノ:::`ー---‐'′:l-イ
l `_ ____,、 :l|::::|
>>710 教えてあげません
. ヽ. ― /:::|:リ
ヽ. ,. -'-‐''"´| ,.へ,
r} ̄ _,,.. -‐ ''"フ‐''"_∠,`ー- ...,,_
-‐ノハ ̄ _.=''´/ --`i '''' ー-′
/ l / / '′ -ー{
,.ヘ. '´_,.‐'′
>>702 「アプリケーションに【ユーザ独自の】メッセージ ボックスを実装するには」
ということでしょう。で、その場合↓をオーバライドする。
>CWinApp::DoMessageBox
>AfxMessageBox 呼び出しのアプリケーション レベルの処理をカスタマイズするには、
>このメンバ関数をオーバーライドします。
MFCでCOMAutomationを使おうとして、COMサーバー添付のタイプライブラリをプロジェクトに追加したのですが COMのオブジェクトのイベント(OnStartとか)をどう実行したらよいかわかりません。タイプライブラリを追加して できたヘッダファイルは以下のような感じです。 // IMeasurement ラップ クラス class IMeasurement : public COleDispatchDriver{ public: IMeasurement() {}// COleDispatchDriver デフォルト コンストラクション IMeasurement(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {} IMeasurement(const IMeasurement& dispatchSrc) : COleDispatchDriver(dispatchSrc) {} // アトリビュート public: // オペレーション public: void Start(); void Stop(); void Step(); }; // _IMeasurementEvents ラップ クラス class _IMeasurementEvents : public COleDispatchDriver{ public: _IMeasurementEvents() {}// COleDispatchDriver デフォルト コンストラクション _IMeasurementEvents(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {} _IMeasurementEvents(const _IMeasurementEvents& dispatchSrc) : COleDispatchDriver(dispatchSrc) {} // アトリビュート public: // オペレーション public: // メソッド 'OnStart' は戻り値の型またはパラメータ型が無効なため表示できません。 // メソッド 'OnStop' は戻り値の型またはパラメータ型が無効なため表示できません。 };
>>713 1.CreateDispatch
2.1でできたオブジェクトのOnStart
>>710 CButton派生の自作クラスを作って、メッセージを送出したらいいじゃない。
質問です。 あるプロジェクトで作成したダイアログを、 他のプロジェクトで利用したいときはどうすればいいでしょう? VC++6.0でSDI→MDI移植に挑戦してるけど、 ダイアログのソースファイルや.rcファイルをコピーしてもうまくいきません。 どなたか知恵をお貸しください。
基本的にはできないと思う。 ダイアログをDLLで作ってあればまだしも
リソースファイル開いてコピペするだけじゃないか? 何がうまくいかないのかよくわからん
Resource.h
CHtmlView上で、ハイパーリンク上にマウスカーソルが来た時を検知したいです。 この時に飛んでくるイベントなどありますでしょうか? 未熟者ゆえ、Spy++を眺めてもわからなかったとです。どうぞ御教示下され VC++ 6 on Win2KSP4
722 :
717 :2005/10/11(火) 22:06:55
リソースファイルをコピペ&ソース・ヘッダファイルをコピペ、 でビルドしたところ"ID~が定義されていません"系エラー多発。 ソースを追うとリソースエディタのプロパティで確認できるIDと、 ヘッダファイル内のIDが異なっていることに気付く。 これは元プロジェクトも同様。 よってIDを結びつけるマッピング関数が記述されたファイルがどこかにあると思ったんだがorz 結局SDIプロジェクトに新規MDIプロジェクトからApp,Doc,Viewを移植することで SDI→MDI移植計画中ですたい。
724 :
デフォルトの名無しさん :2005/10/11(火) 22:39:08
>>722 まずは、すべてのIDをresource.hで定義しろ。
resource.hが他のソースの依存関係に入っていないので、
resource.hを手動で書き換えたらリビルドする必要がある。
resource.hが依存関係にないのは、
//{{NO_DEPENDENCIES}}
と書かれているため。
リソースを追加するとresource.hが書き換わるが、
リソース追加のたびにresource.hをincludeしてる全ファイルをビルドする羽目になる。
NO_DEPENDENCIESはこれを避けるための仕組み。
SDI→MDI の移植って、いじる場所さえ分かってれば、 プロジェクトそのまま移行できたはず。 俺も具体的な手順は忘れたけど。
質問です。 MFCダイアログベースのアプリで、メインのダイアログから、CDialog派生のダイアログを DoModalで表示させています。 その派生ダイアログの中にCEditコントロールがあって、SetSelで選択範囲を指定している んですが、Windows2000とXPで挙動が違うようなので困っています。 具体的には、たとえばテキストが"あいabcd"だとして、SetSel(2, 4)とすれば、2000環境では "い"の部分が選択されますが、XP環境では"ab"の部分が選択されます。 どうやらXP環境ではバイト数ではなくマルチバイト文字数で選択範囲が決まっているようなんですが、 こういう仕様なんでしょうか?
自己レス
>>726 XPでmanifestファイル、コモンコントロールv6.0を使用している場合、
テキスト関連(キャレット位置、選択範囲等)はだいたいバイト数ではなく
文字数での扱いになるようです。
そういう仕様なのだと…
追記: でもIsWindowUnicode()はFALSEを返すんですよね…
>>728 MBCSでビルドしてもcomctl32.dll ver6.0だとWCHAR単位になるんだよ
732 :
デフォルトの名無しさん :2005/10/15(土) 15:33:12
CMemFile の内容を、CHtmlView というか WebBrowser コントロールに 表示させたいのですが、実ファイルを作成せず、メモリファイルのまま 表示させる方法はないでしょうか?
VisualStudio.net 2002を使っております。 MDIのプログラムから起動時に、 モードレスダイアログボックスを呼び出しています。 モードレスダイアログボックスがアクティブになっている時、 CxxxDialog::OnKeyDownでキーの取得が出来ないのですが、 どのようにすればよろしいのでしょうか。 メインウィンドウがアクティブになっているときは、 CxxxView::OnKeyDownでキーの取得はちゃんとできます。 また、CxxxDialog::OnMouseMoveでマウスの動きは取得できます。 キー入力だけ取得できないので困っております。 原因が分かる方おしえてください。
734 :
733 :2005/10/16(日) 01:37:03
PreTranslateMessage()であっさり拾えました。
自作アプリでコマンド実行して、処理が遅いなーと思ったときに、 どのメソッド・関数で時間がかかっているか調べるようなツールはありませんか?
736 :
デフォルトの名無しさん :2005/10/16(日) 17:55:19
>>735 関数などの処理の前後で現在時刻を取得しろ。ミリ秒単位で取得できるぞ。
profiler
DevPartner
自前で測定する手間を省こうとするな馬鹿。
VC++ 6.0のプロか エンタープライズに付いているよ。 あまり高機能とは言えないけど。
profiler の検索結果 約 6,440,000 件中 1 - 10 件目 (0.15 秒) ある の検索結果 約 82,500,000 件中 1 - 10 件目 (0.03 秒)
profiler ある の検索結果のうち 日本語のページ 約 44,300 件中 1 - 100 件目 (0.09 秒)
>>743 VC6 のプロファイラか…
あれ、設定ダイアログに罠が仕込んであるからなあw
kwsk=詳しく GUIのバグということだ。
749 :
デフォルトの名無しさん :2005/10/18(火) 03:27:46
一つのCImageListを複数のCTreeViewlで使いたいのですが、 リストビューのLVS_SHAREIMAGELISTSのようなフラグが見つかりません。 ツリービューの場合は共有イメージリストであることを特に明示する必要はないんでしょうか?
750 :
デフォルトの名無しさん :2005/10/19(水) 05:35:06
CListCtrl の選択されている一行に対し、フォーカスの有無に関係なく 任意の背景色を与えることはできますか? カスタムドローを使って NMLVCUSTOMDRAW の nmcd.dwDrawStage が CDDS_PREPAINTのときにCDRF_NOTIFYSUBITEMDRAW をセットして・・・と いうところに行き着きましたが、1行おきに色をつけること等はできても 目的の選択行だけ色を・・・という所には行き着けません。 この方法、選択行の色を変える方法として正しくない気もします・・・
>>750 1行おきに色をつけられるってことは、何行目かは判るってことでしょ。
その行が選択されているかどうかは得られるわけだから、カスタムドローでできそうだが。
752 :
デフォルトの名無しさん :2005/10/19(水) 10:41:02
ダイアログ上の各コントロールにタブオーダーで順番を割り振っているのですが、 1番がラジオボタンだと、初期表示でラジオボタンにフォーカスが当たってくれません。 プロパティではタブストップTRUEにしています。 画面はこんな感じの構成になっています。 ----グループボックス----------------------------------------- スタティックテキスト ○ラジオボタン1 ○ラジオボタン2 スタティックテキスト ○ラジオボタンA ○ラジオボタンB エディットコントロール [______] ------------------------------------------------------------- タブ順は 『ラジオボタン1→ラジオボタン2→ラジオボタンA→ラジオボタンB →エディットボックス』と設定していますが、初期表示でフォーカスが エディットボックスに当たってしまいます。 きちんと設定したタブ順で遷移させたいのですが、何か原因がありましたら ご指導お願います。
ラジオボタンは、チェックされたものが無いとタブで止まらないよ
最初にSetFocusしたらいいじゃない。
>プロパティではタブストップTRUEにしています。 「グループ」をONにしてないんじゃまいか?
756 :
デフォルトの名無しさん :2005/10/19(水) 13:44:01
>>755 グループはTRUEでグループ化しています。
チェック有無の制御も問題無く出来ています。
午前中いろいろ考えましたが、原因がわからないため
>>754 さんの言うとおり、SetFocusで強制的にフォーカスを当てるように
作り直しました。ちょっと変な感じしますが、現状で問題なく動いてくれて
いるので由としてます。アドバイスありがとうございました。
757 :
750 :2005/10/21(金) 05:01:09
>>751 カスタムドローをベースに、選択行だけ背景と文字を自分で描くようにして
とりあえず解決しました。プチオーナードロー
CArrayの使い方が良く分かりません CArray<int, int> hoge; と宣言すると ; が < の前に必要ですとかエラーが出ます。 でも、CArrayをググって見ると、上記で宣言してるソース見本がたくさんあります これ、何がいけないんですか?
>>758 エラーメッセージがアレだが、
「CArray って何よ?」
と訴えている。
#include <afxtempl.h>
>>759 いけました、ありがとうございます
ウィザードで自動生成されたstdafx.hでインクルードされてるものだけじゃCArray使えないんですね・・・
勉強になりました
CArrayなんて使うなよ。
なんで?
使うメリットが(std::vectorに対して)殆どないから。
じゃあ、CArrayに対してstd::vector使うメリットは? どうせMFC使うんだから、STL使わずにMFCだけでやろうと思ってCArrayにしたんだけどね
<algorithm>が使える
MSと心中するつもりならそれでも委員でない? 標準品があるのにわざわざ特殊仕様品を使う積極的な理由が他にあるとも思えないけど。
Windows用プログラムなんだから別にMFCも特殊仕様品じゃないだろ?
MFC自体が処理系依存なライブラリ。
いやおまえ、処理系依存って、Windows以外にMFCを使おうとするヤツが居るとでも・・・
処理系依存と環境依存を混同するな。
>>765 だよねえ。
MFC のコンテナは C++ に STL が含まれて
居なかった頃の名残でしかないワケで
今更使う意味はないね。
>>765 CArrayを勧めるつもりではないが、CArrayでもおそらく&a[0]と&a[0] + a.GetSize()でいける。
CArrayとCListのナントカ性がないのでCArrayからCListに直すのが面倒。 何て言うんだっけ。
移植性?
一貫性?
MFCの方が使いやすいし、わざわざSTL使ってexeのサイズを増やすのもあれだそうだ Even though it's perfectly safe to use STL classes in MFC applications, many MFC programmers prefer MFC's collection classes to STL's, either because they're more familiar with MFC's or because they don't want to increase their applications' EXE size by linking to two separate class libraries.
STLつかうと一気に実行ファイルサイズが10倍に?!
最近EXEサイズを小さく抑えようとする努力を全く行わなくなった俺はきっとダメPG
細菌 std::vectorに慣れてしまって使いまくっている。 それと、exeサイズを増やすことにロマンを感じてしまっている。
MyDialog : public CDialog { std::map<_bstr_t, std::vector< ComPtr<IStream> > > }; はやくライブラリ統一されんかのか
CListCtrlをダイアログに貼り付けたのですが、どうもアイテムの追加がうまくいきません。 何か足りないでしょうか。。 BOOL CDialog1::OnInitDialog() { CDialog::OnInitDialog(); // TODO: この位置に初期化の補足処理を追加してください m_list.InsertItem(0, "テスト"); UpdateData(FALSE); return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります // 例外: OCX プロパティ ページの戻り値は FALSE となります }
786 :
784 :2005/10/23(日) 03:07:12
事故解決しました >785 その通りでした。。(*_ _)人
787 :
デフォルトの名無しさん :2005/10/23(日) 22:26:30
すみません。質問させてください。 VC6でMSDNのサンプルのKBBarを弄っています。 ボタンをクリックしたらダイアログが出るように改造しようと思い、 リソースにダイアログを追加し、クラスウィザードでCKBDlgクラスを作成し、 以下のようなソースを作成しました。 CKBDlg cdlg; cdlg.DoModal(); これでDebugモードでコンパイルし、上記のソースの部分を実行すると、 DoModalする際にAssertされます。 内容はProgramがiexplorer.exeで Fileがafxwin1.inl Line 26です。 どうにかDialogを表示することができないのか、 どなたか宜しくお願い致します。
afxwin1.inlの26行目を見たらいいじゃない。
790 :
787 :2005/10/23(日) 22:56:30
>788 的外れかもしれませんが、 InitInstanceでAfxEnableControlContainer はしています。 >789 25 _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle() 26 { ASSERT(afxCurrentResourceHandle != NULL); 27 return afxCurrentResourceHandle; } のところです。
>>790 では
ASSERT(afxCurrentResourceHandle != NULL);
の意味を考えてみよう。
792 :
787 :2005/10/24(月) 12:45:57
>791 遅くなって申し訳ございません。 afxCurrentResourceHandleの中を追っかけてたときは、値を返しているようなのですが、 どうも最終的にはNULLが返ってきます。 情けないことに、これまでこんなに奥深いところで悩んだことがなかったですので、 チンプンカンプンです。
>>792 インタフェイス等で外部から呼ばれたときに、
ちゃんとAFX_MANAGE_STATEとかしてる?
794 :
デフォルトの名無しさん :2005/10/26(水) 14:20:02
デバッガでトレースしてると、 関数なんかの引数でCStringがあると、 F11キー「CString::CString(const CString& stringSrc)」の中まで潜っちゃうんですが、 そうならない設定を教えて下さい。
混合モードを表示して、その辺りのコンストラクタを抜けて肝心の関数に入る辺りまでF10でスキップする。
変なところにステップインしたらステップアウトしてもう一回ステップイン それの繰り返し
指定のディレクトリにある関数にはステップインしないような 設定は欲しいなあとつくづく思う今日この頃。
そんな変な仕様はありえない
BCBならステップインしないユニット指定出来るんだけどな。
800 :
デフォルトの名無しさん :2005/10/26(水) 17:48:33
ステップ インとステップ オーバーを使い分ければいいじゃない。
素人はBCB使ってろということだな
玄人ほどよい道具を使うものだが
VCのデバッガは非常に強力という意見は良く聞くけど 使う人によって評価は分かれるんだね
806 :
デフォルトの名無しさん :2005/10/27(木) 23:40:27
>57 >VC++にくらべてデバッガとテキストエディタの出来が悪い 単なる慣れの問題です。 VC++5エディタなんてコード補完もついてない屑ですよ。 あとVC++のマクロ定義糞だるいんで覚える気しないですし
59 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 00:28
>>58 何故わざわざ古いバージョンを持ち出す?
60 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 00:47
開発業務アプリの都合でVerUpできねんだよ、藁エ!
ケッ
61 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 04:07
ハッハッハ!>60
開発業務アプリの都合でVS5とVS6とVS2003を同時に使ってるよ。 正直、VS2003が一番なじめん。
809 :
デフォルトの名無しさん :2005/10/28(金) 02:02:42
> BCB: > VC++にくらべてデバッガとテキストエディタの出来が悪い 開発ってプログラム書いてデバッグするの繰り返しだよな。 エディタとデバッガの出来が悪かったら何が残る? スプラッシュ? 外装? 分厚いマニュアル?
>何が残る? ボーランドの社員の涙
811 :
デフォルトの名無しさん :2005/10/28(金) 09:47:56
アプリに文字列入力したいのですが、 デバッグ用途なのでわざわざダイアログを興したくありません。 簡単なインプットボックスは無いでつか?
>>809 開発者なら使って評価してみな。
論理的な文章とか、機能の有る無いのマトリクス、だけでは気付けない、
アプリの全体構造というか開発手法という重要なものがあるから。
へー ∩___∩ / ヽ |● ● ヽ (_●_ ) | 彡 |∪| ミ ヽノ ( / ヽ / ) .( <| / ヽ| | | ) ) 。。゚ | /| / 。゚ | / \ \ ∪ 〉 ) (___ノ
>>809 素晴らしいクラスライブラリ。
…ごめん知らん。言ってみただけだ。
そう
>>814 素晴らしいというより、普通のビジュアルコンポーネントクラスライブラリ。
普通のクラスライブラリ
↓
・コードが生成される部分が殆ど無くてチョコチョコっと書くと動作(ウィザードは×)
・開発は振る舞いを変える派生で、画面に貼るコンポの派生もおk(ActiveXは×)
・メソッドのオーバーライドすれば良い部分は一箇所に集約されてて特定にソース読める(ドトネトは×)
・標準的な動作(性能。依存度の低さ)で、ネットにフリーコンポーネントが溢れている(MFCは×)
816 :
デフォルトの名無しさん :2005/10/28(金) 13:56:30
Menuの1アイテムを非表示にするにはどうしたら良いですか?
>>815 なるほど、BCB厨は日本語が不自由と。
818 :
デフォルトの名無しさん :2005/10/28(金) 16:27:07
Borland製品を使った上で言うわけだが、 自分のアプリから他のアプリにちょっかいを出すのが面倒。 Borlandのエディットボックス(もどき)にWM_SETTEXTを送って、 Spy++で見ると(目に見えない)タイトルはちゃんと変わってるが、 目に見える文字列が変わらない。 Windows標準であるのに、わざわざ独自仕様のを自前で作って何がうれしいんだろうね。
残念
>>818 それは絶対気のせい。
ウィンドウズ標準コントロールはちゃんとTWinControlの派生となってて、
その中の人が標準コントロール派生してる。
>Windows標準であるのに、わざわざ独自仕様のを自前で作って何がうれしいんだろうね。 それが本当に独自コンポーネントだったとしたらだけど、 派生して数行で独自コンポーネント作りまくれるから超楽しい。
そして独り善がりのど派手なUIが跳梁跋扈することになるわけですね。
>独り善がりのど派手なUIが跳梁跋扈する 携帯機器の今の時代超重要。 だからMFC/ActiveXやブビアプリが滅んだわけさ。
823 :
デフォルトの名無しさん :2005/10/28(金) 18:29:39
ウィンドウをCreateする前に、IsWindowVisible()すると、 エラーっぽいんですが、 Createの前後をチェックする方法ありましたっけ?
Createしてないのは存在しない
Createしてないウィンドウなんて存在しない。
HWND
今時MFCなんて…
今どきMFCを使ったことが無い奴は珍しい
829 :
デフォルトの名無しさん :2005/10/29(土) 22:49:10
MDIのアプリについて質問です。 メニューの新規作成を押した後でドキュメントの作成をキャンセルするにはどうしたらいいのでしょう。
おい、エスパー!お呼びだぞ!
ゝ ,イ-ト、リ_ヽノ V´ レ',.-、 , )! . (/ )´、r‐o-=' /=c<,ィ ル' ! r‐、 } ,,ー‐' ( ー-' !/ ・・・・・・ ヽ {.fi {( ;;;;; _」 │ . ヽ. `ー;`' r─-、´ / `ヽ { └--‐' /
832 :
829 :2005/10/29(土) 23:30:56
つまりメニューがクリックされると CFrameWnd::OnCmdMsg() CWinApp::OnFileNew() MyDocument::OnNewDocument() (途中一部略) おおまかにこういう順番で呼ばれます。 このアプリではドキュメントが実際に作成される前にダイアログを出します。 そのダイアログはドキュメントに必要な属性値を前もって設定したり、ドキュメントの作成をキャンセルします。 しかしながら、キャンセルするためにダイアログをどの位置で呼び出せばいいのか、それがわかりません。 OnNewDocumentでFALSEを返したりOnFileNewをオーバーライドしてもダメでした。 教えてください。お願いします。
試してないけど、 MyDocument::OnNewDocument()内で、 CDocument::OnNewDocument()の前でFALSEを返してもダメ?
>>833 それでできました!どうもありがとうございました。
最初からそうやってしっかり説明しろよ・・・
836 :
デフォルトの名無しさん :2005/10/31(月) 14:26:35
CListCtrlのレポートビューで(プログラム側で)選択行を移動させたいんですけど そういうメソッドありますか? 無ければ、やり方をお教えくださいませ・・・
選択行を移動させる、ってなによ?
まんま移動させるんじゃね?上下に
だから、その「移動」の意味するところは?
840 :
デフォルトの名無しさん :2005/10/31(月) 16:17:51
一行目を選んでいたら、それを二行目にしたいってだけだったんですが・・・ 通じませんでしたか?
>一行目を選んでいたら、それを二行目にしたいってだけだったんですが・・・ 選択してる位置を移動させるのか、選択したデータ自体を移動させるのかどっちだ?
842 :
デフォルトの名無しさん :2005/10/31(月) 16:56:02
MFCウイザードでMDIプロジェクトを名前hogeで作ると ChogeView ChogeDoc CChildFrm CMainFrm が生成されますが、CChildFrmの存在意義がわかりません。 私はCHogeViewがMDI子ウインドウを表すクラスだと解釈しています。 ではなぜCChildFrmが必要なのでしょうか? CChildFrm::OnCreateChildをオーバーライドすると一応使われて画面にも表示(?)されているようで疑問です。いったいこれは何なんですか。
>>842 Childframeの中にViewがはまってる
移動させるってったら、普通データの移動だろ 選択を変えるのを移動なんていうヤツイネェ
845 :
842 :2005/10/31(月) 17:00:02
すみません。 詳しくは CChildFrm::OnCreateChildをオーバーライドしてデバッグ画面で呼び出しを確認すると、でした。
>>842 わからんならDocument&Viewアーキテクチャの勉強してこい
viewにはフレームないじゃん viewはsdiでも使うからフレームの機能はわけたのでは?
848 :
842 :2005/10/31(月) 17:10:35
>>847 フーム、納得。CViewがCWndを継承しているからMDI子ウインドウがCViewそのものだと誤解していました。
CViewはCFrameWndとはまったく別のものだったんですね。
どうもありがとうございました。
CWndを継承してるからって、 コントロールも全部Windowですよ?
850 :
デフォルトの名無しさん :2005/10/31(月) 17:59:34
ええその通りです。それを忘れていました。
851 :
デフォルトの名無しさん :2005/11/01(火) 20:51:27
画面にビットマップ貼るにはどうしたら良いですか?
紙に印刷してテープで貼り付けてください
854 :
デフォルトの名無しさん :2005/11/02(水) 13:56:41
ある画面からある画面に通知したくて、 かつ、両クラスがお互いを参照してない場合は、 SendMessageですか? 他に良いMFC的な方法があれば教えて下さい。
855 :
デフォルトの名無しさん :2005/11/02(水) 14:01:57
CWnd::SendMessage 指定されたメッセージをこのウィンドウに送ります。 LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
856 :
854 :2005/11/02(水) 14:36:22
>>855 了解しました。
やっぱ、Win32なんですね。
次、MFCのCDialog側のメッセージハンドラの作り方調べなきゃ。。。
画面から画面といったら別のパソコンにメッセージを送るのかと思った。
858 :
854 :2005/11/02(水) 15:09:17
受信するために、 CDialogに「::WindowProc(message, wParam, lParam);」を追加しますた。 これであってんのかなぁ。
859 :
854 :2005/11/02(水) 15:16:46
あれ? WM_USERはいっぱいコールされるけどMFCが使用してる?
画面が使ってる
CDialogに::WindowProc追加かあ 確かにCDialogの場合は、RUNTIMEで束縛されて無いからその方法も有なのかな。 自分だったら、wizardに無いなら、MESSAGE_MAPに手コード追加すると思う。
863 :
854 :2005/11/02(水) 15:43:07
>>860-862 サンクス。
WM_APPしてみます。
メッセージマップに手書きでも良いのか。
>>862 >CDialogの場合は、RUNTIMEで束縛されて無い
ってどーいうこと?
865 :
デフォルトの名無しさん :2005/11/03(木) 06:13:33
結局ランタイムの上で踊らされてる罠。
> SendMessage ::WindowProc 単にMFC知らないだけだろ
オブジェクト指向すら分かってなさそうだ。
>>864 RUNTIME_CLASS の事じゃね?
で、ウィザードでサポートしてないメッセージハンドラは
MESSAGE_MAP に手で追加するのが基本。
869 :
デフォルトの名無しさん :2005/11/03(木) 10:07:37
MFCの場合は、throwで何投げますか? C++のthorwって、int、const char*、exception等の派生と何でも投げれるって言うじゃなぃ?
C++です
さじを投げます。
槍を投げます。
賽を投げます
MSDNをthrow
窓からthrow
岸部throw
十catch花子
ダイアログ上にCListCtrlを配置して下記のイベントを取得できていたのですが BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST, OnGetdispinfoList) ON_NOTIFY(NM_CLICK, IDC_LIST, OnClickList) END_MESSAGE_MAP() CDialog->CStatic->CListCtrlの親子関係(CStaticがCListCtrlの親になった) にしたら、上記のイベントハンドラにイベントが飛んでこなくなりました。 親子関係は下記のようにして構築しています。 CMyDlg::OnInitDialog() { static.Create(NULL, SS_WHITERECT | WS_VISIBLE, rcStatic, this); // thisはCMyDlg list.Create(LVS_..., rcList, &static, IDC_LIST); } BEGIN_MESSAGE_MAPマクロの方にも手をいれないといけないのでしょうか?
880 :
sage :2005/11/05(土) 05:36:02
881 :
デフォルトの名無しさん :2005/11/05(土) 08:49:35
>>879 CDialog->CStatic->CListCtrlという関係なのだから、
CListCtrlに対するメッセージも、
CStaticが受け取ってCListCtrlに転送してやる必要がある。
CListCtrlへのメッセージをCStaticが受け取るなんて異常。
CListCtrlをCDialogの子ウィンドウにしたまま、
CStaticの手前に貼り付けるのが普通。
882 :
879 :2005/11/05(土) 10:37:37
>>881 CStaticの子にした理由はCListCtrlのスクロールバーを画面に表示させないためです。
(スクロールバーの幅分CListCtrlの幅を大きくしてます)
スクロールバーは自前のビットマップスクロールバーを使いたくて、自前のスクロールバーと
CListCtrlのリンクは出来たのですが、あとはCListCtrlの標準スクロールバーを画面に見せなく
する方法がこれしか思いつきませんでした。
CListCtrlに描画リージョンを持たせた方がいいのかなと思ったんですが、やり方が分からなくて…
883 :
デフォルトの名無しさん :2005/11/05(土) 10:46:42
>>882 CListCtrlのスタイルを変更する方法を探せ。
LVS_NOSCROLL
LVS_EX_FLATSB
それでできないなら自前で描画した方がいい。
VC7で、 ダイアログのエディットボックスに変数を割り当てたいのですが これをUINTにしてあげると数字以外を入力すると禁止されるんですよね? しかしこのエディットボックスを編集したときにその数字を使って計算をして 計算結果を表示させたいのですが、EN_CHANGEを実装して、その関数で UpdateData(TRUE)をして値を引こうとしたのですが、どうもまともに取れないです。 具体的には初期化されてない時の0xCDCDCDCDである3452816845という値になってしまいます。 私がやろうとしていることは無理なのでしょうか? ソースはかなりいろんな人がいじくっているのでリソースIDとの関係がおかしくなっている可能性もあるので こういうことはできる・できないという点でのアドバイスで結構ですのでお願いします。
885 :
デフォルトの名無しさん :2005/11/05(土) 17:53:39
>>884 できる。
resource.hを手動で書き換えたらリビルドしろ。
ありがとうございます。 もうちょっとがんばってみます。 最悪書き直しかも。
887 :
879 :2005/11/05(土) 18:32:44
>>879 の件ですが、SetWindowRgn()でスクロールバーを除いたリージョンを設定して解決しました。
>>883 >LVS_NOSCROLL
>LVS_EX_FLATSB
ありがとうございます。これどちらも効きませんでした。
もう一点教えてください。
自前のスクロールバー側から操作した内容をCListCtrlへ反映する処理はOnVScroll()で実装できたのですが、
今度は逆にCListCtrlのリスト部でスクロールに関連した操作(PgUp/PgDown/Up/Down/Home/Endキー)を
スクロールバー側へ反映させる場合、キーボードイベントはどこで拾うのがスタンダードなのですか?
PgUpキーがCListCtrl側で処理された後で、CListCtrl::GetTopIndex()を見てスクロールバーの新位置を決めなければ
ならないですよね。それってどこになるのでしょうか?
888 :
881,883,885 :2005/11/05(土) 18:48:49
>>887 キーを押したらCListCtrlの選択された項目が変化するのだから、
キー入力を意識する必要はない。
マウスクリックでCListCtrl内の項目がクリックされたときと同じ。
>879 なんか前の親子孫の関係と、今のそれの関係がよく分からんけど、 俺だったら、CDialogの派生クラスのハンドラに仮想関数持ってきて、 強制的に孫を読ませるようにすると思う。 見当違いだったらごめんね。
890 :
デフォルトの名無しさん :2005/11/05(土) 19:09:19
>>888 意識する必要がないとは?
マウスクリックの時はNM_CLICKイベントが発生しますけど、キーボードでPgUpや上下キーを押した時はNM_CLICKイベントは発生しませんよね。
それでリスト部はカーソルキーを押すだけスクロールしていき、自前のスクロールバーへの反映ができずにスクロール位置がズレていってしまいます。
>891 いやぁ、いきなり割り込んでしまった感があるけど、virtualの機能という面で見て、本にも書いてあると思うけど、 virtual関数呼ばれると、必然的に、その派生クラスのvirtualを継承した関数を探し、あった場合は継承したほうが呼ばれるでしょう。 これらを子と孫に適用してやる。 勘違いしてて、話し噛みあってないかもしれないから、具体的な方策は調べて? 余談として実行するまで呼ばれる関数は分からないという機能としても使える。
ウィンドウの親子関係とクラスの継承は関係ない MFC使わずにCのみで作ってもウィンドウの親子関係は存在する。
質問です。 CDCのメンバ関数LineToについてですが、たとえば、 CXXXView::Test(CDC* pDC) { pDC->MoveTo(0,0); pDC->LineTo(1,100); } ってやると、画面に少し傾いた線が描画されますよね。その際、ピクセル単位で見ていくと (0,0)-(0,1)-……-(0,50)-(1,50)-(1,51)-(1,52)-……-(1,99) これらの点が塗られていると思うんですけど、 一旦線を引いた後に、これらの点を求める方法ってあるんですかね? えと、つまり (a,b)-(c,d)まで線を引こうと思ったとき、一体どの点が実際に塗られているのかを 判断する方法ってあるんですか?
デバイスに依存するから決まってない。 例えば縦横の比率がデバイスによって違う。
LineTo()の塗り方が気に入らなければ自分で塗るしかないしな。
そういうわけにもいかないんです。 実は多角形の内部判定ルーチンを作っていまして 次のような場合に問題が起こるんですよ。 三角形(0,0) - (1,100) - (1,0)の内部に(0,1)が含まれているか? っていう事を考えると、実際にPCに描画したときには内部に含まれるのに 単純に座標で考えると内部に含まれていない。 っていうことになって困っています。 もちろん、こういった個別の場合に対応すること自体は可能なのですが LineToを使った描画アルゴリズムがわからない限り、応急処置的な 対応が完全かどうか、まったく保証が得られません。 あと、LineToは顧客が使うといっているため、 ここを変更する事はできないんです。。。どうしましょう。
画像の取り込みとかに使う以外は使ったこと無いけど、 デバイスコンテキストのコンパチのメモリ上の架空のメモリデバイスコンテキストて あれは、枠(RECT)の大きさも変わるんでしたっけ?Frameの大きさとか変えたりしても。 CreateCompatibleDCで作ったメモリデバイスコンテキストに座標なんか扱えるかどうか分からないけど、扱ったことないし。
>>897 リージョンCRgnを使いなさい。
内部判定ルーチンなど作る必要がなくなる。
おぉ、CRgnって言うのがあったのか・・・orz どうも、ありがとうございました。
orz CRgn使ってみたのですが、結果は変わらず。 やっぱり、三角形(0,0) - (1,100) - (1,0)の内部に(0,1)が含まれているか? っていう問題が解決しません。。。
>901 WindowRectとClientRectを使ってるか、違いはどこか? この辺どんなもんでしょ
>>894 WinAPIの::LineDDA()はどう?
904 :
901 :2005/11/05(土) 21:47:29
>>902 えぇっと。使ってません。
ちゅーか、WindowRectって何ですか?
ぐぐってきます。
905 :
901 :2005/11/05(土) 21:52:41
>>903 おぉ……使えそうかも。。。今からやってみます。
906 :
901 :2005/11/06(日) 00:54:36
LineDDAで完全に解決しました。 どうも、ありがとうございます。
907 :
仕様書無しさん :2005/11/06(日) 01:50:21
>>887 試していないけど、自前のスクロールバーをメンバ変数(コントロール)
に持つ、CListCtrl派生クラス(CMyListCtrl)を作成して、CListCtrl::
PreSubclassWindow()か、CListCtrl::OnCreate()の一方または両方を
オーバーライドして、CListCtrlのスクロールバーをSubclassWindow()
してやればよいのでは?
ダイアログに貼り付けたリストコントロールは、CXXDlg::DoDataExchange()
内で、DDX_Control(pDX,IDC_LIST1,m_wndMyListCtrl);するか、CXXDlg::
OnInitDialog()内で、m_wndMyListCtrl.SubclassDlgItem(IDC_LIST1,this);
する。
908 :
仕様書無しさん :2005/11/06(日) 01:53:18
>>890 選択アイテムの変更は、LVN_ITEMCHANGEDで検出できる。
909 :
仕様書無しさん :2005/11/06(日) 02:06:22
>>884 DDX_Text()の処理で「数字を入力してください」と表示されるだけで、
エディットコントロ-ルに「ES_NUMBER」スタイルを適用するか、CEdit
派生クラスでCWnd::OnCharをハンドラしない限り、数字キー以外のキー
も入力できる。
コントロールからUINT変数に値が取得されないのはリソースIDが一致
していないせいで、Debugビルドならアサーションが起こると思われ。
質問です。 DirectXのプログラムを作ってて、後にMFCで動くプログラムに、 その機能を載せ代えたくて、作業を進めているのですが、 DirectInputをどうやって使うのか分からないので、 何か使う方法があれば教えてください。 *App :: InitInstance()上で、 m_hInstanceをグローバル変数に格納し、 初期化に使ったのですが、うまくいきませんでした。 環境は、 VC++ .NET 2003 DirectX 9.0 SDK August 2005 です。
>>909 サンクス。ES_NUMBERを設定するのを忘れるところでした。
afxって何の略ですか?
915 :
デフォルトの名無しさん :2005/11/07(月) 10:33:08
CRecordset を Open して, データベースに問いあわせるとき その問いあわせにかかった時間を取得する方法はありますか? たとえば CSE というデータベースの クライアントソフトがありますが, あれでクエリすると反応時間が表示されます. その値がほしいのです
916 :
デフォルトの名無しさん :2005/11/07(月) 10:41:24
>>915 問い合わせの前後の時刻を自前で求めればいいじゃない。
//#include <atltime.h>
CTime t = CTime::GetCurrentTime();
#include <ATLComTime.h>
COleDateTime odt = COleDateTime::GetCurrentTime();
917 :
915 :2005/11/07(月) 10:46:57
>>916 CSE というソフトでは
データベースの反応時間と,
その結果を表示する時間の2種類が表示されるんですが,
前者の方はたぶん,おっしゃる方法ではなくて,
直接,データベースから値をもらってる
雰囲気があるのですが,
それができないかな,と思いまして
それともやっぱり
>>916 の方法でやってるんですかね?
データベースの質問ならそっちでやって 使い方もわからずにプログラム作ろうとしてるんだろうか
データベースの機能なのかどうかもわかってないんじゃどうしようもないだろう。
// 時刻1 rs.Open(~); // 時刻2 // 時刻3 while (!rs.IsEOF()) { rs.MoveNext(); } // 時刻時刻4 この「時刻2-時刻1」、「時刻4-時刻3」をそれぞれ表示してるだけだろ。
921 :
890 :2005/11/07(月) 16:14:30
>>908 ありがとうございます。LVN_ITEMCHANGEDでやりたいことが実現できました!
はじめLVN_ITEMCHANGEDのイベント中にListCtrl::GetTopIndex()を取得して
自前のスクロールバーへSetScrollPos()してあげればいいかと思ってましたが
それだとListCtrl::GetTopIndex()は以前の値を返してしまうんですね。そこで
LVN_ITEMCHANGEDに渡ってくる現在行と1ページに表示できる行数を使って
画面上の先頭行を求めてSetScrollPos()してあげたらうまくいきました。
初歩的なことを質問させてください。 ダイアログ(CDialog)にCStatic等のコントロールを乗せている状態で、 そのコントロールの左クリックイベントをCDialogが拾う、もしくはCDialogに 通知するにはどうしたらいいのでしょうか。
普通にハンドラを追加する。
924 :
922 :2005/11/07(月) 18:22:00
>>923 ご助言ありがとうございます。
説明不足で申し訳ございません。
CStaicコントロールは、動的に不定数生成しており、
ON_CONTROL_RANGEでイベントをとっているのですが、
クリックされた際の座標が取得できないのです。
座標も取得できれば言うことはないのですが、簡単に取れますか?
>>924 GetMessagePosしてScreenToClientする。
926 :
888 :2005/11/07(月) 18:54:23
>>921 >>888 で言いたかったこと分かった?
だからキーかマウスかなんて関係ないんだよ。
888 :881,883,885:2005/11/05(土) 18:48:49
>>887 キーを押したらCListCtrlの選択された項目が変化するのだから、
キー入力を意識する必要はない。
マウスクリックでCListCtrl内の項目がクリックされたときと同じ。
ああ、駄目な質問者の典型だな。
928 :
922 :2005/11/07(月) 19:14:36
>>925 ありがとうございました!
無事座標を取得できました。
もうひとつ不明な点があるのですが、コントロール上でのマウス移動やボタンアップイベントは
親ダイアログからはON_CONTOROLを使用して取得できないものなのでしょうか。
できるとしたら、イベントに何を指定すればいいのでしょうか。
くれくれ君ですみませんが,よろしくお願いいたします。
929 :
922 :2005/11/07(月) 19:26:02
自己レス コントロールをサブクラス化して親へイベントを発行するようにしました。 どうもありがとうございました。
>>928-929 スタティックコントロールを作成する際に、「通知」属性をセットして
おけば、スタティックコントロール内のマウスイベントが親ウィンドウ
に通知される。
CStatic派生クラスを作る際に、CWnd::PreSubclassWindow()および、
CWnd::OnCreate()内で ...
ModifyStyle(0,SS_NOTIFY);
を呼び出せばよい。 PreSubclassWindow()も加えるのは、ダイアログの
初期化時やDDX_Control()でコントロールメンバをサブクラス化すると、
派生クラスのOnCreate()が呼ばれないから。
ダイアログリソースなら、迷わず「通知(N)」をチェックしる。
しかし、CEditのスタイルの説明からは「ES_NUMBER」が、CStaticの
スタイルの説明からは「SS_NOTIFY」が抜け落ちているのは、ナ~ゼ~。
MSがバカだからさ
CRgn rgn; rgn.CreateRectRgnIndirect(rect); // (1) rgn.DeleteObject(); // (1)のリージョンを解放 rgn.CopyRgn(rgn2); // ここでrgnがASSERT(m_hObject != NULL)で引っかかる DeleteObject()した後でm_hObject変数にNULLをセットするのはプログラマーの役目なんですか? それともCRgnのメンバ変数をリセットするような方法が他にありますか?
>>933 勘違いしてました。orz
m_hObjectがNULLだからエラーになっているんですね。
CopyRgn()はCombineRgn()を呼び出しているのでコピー先がNULLでは使えないんですね。
新しいリージョンで上書きするというイメージで使おうとしていました。
>>934 CopyRgn()はCombineRgn(RGN_COPY)で呼び出してるから上書きイメージで使えるんだった。orz
でもコピー前のリージョンをDeleteObject()で解放しなくて問題ないんですか?
CombineRgn()の中でやってくれている?
rgnのハンドルが有効かどうか毎回確かめたらいいじゃない。 CRgn rgn; ... if ((HRGN)rgn) { //rgnに対する操作 }
>>936 じゃなくて
CRgn rgn1;
CRgn rgn2;
...
rgn1.CreateRectRgnIndirect(rect); // (1)
rgn1.CopyRgn(rgn2);
(1)で作ったリージョンは削除しなくても勝手に解放される?
DeleteObject()呼ぶとCopyRgn()内でアサートが発生するので呼べない
938 :
デフォルトの名無しさん :2005/11/08(火) 10:10:06
フレックスグリッドの質問はここでいいですか? フレックスグリッドで常に横一行の選択状態にしたいのです。 VC++6.0で作ったときはできたので同じように VC.NETでやったのですが、うまくいきません。 なにか違いがあるのでしょうか?
>>938 SelectionModeはどないなってん?
940 :
938 :2005/11/08(火) 10:47:08
FocusRect = 0 SelectionMode = 1 HighLight = 1 です。プロパティでも設定していますし、動的にも設定してみました。 そしてSetColSel(GetCols() -1)をやっています。
>>940 SetColSel()は要らんと思うけど。
VC.NETでC++からActiveX版のFlexGridを使ってるの?
#.NET版はプロパティが随分違うようだけど。
>>937 Region が解放されるというわけではないけど、
DeleteObjectとかはしなくて良いよ。
CopyRegion とか CombineRgn の機能は、ターゲットのRegionを
得ようとする形状に変更する、というものだから。
943 :
938 :2005/11/08(火) 11:55:47
VC++.NETでActiveXコントロールの挿入→ Microsoft FlexGrid Control version 6.0 を入れています。 これで答えになってますか?
944 :
941 :2005/11/08(火) 12:46:59
>>943 納得。確かVC7.1にはFlexGridはついてきてなかったと思ったから確認したかった。
つーか、今やってみたらMFC42.LIBを要求されてしまった。
VC6のディレクトリをライブラリパスに追加したらビルドは通ったけどクリエートができない。
そっちではFlexGridの表示までは行っているの?
FocusRect = Light SelectionMode = By Row Highlight = Always にすればいいじゃない。 VC++.NETのプロパティでは数値でなくTrueとかAlwaysとか文字で出てないか?
946 :
945 :2005/11/08(火) 12:53:13
メンバ変数に割り当てたら実体がenumなのは分かるけどさ。 生成されたmsflexgrid1.hの一部: enum { flexFocusNone = 0, flexFocusLight = 1, flexFocusHeavy = 2 }FocusRectSettings; enum { flexSelectionFree = 0, flexSelectionByRow = 1, flexSelectionByColumn = 2 }SelectionModeSettings; enum { flexHighlightNever = 0, flexHighlightAlways = 1, flexHighlightWithFocus = 2 }HighLightSettings;
947 :
945 :2005/11/08(火) 13:05:47
例えば m_FlexGrid というメンバ変数を作って、
動的にスタイルを変えるのならこう。
m_FlexGrid.put_FocusRect(CMsflexgrid1::flexSelectionByRow);
m_FlexGrid.put_SelectionMode(CMsflexgrid1::flexSelectionByRow);
m_FlexGrid.put_HighLight(CMsflexgrid1::flexHighlightAlways);
つまり、
>>946 を見た感じだとFocusRectがNoneなのがまずい。
FocusRect = Light (1)
948 :
945 :2005/11/08(火) 13:09:23
あー、あとうちではMFC42.LIBを要求されることなく普通に実行できた。 (実際に作って確認してる。) 環境変数の順位とかが関係あるのかしら。
949 :
938 :2005/11/08(火) 13:31:57
>>942 ありがとう。安心しました。
CreateRectRgnIndirect()のヘルプに、使い終わったらDeleteObject()しろと書いてあったから心配だったんだ。
951 :
938 :2005/11/08(火) 17:51:38
のあああ!解決しました。 違う人間がプロジェクトにグリッドを突っ込んだので、怪しいと思い、 あらためて新しいプロジェクトで作り直したらきちんと動きました。 つーかVC++6.0からクラスをコピーしてきたんじゃなかろうかってかんじです。 >946のenum定義もないし、おかしいと思って調べまくりました。 くだらないことにお付き合いいただきありがとうございました。 これから正しく?組み込みなおします。
952 :
941 :2005/11/08(火) 18:00:01
よかったよかった。 #私の端末で巧くビルドできなかったり実行できなかったりしたのは謎だけど。
953 :
945 :2005/11/08(火) 18:32:40
>>949 FocusRect = Light はフォーカスの太さを指定するもの。
なしにしたら囲まれない。Heavyなら太線。
クリックしたセルが囲まれて、同じ行の他のセルは全部反転してるはず。
まあ解決したのならよかった。
>>952 解決したらいいね。↓うちのFlexGrid
Microsoft FlexGrid Control, version 6.0
C:\WINDOWS\system32\MSFLXGRD.OCX
ver 6.0.84.18
954 :
941 :2005/11/08(火) 19:15:29
>>953 あーいや、その組み合わせでは使わないから。
今度使うとしたらVC7+FlexGridProだろうな。
955 :
938 :2005/11/08(火) 19:30:32
舞い戻ってまいりました・・・ 原因は固定行のマージにありました・・・orz また明日、マージのところをきちんと調べて再挑戦します。 ありがとうございました。
AppWizardを使わないで初心者向けにMFCの解説をしているような本やサイトで、お勧めがあったら教えていただけないでしょうか
>>957 猫は一応読みました。もう少しGUIに関する部分で突っ込んだ説明が欲しいのですが・・・
マイクロソフト公式解説書 プログラミングMicrosoft Visual C++ .NET〈Vol.1〉基礎編 いろいろ買った中で、これが一番役立った。
>>959 ありがとう、明日本屋で立ち読みしてみます
でも確かその本はマネージドの事が主な内容だった気がするのですが・・・
MFCに関しても詳しく書かれてましたか?
あ、ちと勘違いしておりました・・・ MFCの事も書かれてますね
>AppWizardを使わないで初心者向けにMFC 標準講座MFC6.0 基本的にAppWizardを使わないが、AppWizardの解説も少しある。
ウィザードでメッセージハンドラを追加したら それがソースにどう反映されるかを見た方が 手っ取り早く勉強になったりするけどな。
965 :
956 :2005/11/09(水) 15:41:32
ありがとうございます
>>962 >>963 参考にさせて頂きます
>>964 自分がやろうと思ってるのはちょっと定形外な事なので…
一応、ウィザードで作られるコードは十分理解しているつもりです
966 :
デフォルトの名無しさん :2005/11/09(水) 16:29:22
967 :
デフォルトの名無しさん :2005/11/10(木) 20:37:40
VC++.NET 2003 のWindowsフォーム アプリケーション(.NET) で
CAsyncSocketを使って通信のクライアント処理を作ろうとしていますが、
CAsyncSocket socket;
socket.Create();
で、socket.Create()の返り値が 0(異常終了) で返ってきます。
Windowsフォーム アプリケーション(.NET)では、CAsyncSocketは使えないのでしょうか?
また、Windowsフォーム アプリケーション(.NET)の通信の実装は、CAsyncSocketを使う以外に
あるのでしょうか?
知っている人がいれば、よろしくお願いいたします。
某スレで
>おまえそれMFCだろうが
というご指摘があったので、マルチで質問しています。
★初心者にVisual C++を教えるスレ★ Part22
http://pc8.2ch.net/test/read.cgi/tech/1131443284/8-
>>967 そうじゃなくて向こうのスレの人はこっちへ来いというのではなく、
「CAsyncSocketがMFCのだから.Netアプリで使うなよ」
と言ったかったのだと思う。
Socketというそのものズバリのクラスがあるだろ。
無いよ。馬鹿な香具師
/\ / \  ̄| | ̄ ___| |__ / ⌒ ⌒ ::: \ |\ | (●), 、(●)、  ̄ ̄ \ | ,,ノ(、_, )ヽ、,, 左を見ろ> こっちは右だバカ! | `トェェェェイ' .:::::__ ./ \ `ニニ´ .:::/ |/ l_!!! ,、 ,..-ヽー'',,.. ' ノ`丶--'ー--、 -―--、 + + + | ! !_!|i::::::::::`´ー''´:::::::::::::::::::|:::::::::::::::::::::,..、::`ヽ + + .! ', ,|!::::::::::::::::::::::::::::::::::::::::::ヽ/---‐'´`\::::\ + !、_,イ:::ヽ::::::::::::::::::::::├┤:::/::| \:::ヽ、_ ',::::::',::::::|ヽ::::::::::::::::::::::::::::/:::::::l
質問です 某アプリのプラグインをmfcで作ろうと思っています その仕様を見ると最初にCreateProc()というコールバック関数の中で ウィンドウを作成して、そのウィンドウハンドルを本体側に返さないといけないのですが いつものようにウィンドウを作ると、内部のCWinApp::Run()で処理がループしてしまうので 返り値を本体側に渡す事が出来ません どのようにしたら解決出来るでしょうか?
973 :
デフォルトの名無しさん :2005/11/12(土) 09:28:12
age
mfcを使わなければいい
975 :
デフォルトの名無しさん :2005/11/12(土) 11:11:08
>>972 何のアプリか書いたら検証できるのに、頭が残念なやつだ。
CWinAppでウインドウ作らなきゃいいし、 コールバック関数も使えるだろ
>>972 Sleipnir1のパネルプラグインです。ごめんなさい
>>976 CWinApp以外でウィンドウを作る方法があるという事でしょうか。
イレギュラーな方法でなければ教えていただけると幸いです。
978 :
975 :2005/11/12(土) 13:37:46
>>977 できる。自作パネルを表示した状態のSleipnir1.66でこれを書いてるw
Sleipnir本体がMFCで書かれてることが幸いしている。
CWinAppなんか出てこない。
DLLのプロジェクトを作成する。
ExPanel_Sample2.zipのソースを貼り付ける。
CWnd派生のクラスCMyPanelを作る。
SPX_CreateProcでウィンドウを作ってそのハンドルを返すようにする。
ここまでできたら、パネルが表示されるか確認
WndCallbackProc, OnCommand, OnSize 相当の機能を CMyPanel に書く。
>>978 うわ、助かります
ちょっと今から試してみます
>>978 それで上手く行きました。ありがとうございました
ところでドキュメント/ビューを使うなら結局CWinAppを使うしかないのでしょうか
CHtmlViewを使いたいのですが、また詰まってます…
SDK使ったほうが簡単ですよ
CHtmlViewではなくて、ブラウザのような物を作ろうとするとWebBrowserControlを使う必要があって、 ATL/WTLを使うことになりますよね?(間違ってたらすいません) そっちのほうが楽でしょうか? いずれにしても、自分の力では何をやっても厳しいのは痛感しております 指針となるような情報を頂けると幸いです…orz
>>982 Viewの基本クラスをCViewからCHtmlViewに変えれば出来るだろ。
>>982 その程度が分からないなら、素直にCHtmlView使っとけ。
CHtmlViewの方がはるかに楽だ。
わからずにATL/WTLに特攻してもぐちゃぐちゃになるだけ。
報告です。起動した後に >Warning: Creating a pane with no CDocument. >Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND >Sleipnir.exe の 0x7c81eb33 で初回の例外が発生しました : Microsoft C++ exception: COleException @ 0x0012d0e0。 のように何だか分らない例外が投げられてますが(これまずいんですかね)、一応動くようにはなりました。 助けてくださった方々に感謝m(_ _)m
986 :
975 :2005/11/13(日) 15:32:48
>>972 =
>>980 =
>>982 =
>>985 勉強不足だな。CHtmlView使うのなら、
ウィザードが作ったスケルトンを見ながらDoc-Viewの仕組みを勉強しろ。
CView系はCDocument系と対で使うもの。
987 :
985 :2005/11/13(日) 17:05:38
>>986 叱咤激励ありがとうございます、とりあえずMSDNを読み直しました
それで以下のようにCDocumentと結びつけたら最初のWarningは消えました。
その下のCOleExceptionに関してはお手上げで、ググったら
「CWebBrowserでも同じ例外が出るから、そういうものだと思って無視していいんじゃ?」
と書いてました。どうなんでしょうね。
CMyHtmlView *g_pMyPanel;
CMyDocument *g_pMyDocument;
static SPX_HWND SPX_CALL SPX_CreateProc(SPX_ISleipnir* ipSleipnir, SPX_HWND hWndParent)
{
g_pMyPanel = new CMyHtmlView();
g_pMyDocument = new CMyDocument();
CCreateContext CCC;
CCC.m_pNewViewClass = RUNTIME_CLASS(CMyHtmlView);
CCC.m_pCurrentDoc= g_pMyDocument;
g_pMyPanel->Create
(
NULL,
"PanelWindow",
WS_CHILD | WS_VSCROLL | WS_VISIBLE,
CRect(0, 0, 200, 200),
CWnd::FromHandle(hWndParent),
0,
&CCC
);
g_pMyPanel->Navigate2("
http://2ch.net ", NULL, NULL);
return g_pMyPanel->m_hWnd;
}
988 :
デフォルトの名無しさん :2005/11/14(月) 15:05:26
CStringListの文字を、POSITIONというイテレーターを使わずに読む方法ありますか?
GetHead/GetTail
サンクス。 でも、配列のIndexで取れないの?
>>990 GetAt()はあるね。
まぁ、CObjectの派生クラスを使おうとしてしまった自分自身を呪うがいい。
992 :
990 :2005/11/14(月) 15:33:27
GetAtの引数はPOSITIONみたい...
>>991 CStringListライクで、CObject系以外のものがあるってこと?
FindIndexとGetAtでいいじゃん。 なんでそんなにPOSITIONを忌み嫌う。 おれは嫌いだが。
>>990 CArray<CString,CString&> なら GetAt(nIndex) できる。
995 :
990 :2005/11/14(月) 15:38:18
じゃ、これからCStringListにオサラバして、CArray使う系な人になりまつ。
996 :
990 :2005/11/14(月) 15:41:12
CArrayの使い方をググってみたら、CStringArrayってのもあるのか。 MFCってワケワカメ。
なんだよ、既存のソースでCXXList使ってるのかと思ったら、 わかんなくてList使っちゃっただけか?
998 :
994 :2005/11/14(月) 15:48:28
>>990 CArray系とCList系は直交性がないから
最初にどっちにするかちゃんと決めておかないと後で直すのが面倒。
999 :
990 :2005/11/14(月) 15:49:26
既存ソースには、CStringListもCArrayもCStringArrayもなくてビクーリでつ。 自分、BCB/TStringList使ってたから、配列参照が欲しくて。 TStringListだとそれに対するNamesとかParamsとかでini形式の左右が取れたり便利だお。
1000 :
990 :2005/11/14(月) 15:49:54
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。