■MFC相談室 mfc14d.dll■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/13(水) 05:28:44■MFC相談室 mfc13d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1110179996/
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
■ VisualC++(MFC限定)相談室 MFC9.dll■
http://pc5.2ch.net/test/read.cgi/tech/1062098350/
■ VisualC++(MFC限定)相談室 MFC8.dll■ (スレタイ壊れているけど前スレ)
http://pc5.2ch.net/test/read.cgi/tech/1056584836/
■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc5.2ch.net/test/read.cgi/tech/1047949606/l50
■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc5.2ch.net/test/read.cgi/tech/1039607377/
■ VisualC++(MFC限定)相談室 5■
http://pc3.2ch.net/tech/kako/1028/10285/1028553308.html
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/tech/kako/1021/10216/1021620974.html
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/tech/kako/1014/10140/1014057520.html
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/tech/kako/1008/10080/1008031675.html
■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/tech/kako/989/989902845.html
0002デフォルトの名無しさん
2005/07/13(水) 10:42:13CParentDialog::OnShowWindow(BOOL bShow, UINT nStatus)
{
ChildDialog.Create(IDD_CHILD, this);
ChildDialog.ShowWindow(true);
}
として動作していました。
が、ChildDialogに値を渡したいので、
ChildDialog.Create処理だけをParentDialog.DoModal()の前に移動して、
ChildDialogのプロパティを参照するようにしました。
そうしたところ、ChildDialog.ShowWindow(true)でエラーになりました。
回避方法教えて下さいでつ。
00032
2005/07/13(水) 10:47:26処理変えなきゃ良いんでつね。
>ChildDialog.Create(IDD_CHILD, this);
これがnewだと勘違いしてます他。
0004デフォルトの名無しさん
2005/07/13(水) 15:15:44非表示では動作しませんか?
0005デフォルトの名無しさん
2005/07/13(水) 15:27:39非表示でも動きます。
UpdateData(TRUE);
UpdateData(FALSE);
が実行されれば。
00064
2005/07/13(水) 15:59:26ただ、CWnd::UpdateDataの中の1行目「ASSERT(::IsWindow(m_hWnd));」でコケまつ。
0007デフォルトの名無しさん
2005/07/13(水) 16:19:00アプリがどういう作りかわからんが、
ウィンドウが作られる前にUpdateData動かしてるからだろ。たぶん。
ダイアログのコンストラクタでUpdateData呼び出したら、
同じエラーになるぞ。
00084
2005/07/13(水) 16:38:19Dlg.DestroyWindow();
Dlg.Create(IDD_DLG, this);
でウィンドウ作るようにしてみましたが、
今度は、
CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
の出だしの、
「ASSERT(HIWORD(lpszTemplateName) == 0 || AfxIsValidString(lpszTemplateName));」
でこけてまつ。
変な記述してるわけじゃないんだけどな...
00094
2005/07/13(水) 16:45:08>CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
先頭の引数は数値なのにLPCTSTRに入ってる時点で不思議。
なんか明示的に書いてやる必要があるのかな?
00104
2005/07/13(水) 16:47:270011デフォルトの名無しさん
2005/07/13(水) 16:52:12つか、いったい何がしたいのか?
00124
2005/07/13(水) 16:56:23>Dlg.m_Control.SetCaption("データ"); //////←これをやりたい!
Dlg.DoModal();
コントロールに文字列を設定したい。
なぜかというと、Dlgの中のメソッドの人に、
コントロールの文字列を使って動作する処理が入ってるから。
それを直すのも怖いし。
0013デフォルトの名無しさん
2005/07/13(水) 17:01:20環境書いてくれい
VC6.0++とかか?
あと、Dlg.DestroyWindow();で
ダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・
00144
2005/07/13(水) 17:04:42>あと、Dlg.DestroyWindow();でダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・
え”〜困ります。
既に出来てるDlgがグローバル変数になってて、一旦初期化しないと...
00154
2005/07/13(水) 17:12:22Dlg.UpdateData(FALSE);
>Dlg.m_Control.SetCaption("データ"); //////←これをやりたい!
Dlg.DoModal();
でも、UpdataDataでエラーですね。。。
UpdateDataを外してもデータのセット時にエラーだし。
0016デフォルトの名無しさん
2005/07/13(水) 17:14:26CDialog::OnInitDialogの中で
UpdateData(TRUE)
001716
2005/07/13(水) 17:15:50UpdateData(TRUE)じゃなくてUpdateDate(FALSE)です
00184
2005/07/13(水) 17:20:18っていつコールされるんでしたっけ???
0019デフォルトの名無しさん
2005/07/13(水) 17:21:02dlg.DestroyWindow(); //破棄する
dlg.Create(IDD_DIALOG1, NULL); //も一回作る
dlg.m_ctltext="aiueo";//ダイアログのメンバにセット
dlg.UpdateData(FALSE);//変数からコントロールに更新
dlg.ShowWindow(SW_SHOW);//表示
これなら動いたぞ
0020デフォルトの名無しさん
2005/07/13(水) 17:25:49dlg->m_ctltext="aiueo";
dlg->DoModal();
dlgはCNewDlg*型
これならUpdateDataいらんな
002116
2005/07/13(水) 17:31:53>っていつコールされるんでしたっけ???
CreateまたはDoModalしたとき。
そのCDialog::OnInitDialogの中で
自動でUpdateData(FALSE)が呼ばれるようになってる
MFCのソース見てごらん。
19の書いてくれてるのは
dlg.m_ctltext="aiueo";//ダイアログのメンバにセット
dlg.Create(IDD_DIALOG1, NULL); //も一回作る
dlg.ShowWindow(SW_SHOW);//表示
としてもOKだと思うよ。
中でUpdateDataしてくれるはず。
00224
2005/07/13(水) 17:34:33>>19
ですよね?
自分もそれに近いコールで動いてる箇所もあるような気がするし、
今のフォームはASSERTにひっかかるし、キョドってる。
MFCのCDialogのASSERTってトラップっていうか邪魔。
002319
2005/07/13(水) 17:37:42あ〜ほんとだ、動くね。
00244
2005/07/13(水) 17:48:25>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);
この行でエラーダイアログが出ます。
00254
2005/07/13(水) 18:00:19>dlg.DestroyWindow(); //破棄する
>dlg.Create(IDD_DIALOG1, NULL); //も一回作る
ごめんなさい、ここまでOKでした。
間違いは、2回目のCreateのID間違いでした。
が、この後のDoModal()でエラー。
DoModal前にCreateは禁止だったかなぁ?????
00264
2005/07/13(水) 18:03:04BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
の出だしのASSERTで爆発。
もっと自由にコールできるメソッドにして欲しぃ。
002719
2005/07/13(水) 18:06:49Createの後でDoModalは俺もエラー
だからとりあえずShowWindowにした。
DoModalでなきゃヤダとか言うなら>>20の方法なら
問題なくDoModal出来る。
表示されるダイアログがクラス化されていればの話だが・・・
他に方法あったっけ?
00294
2005/07/13(水) 18:11:03>DoModalでなきゃヤダとか言うなら>>20の方法なら
>表示されるダイアログがクラス化されていればの話だが・・・
Dlgがグローバル変数で、かつ、実体宣言されてるので、
こうするためには激しい書換えが発生しまつ。
一部のメンテなんで激しい書換えは予定外でつ。厳しい...
0030デフォルトの名無しさん
2005/07/13(水) 18:14:23そういうMFCでのモーダルとモードレスの制限が知りたいんじゃなく回避方法が必要なんでわ?
003128
2005/07/13(水) 18:19:35そういう問題じゃない。
Createの後で何でDoModalするんだよ。
モードレスダイアログなら19の書いてくれてるように
CreateしてShowWindowでいいの!
>>30
何を回避?
4がモーダルとモードレスを混同しているとしか思えないが。
0032デフォルトの名無しさん
2005/07/13(水) 18:34:26アタマワリー
別のライブラリなら、
TCustomForm *Form = new TForm(NULL);
Form->PropA = "aaa"; //値をセット
Form->ShowModal(); //モーダル
Form->Show(); //モードレス
という感じで自由にコールできるぞ。
003331
2005/07/13(水) 18:46:01意味不明。
このスレはMFCの話だろ。
Createするってことはモードレスを意図してるんだろ。
その後でDoModalする必要性は如何に?
003419
2005/07/13(水) 18:54:14表示ダイアログの書き換えムリなら、
ShowWindowでモードレス表示して、
親ダイアログは制御を取らないように・・・って
なんか面倒なような気が・・・
俺なら問答無用に表示ダイアログ作り直すw
0035デフォルトの名無しさん
2005/07/13(水) 18:54:17これが読み間違いだろ。
このクリエイトの目的は値をセットするためであってモードレス意図じゃないだろ。
00364
2005/07/13(水) 18:56:55やっぱ難しいんですね。
MFCのDoModalとそれ以前のコントロールの設定の組み合わせは。
ダイアログ直して、コントロールに依存しないようにしてみまつ。
003719
2005/07/13(水) 19:00:31仕様が変。
DoModalしたきゃ、表示ダイアログクラス化して、
パブリックなメンバ変数にアクセスして設定するとかしなきゃダメ。
そうすりゃ何でもあり。自由自在!!
00384
2005/07/13(水) 19:02:27変なものをメンテしてるんだから、そんなこと言われても...
やっぱ、MFCのCDialogがもう少し使いやすくなるべきでわ。
ライブラリが色々強要してくると面倒。
003933
2005/07/13(水) 19:04:50値をセットしたいなら
[モーダル]
dlg.m_hoge="abcde";
dlg.DoModal(); ※
[モードレス]
dlg.m_hoge="abcde";
dlg.Create(); ※
dlg.ShowWindow();
でいいだろ。(引数は省略)
UpdateData(FALSE)はそれぞれの※の後で、
CDialog::OnInitDialog()の中で自動で呼ばれる。
CreateとDoModalを一緒に呼び出す意図が分からないのだが。
00404
2005/07/13(水) 19:09:28あるグローバルのダイアログが色んな用途に使われてて(←ここが破綻の元。せめて、1リソースに複数クラスにしといてくれたら何とかなったかも)、
モーダル/モードレスで開いたり閉じたりします。
で、
dlg.DestroyWindow(); //破棄する
が必要なんです。
で、破棄後に、
[モーダル]
dlg.m_hoge="abcde";
するとエラーになる。
004119
2005/07/13(水) 19:18:36ねぇ、そのグローバルのダイアログってクラス化されてないの?
dlg.DestroyWindow();のdlgってあくまでCDialogなのか?
宣言部教えて
00424
2005/07/13(水) 19:24:34何を言いたいのか分かっているというか、
ダイアログのコントロールに直接入出力するのがおかしいことくらい誰でも知っている。
とりあえず、自分は19を必要としてない。
00434
2005/07/13(水) 19:32:2819さんは色々教えて下さった方でした。
「モーダルとモードレスと知らないのか?」と煽った人と勘違いしました。
004419
2005/07/13(水) 19:36:46うぇ〜あぶねぇ・・・
ムカついて煽りの一文書くとこだったw
004519
2005/07/13(水) 19:40:59どんな使い方してる?
DoModalで表示?それともShowWindowで表示?
必ずCreateしないと使えないの?
00464
2005/07/13(水) 20:01:03今までずっとShowWindowでモードレスされてたウィンドウですが、
今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。
ダイアログを別インスタンスにしようと思ったら、
グローバルなダイアログ同士が参照しあってて、
正直ガクブル
004733
2005/07/13(水) 20:02:28俺に対して言ってるんだろうなぁ。
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);
}
00484
2005/07/13(水) 20:06:24煽りに対して憤ってるんじゃありません。
前スレで感じたんだけど、MFCスレは上手く会話を流さないとやヴぁい流れになるんで。
dlg.DestroyWindow();
dlg.m_str = "Modal";
dlg.DoModal();
この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。
でもまぁこれはMFCの制限と捕らえました。
0049デフォルトの名無しさん
2005/07/13(水) 20:10:040050デフォルトの名無しさん
2005/07/13(水) 20:10:54A,BをそれぞれDDEサーバーかつDDEクライアントにして
プログラムを書いたら、どうにか動いたのですが、それをLinuxに
移植したいと考えています(できればWindowsでも動かしたいです)。
DDEの代わりになるお勧めの方法はありますか?
交換するデータ量は、たとえばAのプログラムでボタンをクリックした
ときに、数バイト程度の文字列をBに送るとか、その逆です。
よろしく。
005147
2005/07/13(水) 20:13:28dlg.m_ctrl.
dlg.Create(...)
こうすると確かにエラー
Createの段階ではコントロールウィンドウが作成されてないためでしょう
dlg.Create(...)
dlg.m_ctrl.
ならOKでしたよ。
0052デフォルトの名無しさん
2005/07/13(水) 20:15:35MFC の 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 を共にする。
005319
2005/07/13(水) 20:26:26ちょーとまて
>この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。
って事は実はクラス化されているのか?DoDataExchangeも使ってるし・・・
dlg.DestroyWindow(); のdlgって
CDialogの派生でCXxxxDlgなのかな?
dlg.DestroyWindow(); //今までの削除
CXxxxDlg dlg2;//新しく宣言
dlg2.DoModal(); //表示
まずこれで動くか?
0054デフォルトの名無しさん
2005/07/13(水) 20:27:27ご愁傷様。そこで回避案。
class IInitDialogHandler
{
public:
0055デフォルトの名無しさん
2005/07/13(水) 20:30:25>今までずっとShowWindowでモードレスされてたウィンドウですが、
>今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。
AfxGetMainWnd()->EnableWindow(FALSE); してから dlg.ShowWindow() すると
おおむねモーダル風になるよ。
0056デフォルトの名無しさん
2005/07/13(水) 20:40:52class 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(...);
}
}
005747&51
2005/07/13(水) 22:30:54[モーダル]の場合
dlg.m_ctrl.・・・
dlg.DoModal();
とすると、DoModal前はコントロールのウィンドウが作成されておらず、HWNDが無効なため
m_ctrlにアクセスしようとするとエラーになる。(51のCreate前と同様の現象)
>>12を読む限り文字列さえ設定できれば良いようなので
新たにCString型のDDX変数を追加して>>47みたいにすればOK。
SetCaptionというのには標準のDDX_Textを使えないので
自前でDDX_,DDV_を実装すればよい。
関数を書いてもいいし、CHogeDialog::DoDataExchangeの中に書くのでもいい。
http://www.microsoft.com/japan/developer/library/vcmfc/_mfcnotes_tn026.htm
0058デフォルトの名無しさん
2005/07/13(水) 22:52:44CWnd : : Detach()でも使えないかね…
DestroyWindow()はなんか大げさな希ガス。
0059デフォルトの名無しさん
2005/07/14(木) 08:29:5800604
2005/07/14(木) 08:42:33あ、DoDataExchangeってそういう使い方するんですか。
コントロール生成の前に値を変数に入れとくわけですね。
って超基本を誤解してた悪寒。
>>51-59
各種破棄メソッドとlifetimeの関係、
このあたり、ずっと知りたいとこでした。¢(ーー;メモシトク・・・
0061デフォルトの名無しさん
2005/07/14(木) 13:58:17dcWork に描画された内容を 指定したRGB値を透明色にして 全体を半透明に dcScrren にBitBltしたいのですが、
このようなことはできるのでしょうか?(自前でアルファブレンドや透明色のコードを書かないで)
CDC::AlphaBlendとCDC::TransparentBltの2つの機能をあわせたような処理を実現したいのです。
自前でピクセルを全て操作するような処理を実装すると、すこぶる遅くなるので、MFC(API)に任せたいのです。
(DirectXとかOpenGLとかは使いたくないです。)
賢者の方よろしくご教授下さい。お願いします。
0062デフォルトの名無しさん
2005/07/14(木) 14:14:19006361
2005/07/14(木) 14:22:23他にこのAPIが使えそうとか、こういう風な実装をすれば、高速に処理できるとかヒントや参考になるリンクでも
知っている人がいましたら、ぜひお教え下さい。お願いします。
GDI+とかでもできなさそうでしょうか?Graphicsクラス?
0064デフォルトの名無しさん
2005/07/14(木) 14:58:030065デフォルトの名無しさん
2005/07/14(木) 15:09:530066デフォルトの名無しさん
2005/07/14(木) 15:22:55006716ほか
2005/07/14(木) 19:19:35今ごろになって何言ってんの?
まともにデバッガ使ってないだろ。
ついでに、俺の全レスは>>16>>21>>28>>31>>33>>39>>47>>51>>57。
それでも42-43のような発言をした挙句に撤回もせずに
すっとぼけて出てくる気が知れん。
-----------------------------------------------------
あまりにも目に余るので一言言わせてもらいました。
他の回答者&質問者の方々、スレ汚しになり申し訳ありません。
0068デフォルトの名無しさん
2005/07/14(木) 19:21:13リストのアイテムを選択した際の描画をフックするために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 );
何が問題かわかりますでしょうか。。。
006968
2005/07/14(木) 19:24:27マウスでアイテムをピックした場合にはうまくいくものの、プログラム内の他の関数から
SetItemStateを読んでアイテムを選択状態にしても(*)の場所に処理が来ずに描画ができないという状況です。
0070デフォルトの名無しさん
2005/07/14(木) 19:30:32Listコントロール自体がフォーカスを持っていないからでは?
0071デフォルトの名無しさん
2005/07/14(木) 19:33:16選択状態のアイテムの強調表示を常に行いたいのなら、ListViewのスタイルに
LVS_SHOWSELALWAYS を追加して、uItemState & CDIS_SELECTED を見るのが
正しげに思える。
0072デフォルトの名無しさん
2005/07/14(木) 19:38:48フォーカスと選択に関する例です。解っているなら無視してください。
例えば List Control の代表的な例としてエクスプローラでファイルがいくつか入った
フォルダを開いて、アイテムをクリックすると、リストコントロールとアイテムが選択され、
かつそのアイテムにフォーカスが移動する。
ここでCtrl+矢印でフォーカスだけ移動させてみると、フォーカスを示す点線の矩形が
ファイル名を囲むように表示される。他のウィンドウをクリックするなどして、リストコント
ロールがフォーカスを失うと、アイテムのフォーカスを示す矩形は非表示になる。
0073デフォルトの名無しさん
2005/07/14(木) 19:55:46SetItemStateの引数に渡すのはCDIS_じゃなくてLVIS_の方だと思う。
それぞれ以下のようにdefineされてるので、確認。
CommCtrl.h
#define LVIS_FOCUSED 0x0001
#define LVIS_SELECTED 0x0002
#define CDIS_SELECTED 0x0001
#define CDIS_FOCUS 0x0010
0074デフォルトの名無しさん
2005/07/15(金) 00:05:26そしてWM_USER_ADD_STRINGというメッセージを受けるとメッセージハンドらで
CXXXDlg::OnAddString(WPARAM wParam, LPARAM lParam)
{
m_Edit += (LPCTSTR)lParam;
UpdateData(FALSE);
}
とやってm_Editに文字列を追加していきます。
そしてたくさん追加するとスクロールバーが出てくるのですがこいつを一番したに自動で行かせたいのです。
つまり最後に追加した奴を見るのにいちいち人手でスクロールさせるのは面倒くさいので自動にしたいわけです。
いい方法はありませんか?
0075デフォルトの名無しさん
2005/07/15(金) 00:14:310076デフォルトの名無しさん
2005/07/15(金) 01:15:04MSDNのCEditクラスメンバー辺りを矯めつ眇めつする。
0077デフォルトの名無しさん
2005/07/15(金) 01:42:18UpdateDataの次の行から
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のどちらかしかスクロールバーが最後に来てくれないのです。
なぜでしょうか?
0078デフォルトの名無しさん
2005/07/15(金) 01:56:24SetSel()は表示されることを保証しないからねぇ。
ちなみに私が使っている最終行を表示させる関数はこう。
void showLastLine(CEdit & edit)
{
edit.SetRedraw(false);
edit.LineScroll(edit.GetLineCount());
edit.LineScroll(-1);
edit.SetRedraw();
}
0079デフォルトの名無しさん
2005/07/15(金) 02:07:15ありがとうございます!!!
明日早速試してみます。
本当に夜分遅くありがとうございました!
0081デフォルトの名無しさん
2005/07/15(金) 13:40:58ViewのOnCreateでダイアログを作成してモードレスで表示しています。
ソフトが立ち上がったときにこのダイアログのエディットコントロールに
すでに入力フォーカスがあるようにしたいのですが、
OnInitDialogでSetFocusをやったけれどうまくいきませんでした。
どこでSetFocusをすればいいのでしょうか?
0082デフォルトの名無しさん
2005/07/15(金) 13:43:07ViewのOnCreateでダイアログを作成してモードレスで表示しています。
ソフトが立ち上がったときにこのダイアログのエディットコントロールに
すでに入力フォーカスがあるようにしたいのですが、
OnInitDialogで
GetDlgItem(ID)->SetFocus()
をやったけれどうまくいきませんでした。
どこでSetFocusをすればいいのでしょうか?
0083デフォルトの名無しさん
2005/07/15(金) 13:44:210084デフォルトの名無しさん
2005/07/15(金) 14:57:53OnInitDialog()のテンプレートにはコメントがついていると思うのだが、
そこには何と書いてあるかな?
0085デフォルトの名無しさん
2005/07/15(金) 16:04:25>84さんのやり方のほうが簡単だとおもって
戻り値をFALSEに代えてみたけどちょっと動作が不安定なのです・・・
入力フォーカスが行ったり行かなかったりします。(大概いかない)
もしよければ詳しく教えてもらえませんか?
OnInitDialogで
GetDlgItem(ID)->SetFocus();
return FALSE;
とやると、一旦はフォーカスが行くようですが、
そのあとKillFocusが呼ばれ、フォーカスは目的の場所には行っていません。
当然SetFocusをやらなければKillFocusも呼ばれないのですが。
0086デフォルトの名無しさん
2005/07/15(金) 17:40:26ダイアログからフォーカス奪うからだめでしょう。
そのタイミングでダイアログをアクティブにするため
PostMessageすればよろし。
0087デフォルトの名無しさん
2005/07/15(金) 19:44:30MFCで、リソースからダイアログを生成したのですが、
再描画がうまくされない不具合があります。
なぜなのでしょうか?
ちなみに、再描画されないリソースダイアログは、親のダイアログの子としてCreate生成しております。
0088デフォルトの名無しさん
2005/07/15(金) 20:21:30008987
2005/07/15(金) 20:26:31009087
2005/07/15(金) 20:28:37具体的には、親のダイアログの子としてCreateすると、
子ダイアログの後ろにある、親の背景が透けて見えるという
感じです。コンパイルは成功するのですが、描画だけおかしくて。
問題点を教えてもらえればありがたいです。
0091デフォルトの名無しさん
2005/07/15(金) 20:29:55せいだろう。チェックを外してみるが良し。
009387
2005/07/15(金) 20:58:520094デフォルトの名無しさん
2005/07/15(金) 21:09:23当たり前だろ
0095デフォルトの名無しさん
2005/07/15(金) 22:03:440096デフォルトの名無しさん
2005/07/16(土) 01:04:36RedrawWindow()なりやってみる。
009774
2005/07/16(土) 01:24:20結論から言うと>>77でも>>78さんのやり方でもできましたが、>>77で書いた問題はどちらもありました。
で、その問題はなぜ起きるかと言うと、UpdateDataの契機でIDC_EDITもIDC_EDIT2も
最初の行にスクロールして戻ってしまうからでした。
よって
CXXXDlg::OnAddString()
CXXXDlg::OnAddString2()
のいずれのハンドラでもIDC_EDIT、IDC_EDIT2の両方に対し、最後の行に移動する処理を書く必要があったみたいです。
もっとうまい方法がある気がしますが、自分はこの辺でやめときます。
(キャレットを最後に移動させておくとかするとUpdateDataで最初の行に戻らないのかも??)
009878
2005/07/16(土) 01:47:39あー、そりゃDDXで全てやろうとするからだ。
私の場合は処理速度の問題もあったからReplaceSel()で追加しているんで
UpdateData()までは気付かなかったよ。
0099デフォルトの名無しさん
2005/07/16(土) 08:51:57子ウィンドウをクリップにチェック
010182
2005/07/16(土) 11:54:45そうか。PostMessageもありましたね。
自分の解決策は、Appのイニシャライズで無理矢理SetFocusをする方法でした。
なぜフォーカスを奪われてしまうところの解決策はなさそうですね。
とりあえず解決しております。分からないこともありますが・・・
ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています