■MFC相談室 mfc14d.dll■

1デフォルトの名無しさん
Microsoft Foundation Classライブラリ専用スレです。

■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
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)でエラーになりました。

回避方法教えて下さいでつ。
32:2005/07/13(水) 10:47:26
事故解決しました。

処理変えなきゃ良いんでつね。
>ChildDialog.Create(IDD_CHILD, this);
これがnewだと勘違いしてます他。
4デフォルトの名無しさん:2005/07/13(水) 15:15:44
DoDataExchangeの動くタイミングを教えて下さい。
非表示では動作しませんか?
5デフォルトの名無しさん:2005/07/13(水) 15:27:39
>4
非表示でも動きます。
UpdateData(TRUE);
UpdateData(FALSE);
が実行されれば。
64:2005/07/13(水) 15:59:26
サンクツ>>5

ただ、CWnd::UpdateDataの中の1行目「ASSERT(::IsWindow(m_hWnd));」でコケまつ。
7デフォルトの名無しさん:2005/07/13(水) 16:19:00
>>6
アプリがどういう作りかわからんが、
ウィンドウが作られる前にUpdateData動かしてるからだろ。たぶん。

ダイアログのコンストラクタでUpdateData呼び出したら、
同じエラーになるぞ。
84: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));」
でこけてまつ。

変な記述してるわけじゃないんだけどな...
94:2005/07/13(水) 16:45:08
>Dlg.Create(IDD_DLG, this);
>CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)

先頭の引数は数値なのにLPCTSTRに入ってる時点で不思議。
なんか明示的に書いてやる必要があるのかな?
104:2005/07/13(水) 16:47:27
UpdateData呼び出すのも難しいYO
11デフォルトの名無しさん:2005/07/13(水) 16:52:12
>4
つか、いったい何がしたいのか?
124:2005/07/13(水) 16:56:23
Dlg.DestroyWindow();

>Dlg.m_Control.SetCaption("データ"); //////←これをやりたい!

Dlg.DoModal();

コントロールに文字列を設定したい。
なぜかというと、Dlgの中のメソッドの人に、
コントロールの文字列を使って動作する処理が入ってるから。

それを直すのも怖いし。
13デフォルトの名無しさん:2005/07/13(水) 17:01:20
>4
環境書いてくれい
VC6.0++とかか?

あと、Dlg.DestroyWindow();で
ダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・

144:2005/07/13(水) 17:04:42
Yes.>VC6.0++とかか?

>あと、Dlg.DestroyWindow();でダイアログを破棄してからセットするのか?ていうかできないんじゃ・・・

え”~困ります。
既に出来てるDlgがグローバル変数になってて、一旦初期化しないと...
154:2005/07/13(水) 17:12:22
Dlg.DestroyWindow();
Dlg.UpdateData(FALSE);
>Dlg.m_Control.SetCaption("データ"); //////←これをやりたい!
Dlg.DoModal();

でも、UpdataDataでエラーですね。。。
UpdateDataを外してもデータのセット時にエラーだし。
16デフォルトの名無しさん:2005/07/13(水) 17:14:26
>>15
CDialog::OnInitDialogの中で
UpdateData(TRUE)
1716:2005/07/13(水) 17:15:50
上のは
UpdateData(TRUE)じゃなくてUpdateDate(FALSE)です
184: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いらんな
2116: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してくれるはず。
224:2005/07/13(水) 17:34:33
>これなら動いたぞ
>>19

ですよね?
自分もそれに近いコールで動いてる箇所もあるような気がするし、
今のフォームはASSERTにひっかかるし、キョドってる。
MFCのCDialogのASSERTってトラップっていうか邪魔。
2319:2005/07/13(水) 17:37:42
>21
あ~ほんとだ、動くね。
244: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);
この行でエラーダイアログが出ます。
254: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は禁止だったかなぁ?????
264:2005/07/13(水) 18:03:04
Createをやめて、UpdateDataに差し替えたところ、

BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?

の出だしのASSERTで爆発。

もっと自由にコールできるメソッドにして欲しぃ。
2719:2005/07/13(水) 18:06:49
>4
Createの後でDoModalは俺もエラー
だからとりあえずShowWindowにした。

DoModalでなきゃヤダとか言うなら>>20の方法なら
問題なくDoModal出来る。
表示されるダイアログがクラス化されていればの話だが・・・

他に方法あったっけ?

2816&21:2005/07/13(水) 18:09:01
>>25-26
おいおい
モーダルとモードレスの違い分かってる?
294:2005/07/13(水) 18:11:03
thx>>27
>DoModalでなきゃヤダとか言うなら>>20の方法なら
>表示されるダイアログがクラス化されていればの話だが・・・

Dlgがグローバル変数で、かつ、実体宣言されてるので、
こうするためには激しい書換えが発生しまつ。
一部のメンテなんで激しい書換えは予定外でつ。厳しい...
30デフォルトの名無しさん:2005/07/13(水) 18:14:23
>>28
そういうMFCでのモーダルとモードレスの制限が知りたいんじゃなく回避方法が必要なんでわ?
3128:2005/07/13(水) 18:19:35
>>29
そういう問題じゃない。
Createの後で何でDoModalするんだよ。
モードレスダイアログなら19の書いてくれてるように
CreateしてShowWindowでいいの!

>>30
何を回避?
4がモーダルとモードレスを混同しているとしか思えないが。
32デフォルトの名無しさん:2005/07/13(水) 18:34:26
>4がモーダルとモードレスを混同しているとしか思えないが。
アタマワリー

別のライブラリなら、
TCustomForm *Form = new TForm(NULL);
Form->PropA = "aaa"; //値をセット
Form->ShowModal(); //モーダル
Form->Show(); //モードレス

という感じで自由にコールできるぞ。
3331:2005/07/13(水) 18:46:01
>>32
意味不明。
このスレはMFCの話だろ。

Createするってことはモードレスを意図してるんだろ。
その後でDoModalする必要性は如何に?
3419:2005/07/13(水) 18:54:14
>4
表示ダイアログの書き換えムリなら、

ShowWindowでモードレス表示して、
親ダイアログは制御を取らないように・・・って
なんか面倒なような気が・・・

俺なら問答無用に表示ダイアログ作り直すw
35デフォルトの名無しさん:2005/07/13(水) 18:54:17
>Createするってことはモードレスを意図してるんだろ。

これが読み間違いだろ。
このクリエイトの目的は値をセットするためであってモードレス意図じゃないだろ。
364:2005/07/13(水) 18:56:55
>>34
やっぱ難しいんですね。
MFCのDoModalとそれ以前のコントロールの設定の組み合わせは。

ダイアログ直して、コントロールに依存しないようにしてみまつ。
3719:2005/07/13(水) 19:00:31
ていうか、表示ダイアログの使い方って言うか、
仕様が変。

DoModalしたきゃ、表示ダイアログクラス化して、
パブリックなメンバ変数にアクセスして設定するとかしなきゃダメ。
そうすりゃ何でもあり。自由自在!!

384:2005/07/13(水) 19:02:27
>>37
変なものをメンテしてるんだから、そんなこと言われても...

やっぱ、MFCのCDialogがもう少し使いやすくなるべきでわ。
ライブラリが色々強要してくると面倒。
3933: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を一緒に呼び出す意図が分からないのだが。
404:2005/07/13(水) 19:09:28
>>39
あるグローバルのダイアログが色んな用途に使われてて(←ここが破綻の元。せめて、1リソースに複数クラスにしといてくれたら何とかなったかも)、
モーダル/モードレスで開いたり閉じたりします。
で、
dlg.DestroyWindow(); //破棄する
が必要なんです。
で、破棄後に、
[モーダル]
 dlg.m_hoge="abcde";
するとエラーになる。
4119:2005/07/13(水) 19:18:36
>4
ねぇ、そのグローバルのダイアログってクラス化されてないの?
dlg.DestroyWindow();のdlgってあくまでCDialogなのか?

宣言部教えて

424:2005/07/13(水) 19:24:34
19はシツコイ。

何を言いたいのか分かっているというか、
ダイアログのコントロールに直接入出力するのがおかしいことくらい誰でも知っている。

とりあえず、自分は19を必要としてない。
434:2005/07/13(水) 19:32:28
ごめんなさい42を取り消します。
19さんは色々教えて下さった方でした。
「モーダルとモードレスと知らないのか?」と煽った人と勘違いしました。
4419:2005/07/13(水) 19:36:46
>4
うぇ~あぶねぇ・・・
ムカついて煽りの一文書くとこだったw
4519:2005/07/13(水) 19:40:59
>あるグローバルのダイアログが色んな用途に使われてて

どんな使い方してる?
DoModalで表示?それともShowWindowで表示?
必ずCreateしないと使えないの?
464:2005/07/13(水) 20:01:03
>>45
今までずっとShowWindowでモードレスされてたウィンドウですが、
今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。
ダイアログを別インスタンスにしようと思ったら、
グローバルなダイアログ同士が参照しあってて、
正直ガクブル
4733: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);
}
484:2005/07/13(水) 20:06:24
thx>>47
煽りに対して憤ってるんじゃありません。
前スレで感じたんだけど、MFCスレは上手く会話を流さないとやヴぁい流れになるんで。


dlg.DestroyWindow();
dlg.m_str = "Modal";
dlg.DoModal();

この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。
でもまぁこれはMFCの制限と捕らえました。
49デフォルトの名無しさん:2005/07/13(水) 20:10:04
自演の悪寒
50デフォルトの名無しさん:2005/07/13(水) 20:10:54
二つのプログラムA,Bで双方向に非同期で通信したかったので、
A,BをそれぞれDDEサーバーかつDDEクライアントにして
プログラムを書いたら、どうにか動いたのですが、それをLinuxに
移植したいと考えています(できればWindowsでも動かしたいです)。
DDEの代わりになるお勧めの方法はありますか?
交換するデータ量は、たとえばAのプログラムでボタンをクリックした
ときに、数バイト程度の文字列をBに送るとか、その逆です。
よろしく。
5147:2005/07/13(水) 20:13:28
>>48
dlg.m_ctrl.
dlg.Create(...)
こうすると確かにエラー
Createの段階ではコントロールウィンドウが作成されてないためでしょう

dlg.Create(...)
dlg.m_ctrl.
ならOKでしたよ。
52デフォルトの名無しさん:2005/07/13(水) 20:15:35
>>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 を共にする。
5319:2005/07/13(水) 20:26:26
>4
ちょーとまて
>この「m_str」はCStringだと思いますが、これをコントロールにするとエラーします。
って事は実はクラス化されているのか?DoDataExchangeも使ってるし・・・

dlg.DestroyWindow(); のdlgって
CDialogの派生でCXxxxDlgなのかな?


dlg.DestroyWindow(); //今までの削除
CXxxxDlg dlg2;//新しく宣言
dlg2.DoModal(); //表示

まずこれで動くか?


54デフォルトの名無しさん:2005/07/13(水) 20:27:27
>>46
ご愁傷様。そこで回避案。
class IInitDialogHandler
{
public:
55デフォルトの名無しさん:2005/07/13(水) 20:30:25
>>46
>今までずっとShowWindowでモードレスされてたウィンドウですが、
>今回の修正でモーダルが必要になったんでdlg.DestroyWindow()しました。

AfxGetMainWnd()->EnableWindow(FALSE); してから dlg.ShowWindow() すると
おおむねモーダル風になるよ。
56デフォルトの名無しさん:2005/07/13(水) 20:40:52
>>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(...);
}
}
5747&51:2005/07/13(水) 22:30:54
>>51の補足
[モーダル]の場合
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
58デフォルトの名無しさん:2005/07/13(水) 22:52:44
ダイアログクラスのインスタンスを何度も使いまわすなら
CWnd : : Detach()でも使えないかね…
DestroyWindow()はなんか大げさな希ガス。
59デフォルトの名無しさん:2005/07/14(木) 08:29:58
実は>55が一番素直じゃないかって気もしないでもないな。
604: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とかは使いたくないです。)

賢者の方よろしくご教授下さい。お願いします。
62デフォルトの名無しさん:2005/07/14(木) 14:14:19
少なくともMFCにそんな機能は無い。
6361:2005/07/14(木) 14:22:23
>>62 そうなんですかがっかり・・・・

他にこのAPIが使えそうとか、こういう風な実装をすれば、高速に処理できるとかヒントや参考になるリンクでも
知っている人がいましたら、ぜひお教え下さい。お願いします。

GDI+とかでもできなさそうでしょうか?Graphicsクラス?
64デフォルトの名無しさん:2005/07/14(木) 14:58:03
素直にDirectX使った方がいいかと
65デフォルトの名無しさん:2005/07/14(木) 15:09:53
MFCにDirectXのラッパ無いんでしたっけ?
66デフォルトの名無しさん:2005/07/14(木) 15:22:55
そんなの要らん
6716ほか: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 );
何が問題かわかりますでしょうか。。。
6968:2005/07/14(木) 19:24:27
わかりにくくてすみません。>>68の(*)の位置で選択状態にあるアイテムの描画をしているのですが、
マウスでアイテムをピックした場合にはうまくいくものの、プログラム内の他の関数から
SetItemStateを読んでアイテムを選択状態にしても(*)の場所に処理が来ずに描画ができないという状況です。
70デフォルトの名無しさん:2005/07/14(木) 19:30:32
>>68
Listコントロール自体がフォーカスを持っていないからでは?
71デフォルトの名無しさん:2005/07/14(木) 19:33:16
>>69
 選択状態のアイテムの強調表示を常に行いたいのなら、ListViewのスタイルに
LVS_SHOWSELALWAYS を追加して、uItemState & CDIS_SELECTED を見るのが
正しげに思える。
72デフォルトの名無しさん:2005/07/14(木) 19:38:48
>>69
フォーカスと選択に関する例です。解っているなら無視してください。

例えば List Control の代表的な例としてエクスプローラでファイルがいくつか入った
フォルダを開いて、アイテムをクリックすると、リストコントロールとアイテムが選択され、
かつそのアイテムにフォーカスが移動する。

ここでCtrl+矢印でフォーカスだけ移動させてみると、フォーカスを示す点線の矩形が
ファイル名を囲むように表示される。他のウィンドウをクリックするなどして、リストコント
ロールがフォーカスを失うと、アイテムのフォーカスを示す矩形は非表示になる。
73デフォルトの名無しさん:2005/07/14(木) 19:55:46
>>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に文字列を追加していきます。
そしてたくさん追加するとスクロールバーが出てくるのですがこいつを一番したに自動で行かせたいのです。
つまり最後に追加した奴を見るのにいちいち人手でスクロールさせるのは面倒くさいので自動にしたいわけです。
いい方法はありませんか?
75デフォルトの名無しさん:2005/07/15(金) 00:14:31
あります。
76デフォルトの名無しさん:2005/07/15(金) 01:15:04
>>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のどちらかしかスクロールバーが最後に来てくれないのです。
なぜでしょうか?
78デフォルトの名無しさん:2005/07/15(金) 01:56:24
>>77
SetSel()は表示されることを保証しないからねぇ。
ちなみに私が使っている最終行を表示させる関数はこう。
void showLastLine(CEdit & edit)
{
edit.SetRedraw(false);
edit.LineScroll(edit.GetLineCount());
edit.LineScroll(-1);
edit.SetRedraw();
}
79デフォルトの名無しさん:2005/07/15(金) 02:07:15
>>78
ありがとうございます!!!
明日早速試してみます。
本当に夜分遅くありがとうございました!
8061: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をすればいいのでしょうか?
83デフォルトの名無しさん:2005/07/15(金) 13:44:21
あっ、書き込めてないと思って2重カキコしてしまいました。すいません・・・
84デフォルトの名無しさん:2005/07/15(金) 14:57:53
>>82
OnInitDialog()のテンプレートにはコメントがついていると思うのだが、
そこには何と書いてあるかな?
85デフォルトの名無しさん:2005/07/15(金) 16:04:25
とりあえず自己解決策を見出してみたのですが、
>84さんのやり方のほうが簡単だとおもって
戻り値をFALSEに代えてみたけどちょっと動作が不安定なのです・・・
入力フォーカスが行ったり行かなかったりします。(大概いかない)
もしよければ詳しく教えてもらえませんか?

OnInitDialogで

GetDlgItem(ID)->SetFocus();
return FALSE;

とやると、一旦はフォーカスが行くようですが、
そのあとKillFocusが呼ばれ、フォーカスは目的の場所には行っていません。
当然SetFocusをやらなければKillFocusも呼ばれないのですが。
86デフォルトの名無しさん:2005/07/15(金) 17:40:26
viewのOnInitialUpdate()のタイミングでViewがアクティブになり
ダイアログからフォーカス奪うからだめでしょう。
そのタイミングでダイアログをアクティブにするため
PostMessageすればよろし。
87デフォルトの名無しさん:2005/07/15(金) 19:44:30
こんばんわ。

MFCで、リソースからダイアログを生成したのですが、
再描画がうまくされない不具合があります。

なぜなのでしょうか?

ちなみに、再描画されないリソースダイアログは、親のダイアログの子としてCreate生成しております。
88デフォルトの名無しさん:2005/07/15(金) 20:21:30
再描画がうまくされないとは?
8987:2005/07/15(金) 20:26:31
かいけつしました
9087:2005/07/15(金) 20:28:37
ありがとうございます。

具体的には、親のダイアログの子としてCreateすると、
子ダイアログの後ろにある、親の背景が透けて見えるという
感じです。コンパイルは成功するのですが、描画だけおかしくて。
問題点を教えてもらえればありがたいです。
91デフォルトの名無しさん:2005/07/15(金) 20:29:55
それは、ダイアログリソースの可視にチェックを入れている
せいだろう。チェックを外してみるが良し。
9287:2005/07/15(金) 20:31:07
>>91さん
ビンゴでした。どうもありがとうございました。
9387:2005/07/15(金) 20:58:52
可視を消したら全部消えちゃった
94デフォルトの名無しさん:2005/07/15(金) 21:09:23
>>93
当たり前だろ
95デフォルトの名無しさん:2005/07/15(金) 22:03:44
>>91は詐欺師
96デフォルトの名無しさん:2005/07/16(土) 01:04:36
強制的に対象ダイアログに対してInvalidate()なりUpdateWindow()なり
RedrawWindow()なりやってみる。
9774:2005/07/16(土) 01:24:20
さっそくためさせていただきました。
結論から言うと>>77でも>>78さんのやり方でもできましたが、>>77で書いた問題はどちらもありました。
で、その問題はなぜ起きるかと言うと、UpdateDataの契機でIDC_EDITもIDC_EDIT2も
最初の行にスクロールして戻ってしまうからでした。
よって
CXXXDlg::OnAddString()
CXXXDlg::OnAddString2()
のいずれのハンドラでもIDC_EDIT、IDC_EDIT2の両方に対し、最後の行に移動する処理を書く必要があったみたいです。

もっとうまい方法がある気がしますが、自分はこの辺でやめときます。
(キャレットを最後に移動させておくとかするとUpdateDataで最初の行に戻らないのかも??)
9878:2005/07/16(土) 01:47:39
>>97
あー、そりゃDDXで全てやろうとするからだ。
私の場合は処理速度の問題もあったからReplaceSel()で追加しているんで
UpdateData()までは気付かなかったよ。
99デフォルトの名無しさん:2005/07/16(土) 08:51:57
>>87
子ウィンドウをクリップにチェック
10074:2005/07/16(土) 09:49:33
>>98
ReplaceSel()を使うのですか。またひとつ勉強になりました。
10182:2005/07/16(土) 11:54:45
>86
そうか。PostMessageもありましたね。
自分の解決策は、Appのイニシャライズで無理矢理SetFocusをする方法でした。
なぜフォーカスを奪われてしまうところの解決策はなさそうですね。
とりあえず解決しております。分からないこともありますが・・・
ありがとうございました。
10278:2005/07/16(土) 14:05:56
>>100
それじゃ折角だから追加するロジックも貼っておこう。
--
int pos = edit.LineIndex(edit.GetLineCount() - 1);
edit.SetSel(pos, pos);
edit.ReplaceSel("foo\r\n");
103デフォルトの名無しさん:2005/07/18(月) 00:14:10
質問です。

mfcを使ってWinXPで動作するアプリケーションを組もうと思っています。
開発にはVC++ 2003を使います。

アプリの内容は、インターネット上のサーバーから、値段の情報が10くらい
一度に送られてきて(送られてくる頻度は10値段/3秒くらい)、
それをリアルタイムに折線グラフを画面上に表示するものです。
リアルタイムの株価グラフアプリを思い浮かべて頂くとよいです。

質問の内容は、「上記アプリで「グラフを描画する」際に、最も適当な手段はなにか」を教えて頂きたいのです。
例えば、
 mfcの機能のみでゴリゴリ書く
 グラフライブラリを使う ←そもそもあるのか?
 グラフクラス集を使う ←そもそもあるのか?  とかです。

私がググったところ、それっぽいのは発見できませんでした。

将来的にはOpenGLとかを使ったグラフの3次元化も考えています。

エロイ人おながいしまつ。
104デフォルトの名無しさん:2005/07/18(月) 01:16:01
CDC
105デフォルトの名無しさん:2005/07/18(月) 10:36:22
>>103
つ[諦める]

世の中にはグラフのためのライブラリなんて山ほどあるのにそれを見つけられないようなら、ね。
私は3Dグラフも必要だったからTrueWinChartを使ったけど、そんなに高くなくても
追記型のグラフ作成に向いたのがいくつもあるよ。
106103: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があるよ、
とかありましたら、お教え下さい。
107デフォルトの名無しさん:2005/07/19(火) 00:40:43
つか、折れ線グラフくらいならライブラリ使わなくても自力でいけるだろ。
108デフォルトの名無しさん:2005/07/19(火) 15:26:29
印刷ダイアログと印刷プレビューの機能を実装したいのですが、
分かりやすいサンプルコードはないですか?
109デフォルトの名無しさん:2005/07/19(火) 15:26:51
質問なのにsageちゃったのでageます。
110デフォルトの名無しさん:2005/07/19(火) 16:45:05
どういうレベルの話かわからんが、印刷サポート付きのMFCアプリケーションを
ウィザードに作らせれば、MFCの持つその機能の使い方はわかる。
111デフォルトの名無しさん:2005/07/19(火) 18:51:59
スレッドを作成する関数に"AfxBeginThread"って言うのがありますが、
ゴチャゴチャしてて面倒くさそうなので、process.hの_biginthreadを使用し
ています。
_biginthreadに対するにAfxBeginThreadのメリットって、簡単に言うとどう
いうことでしょうか?
112デフォルトの名無しさん:2005/07/19(火) 18:53:41
訂正:_biginthread -> _beginthread
結構はずかしい。
113デフォルトの名無しさん:2005/07/19(火) 18:56:55
>>111に答えようと思いましたが、ゴチャゴチャしてて面倒くさいのでやめます。
1141/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();
}
}

と追加したところ、新しい窓が表示されました。
1152/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);
とやってもデバッグアサーションになりました。
116デフォルトの名無しさん:2005/07/19(火) 20:04:24
アサーションに失敗すると、次のテキストがメッセージ ボックスに表示されます。
assertion failed in file <name> in line <num>
Abort Retry Ignore

<name> にはソース ファイルの名前、<num> にはエラーが発生したソース ファイルの行番号が入ります。

[中止] をクリックすると、プログラムの実行が停止します。
[無視] をクリックすると、プログラムの実行が再開されます。
[再試行] をクリックすると、ASSERT の後でも、デバッガに移行できます。
117デフォルトの名無しさん:2005/07/19(火) 21:17:08
>>115
なんでAttachした後にLoadMenu()するんだ?
118デフォルトの名無しさん:2005/07/19(火) 21:37:50
115
OnCreate()のタイミングではどうやっても無理。
CHogeApp::InitInstance()で
CSingleDocTemplate( IDR_・・・
とするか
CMainFrame::PreCreateWindowで
cs.hMenu = LoadMenu(NULL, MAKEINTRESOUCE(IDR_・・・
とする。
119デフォルトの名無しさん:2005/07/19(火) 22:43:30
>>111
AfxBeginThreadではMFCの初期化処理が行われている。
つまりスレッドでMFCを使うのならAfxBeginThreadを使わないといけない。
120デフォルトの名無しさん:2005/07/19(火) 23:38:18
そうでもないぞ。MSDNのMFCマルチスレッドのサンプルでは
AfxBeginThreadなんて使ってないよ。なぜ使ってないかは
ソース見れば分かるが。
121115:2005/07/20(水) 19:16:36
>>118
うまくいきました。愛してる。
122デフォルトの名無しさん:2005/07/20(水) 19:36:46
>>120
> なぜ使ってないかは
分かったぞ、ゴチャゴチャしてて面倒くさそうだからだ。
123デフォルトの名無しさん:2005/07/20(水) 19:47:50
MSDNのサンプルって昔のバージョンのやつを使いまわしてるからな
124103:2005/07/20(水) 20:17:16
折線グラフで書く線分に、アンチエイリアスとアルファブレンディングしたいのですが、
MFC上で使うには、どのように指定すればいいですか?

OpenGLとか使わなければできないのでしょうか?
125デフォルトの名無しさん:2005/07/20(水) 21:31:45
>>124
んなことない
126デフォルトの名無しさん:2005/07/20(水) 22:12:00
アンチエイリアスとアルファブレンドについて小一時間調べてからこい。
127103:2005/07/21(木) 06:11:41
>>125,126
小一時間調べました。DirectXや .NET Frameworkを使えば出来そうです。

が、MFC以外の仕組み(Direct~やOpenGLやその他のライブラリ様のものや .NET Framework)は出来れば使いたくなく、
アンチエイリアスとアルファブレンドのアルゴリズム等も実装せずに使いたいのです。
どのようにすれば出来ますか?
128デフォルトの名無しさん:2005/07/21(木) 07:01:08
>>127
たかがリアルタイムトレンドみたいなものにしては要求仕様が無駄に高いな。
TrueWinChart(orTrueWebChart)のようなそういう目的で作られたようなライブラリでさえ
そこまでしてなかったような気がするんだが。

にも関わらず、それらを使わずアルゴリズムも実装しないって、何舐めてんの?
手間をかけずに無から有が得られるわけないじゃない。
営業といっしょにクライアントに頭下げに行ってきたら?
129デフォルトの名無しさん:2005/07/21(木) 13:09:07
>>127
GDI+ 程度で十分過ぎると思うけど・・・
130デフォルトの名無しさん:2005/07/21(木) 13:11:41
MFC以外は使いたくないんだとさ。
ほっとけよ。
131デフォルトの名無しさん:2005/07/21(木) 16:55:23
MFCのCStringは可変長ですが、
初期状態で、代入できる文字列の長さの制限はありますか?

なぜか、デバッグで調べたところ、文字が途中で切れているみたいなのですが。
132デフォルトの名無しさん:2005/07/21(木) 17:01:23
解説

どのコンストラクタも指定されたデータで新しい CString オブジェクトを初期化します。

各コンストラクタは入力データを新しく確保した領域にコピーします。したがって、メモリ不足の例外に注意する必要があります。
133デフォルトの名無しさん:2005/07/21(木) 17:05:12
CListCtrlのSetItemTextで設定できる文字列の長さに制限はありますか?
134103:2005/07/21(木) 17:11:59
>>129
情報ありがとうございます。
GDI+について、小二時間くらい調べました。

.NET Frameworkに組み込まれているGDI+は、
VC++のマネージコードから呼び出すように作られていると思います。

VC++マネージコードで書かれた、GDI+を使ったクラスを、
MFCを使ったVC++ネイティブコードから呼び出すことは出来ますか?

また、出来るとしたら、どのようにすれば出来るか、
その方法を知ってる方、回答お願いします。
135デフォルトの名無しさん:2005/07/21(木) 17:14:01
>>134
GDI+はマネージなしの単独でも使える。
http://www.kumei.ne.jp/c_lang/sdk4/sdk_335.htm
136名前は開発中のものです。:2005/07/21(木) 17:43:32
gdi+ってXP以上しか使えないんじゃなかったっけ?
俺のとこMeなんだけど。
137103:2005/07/21(木) 17:56:48
>>135
的確な情報ありがとうございます。
本当に助かりました。
138デフォルトの名無しさん:2005/07/21(木) 18:00:29
>>136
gdiplus.dll をアプリケーションと供に配布すればOK。

ただし、セキュリティの問題で1度改版されているので、
SDK に入ってる奴とかを安易にコピーしないで最新のを
配布する必要があります。
139デフォルトの名無しさん:2005/07/21(木) 20:28:10
それでもgdiplus.dllはWin95には対応していないと書いてあったような。
140デフォルトの名無しさん:2005/07/21(木) 20:42:12
>>131
64KByteだと記憶していたが、その記載が見当たらんな。
CEditと勘違いしたかな・・・
141デフォルトの名無しさん:2005/07/21(木) 21:44:16
CListCtrlのSetItemTextで、設定できる文字列数の制限ってあります?
142デフォルトの名無しさん:2005/07/21(木) 22:06:49
>>141
LVITEMのヘルプ
143デフォルトの名無しさん:2005/07/22(金) 19:59:02
テキストファイルにStdioFileのWriteStringで書き込むと
上書きされてしまいます。
追加で書き込む方法はありませんか?
144デフォルトの名無しさん:2005/07/22(金) 20:11:58
最後まで移動してから書け。
145デフォルトの名無しさん:2005/07/22(金) 20:32:10
自己解決しました。

>最後まで移動してから書け。

これだと途中に追加できないでしょ。

解決策は、書き込む部分以降の文字列を
\nも考慮してバッファに一時退避して、
あとからWriteStringで一発。
146デフォルトの名無しさん:2005/07/22(金) 20:43:43
途中に入れるのは追加と言わず挿入というんだ。
147143:2005/07/22(金) 21:39:29
確かにわかりにくいですね。
教えてくれたのにえらそうにしてすみませんでした
148デフォルトの名無しさん:2005/07/22(金) 22:13:14
コンパイルしたexeが実行されているpathを得るにはどうしたらいいですか?

後、システムのtmpフォルダのpathを得る方法は、どのようにすればいいでしょうか?
149デフォルトの名無しさん:2005/07/22(金) 22:31:13
GetModuleFileName
GetTempPath
150デフォルトの名無しさん:2005/07/22(金) 22:32:04
>>148
それぞれGetModulePathName,GetTempPathかな
151150:2005/07/22(金) 22:35:01
先越された上に間違っとる。
149のが正しい。
ちゃんと調べてから答えねば・・・
152148:2005/07/22(金) 22:36:46
どうもありがとうございました。
153デフォルトの名無しさん:2005/07/22(金) 23:07:42
作業フォルダが実行ファイルの位置と同じかどうかは
ユーザーの良識に任せられてるから気をつけませう
154デフォルトの名無しさん:2005/07/22(金) 23:12:09
誰も作業フォルダの話はしていないが、作業フォルダにユーザの良識なんか関係ない。
155デフォルトの名無しさん:2005/07/23(土) 00:10:56
.NETやらでプログラマーへの負担が減ってきている中で、MFCみたいなもんを使わないといけないというのが不憫でならない。
156デフォルトの名無しさん:2005/07/23(土) 00:16:59
MFCってヌルポインターの例外処理クラスってあるか?
157デフォルトの名無しさん:2005/07/23(土) 00:25:18
>>155
MFCの一番嫌なのは慣れてないことしようとすると調べる時間が大半を占めるところだと思う。
それといちいちドキュメント見なきゃ引数を渡せないのも痛いと思う。
158デフォルトの名無しさん:2005/07/23(土) 00:29:05
>>157
基本的なことをするのには簡単なのはわかるが、応用が利かない。
ちょっとでも変形すると、言うこと聞かなくなる。
159デフォルトの名無しさん:2005/07/23(土) 01:18:44
>それといちいちドキュメント見なきゃ引数を渡せないのも痛いと思う。
なんだってそうだと思うが。
160デフォルトの名無しさん:2005/07/25(月) 11:10:01
ダイアログのwindowにBMPを貼り付けているんですが(タブ切り替えなどで画像
が切り替わります)、このwindowを最小化、またはMFCとは全く別のwindow、
たとえばIEのブラウザのwindowや全く別のソフトのwindowなどで、
この画面を覆ってから再度元のMFCのwindowを表示させるとBMPが別の画像に
変わってしまいます。

このような再度画面を表示させたときに呼び出されるイベントハンドラがあれば
その中で適切に処理して、問題解消できるのですが、そのイベントがわかりません。
試した中でそれっぽい物はOnInitDialogやSetActiveなんですが、
どちらも反応しませんでした。

現状を説明するのが難しくてわかりにくい質問になってしまうのですが、
ご理解できる方で何かアドバイスがあればよろしくご指導お願します。
161デフォルトの名無しさん:2005/07/25(月) 11:31:04
>>160
画面に描画するのはいつもOnPaint。
でもほかに原因がありそう。
162デフォルトの名無しさん:2005/07/25(月) 12:28:58
いや、「WM_PAINTに対応していない」がすべての原因だと思う。
そして、この後ダイアログのOnPaintを作ったけどどーにもならんという相談が続く。
163デフォルトの名無しさん:2005/07/25(月) 14:23:32
KSPIN_LOCKのエラーが出るのですが、、これはいったい何なのでしょうか?
164デフォルトの名無しさん:2005/07/25(月) 14:53:37
コンパイルエラーでしょう。
165デフォルトの名無しさん:2005/07/25(月) 16:11:52
CFindFile::FindFileでフォルダを列挙しています。
FindFileの引数に入れる検索する文字列の中に、たとえば
「"C:\news.2ch.net\*.*"」というようなかんじでいれていますが、
検索フォルダ名に"."が入っていると
FindFile() = 0 が返ってきてその下層のフォルダの列挙ができません。
もちろんnews.2ch.netフォルダもありますし、その下にはフォルダがまだあります。
"."を手動で消して試してみたらできました。
これの原因、対処方法など知っている方がいましたら教えてください。
166デフォルトの名無しさん:2005/07/25(月) 16:17:00
よもや'\\'の呪縛ではなかろうな。
167デフォルトの名無しさん:2005/07/25(月) 16:36:48
「指定したドライブのセクタをダンプ表示するプログラム」
を作っているのですが、ドライブのアクセス方法がわからなくてのっけからつまずいています。
どなたかご存知の方いましたらご教授お願いします。
環境はXP、VC++6.0、MFCダイアログベースです。
168デフォルトの名無しさん:2005/07/25(月) 16:41:13
物理ドライブ番号 read でぐぐったらみつかりそうだけど
169165:2005/07/25(月) 16:44:10
>166
それも確認済みです。
今もう一度確認しましたが、大丈夫です。
ワイルドカードを"*.*"→"*"に変えてみましたがだめでした。
GetLastErrでは「指定されたパスがみつかりません」と出ました。
もうちょっといろいろやって試してみますが・・・
原因知っている方いませんか~
170デフォルトの名無しさん:2005/07/25(月) 16:51:27
念のためFindFileに渡してる文字列をMessageBoxやTRACEで表示してみ。
171165:2005/07/25(月) 16:54:34
アイター。原因がわかりました。
CFindFile::GetFileTitle()から取得したフォルダ名をつかって
さらにその下のフォルダを取ろうとしていたので、
GetFileTitle() = "news.2ch" となっており、
".net"部分が拡張子とみなされたのか、入っていませんでした。
すみません。ありがとうございました。確認って大切ですね・・・
172デフォルトの名無しさん:2005/07/25(月) 17:21:54
>>167
read CreateFile() page in MSDN.
173デフォルトの名無しさん:2005/07/25(月) 18:49:57
>162
ダイアログだと特定のイベント受け取らないとか、
(メニュー反応しないとか、そういうやつ)
あの意味不明な仕様は一体なんなんでしょうね。
MFCの謎仕様に振り回されて気が狂いそうです。
174デフォルトの名無しさん:2005/07/25(月) 19:16:01
MFCじゃなくても普通ダイアログにメニューつけるなんてしないしなあ。
175デフォルトの名無しさん:2005/07/26(火) 02:59:05
起動時に最大化という設定はどうすればいいんでしょうか?
AppWizardの設定で通常にしていたのですが、途中で起動時に最大化にしたくなりまして・・・
176デフォルトの名無しさん:2005/07/26(火) 10:27:02
SW_MAXIMIZE
177デフォルトの名無しさん:2005/07/26(火) 11:23:33
ウインドウ関係はCWndだと知ってれば済む問題
178こん:2005/07/26(火) 11:52:44
ウィンドウのタイトルやフレームを消す方法って、どうするんですか?
アプリケーションの起動時に消す方法は、PreCreateWindowっやつの中で
CREATESTRUCTをいじくればいいってことはわかったんですが、いったん
表示してしまった後で変更する方法(たとえばメニューから操作して)が
わかりません。
どういう方法をとればいいかご存知の方、教えてくださいませ。

179デフォルトの名無しさん:2005/07/26(火) 12:02:56
180こん:2005/07/26(火) 13:18:04
>>179
そこまでは大体予想がつくんですが、どのメソッドをどういじくるのか
もしご存知なら、もう少し具体的に教えてください。
MFCプログラミングをはじめてまだ1週間なんで、MFC流儀の法則性のような
ものが良くわからないんです。
普段なら「これは好機」と何時間(何日?)もかけて片っ端から
試しまくるところですが、今回は少し急いでいるんです。
どうか、あなたのお時間をお分けください。
181こん:2005/07/26(火) 13:24:07
ちなみに現在のところ、AppWizard(SDI)が作ったドキュメント/ビュー
アーキテクチャで進めています。
182デフォルトの名無しさん:2005/07/26(火) 13:24:23
>>180
タイトルやフレームの無いスタイル(style)に修正(modify)する。
183こん:2005/07/26(火) 14:21:00
やっぱりそいつでしたか。確信を持たせていただいたおかげで
かなりの時間をカットできました。ありがとうございます!
途中でCWnd::SetWindowPosで試してみたり、ビュークラスに付けてみたりして
で時間がかかりましたが、メインフレームクラスに付けて何とかできました。

最後にもう一つ、甘えさせてください!
これを即時反映するには、どうすればよいのでしょうか、教えてください。
InvalidateRect()とかUpdateData()みたいな感じのものがあるのでしょうか?
184デフォルトの名無しさん:2005/07/26(火) 15:05:12
CScrollViewを基本にテキストファイルを表示するプログラムを作ったのですが、
MFCで最初から提供されている印刷機能で印刷するとすっごく縮小されたものが印刷されてしまうのですがどうしたらいいですか?
185デフォルトの名無しさん:2005/07/26(火) 15:19:44
>>183
MSDNを100回嫁
186デフォルトの名無しさん:2005/07/26(火) 15:28:45
>>183
その関数名と動的で検索
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時間
右手の中指と左手の中指間違った。
190デフォルトの名無しさん:2005/07/26(火) 19:02:39
おまえ調査に時間かかりすぎ。才能ないからプログラマ辞めた方が身のためだよ
191デフォルトの名無しさん:2005/07/26(火) 19:08:42
これは向いてないね。
人生設計見直してみたら?
192デフォルトの名無しさん:2005/07/26(火) 19:17:34
>>188
気にするな。俺もウインドの中のウインドの位置をプログラムから
自動調整したり親ウインドをそれにあわせて広げたり縮めたりするだけで子一時間悩む。
193デフォルトの名無しさん:2005/07/26(火) 19:41:43
194デフォルトの名無しさん:2005/07/26(火) 19:56:17
お世話になっております
質問です

リストビューのタイトルバーに、
2行の文字を入れたい場合,、リストビューに
どのように記述すればいいでしょうか?
  
 1  山田  田中
    太郎  一郎

  のように、第2、3カラム目を2行表示にしたいのですが。
195こん:2005/07/26(火) 20:20:53
190-191
AppWizard使ったのは今日が初めてだったんっす。
したら、なんかそっくりなコードがいっぱい作られて大変だったんす。
マジで今日はMFCの仕様に面食らいました。
ちなみに、僕はプログラマではないので、それが唯一の救いです。
196デフォルトの名無しさん:2005/07/26(火) 20:37:06
こんってベリューションにいる奴?
うぜーから消えてくれ
197デフォルトの名無しさん:2005/07/26(火) 20:48:24
>>196
明らかに違うだろw
198デフォルトの名無しさん:2005/07/26(火) 21:44:02
MFCを1週間も勉強して、それならやっぱり>>190-191だな。
199デフォルトの名無しさん:2005/07/26(火) 21:46:48
MFCを1週間も勉強して、>>195ならやっぱり>>190-191だな。
200デフォルトの名無しさん:2005/07/27(水) 06:54:43
右手の中指と左手の中指間違ったってのがすげぇ笑った。
201デフォルトの名無しさん:2005/07/28(木) 13:56:16
スクリーンショット取りたいんだけど、
デスクトップ全体はGetDesktopWindow()を使えばいいのはわかったんだけど
他のアプリケーションの領域だけ取得するにはどうすればいいんでしょうか?
202デフォルトの名無しさん:2005/07/28(木) 14:07:02
>>201
GetDesktopWindow()を、対象アプリのウィンドウハンドルを得るコードに置き換える。
203デフォルトの名無しさん:2005/07/29(金) 00:26:09
CPrintDialogの使い方がイマイチ分かりません。
印刷ダイアログで変更した用紙サイズ/用紙方向を出力に反映させるにはどうやったらいいの?
204デフォルトの名無しさん:2005/07/29(金) 00:29:22
>>203
用紙サイズ/用紙方向の情報を元に
自前で出力
205デフォルトの名無しさん:2005/07/29(金) 01:21:48
MyTrashCanのmfc70.dllを解凍したいんですが、
うちにある解凍ソフトでは解凍できませんでした。
何で解凍できますか?教えて下さい。
206デフォルトの名無しさん:2005/07/29(金) 01:28:25
>>205は自己解決しました。失礼致しました…
207デフォルトの名無しさん:2005/07/29(金) 10:06:03
>204
印刷ダイアログで設定しプロパティを拾うにはどうしたらいいんでしょうか?
208デフォルトの名無しさん:2005/07/29(金) 11:03:47
DEVMODE
209デフォルトの名無しさん:2005/07/29(金) 15:01:30
どのソースからもアクセスできるインスタンスを作るにはどうすればいいの?
210デフォルトの名無しさん:2005/07/29(金) 15:08:34
>>209
MFC なら WinApp の派生クラスのメンバ変数にでもして、
((CMyApp*) AfxGetApp())->hoge とかする程度でいいんじゃない?
211デフォルトの名無しさん:2005/07/29(金) 15:19:45
>>210
thx!
212デフォルトの名無しさん:2005/07/30(土) 18:52:42
プロパティーシートのボタン「OK」「適用」「キャンセル」「ヘルプ」を使えない(無効)ようにしたいのですが、
どうすればよろしいでしょうか?

よろしくお願いします。
213デフォルトの名無しさん:2005/07/30(土) 19:57:04
マルチ氏ね
214デフォルトの名無しさん:2005/07/30(土) 20:10:55
TVゲームみたいにメインループを無限ループさせたいんだけど
別スレッド作ってそっちを無限ループさせてもいい?
215デフォルトの名無しさん:2005/07/30(土) 21:15:41
>>209
グローバルにすればいい
>>212
EnableWindow()
>>214
いいよ
216デフォルトの名無しさん:2005/07/30(土) 21:35:10
>>215
ありがとうございます。

ただ、プロパティシートのボタンの場合、自動的に付加されるものなので、
どうやってウィンドウクラスポインタを取得すればいいのかがわかりません。

その辺、おしえていただけないでしょうか。
217214:2005/07/30(土) 23:01:28
>>215
ありがとう
218デフォルトの名無しさん:2005/07/30(土) 23:12:31
>>216
GetDlgItem(IDOK)
219デフォルトの名無しさん:2005/07/31(日) 17:38:14
実行すると
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回出る
検索したけど同じような症状は見つからなかった
どうしたらいい?
220デフォルトの名無しさん:2005/07/31(日) 18:22:24
>>219
情報少な杉
221デフォルトの名無しさん:2005/07/31(日) 18:35:15
ビットマップを表示するルーチンをソースに加えると
なぜか起動直後のCFrameWnd::Createの時点でエラーが出る
それまでは普通に表示出来てた
何がきっかけでエラーが出るようになったかはわからない
今の所エラーが出たり出なかったりしながら原因になる部分探し中
222デフォルトの名無しさん:2005/07/31(日) 18:48:11
わかったわかった
関数が実行される順番を勘違いしてたから
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 のように,
リソースを使うものだと
辻褄があわなくなって
うまく動かなくなります

[クラスの追加]でウィザードがちゃんと動くように
するにはどうしたらいいのでしょうか?
224デフォルトの名無しさん:2005/08/01(月) 21:40:53
新しくMFC dllのプロジェクトを作って、必要な部分をこぴぺしたら?
225デフォルトの名無しさん:2005/08/01(月) 23:36:20
サブクラス化が(クラスの継承に加えて)何故必要なのかわかりません。

例えばCEdit内で右クリックを無効にしたいとします。
この時、CEditを継承した新クラス作って、右クリックイベントのハンドラを
何もしない関数に置き換え、このクラスでエディットボックス作るだけで問題解決
な気がするのですが、違うのでしょうか?

実際、ダイアログにそのコントロールをSubclassDlgItemせずに貼り付けても
うまく右クリックで沈黙してくれているようでした。

というわけで、クラスの継承に加え、CWnd::SubclassXXXする意義を教えて頂けないでしょうか?
226デフォルトの名無しさん:2005/08/02(火) 00:15:07
>>225
自分でcppソース上で貼り付ける分には関係ない。
リソースエディタで作った各コントロールのオブジェクトは、通常
フレームワーク側で作成されるが、そのオブジェクトをユーザソ
ース側で管理したいときにサブクラスとして指定する。

>>225の例だとリソースエディタでエディットボックスを作成し、そ
のコントロールを自分でCEditを継承して作ったクラスで管理した
い場合、オブジェクトを作成しSubclassDlgItemで関連付ける感じ。
227デフォルトの名無しさん:2005/08/02(火) 00:18:02
MFC使わずにWin32APIだけで組んでみるとよく分かるかも知れんよ。<サブクラス化
228225:2005/08/02(火) 11:25:02
>>226
なるほど、理解できました。「前もって配置したリソースIDのあるコントロールを
メンバ変数に関連付けたい人用」メソッドなんですね。最初っからnewしてCreate
するのが好きな人はそちらをドゾ-というわけですな。
// 最初はnew/Createで試し、次はダイアログで一旦CEditのDDX変数を作って
// その後宣言部をCEditから自作クラスに差し替え、つー(邪道な)テストをしてました。
// そんで「何だ、動くじゃん。Subclass関数不要じゃん!」と・・・orz

>>227
調べてわかりました。イチからCreateWindowするのは面倒なので
ウィンドウプロシージャだけを差し替えよう、ということなんですね。
サブ「クラス」といわゆる"class"は別、つうことらしいですが、考えは継承と似てますな

お二方、ありがとうございました。ひとつ賢くなれました
229デフォルトの名無しさん:2005/08/02(火) 11:41:33
1ダイアログに1リソースファイルにしたいんですが、
V$2005とかでMFCのバージョンがあがってそうならないんでつか?
230デフォルトの名無しさん:2005/08/02(火) 12:23:45
VS6同様、できますよ。
231デフォルトの名無しさん:2005/08/02(火) 12:24:52
>>228
C++から使うとは限らないからC++の継承とは別のアプローチが採られていると思えばいい。
#実際は、逆だけど。
232デフォルトの名無しさん:2005/08/02(火) 13:12:06
>>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年前に失格の烙印を押されたものであることを
心に留めて、距離を置いて開発すべきだ。
233デフォルトの名無しさん:2005/08/02(火) 13:53:58
>>230
1プロジェクトに1リソースじゃなくて、
1プロジェクト内部に複数ダイアログがあって、
1ダイアログに1リソースでつよ?
234230:2005/08/02(火) 14:45:28
はい。
現にやってますが何か。
#まともに質問されているわけでもないし面倒だから解説せんが。
235デフォルトの名無しさん:2005/08/02(火) 14:47:36
解説お願い。
自分もそうしますから。
236デフォルトの名無しさん:2005/08/02(火) 21:53:16
237デフォルトの名無しさん:2005/08/02(火) 22:05:03
俺はあまりこった使い方しないから、次期MFCなどより、各メンバ関数の簡潔な
チュートリアルを充実してくれた方がありがたいんだけどなぁ。
238デフォルトの名無しさん:2005/08/03(水) 13:11:59
EmbeddedWindowsXPにはフレームワークがインストールされていないので
フレームワークを使うアプリケーションを開発しても実行できないと
説明されたのですがフレームワークと言うのは具体的に何を指すのでしょうか?
239デフォルトの名無しさん:2005/08/03(水) 13:33:56
.Netじゃないの?
240デフォルトの名無しさん:2005/08/03(水) 13:36:06
Javaという可能性も。

まあどっちにしろスレ違いの予感
241デフォルトの名無しさん:2005/08/03(水) 19:47:50
ダイアログでテキスト・画像混在の情報を見たいです。(多め)
CScrollViewを配置できればよいのですが、やり方がわかりません。
Google先生にお伺いはたてたのですが、聞き方が悪いのか情報を得られないままです。
差し支えなければ、方法を伝授して頂けないでしょうか?
あるいは、情報(勉強)へのポインタを示して頂けないでしょうか?
242デフォルトの名無しさん:2005/08/03(水) 20:05:44
>>241
CHTMLViewはどう?
243241:2005/08/03(水) 20:22:29
>>242
お返事ありがとうございます。
質問の仕方が悪かったようで申し訳ないです。
「ビューをダイアログ上に配置するのはどうするか?」
ということだったのです。コントロールなんかはCreateすれば
張り付いてくれますが、ビューではどうやったらいいのだろう?ということでして・・・
# テキスト+画像表示用途でCHtmlViewはほぼbestなんですが、
# 「一旦ファイルに書き出す」必要がないということで、CScrollViewを選択したのです
244デフォルトの名無しさん:2005/08/04(木) 09:26:53
わちにんこ~!

CListCtrl間でリスト項目(item)をDrag&Dropしたいのですが、
どうすればいいのでしょうか。
簡潔に教えていただければ、あとはGoogleで調べます。

よろしく。
245デフォルトの名無しさん:2005/08/04(木) 11:19:12
死ね
246244:2005/08/04(木) 13:27:19
わらわら
247デフォルトの名無しさん:2005/08/05(金) 19:47:18
すみません。教えてください。
MFCのダイアログベースのアプリを作りました。
なぜか急にダイアログ起動時にダイアログの一部が緑色になってしまいました。
緑の部分を他のダイアログなどで一度隠すと、元の色に戻ります。
OnInitDialog中でInvalidateRect(NULL)しましたが直りません。
もちろんOnCtlColorはチェックしました。

どう解決したらいいんでしょうか?
248デフォルトの名無しさん:2005/08/05(金) 23:48:30
取り敢えずリブートしてみようか。
249デフォルトの名無しさん:2005/08/06(土) 00:56:51
人生をリブートしたい.。
250247:2005/08/06(土) 11:38:58
>248
アプリのリブートですよね?
毎回起こります。
251デフォルトの名無しさん:2005/08/06(土) 12:42:24
>>250
OSの再起動だと思われ
252デフォルトの名無しさん:2005/08/06(土) 16:30:53
やだなぁ、リブートととは再ブート、つまりブートを再度行なうことじゃないですか。
このブートとは本来ブートストラップを掛けること、つまりシステム立ち上げのことなんですが。

#つーか、アプリのリブートなんて初めて聞いた。
253デフォルトの名無しさん:2005/08/06(土) 18:57:20
他の関数からは見えないけどサブルーチンからだけは見える変数って作れる?

関数{
  変数宣言
  サブルーチン呼び出し


サブルーチン{
  呼び出し元の変数使用


みたいに
254デフォルトの名無しさん:2005/08/06(土) 19:37:13
>>253
それはC/C++の質問なのか?
255デフォルトの名無しさん:2005/08/06(土) 19:46:12
どっちでもいいよ
256デフォルトの名無しさん:2005/08/06(土) 20:06:50
それはMFCの相談なのか?
257デフォルトの名無しさん:2005/08/06(土) 20:12:19
そうだよ
258257:2005/08/06(土) 21:17:43
うそです。ごめんなさい。
もう二度とここへは来ません。
259デフォルトの名無しさん:2005/08/06(土) 21:28:27
言いたいことがあるならはっきり言えよ
7時からずっと待ってるんだぞ
260247:2005/08/06(土) 21:34:24
252
>#つーか、アプリのリブートなんて初めて聞いた。

私も初めて言いました。すみません。勝手に飛躍してました。
どのみち直りません。
あまりこういう例ってないんでしょうか?
以前まで平気でしたので、更新分をチェックして自己解決目指します。
どうもでした。
261デフォルトの名無しさん:2005/08/06(土) 22:43:22
>>253
関数内関数
262デフォルトの名無しさん:2005/08/06(土) 22:50:43
>>261
thx!
検索してみる
263デフォルトの名無しさん:2005/08/06(土) 22:53:26
>>262
C/C++標準ではないから注意な
264デフォルトの名無しさん:2005/08/06(土) 23:43:30
つーか、MFCプログラミングって使いにくいと感じるのはオレだけですか?
265デフォルトの名無しさん:2005/08/07(日) 00:43:34
どう使いにくいかわからんが、Doc/View形式のアプリを作る場合は楽できていい。
DDXなんかも便利。
266デフォルトの名無しさん:2005/08/07(日) 09:18:29
リストビューに関して、質問させてください。

アイテムを選択された時の処理を「WM_LBUTTONCLICK」を使って
やってるのですが、これだと「一回クリックして選択→もう一度クリックして処理」と
なってしまいます。そうではなく、例えばOEなどの「メールを選択されると、
クリックしないでもそのメール内容が表示される」という風にしたいです。
どのようにすれば宜しいでしょうか。

宜しくお願いします。
267デフォルトの名無しさん:2005/08/07(日) 09:38:53
TVN_SELCHANGEDかな?
268266:2005/08/07(日) 10:13:04
>>267
LVN_ITEMCHANGEDで出来そうですね。
「CHANGED」がヒントになりました。ありがとうございます。
269デフォルトの名無しさん:2005/08/07(日) 10:16:46
ごめん。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
>>270-271もヨロ
275デフォルトの名無しさん:2005/08/11(木) 17:50:14
>>274
他人に判るように質問してください。
276デフォルトの名無しさん:2005/08/12(金) 00:27:43
ボタンを押すと、指定したファイルを開いて表示させて、編集する事ができる・・・
って操作をしたいんですけど、どうすれば?
fopenとかだと、画面上に表示させられないので。
277デフォルトの名無しさん:2005/08/12(金) 00:39:25
>>276
なぜ?
278デフォルトの名無しさん:2005/08/12(金) 01:56:33
そもそもfopenは画面表示用の関数じゃないし。
279デフォルトの名無しさん:2005/08/12(金) 04:18:00
>>276
これはまた随分とハイレベルな質問ですな・・・
280デフォルトの名無しさん:2005/08/12(金) 04:41:53
>>276
ボタンを押すと、あらかじめ指定したファイルが、あたかもダブルクリックされたように開かれたら、
ということでよろしいか。
a.txtならメモ帳が、b.htmlならIEが開く、というぐあいに。

もしそうなら、ShellExecute関数だね。
281デフォルトの名無しさん:2005/08/12(金) 09:33:46
あ、そうなの?
てっきりエディタを自作してるのかと
282デフォルトの名無しさん:2005/08/12(金) 10:22:12
Microsoft Forms 2.0のCommandButtonが凹んだように見せれますか?
283デフォルトの名無しさん:2005/08/12(金) 11:27:29
厨な質問しか無い点について。
284デフォルトの名無しさん:2005/08/12(金) 11:37:38
MFCのダイアログリソースのプロパティで、「透過」とありますが、
これはウィンドウスタイルでいう、何にあたるのでしょうか?

おそらく、下記のいづれかだとおもいますが。
WS_CLIPSIBLINGS
WS_CLIPCHILDREN

よろしゅうねがいます。
285デフォルトの名無しさん:2005/08/12(金) 11:42:28
WS_EX_TRANSPARENT
286デフォルトの名無しさん:2005/08/12(金) 12:11:39
透過とCLIPが関連あると思う発想がすげぇ。
287284:2005/08/12(金) 12:54:44
拡張のほうでしたか。
http://yokohama.cool.ne.jp/chokuto/urawaza/prm/extended_window_style.html

助かりました。
またよろしゅう。
288デフォルトの名無しさん:2005/08/13(土) 20:47:36
リストビューに表示されたアイテム上で右クリックすると、ポップアップメニューが
出るようにしたいと思ってます。
ところが、WM_RBUTTONUPで処理するとアイテムが表示されていない場所では
期待の動作をするのですが、アイテムが表示されている部分では動作してくれません。
RBUTTONDOWNを使うと出来るのですが。
原因や対策など、出来ればお願いします。
289デフォルトの名無しさん:2005/08/13(土) 23:48:54
>>288
WM_CONTEXTMENU
290デフォルトの名無しさん:2005/08/14(日) 15:45:49
CDRomで配布するexeファイルを、
そのCDRom以外から起動できないようにしたいのですが、
何かこれを実現するAPIやロジック等ありますでしょうか?
291デフォルトの名無しさん:2005/08/14(日) 15:56:07
>>290
GetModuleFileNameで自exeのパスを取り
ドライブレターを切り出し
GetDriveTypeでCD-ROMドライブか調べる。
292デフォルトの名無しさん:2005/08/14(日) 15:57:27
森永のココアより甘いチェックだな
293デフォルトの名無しさん:2005/08/14(日) 16:07:53
仮想ドライブから動かなかったらnyユーザーとか困るじゃん
294デフォルトの名無しさん:2005/08/14(日) 16:09:56
>>291
ありがとうございます。
そのロジックで実装します。
295デフォルトの名無しさん:2005/08/14(日) 16:17:21
すいません。
質問失礼します。

現在、タスクトレイプログラムを作成中です。
トレイのアイコンを右クリックして、メニューを表示するまでは出来たのですが、
右クリック時に動的に登録したメニュー項目が 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
です。

分かる方、よろしくお願いします。
296デフォルトの名無しさん:2005/08/14(日) 16:27:55
>>295
対応するハンドラが無いと自動的にグレイになった希ガス。
ON_COMMAND_RANGE使えば?
297295:2005/08/14(日) 17:11:29
>>296
レスありがとうございます。

ON_COMMAND_RANGEは知らなかったので、調べて試してみたら一応解決しました。
が、予め静的にIDの範囲を決めるって所が、どうしようかと悩んでいます。
「動的にn個」に対応するやり方って無いのでしょうか?
無いなら、ON_COMMAND_RANGEで行きます。
298デフォルトの名無しさん:2005/08/16(火) 19:41:11
Janeのスレ一覧のように、データをテーブル表示させたいのですが、
どのコントロールを使用すればよいでしょうか?
299デフォルトの名無しさん:2005/08/16(火) 20:13:36
>>298
CListCtrl
300デフォルトの名無しさん:2005/08/16(火) 20:20:30
>>299
ありがとうございます
301デフォルトの名無しさん:2005/08/16(火) 23:03:04
はじめまして

初心者なのに、
CHtmlViewでシンプルなブラウザ作成に挑戦してみました。

普通に動いた(当たり前!?)んですケド
サイトのタイトルが表示されずに悪戦苦闘してます。。

CDocument::SetTitle()
って、使えばOKみたいなんだけど、
現在のサイトタイトルがドコにあるかわかりません。

って事で、教えてもらえんスか?
そいか、ブラウザ作成の講座みたいなサイトないでしょーか?
よろしくです★
302デフォルトの名無しさん:2005/08/17(水) 08:04:57
質問投下します。

CDC::BitBltってデバイス依存しますか?
「画面のプロパティ」→「色の設定」で「32bit」に設定した環境でビルドしたものを
「24bit」に設定した環境で動作させると画面表示が乱れます。
これを解消する方法ありますか?
それともBitBltではしょうがないのでしょうか?
303デフォルトの名無しさん:2005/08/17(水) 08:18:30
使い方がおかしい。

以上








追伸
スレ違い
304デフォルトの名無しさん:2005/08/17(水) 11:38:50
トグルボタンで、
かつ、
トグル動作はマニュアルで行える
というコントロールはありまつか?
305デフォルトの名無しさん:2005/08/17(水) 11:58:00
VC++始めたばかりの超初心者です。

CListCtrl::Scrollの使い方がわかりません。
使用例とか探してるのですが見つからず。。。orz
よろしければ教えてくださいm(_ _)m

現在↓のようになってますが、
error C2227: '->Scroll' : 左側がクラス、構造体、共用体へのポインタではありません。
というエラーが出てしまい、対処できない状態です。。

void CConnLst::OnBnClickedBuTest()
{
IDC_LST_CL->Scroll(10);
}
306デフォルトの名無しさん:2005/08/17(水) 12:18:26
>>305
CSize size(x,y);
this->Scroll(size);
で行けそうな。

そしてやりたいことは多分
EnsureVisibleの方じゃないのか?
307デフォルトの名無しさん:2005/08/17(水) 12:56:23
>>304
CButtonをBS_CHECKBOXで作ったチェックボックスではどう?

>>305
コントロールに変数を割り当ててダイアログクラスのメンバにしてやるか、
GetDlgItem(IDC_LIST_CL)をCListCtrlにキャストしてやらないと呼び出すことはできない。
Scroll()よりもEnsureVisible()の方が便利だと思うのは>306に同意。
つーか、いきなりListCtrlなんかじゃなくて、入門本かなんかを見ながら
一般的なコントロールの使い方を勉強すべきかと。
308305:2005/08/17(水) 13:01:51
>>306
レスありがとうございます。

>CSize size(x,y);
>this->Scroll(size);

でやってみたのですが、
error C2039: 'Scroll' : 'CConnLst' のメンバではありません。
とでてしまいました。

私は今、リストコントロールをスクロールを使わずに
他にボタンを用意して、ボタンを押下するごとに1行ずつスクロール
するという処理を作成しています。

EnsureVisibleについて調べてみます。
309デフォルトの名無しさん:2005/08/17(水) 13:23:54
>>308
おーい、>>307読んどけ。
310306:2005/08/17(水) 13:24:23
>>308
ごめんCConnLstはCLitsCtrlの派生かと思ってた。
>307の言うとおりGetDlgItem(IDC_LIST_CL)をキャストしないと無理だね。
最初書いていたけど別に要らないかなと消しちゃった。

CLitsCtrlは高機能でバージョンによる機能の違いが多いし
MSDNだけじゃ理解しにくい部分が多いから
基本的な事の勉強ならCListBoxとかのほうが良いけどね。
データが多いときにオーナーデータとか使いこなせると便利すぎるけど。
311デフォルトの名無しさん:2005/08/17(水) 13:24:42
thx>>307
チェックボックスのプッシュボタンライクで良さそうで津。
312305: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に着色する方法教えて下さいでつ。
314デフォルトの名無しさん:2005/08/17(水) 14:21:56
>>313は女
315デフォルトの名無しさん:2005/08/17(水) 14:26:44
>>312
おいおい、そのポインタに値がセットされていないじゃないか。
CListCtrl * pmyListCtrl = static_cast<CListCtrl *>(GetDlgItem(IDC_LIST_CL);
316デフォルトの名無しさん:2005/08/17(水) 14:30:37
>>313
CButton::DrawItem()をオーバーライドして自前で描画するか、画像を張ってしまう。

>>314
一々下らんレスすんなや。
317デフォルトの名無しさん:2005/08/17(水) 14:34:13
>>316
CButton::DrawItem()をオーバーライドして自前で描画するか

このオーバーライドってリソースエディタでベタベタ貼った後にも出来るんでしたっけ?
318316:2005/08/17(水) 14:41:25
>>317
コントロールに変数を追加するときに、CButtonの代わりに派生クラスを指定すればいい。
319デフォルトの名無しさん:2005/08/17(水) 14:44:54
カラー程度で派生するのおかしくなぁい?
基本クラスがカラー・プロパティ持っとけば良いじゃん。
320デフォルトの名無しさん:2005/08/17(水) 15:08:12
画像貼ると、キャプションの文字が消えちゃうよー
321デフォルトの名無しさん:2005/08/17(水) 15:13:51
>>319
ここはMFCの仕様を云々するスレではありません。

>>320
画像に書いとけ。
322デフォルトの名無しさん:2005/08/17(水) 16:32:16
>>316
下らんレスに下らんレスすんなや
323302:2005/08/17(水) 22:13:22
MFCじゃなかったかスマソ
324デフォルトの名無しさん:2005/08/18(木) 10:03:39
SDIアプリケーションを起動した時に、モーダルダイアログを出して、
ファイルを新規作成するか、既存のファイルを開くか、を選択させたいのですが、
この処理はどこに書けばよいですか?
325デフォルトの名無しさん:2005/08/18(木) 11:29:18
>>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)が変なとこに移動しちゃう。
何で?
327デフォルトの名無しさん:2005/08/18(木) 11:47:29
>>326
スクリーン座標・クライアント座標
328326:2005/08/18(木) 11:49:32
>>327
GetClientRectにすると、画面から消えちゃうよ?
329デフォルトの名無しさん:2005/08/18(木) 11:56:27
どんな値が取れているかくらいデバッガ等で調べろよ。
330デフォルトの名無しさん:2005/08/18(木) 11:57:46
MDIのプロジェクトでCDialogBarを使用しています。
そのダイアログバーにはコンボボックスをリソースエディタで配置してあります。

このコンボボックスにフォーカスがある時に
エンターキーを押されたことを知りたいのですがどうやったらいいでしょうか?

CMainFrameにOnKeyDown関数を定義してもメッセージが飛んできません。
CDialogBarの派生クラスを無理矢理作ってもOnKeyDownは呼ばれませんでした。
331デフォルトの名無しさん:2005/08/18(木) 13:01:41
コンボボックスの派生で夜路死苦
332デフォルトの名無しさん:2005/08/18(木) 13:09:53
>>331
それでやってみます。ありがとうございました。
333デフォルトの名無しさん:2005/08/18(木) 14:31:07
ダイアログにリストコントロールを貼り付けて、プロパティで表示を
「レポート形式」にして使っています。
で、スクロールは外部から 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:の後になにも出ていないのが気になりますが。。。
長文失礼しました。
以上、宜しくお願いします。
338デフォルトの名無しさん:2005/08/18(木) 15:04:20
>>334
それだけ長文ならアップローダ使えよ。
で、長いから面倒なんで読む気がしない。
寧ろ、プロジェクト一式(中間ファイルは除く)上げた方が検証しやすいのでは?

>>333
自前でスクロールしたい場合にもスクロールバーは必要では?
でないとスクロール可能にならない気がする。
#なるようなら御免。
どうしてもスクロールバーを見せたくないならカスタムドローか他のパーツで隠すとかで誤魔化すとか。
#でもどうせ矢印キーか何かでスクロールできてしまう罠。
そもそもなんでスクロールバーを見せたくないの?
339333:2005/08/18(木) 15:56:12
>>338
スクロール見せたくない理由なんですが、
現在2つのリストコントロール(AとBとします)を表示していて、
Aでスクロールした場合、Bも連動してスクロールするという
処理を作成しているためです。
(Bでは、自分でスクロールできないようにスクロールを隠したいだけなのです。)
説明がへたくそでスミマセン。。。(>_<;)

>どうしてもスクロールバーを見せたくないならカスタムドローか他のパーツで隠すとかで誤魔化すとか。
もしできなければ、↑の方法で、丸めこんぢゃおうと思います★
340デフォルトの名無しさん:2005/08/18(木) 20:57:05
一日中プログラム組んでる奴ってキモオタなんじゃない?
341デフォルトの名無しさん:2005/08/18(木) 22:36:53
きもはしらんがおたのかのうせいはたかい
342デフォルトの名無しさん:2005/08/19(金) 01:08:31
VC++6.0のMFCで生成されるバージョン情報のダイアログのアイコンのように、
ダイアログに画像(できればJPEGファイル)を表示させたいのですが、
どのようにすれば良いのでしょうか。
343デフォルトの名無しさん:2005/08/19(金) 08:22:24
>>342
アイコンならリソースと僅かなコードだけで張り付きますが、
jpeg画像は自前で描画する必要があります。
344デフォルトの名無しさん:2005/08/20(土) 15:41:53
メモリリークっぽいんですが、どう読めば良いんですか?
クラス名とか教えてくれるのかなぁ?

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
345デフォルトの名無しさん:2005/08/20(土) 16:04:16
>>344
40、640、480、1、24
ってデータが入っている構造体っぽいね。
346デフォルトの名無しさん:2005/08/20(土) 16:11:09
サンクス。>>345

HeapAlloc、LocalAlloc、realloc等各種コールしてるみたいなんですが、
特定する方法無いでつか?
347デフォルトの名無しさん:2005/08/20(土) 17:29:14
>>343
そうなんですか。。。
がんばってみます。ありがとうございました。
348デフォルトの名無しさん:2005/08/20(土) 19:49:17
>>344
メモリリークはいいんですが、共同作業をしている人のせいにしないように(笑)。
349デフォルトの名無しさん:2005/08/20(土) 22:25:31
>>344
VSS使ってるなら、ダブルクリックすれば該当個所に飛んだはず
350デフォルトの名無しさん:2005/08/20(土) 22:47:37
>>349
ファイル名と行番号が入ってないと飛ばないと思ったが。
351デフォルトの名無しさん:2005/08/20(土) 23:23:11
>>344
デバッグ版のmallocやfreeがあって(C++のnewでも低レベルではmallocやfreeで実装される)
こいつらをリンクしてないとファイル名や行番号は表示されないよ。
DLLのhとlibとdllモジュールだけもらって動かしてるような場合で、そいつが犯人の場合、
場所が表示されなくて困るだろう。
352デフォルトの名無しさん:2005/08/20(土) 23:26:04
>>344はデータからするとRGB24のVGAの画像かなんかか?
353デフォルトの名無しさん:2005/08/20(土) 23:32:11
>>351
>こいつらをリンクしてないとファイル名や行番号は表示されないよ。

それだけでは駄目で、mallocを_malloc_dbgにマクロ等で置き換え
__FILE__, __LINE__を引数に渡さないと表示されない。
354デフォルトの名無しさん:2005/08/21(日) 12:56:34
すごいエスパーがいるスレ。
355デフォルトの名無しさん:2005/08/22(月) 11:37:17
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnvc60/htm/MemLeaks.asp
ここ読んで適切なマクロ定義して、
クラスファイル中で new がメモリリーク追跡用のマクロで
きちんと定義されてるかどうかを確認するヨロシ。
356デフォルトの名無しさん:2005/08/22(月) 12:59:28
>>355
_CRTDBG_MAP_ALLOC使うと、自クラスメンバにfree関数とかあるとそれも置き換わっちゃうんだよなあ。
CRTと同じ名前使わなきゃいいんだけどな。
357デフォルトの名無しさん:2005/08/22(月) 15:51:26
ドキュメントクラスのSerialize関数に、データを保存・読み取りするよう
コードを追加しました。実際にはCObjectから派生したデータクラスの
Serialize関数を呼ぶようにしてあります。

プログラムを動かすと、データの保存はできるようですが、
「開く」で選択すると「ドキュメントを開くことに失敗しました」という
警告ダイアログが出てそれっきりです。

ヘルプでメッセージを検索してもなにも出てきません。
まず何を調べたらよいでしょうか?
358デフォルトの名無しさん:2005/08/22(月) 16:23:42
>>357
失敗した原因
359デフォルトの名無しさん:2005/08/22(月) 16:46:29
質問です。XP、Visual C++ .NET です。

MFC には WinMain がありませんが、
コマンドラインでの引数はどのようにして取得するのでしょうか?
お願いします。
360359:2005/08/22(月) 16:58:50
・・・自己解決しました。
m_lpCmdLine ってのを見つけました。ありがとうございました。
361デフォルトの名無しさん:2005/08/22(月) 17:34:08
APIもあるし、VC++.NETなら(他は知らん)__argvもある。
362デフォルトの名無しさん:2005/08/22(月) 22:22:27
ID_FILE_NEWなどのコマンドを送りたい場合は、どうすればいいですか?
363デフォルトの名無しさん:2005/08/23(火) 08:03:16
>>362
それはプロセスからイベントを発生させたいということですか。

俺も知りたい。
364デフォルトの名無しさん:2005/08/23(火) 11:05:51
MFCの各クラスから、ハンドルを取り出すことはできるのでしょうか?
MFCは使いにくいので、ハンドルを使いAPIで操作したいのですが。
365デフォルトの名無しさん:2005/08/23(火) 11:13:03
>>364
取り出せる。
366デフォルトの名無しさん:2005/08/23(火) 13:45:52
同じコードなのにCPrintDialogで表示されるダイアログが2つのプロジェクトで異なるのですが、
どこの設定を変えればいいのでしょうか?

プロジェクトA = プリンタ選択(コンボボックス)/印刷範囲/部数
プロジェクトB = プリンタ選択(アイコン選択)/印刷範囲/部数/タブがいっぱい
367デフォルトの名無しさん:2005/08/23(火) 18:13:16
いろいろと調べたのですが、分からないので質問させていただきます。

CWnd* m_wndCtrl = m_wndCtrl.GetWindow(GW_CHILD);

このようにして得られる子ウィンドウに対して、WM_RBUTTONDOWNをマップする事は可能でしょうか?
WM_RBUTTONDOWNイベントが得られれば、WindowProcの実装でも構わないです。
アドバイスよろしくお願いします。
368デフォルトの名無しさん:2005/08/23(火) 18:17:53
Attach/Detach
369デフォルトの名無しさん:2005/08/23(火) 18:55:12
>>368
ありがとうございました。
370367: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));
371デフォルトの名無しさん:2005/08/23(火) 20:33:23
Attachの使い方自体はそれでいい。
m_wndCtrl.GetWindow(GW_CHILD);
     ~~~~
とか
GetWindow(hwndCtrl
           ~~~~
が気になるんだが、コントロールの子ウィンドウを取りたいのか?
372デフォルトの名無しさん:2005/08/23(火) 20:56:10
DLLにコンパイル済みの(コモンでない)コントロールを使用していて、
右クリックがコントロールの外に伝わらない状態なのです。

作者にメールを送ったら、
現状だとWM_RBUTTONDOWNが発生しないので、

HWND hwndCtrl = ::GetWindow(hwndCtrl,GW_CHILD);
このhwndCtrl を元に、WM_RBUTTONDOWN を処理してほしい、という回答でした。

そのHWNDをMFCでどう処理するのか分からなかったので、質問した次第です。
Attachの使い方が正しいとするとDLL側の問題かもしれないので、もう一度作者に問い合わせてみます。
373デフォルトの名無しさん:2005/08/23(火) 22:59:44
サブクラス化してしまえ。
374デフォルトの名無しさん:2005/08/24(水) 03:33:15
MFC7で作ったDLLの関数からMFC6で作ったDLLの関数を呼び出そうとしています。
大体は上手く動作していますが、特定の処理で無限ループしたり、戻り値が怪しかったり
と挙動がおかしいです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/vclrfatlcompatibilityissues.asp
上記MSDNのサイトを見るとバイナリの互換性は無いとのことですが、
やはりMFC7でリビルドしないとダメでしょうか?
ちなみにMFC7で作ったEXEから直接呼び出すと何故かDLL経由では必ず無限ループしていた処理が正常終了しました。。。

他社の製品の為、ソースコードが手元に無いので出来れば現状のまま動かしたいです。
DLLの初期化などで回避する方法は無いのでしょうか?

詳しい方がいらしたら、教えていただけると幸いです。
以上、よろしくお願いします。
375362:2005/08/24(水) 07:37:02
自己解決しました。
もっとスマートな方法もあるかもしれませんが、とりあえず下の方法でコマンドの発生に成功しました。

AfxGetMainWnd()->SendMessage(WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), NULL);
376367:2005/08/24(水) 13:10:41
>>373
ありがとうございます。

Attachではなく、
CWind::SubclassWindowで無事成功しました。
377デフォルトの名無しさん:2005/08/24(水) 16:18:49
MS Forms 2.0 CommandButtonのボタンがクリックされると、ダイアログが閉じます。
他人が作成したプログラムの修正中なのですが、
ダイアログを閉じる処理みたいなのは見当たらないのですが...
378377:2005/08/24(水) 16:50:51
ついでに、CDialogを閉じる方法の一覧教えて下さい。
EndDialogは知ってます。
379377:2005/08/24(水) 17:01:49
this->ShowWindow(SW_HIDE);

ってのがあった。これかな?
380デフォルトの名無しさん:2005/08/24(水) 17:19:25
void CDialog::OnOK()
{
    (略)
    EndDialog(IDOK);
}

に飛んで来たけど、これって何ぃ?
381デフォルトの名無しさん:2005/08/24(水) 17:23:57
IDOKを戻り値としてモーダルダイアログを終了させる
382デフォルトの名無しさん:2005/08/24(水) 18:28:01
OnCancel()
OnOK()
383デフォルトの名無しさん:2005/08/24(水) 20:12:50
質問です。
ドロップダウンリストのコンボボックスがあるダイアログを作って、それを何かしらの関数から

CMyDialog dlg;
//コンボボックスの選択項目を設定
if( dlg.DoModal() == IDOK ){
//色々
}

みたいに、AddStringとか使って動的に項目を変更したいんですけど、エラーになります。
どうすればダイアログを出す前に初期化できますか?
384デフォルトの名無しさん:2005/08/24(水) 20:43:02
誰かVC++が自動生成するドキュメント/ビューアーキテクチャについて語ってくれい。

「Documentクラスがデータを管理/Viewクラスが画面表示」という役割説明をよく目にするんだが、
データやりとりのラクさを考えると、
AppクラスかViewクラスにデータ保持してもいいんじゃまいか?
Docでデータ管理する利点・欠点を教えれ。

そろそろスパゲティプログラムを脱したい俺にコメントプリズorz
385デフォルトの名無しさん:2005/08/24(水) 20:45:54
>>383
>//コンボボックスの選択項目を設定

この時点ではまだダイアログは作成されてない。
そのダイアログに載ってるコンボボックスも当然作成されてないからエラーになる。
OnInitDialogで初期化汁。
386383:2005/08/24(水) 21:00:46
>>385
DDXとかで生成した変数の場合なら、ダイアログを見せる前に初期化しても大丈夫のようですが・・・
そういうしようなんですね・・・

つーことは、あらかじめダイアログクラスにデータを保持させるポインタメンバを宣言しといて、
そこに初期化データを持ったオブジェクトのポインタ放り込んでDoModal実行・・・って感じですか?
387デフォルトの名無しさん:2005/08/24(水) 21:13:25
>>386
DDXでもやってることは同じで、OnInitDialogでメンバ変数からコントロールにデータを設定
っていう事をフレームワークが自動でやってる。
388デフォルトの名無しさん:2005/08/25(木) 14:57:34
DDXって苦肉の策であって、newして値設定を素直に出来る方が絶対コーディングしやすい!
389デフォルトの名無しさん:2005/08/25(木) 15:06:38
  _, ._
( ゚ Д゚) …
390デフォルトの名無しさん:2005/08/25(木) 16:32:02
>>384
好きにしろ。
391384:2005/08/25(木) 19:23:23
ぶっちゃけMDI形式の画像エディタを作るとき、画像データはどこで保持するのがいい?

って話なんだがね…
現在グローバル変数使いまくりで実装orz
時間かかるがあれこれ試してみる。
392デフォルトの名無しさん:2005/08/25(木) 19:51:31
>>391
>ぶっちゃけMDI形式の画像エディタを作るとき、画像データはどこで保持するのがいい?

ドキュメントクラス
393デフォルトの名無しさん:2005/08/25(木) 23:36:09
>>391
プログラマに向いてない。
あきらめろ。
394デフォルトの名無しさん:2005/08/25(木) 23:48:36
>>393
391はなんとかしようと努力しているみたいだからまだ見込みがあると思うぞ。
395デフォルトの名無しさん:2005/08/26(金) 00:00:46
努力してスパゲッティを作って周りに迷惑かけるヤツのどこに見込みがあるんだ。
396デフォルトの名無しさん:2005/08/26(金) 01:03:07
スパゲッティと認識してるだけマシじゃないか
397デフォルトの名無しさん:2005/08/26(金) 11:05:52
>>384
MVC モデルなんか知ったことか、というスタンスであれば
View に持たせればいい。
MFC のフレームワークがそれを許すかどうかは別だけど。
398デフォルトの名無しさん:2005/08/26(金) 14:25:08
CWinThreadから派生したスレッドの処理は、
InitInstance()の中でやるんでしょうか?
Run()というやつでやるんでしょうか?

それとも、messageを使わなければCWinThreadから
派生するのはムダですか?
399デフォルトの名無しさん:2005/08/26(金) 14:36:37
>>398
InitInstance

>それとも、messageを使わなければCWinThreadから派生するのはムダですか?

ケースバイケース
400デフォルトの名無しさん:2005/08/26(金) 14:41:29
>>399
ありがとうございます。InitInstance()の中でやります。
あと、AfxBeginThread()で渡した引数って、どこに格納されるんですか?
401デフォルトの名無しさん:2005/08/26(金) 14:53:33
>>400
スレッドプロシージャの引数
402400:2005/08/26(金) 15:21:57
CREATE_SUSPENDEDでスレッドをサスペンド状態にし、
クラスのpublicメンバに値をわたしてやってからResumeThread();することでできました。
403384:2005/08/26(金) 18:30:59
( ´△`)アァー いろんな意見ありが㌧

プログラム書くの好きだけど、人のプログラムに比べると明らかに中身が汚い…
自分でもプログラマに向いてないかなと思ったりorz

しかしいつかスマートなコードを書けるようガンガル
404デフォルトの名無しさん:2005/08/26(金) 21:37:07
質問です。
XPビジュアルスタイルを適用してCEditを使用しています。
そこで日本語を入力して再変換を行うと文字が化けます。

・ATOCKでは発生しません。
・コンテキストメニューから再変換を選択しても発生しません。

_UNICODEを宣言しないで回避する方法ってありますか?
405デフォルトの名無しさん:2005/08/26(金) 23:16:43
せっかくだが、それはCEditじゃなく、エディットコントロールの話ではないのか?
APIスレへどうぞ
406デフォルトの名無しさん:2005/08/27(土) 00:28:45
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で初期ウインドウを作って、最終的にはエクスプローラーを作りたいのですが、
左のペインにツリービューをつくるにはどういう流れになるのですか?
ツリーが自分のパソコンのフォルダを読み込むにはどうすればいいのですか?
409デフォルトの名無しさん:2005/08/29(月) 22:08:02
system("explorer");
410デフォルトの名無しさん:2005/08/29(月) 22:11:04
>>407
このスレでこんなことを言うのはアレだが、
今さらMFCを勉強する必要はないんじゃないか?
まぁ、仕事とかでどうしてもMFCを使わないといけないのなら仕方ないが。
411デフォルトの名無しさん:2005/08/29(月) 23:04:40
>>410
いやぁ仕事で使うからってことで今勉強中なんですが、
どうにも難しくて。。。
今までは自分でプログラミングしていたのを、途中まで完成されたものに
手を加えるのって、結構スキルが必要ですね。
412デフォルトの名無しさん:2005/08/29(月) 23:14:18
>>411
チュートリアル全部目を通して、クラス図とクラス一覧とユーティリティ関数類にも
ざっと目を通さないと、既にきっちり用意されている定番の処理を自前で再実装したり、
Command routing とか View の Update とか使わずにメンドクサイことしたりとか
うっとおしいことになるので気を付けた方がいいですよ。
413デフォルトの名無しさん:2005/08/29(月) 23:36:14
>>411
俺はソースを読んで理解した・・・
414デフォルトの名無しさん:2005/08/30(火) 01:53:54
MFCとかやたらと細部隠蔽がすきなんだが
でも結局細部を理解するはめになるんだよな。
415デフォルトの名無しさん:2005/08/30(火) 19:28:20
CTime*型のメンバm_pTimeをSerializeで処理したいのですが、
どういう風に書けばよいですか?

CTimeはCObjectを継承していないので、以下のような書き方はダメですよね?
if (ar.IsStoring())
  ar << m_pTime;
else
  ar >> m_pTime;
416デフォルトの名無しさん:2005/08/30(火) 19:59:19
すいません、メンバを調べたら
CTime::Serialize64が用意されていました。
417デフォルトの名無しさん:2005/08/30(火) 23:13:16
たとえば最初のAppWizardでSDIのエクスプーラ風で作って、左のツリービューに
class CLeftView : public CTreeViewというのができると思うのですが、
この左のペインに実際項目を挿入するにはどういう流れになりますか?

初心者ですいません。。。
418デフォルトの名無しさん:2005/08/30(火) 23:43:12
>>417
GetTreeCtrl()でツリーコントロール取って、後は好きなように。
419デフォルトの名無しさん:2005/08/30(火) 23:58:14
>>418
ありがとうございます。

そのGetTreeCtrlというのはどこに書けばいいのですか?
420デフォルトの名無しさん:2005/08/31(水) 00:37:55
>>419
項目を挿入したいところで
421デフォルトの名無しさん:2005/08/31(水) 13:37:03
>>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をアクティブにはできません。
どうすればいいのですか?


425デフォルトの名無しさん:2005/09/01(木) 00:08:03
ちょいと質問、というか情報収集。
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;
とかいうオチでは無いよな
427デフォルトの名無しさん:2005/09/01(木) 00:28:13
pはちゃんとNULLが終端に来てるはずだよね。
428デフォルトの名無しさん:2005/09/01(木) 00:30:51
よく見ると
char * p = new char(10);
だった、とか
429425: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();している。
430デフォルトの名無しさん:2005/09/01(木) 00:52:31
どっかで領域壊してるんじゃね?
431デフォルトの名無しさん:2005/09/01(木) 02:28:13
だれかがCStringTのソースを書き換えちゃったんじゃね?
432デフォルトの名無しさん:2005/09/01(木) 10:59:15
実はVCじゃないとか
433425: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のメモリ確保がバッティングしているような悪寒が。
#「デバッグビルドでは再現しない」、「デバッガで起動すると再現しない」他には何かあるかなぁ……
434デフォルトの名無しさん:2005/09/01(木) 11:56:18
>>433
buf.GetLength()はいくつを返してるんだ?
435デフォルトの名無しさん:2005/09/01(木) 12:00:15
>>433
上のコードなら、buf.GetLength() が小さい、とか?

CString 関係で初心者にありがちなバグ
・SetAt() で 0 入れる等して長さを変えようとする
・GetBuffer せずにバッファを書き換える
・GetBuffer した後、ReleaseBuffer せずに文字列操作
436デフォルトの名無しさん:2005/09/01(木) 12:01:56
CStringもnewも全然悪くない悪寒
437デフォルトの名無しさん:2005/09/01(木) 12:10:37
%*s[^0-9]%*d"もおかしくないか?
438425:2005/09/01(木) 12:23:05
>>434
未調査。午後から調べる。ダイアログのタイトルだから少なからず入っているはず。
#つーか、タイトル文字列長は変わらないことになっているらしい。

>>435
SetAt()もGetBuffer()も書き換えもないよ。
昨日>429で書いた通り、GetBuffer()/ReleaseBuffer()にすれば再現しなくなるらしい。

>>436
漏れもそうは思うのだけど。

>>437
タイプミス。%*s%[^0-9]%*dだ。
#最後の%*d要らないじゃん(苦笑)。
439デフォルトの名無しさん:2005/09/01(木) 12:27:28
> %*s%[^0-9]%*d
入力がどんな文字列かわからんけど、最初の%*sに全部食われないか?
sscanfの戻り値は?
440デフォルトの名無しさん:2005/09/01(木) 12:30:07
>>438
>>buf.GetLength()はいくつを返してるんだ?
>ダイアログのタイトルだから少なからず入っているはず。

GetWindowTextで取ってるfooの方じゃないの?
441デフォルトの名無しさん:2005/09/01(木) 12:33:37
>>433
>char * str = new char[buf.GetLength()];

char * str = new char[foo.GetLength()];
の間違い?
442デフォルトの名無しさん:2005/09/01(木) 12:36:47
急速に425が信じられなくなってまいりました
443デフォルトの名無しさん:2005/09/01(木) 12:41:17
sscanf(foo, "%*s%[^0-9]%*d", str);
これでstrには何が入るの?
444425:2005/09/01(木) 12:42:46
>>440-441
あ、>441で正解。
bufをfooに書き換えてたの忘れてたらしい。

>>439
最初の空白で切れるよ。だからこそ、Format()で組み立てるときには空白が入っている。

漏れを信用しないのは判るし、だとすればこっちのコードの粗を探したくなるのも当然だけど……
まぁいいか、午後は再現条件探しするから。
445デフォルトの名無しさん:2005/09/01(木) 12:45:56
%[^0-9]って何ですか?
446デフォルトの名無しさん:2005/09/01(木) 12:50:01
char * str = new char[foo.GetLength()+1];
じゃだめなの?
447デフォルトの名無しさん:2005/09/01(木) 12:52:20
448デフォルトの名無しさん:2005/09/01(木) 22:34:13
sscanfにいきなりCStringを渡してもよいの?
CStringに十分なバッファを確保してからなら大丈夫そうだが
449デフォルトの名無しさん:2005/09/01(木) 22:46:02
まず>>446だな
450425:2005/09/01(木) 23:12:05
結局、当初からの問題の方はGetBuffer()/ReleaseBuffer()で問題が再現しない模様。
現状、原因不明というのが頭痛の種。

ダイアログタイトルの方は、タイトルの形式が違うときに誤動作した模様。
#%*sで期待した空白が2バイト文字だったとさw
なので、sscanf()の戻り値で逃げるか2バイト空白に対応するかと言う落ちに。

>>446>>449
タイトルの一部を切り抜くのが目的だから、タイトル(foo)から文字列を一個読み飛ばしたりすうちを読み飛ばすから
それだけの長さは必要ないというロジック。従って、+1する必要はない。

>>448
CStringはconst char *へのcastオペレータを持ってますから。
つーか、なんか勘違いしていない?

結論。一部ヒントになった以外は情報収集にはなりませんでしたとさ。
協力感謝。
451デフォルトの名無しさん:2005/09/01(木) 23:18:53
>>450
const char *じゃなくてLPCTSTR(つまりconst TCHAR *)じゃないか?
452デフォルトの名無しさん:2005/09/01(木) 23:20:17
sscanfの戻り値チェックもしていなくて、かつ失敗していたってことは、

char* p = new char[...];
CString s = p; // GPF!
delete [] p;

ということ?原因不明も何も・・・
453デフォルトの名無しさん:2005/09/02(金) 00:15:15
スゲー結論書いてるな
原因解明協力してた人カワイソス
454デフォルトの名無しさん:2005/09/02(金) 00:48:52
>>453
だなw コンパイルオプションも書いてねーしどでもいいがな
455デフォルトの名無しさん:2005/09/02(金) 01:36:20
こういうクサクサした雰囲気は次の質問でスカッと解消しよーぜ。
456デフォルトの名無しさん:2005/09/02(金) 02:00:16
彼女がいるわけでもないのですが、いざというときのために財布にコンdo^ムを
忍ばせておいたほうがいいのでしょうか?友達に聞いたら財布によっては跡がつくから
気をつけるべしと言われました。
環境はXP SP2、VC++6.0、DirectX SDK9.0 Summer2004です。
457デフォルトの名無しさん:2005/09/02(金) 09:37:41
>>456
スレ違い。
Win32APIスレへ。
458デフォルトの名無しさん:2005/09/02(金) 12:09:58
MFCの質問と言うかVCの質問と言うか。
VC++7.1でnewで得たポインタの0チェックをしているソースがあるのですが、
ダイアログを生成している元の関数ではbad_allocを受け取るように書かれています。
MFCでは(あるいはVCでは)ただnewと書いた場合にはどっちになるのでしょう。
0を返すならbad_allocに落ちてこないと思うのですが・・・
459デフォルトの名無しさん:2005/09/02(金) 12:41:59
>>458
MFCならどっちも間違い。
CMemoryException*が投げられる。
460デフォルトの名無しさん:2005/09/02(金) 12:46:34
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   |
     |        |( ・∀・)つ ミ |
     |        |/ ⊃  ノ |   | CMemoryException*
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |
                        |
461458:2005/09/02(金) 13:00:09
>>459
レスTHX。
なるほど、どっちみち0チェックは無駄ですね。
どっちの例外も受け取るように作るのが正解かな・・
462デフォルトの名無しさん:2005/09/03(土) 06:27:57
モードレスダイアログについてです。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の挿入は
不要かなと思ったのですが、なぜこの場合はあえて挿入する必要があるのでしょう?
それとも、挿入するとたまたまうまくいってるように見えてるだけなのでしょうか?
463デフォルトの名無しさん:2005/09/03(土) 08:30:11
>>462
createしたものをdestroyせずに再度createはできないってことでは。
464デフォルトの名無しさん:2005/09/03(土) 08:47:11
あとバツで閉じてもOnCancelが呼ばれる。
465デフォルトの名無しさん:2005/09/03(土) 09:42:56
>>462
MSDNのCDialogの頁にOnCancelでDestroyWindowを呼べと書いてある
466デフォルトの名無しさん:2005/09/03(土) 10:55:18
私はいつも

[親側]

メンバ変数
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();
}
467デフォルトの名無しさん:2005/09/03(土) 10:56:35
途中で書いちゃいました。

void CChildDlg::PostNcDestroy()
{
// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
  
delete this;

CDialog::PostNcDestroy();
}

とやってます。
エラーになることはないが、画面を起動するたびに領域が取られて、
アプリ終了時に一気に開放されるので、あまりいいやり方とは思っていないけど。
468デフォルトの名無しさん:2005/09/03(土) 11:34:24
delete this; した後にメンバを呼ぶな。
469デフォルトの名無しさん:2005/09/04(日) 21:07:01
チュートリアルって何ですか?どこにあるんですか?
470デフォルトの名無しさん:2005/09/05(月) 00:26:14
エスパーさん大忙し
471デフォルトの名無しさん:2005/09/05(月) 16:06:08
>チュートリアルって何ですか?
tutorial で英和辞書(英々でもいいが)を引くヨロシ。

>どこにあるんですか?
ヘルプを「チュートリアル」で検索したりするとザクザク出てくるね。
472462:2005/09/05(月) 20:38:21
みなさまコメントありがとうございます。お返事遅れてすみません。
>>463
その通りだと思うのですが、MSDNにはデフォルトのOnCloseが
destroyするとあったので、むしろ自分では何もすべきではないのかな、と。。。
>>464
こちらにDestroyWindow()を記述する(CDialog::OnCancel()は削除)と
うまくいってるようです。確かにOnCloseから呼ばれておりました。
>>465
そちらを見たのですが、「親のいない独立ウィンドウの場合」という風に
読めませんか?まあ上記の通り、そうすると確かにうまくいくのですが。
>>466
ご丁寧にありがとうございます。web上のサンプル含め、new/deleteされる
方が多いみたいですね。私もこちらの方法だとうまくいくのですけれども。。。
473デフォルトの名無しさん:2005/09/05(月) 21:23:24
>>472
まあ意図する動作は実装できたのけど、MFCの設計の意図がよくわからんという
ことですね。DestroyWindow()をオーバーライドしてブレークポイント張って監視しても
OnClose()からはDestroyWindow()は呼ばれないことがわかります。MFCではよくある
ことですがMSDNの説明は怪しいですね。多分CDialog以外のCWndではそうだという
ことなのでしょう。結局はCWnd::Default()のようですし。
474462=472:2005/09/06(火) 01:24:32
またまたお返事ありがとうございました。
>>473
> DestroyWindow()をオーバーライドしてブレークポイント張って監視
なるほど!まさにやりたかった操作です。OnCloseにブレークポイント
挿入してステップインでなんとかしようと思ったが、大量のアセンブラコード
に阻まれてあきらめてしまったのでした。確かにDestroyWindow()は呼ばれてないですね。
> MFCではよくある ことですがMSDNの説明は怪しいですね。
そうなんですか・・・肝に命じておきます。

お返事頂いた皆様ありがとうございました。ひとつ賢くなれました

475デフォルトの名無しさん:2005/09/06(火) 13:37:46
ウィンドウスタイルについて質問です

CFrameWndで作ったウィンドウのPreCreateWindowで
 cs.style = WS_VISIBLE | WS_POPUP;
としていますが、くぼんだ境界線がでちゃいます。
 cs.dwExStyle &= ~WS_EX_WINDOWEDGE;
としても消えてくれない…
消すことってできますか?
ちょうどVBのフォームでBorderStyleを0にしたようなウィンドウにしたいのです

環境はW2k、VC++6.0、MFCダイアログベースです、
よろしくおねがいします

476デフォルトの名無しさん:2005/09/06(火) 16:11:25
>>472
親ウィンドウがある時は親ウィンドウでDestroyWindowするかもしれない。
つーか、親に通知して親がDestroyWindowするようにした方が親の管理が簡単。
477デフォルトの名無しさん:2005/09/06(火) 23:23:20
MFCで作成したダイアログクラス内で

CRect rect;
GetWindowRect(&rect);

と実行するとうまくいくのですが、
共通処理をするために、グローバル関数として別ファイルで同様に書くと
静的でないメンバ関数の呼び出しが正しくありません。
といわれます。

環境はWinXP、VC++2003、MDIアプリです。
識者の方、よろしくお願いします。
478477:2005/09/06(火) 23:24:29
すいません、追加です。
APIと区別するためにCWndで名前解決は行ってあります。
479デフォルトの名無しさん:2005/09/06(火) 23:26:45
>>478
C/C++を勉強しなおせ。
480デフォルトの名無しさん:2005/09/07(水) 00:23:44
>>477
そのGetWindowRectはCWndのメンバなんだから、
よそから呼ぶはウィンドウを指定しないとだめだろ。
481デフォルトの名無しさん:2005/09/07(水) 00:46:40
MFCでモードレスダイアログのオブジェクトを構築した際、
ウィンドウを表示させる前に、表示させる予定の場所の座標をひろうことってどうやってやるのでしょうか?

表示させている状態であればGetWindowRectでひろえるのですが・・・
482デフォルトの名無しさん:2005/09/07(水) 07:47:03
>>481
ウィンドウを表示させる前ってCreateする前?
483482:2005/09/07(水) 09:34:06
そうです。Createする前です。
もちろん、オブジェクトは生成してあります。
欲しい情報は幅と高さだけなので、それだけひろえれば十分です。
484デフォルトの名無しさん:2005/09/07(水) 09:34:37
すみません、481でした。
485デフォルトの名無しさん:2005/09/07(水) 10:29:38
>>481
「予定の場所の座標」は表示させようとするときにWindows側が決めるんじゃないだろうか。
「幅と高さ」はリソースから計算できそうだけど。
486デフォルトの名無しさん:2005/09/07(水) 10:34:44
>>483
Createする前じゃ、GetWindowRectで拾うのは無理だよ。
すべてのCWndのメンバ関数はCreateされた後じゃないと無効だからね。

Createしても
ShowWindowするまでは表示されないから、
その間でGetWindowRectでとる、というのではダメなわけ?
487481:2005/09/07(水) 11:08:00
皆さん、ありがとうございます。
>>485さんの通り、リソースから計算できれば解決なのですが・・・

やりたいことは、メニューバーからモードレスダイアログを表示、非表示の選択をできるようにしたいのです。
フォトショとかにありそうなやつの簡易版とでもいいますか。

そのまま何もしないと毎回位置がリセットされるので何とかしたいのです。
iniファイルを利用し、位置は記憶できますが、再表示の際その位置に表示するのにSetWindowPos関数を使っていますが、
この引数に幅と高さが必要なので、何かいい方法はないか、と思ってます。
488デフォルトの名無しさん:2005/09/07(水) 11:25:40
>>487
>表示するのにSetWindowPos関数を使っていますが、 この引数に幅と高さが必要なので

SWP_NOSIZE指定すりゃいいじゃん
489481:2005/09/07(水) 11:50:34
>>488
そうでした・・・完璧に忘れてましたorz

その部分は解決したのですが、今度はSetWindowPos自体が落ちます。
たぶん原因は>>486さんのいうようにCreateする前にセットしてることだと思うのですが・・・

かといってCreateした後だと一瞬(0, 0)に表示されてしまうので、これは避けたいです。
490デフォルトの名無しさん:2005/09/07(水) 12:11:44
>>489
非表示でCreateして、位置設定した後表示すりゃいいじゃない。
491デフォルトの名無しさん:2005/09/07(水) 13:27:18
>>489
OnInitDialogの中で位置を設定すれば、表示される前にその位置になるよ。
疑い深い人やOnInitDialogの中でやりたくない人は>>490
492481:2005/09/07(水) 16:41:22
皆様、ありがとうございます。

>>490さんの方法で成功しました。

続けて質問なのですが、この方法で作成すると、表示するたびにメンバ変数がクリアされてしまいます。
インスタンスの生成、消滅はビュークラスのコンストラクタ、デストラクタで行っているので、消去されいていることはないと思うのですが・・・
よろしくおねがいします。
493デフォルトの名無しさん:2005/09/07(水) 16:47:06
エスパーさん出番ですよ
494デフォルトの名無しさん:2005/09/07(水) 17:15:21
ソース出せ。
495デフォルトの名無しさん:2005/09/07(水) 17:59:13
質問です。XP、.NET です。
基本的なことではずかしいのですが・・・。
MFC を利用しています。

プロジェクト名を Hoge とします。
グローバル変数はどこでどのように定義すればいいでしょう?
というのも、CHogeApp が定義されている Hoge.h で定義したとしても、
Hoge.h を include している全てのヘッダファイルで定義されてしまい、リンクエラーになります。
extern 宣言をすると、逆に本宣言(?)がなくなり、リンク時に未解決エラーとなります。

Hoge.h のメンバとして用意し、
CHoge* pApp = (CHoge *)AfcGetApp();
pApp->~
として呼び出すのが普通なのでしょうか。
もしくは、何か他に方法があるでしょうか。

よろしくお願いします。
496デフォルトの名無しさん:2005/09/07(水) 18:05:33
>>495
グローバル変数は関数と同じように.hファイルでexternをつけて宣言し、どこかのcppファイルで定義をする必要がある。
497デフォルトの名無しさん:2005/09/07(水) 18:06:31
>>495
お前のプロジェクト内にある「theApp」というグローバル変数がどうなってるか見てみろ
498495:2005/09/07(水) 18:10:25
>>496-497
そっか・・・theApp を例にするのは全く思いつきませんでした。
理解できました、ありがとうございます。
499デフォルトの名無しさん:2005/09/08(木) 01:15:26
CPropertyPageクラスから派生したプロパティ画面で、
そこでの変更をドキュメントクラスに保存したいのですが、どうやってドキュメントクラスを呼び出せばいいのでしょうか。
GetDocumentはもちろん使えないですよね。
なお、制作は.NET2003+MDI環境です。
とても初歩的な何かを忘れてるとは思うのですが思い出せません。
500デフォルトの名無しさん:2005/09/08(木) 10:57:32
プロパティから戻った後にViewから保存すれば?
501デフォルトの名無しさん:2005/09/08(木) 19:03:11
画面閉じる前に、閉じるかどうか聞くコードはどうなりますか?
502デフォルトの名無しさん:2005/09/08(木) 19:38:48
>>501
// for example.
void cSomeDialog::OnCancel()
{
if (AfxMessageBox("閉じるかどうか", MB_ICONQUESTION | MB_YESNO) == IDYES) {
CDialog::OnCancel();
}
}
503247:2005/09/08(木) 19:46:26
一月前の話題ですが、
画面が緑になる問題は、どうやら.netのバグではないか。という結論になりました。
アドバイスどおり、リブートしてからリビルドしたら直りました。
忘れた頃にまた緑になることもありますが、そのときはまたリブート、リビルドで対応してます。
またタイマで起動の1秒後にInvalidateRect(NULL)して、悪くても1秒後には解決するようにしてます。

近況報告でした!
504デフォルトの名無しさん:2005/09/10(土) 15:32:10
自分の思い通りにならないと、すぐ開発環境のせいにするのはいかがなものかと
505デフォルトの名無しさん:2005/09/10(土) 15:43:08
どう考えたってお前のコードのバグだろうが。
起動時の処理のタイミングで症状が出たり出なかったりするだけ。
506503:2005/09/10(土) 19:52:06
そうですね。
安易な責任転嫁は良くないですね。
じゃよければ理由を教えていただけるとありがたい。
507名無しさん@そうだ選挙に行こう:2005/09/10(土) 20:09:04
ソースも晒さずにこういう事言うからなぁ。
どんなダイアログかも分からんし。
508デフォルトの名無しさん:2005/09/10(土) 20:12:11
>>506
.NETのバグだと思うよ
509名無しさん@そうだ選挙に行こう:2005/09/11(日) 10:31:44
>507
まあそうだと思うんですが、どこが悪いのかわからないので、
晒せないんですよ。OnInitDialogだけでもかなり長いし。
でも、「どう考えても」っていうぐらいだから多少の心当たりはあるのかなと思ったので。

>508
やっぱりそうですかね。

まあ1秒後には消せるので、これでいいかなとも思います。
いろいろありがとうございます。
510名無しさん@そうだ選挙に行こう:2005/09/11(日) 10:38:30
バグなら公式サイトに情報が乗るはず
511名無しさん@そうだ選挙に行こう:2005/09/11(日) 11:56:56
とりあえず>>509はプログラマに向いてない。
512名無しさん@そうだ選挙に行こう:2005/09/11(日) 12:38:03
>>509
タイマ使って逃げるのは糞プログラム
513名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:52:41
MFCで動画再生はできますか?
514名無しさん@そうだ選挙に行こう:2005/09/11(日) 18:28:26
MFCにそういう機能はないが動画再生は可能
515名無しさん@そうだ選挙に行こう:2005/09/11(日) 18:46:56
MFCにvideo for windows あるいは DirectShow を組み込むということですよね?
516名無しさん@そうだ選挙に行こう:2005/09/11(日) 19:02:08
一例をあげると
HTMLViewにしてプラグイン入れればほとんどの静止画、動画が再生可能
517名無しさん@そうだ選挙に行こう:2005/09/11(日) 19:36:20
ありがとうございます。
プラグイン探しましたけど、いいのがなくて…
フリーのやつですかね?
518名無しさん@そうだ選挙に行こう:2005/09/11(日) 23:28:09
すいません。初心者です。。。
MFCを使っていくにあたって、こうセオリーみたいなのってありますか?
プログラムによってはソースを書く場所がちがくても
同じ実行だったりするじゃないですか。
ようするに今わからないのは、どの動き方だったらどこに入れるって
いうのがいまいちわからないんです。
なので、もしそういうセオリーみたいなのをわかるサイトもしくは本でも
あれば、教えていただきたいです。

519デフォルトの名無しさん:2005/09/12(月) 02:19:58
「ちがくて」とか言う奴に用はないな
520デフォルトの名無しさん:2005/09/12(月) 02:52:52
セオリーなんて無い。心で感じるんだよ。茶化しているように
見えるかもしれないが、MFCを使いこなせるようになって来たら
確かに心で感じるものだと実感出来るようになるだろう。
521デフォルトの名無しさん:2005/09/12(月) 06:14:23
ソースの書き方は人それぞれでいいよ。
でもMFCは基本的な作りが決まってるから
誰が作ってもだいたい同じような感じになってしまう。
でたらめに作るとビルドできないし動かないからね。
522518:2005/09/12(月) 19:35:23
ありがとうございました。心で感じられるようにがんばってみますです。
523518:2005/09/12(月) 20:42:05
>>522
どちらさま?

>>520,521
そうですね。自分なりに努力してみます。
524518:2005/09/12(月) 21:16:30
>>523
お前こそ誰だ

>>520,521
うるせー、さっさと答えだけ教えろ
525518:2005/09/12(月) 22:00:09
>>522,523,524
成りすましはやめて下さい。
>>520,521
ありがとうございました。
526デフォルトの名無しさん:2005/09/12(月) 22:19:25
>>518が誰でもいいから消えてくれ。
527デフォルトの名無しさん:2005/09/13(火) 11:52:39
初心者はMFCを使わないほうが良い。
528デフォルトの名無しさん:2005/09/13(火) 12:00:19
誰でも最初は初心者なんだが
529デフォルトの名無しさん:2005/09/13(火) 13:42:31
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はこの関数終了後に破棄されるので,もとのペンに戻す必要がないように見えます
531デフォルトの名無しさん:2005/09/13(火) 13:51:59
>>530
リソースリークしてもいいのなら戻さなくていいよ。

ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_9v3o.asp
>An application should always replace a new object with the original, default object after it has finished drawing with the new object.
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をポップしたときに、ディセイブルにするにはどうしたら良いでつか?
533デフォルトの名無しさん:2005/09/13(火) 14:50:48
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_graphic_objects.asp
現在のグラフィック オブジェクトを使い終わったら、
古いグラフィック オブジェクトをデバイス コンテキストに選択し直して、状態を復元します。
フレームに割り当てられたグラフィック オブジェクトは、スコープからはずれたときに自動的に削除されます。
534デフォルトの名無しさん:2005/09/13(火) 15:12:58
>>532
WM_INITMENUPOPUP
535デフォルトの名無しさん:2005/09/13(火) 15:15:37
サンクス>>534



menuのアイテムをディセイブルにする側のコードはどうなるんでしょう?
536デフォルトの名無しさん:2005/09/13(火) 15:18:40
>>535
マニュアル持ってないのか?
CMenuのメンバ関数調べろ
537デフォルトの名無しさん:2005/09/13(火) 15:52:07
メンバ関数見ましたが無さげでつが...
538デフォルトの名無しさん:2005/09/13(火) 16:03:51
ヒント: disableで見つからなければenableで探す
539デフォルトの名無しさん:2005/09/13(火) 16:18:41
サンクス>>538

menu.EnableMenuItem(ID_MENU_~, MF_GRAYED | MF_BYCOMMAND);
でできますた。
540デフォルトの名無しさん:2005/09/16(金) 17:40:42
GetTextExtent や GetOutputTextExtent で文字列が描画されるサイズを
求めたいんですが、複数行の文字列のサイズを求める方法が分かりません。
各行のサイズを自前で求めるしかなかですか?
541デフォルトの名無しさん:2005/09/16(金) 17:44:17
そもそも行という単位は君が決めることだ。WindowsやMFCの知ったことではない。
542カラス:2005/09/16(金) 18:04:49
みんな・恋のノマノマエイってしってる?>-<
543デフォルトの名無しさん:2005/09/16(金) 18:38:59
540
CRect rect( 0, 0 ,1024 ,0 );
pDC->DrawText("test\nテスト\nテスト", rect, DT_CALCRECT|DT_WORDBREAK );
rect.bottomに高さが
544デフォルトの名無しさん:2005/09/16(金) 18:52:32
サイズを求めるためにGetTextExtent や GetOutputTextExtentするんだろ
それでサイズがわからんとはどういうこと?
545デフォルトの名無しさん:2005/09/16(金) 18:57:53
>>543
どうもありがとうございます。
DT_CALCRECTに見覚えがあるとに、すっかり忘れとりました。ボケてきたかな。

>>544
改行を含む文字列の場合、1行に繋がった横長のサイズが求まるとです。
546デフォルトの名無しさん:2005/09/16(金) 19:55:17
ツールボタンにポイントしたときに出る肌色のウィンドウを
ダイアログベースのMFCで出したいのですが、どのようにすれば
そのウィンドウを出せますか?

このウィンドウがどういう名前なのかがわからないので、
検索キーワードだけでもかまわないので教えていただけるとうれしいです。
547デフォルトの名無しさん:2005/09/16(金) 20:01:51
CToolTipCtrl
548546:2005/09/16(金) 20:12:45
>>547
これ!これです!!
ありがとうございます。これで幸せになれました。
549カラス:2005/09/16(金) 20:25:00
何の話?
550デフォルトの名無しさん:2005/09/16(金) 21:18:01
>ツールボタンにポイントしたときに出る肌色のウィンドウ

ノストラダムスの大予言ですか?
551デフォルトの名無しさん:2005/09/16(金) 21:38:59
>>550
お前は何を言いたいんだ? ポツダム宣言か?
552デフォルトの名無しさん:2005/09/16(金) 22:36:50
>>551
エスパーじゃないと答えられないような表現と言いたいんだろう
553デフォルトの名無しさん:2005/09/17(土) 00:13:48
エスパーでなくても答えられそうな気がするが。
554デフォルトの名無しさん:2005/09/18(日) 20:39:29
皆さんに質問です。

モードレスダイアログで変更された項目をドキュメントクラスに反映させたい場合、どうしますか?
モーダルならば戻ってきたときにできますが・・・
555デフォルトの名無しさん:2005/09/18(日) 21:21:50
ダイアログはドキュメントクラスに関係あったっけ?
556デフォルトの名無しさん:2005/09/18(日) 21:40:21
>>554
変更があったらダイアログからメッセージ投げれば?
557デフォルトの名無しさん:2005/09/18(日) 21:52:25
ドキュメントにメッセージを送る方法が分からないんだろうな。
558デフォルトの名無しさん:2005/09/18(日) 22:01:22
モーダルならできると言ってるから
自分で更新するだけのような気がするけど
559デフォルトの名無しさん:2005/09/19(月) 02:04:05
プロパティページの中に
プロパティページを入れることは可能ですか?
またそれが不可能な場合、
プロパティページの中にタブコントロールを入れることになると
思うんですが、
タブコントロールの中に子コントロールを入れるのって
リソースエディッタ等で無理やり入れるのと
ソースコードに配置情報を埋め込むのと
どっちが主流なんですか?
560デフォルトの名無しさん:2005/09/19(月) 02:07:44
CPropertyPage
CPropertyPageDialog
CPropertyPageEx
CPropertySheet
CPropertySheetEx
561559:2005/09/19(月) 02:20:25
CPropertyPageにCPropertyPageを入れるには
CPropertyPageとCPropertySheetから派生したクラスを作るで良いですか?
562デフォルトの名無しさん:2005/09/19(月) 12:07:39
ダイアログで、プッシュボタン風のラジオボタンを作成したとき、
ボタンの外観を普通のボタンと同じようにできますか?
XP標準のLunaを適用させた場合、ボタンの周りにオレンジ色?の枠がついてしまいます。
うまくボタンと同じようにする方法はないですか?
563デフォルトの名無しさん:2005/09/19(月) 13:23:29
>>561
これ?
ttp://www.codeguru.com/Cpp/controls/propertysheet/article.php/c595/

>>562
ダイアログ全体なら.manifestファイル消せばいい
そのボタンだけってなら SetWindowTheme()
564デフォルトの名無しさん:2005/09/19(月) 13:45:22
>>563
キャーまさにそれです。
ありがとうございました!
565デフォルトの名無しさん:2005/09/19(月) 14:56:38
>>563
すいません、そうではなくて、
同じLunaでもボタン風ラジオボタンとプッシュボタンは外観が若干違うんですよ。
どうやら何もしてなくてもマウスオーバー時みたいなボタンになってしまいます。
566デフォルトの名無しさん:2005/09/19(月) 15:03:23
デバッガの「値」欄の表示を編集するには、どうすれば良いですか?

ここに主なメンバを表示させて、ぱっと見でデバッグできるようにしたいのですが。
567デフォルトの名無しさん:2005/09/19(月) 15:14:15
568デフォルトの名無しさん:2005/09/19(月) 15:16:40
>>567
ありがとうございます。
569デフォルトの名無しさん:2005/09/19(月) 18:05:01
CPU使用率を取得する関数ってあるのですか?
ググっても全然見つからないので・・・
570デフォルトの名無しさん:2005/09/19(月) 18:21:49
MFCには関係なさそうな話だな
571デフォルトの名無しさん:2005/09/20(火) 01:05:51
複数のモードレスダイアログがある状態で、あるダイアログから他のダイアログの変数を参照する方法はないでしょうか?
ダイアログはビュークラスで宣言しているのでビューにあるダイアログのポインタ経由は
ビューを完全に宣言していないのでエラーですよね?
572デフォルトの名無しさん:2005/09/20(火) 01:17:03
ビューを完全に宣言していないので
って何?
573571:2005/09/20(火) 01:25:10
一言で言えば、メンバ変数が内部で親クラスを呼び出すことはできないってことらしいです。
実際にコンパイルはエラーになります。
574デフォルトの名無しさん:2005/09/20(火) 01:46:19
エスパー召還
575デフォルトの名無しさん:2005/09/20(火) 06:00:51
親→ダイアログ、ダイアログ→親
まずこれができないと話にならんぞ

それができたら当然これもできるだろ
ダイアログ→親→ダイアログ
576デフォルトの名無しさん:2005/09/20(火) 07:25:43
グロバール変数使えば?
577デフォルトの名無しさん:2005/09/20(火) 12:35:53
ビットマップボタンを四角以外の形というのは可能ですか?
578デフォルトの名無しさん:2005/09/20(火) 13:00:24
>>577
可能です
579577:2005/09/20(火) 13:20:00
ありがとうございます。
要は丸いボタンの絵のところだけ反応するようにしたいのですが、やはり座標を使うのでしょうか?
580デフォルトの名無しさん:2005/09/20(火) 13:39:08
>>577
それは見た目だけかえるのではないのですね?
581577:2005/09/20(火) 13:56:47
その通りです
見た目だけではなく、実際の動作も丸いビットマップのボタンのところだけでしたいのです。しかも楕円などいろんな形を作りたいのです。

ありがとうございます
582デフォルトの名無しさん:2005/09/20(火) 14:19:01
リージョン
583デフォルトの名無しさん:2005/09/20(火) 18:37:09
>569

Pdh~調べてください。
パフォーマンスモニタのカウンタから取得できます。
584デフォルトの名無しさん:2005/09/20(火) 18:42:22
MFCと関係ない
585デフォルトの名無しさん:2005/09/20(火) 19:00:13
MFCってなに?
586デフォルトの名無しさん:2005/09/20(火) 20:14:42
Memorial Fantastic Chinco
587デフォルトの名無しさん:2005/09/20(火) 20:19:37
>>585
お前のせいでバカが来ちゃったじゃないか
588デフォルトの名無しさん:2005/09/21(水) 00:41:52
>>587
待て
Chincoは面白いだろ!
589デフォルトの名無しさん:2005/09/21(水) 00:54:12
>>585
お前のせいでバカがまた来たじゃないか
590デフォルトの名無しさん:2005/09/21(水) 10:14:51
UTF-8とSHIFT_JISの文字コード変換をしたいのですが、
MicroSoftが用意しているAPIってありますか?
591デフォルトの名無しさん:2005/09/21(水) 10:18:37
Shift_JIS→UnicodeならMultiByteToWideChar()だな。
592デフォルトの名無しさん:2005/09/21(水) 10:21:08
MultiByteToWideChar()のCP_UTF8フラグでUTF-8もできる。
593デフォルトの名無しさん:2005/09/21(水) 10:30:16
>>591 >>592
ありがとうございました
594デフォルトの名無しさん:2005/09/21(水) 13:05:21
良かったな。
二度と来るな
595デフォルトの名無しさん:2005/09/21(水) 13:14:11
>MicroSoftが用意しているAPIってありますか?

MFCに関係ない質問ってわかってそうなもんだが
わざとか?
596デフォルトの名無しさん:2005/09/21(水) 17:02:20
質問です。
CFileFindでファイルの列挙を行っています。
ショートカットも列挙したいのですが、

if( !IsDots() && IsDirectory()){
  // ファイルを列挙するための処理
}

とすると弾かれてしまいます。どうすればいいのでしょう。
597596:2005/09/21(水) 17:09:28
あ、すみません、勘違いしました。
出直してきます・・・
598デフォルトの名無しさん:2005/09/21(水) 17:17:17
ガンガレ
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
ナー相談うけるんでしょ?
601デフォルトの名無しさん:2005/09/21(水) 22:26:27
>>587
で、MFCって何?
602デフォルトの名無しさん:2005/09/21(水) 23:39:05
Manco Fucking Chinco
603デフォルトの名無しさん:2005/09/22(木) 00:06:43
>>585 
お前のせいでバカがもっと来たじゃないか 
604デフォルトの名無しさん:2005/09/22(木) 01:06:32
>>603
で、ほんとのところMFCってなに?
605デフォルトの名無しさん:2005/09/22(木) 01:46:50
Mentucky Fried Chicken
606デフォルトの名無しさん:2005/09/22(木) 02:14:59
そろそろ飽きられてるのだが
607デフォルトの名無しさん:2005/09/22(木) 02:44:47
まじでMFCってなんなんだ。
608デフォルトの名無しさん:2005/09/22(木) 10:52:16
WinXP
VC6++

SetLayeredWindowAttributesを使うには、
何をどういう手順でインストールすれば
使えるようになりますか?
VC6++だけでは使えないということはわかったのですが、
PlatformSDKやToolkitなどを落とすみたいで、
ただmicrosoftが全部英語でわかりません。
どなたかご教授願います。。。

609デフォルトの名無しさん:2005/09/22(木) 10:55:51
ググることもできないような奴には何を教えても無駄。
610デフォルトの名無しさん:2005/09/22(木) 11:14:50
MFCと関係ないし
611デフォルトの名無しさん:2005/09/22(木) 11:49:14
CWnd::SetLayeredWindowAttributes つーのはあるんだけど、
まあ質問内容からすればそーいう話では無さそうだな。
612デフォルトの名無しさん:2005/09/22(木) 18:13:28
>>607
マイクロソフト化粧品学級
613デフォルトの名無しさん:2005/09/22(木) 18:47:55
>>612 化粧品って大ざっぱだなと思ったが、日本語ではカタカナでしか書けないな。

MFC = 微軟基礎倉庫
http://www.google.co.jp/search?q=%E5%BE%AE%E8%BD%AF%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%BA%93
614デフォルトの名無しさん:2005/09/22(木) 23:23:16
なんなんだMFCって。。こんなに隠してるところを見ると怪しいな。。
615デフォルトの名無しさん:2005/09/22(木) 23:55:07
>>1の1行目に思いっきり書いてあるし
616612:2005/09/23(金) 00:49:33
>>614
ハァ? 英語だと分からないかと思って和訳してやったのに
隠すどころかオープンだろうが
617デフォルトの名無しさん:2005/09/23(金) 02:50:38
コンボボックスに登録するものってたいてい、自分の都合で決めた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;
 }
}
とか。なんかすっごい無駄なことをしている気がする今日この頃。
皆さんならどんな風にしますか?
618デフォルトの名無しさん:2005/09/23(金) 02:57:55
IDは0からの連番にすればループまわさねーでいいじゃん
619デフォルトの名無しさん:2005/09/23(金) 03:00:37
すみません。
「自分の都合で決めたID」というのは表現が激マズでした。
正しくは何らかの事情に引っ張られて飛び飛びの値をとらざるを得ない。
と読み替えてください。
620デフォルトの名無しさん:2005/09/23(金) 03:09:04
激マズっつーか・・・まあいいや
んじゃAddStringの戻りでIndexが返ってくるから、それと自前のIDでmapでもつくりゃええがな
621デフォルトの名無しさん:2005/09/23(金) 03:14:56
まるほど。。マップというのもありありですね。
普通はどんな風にやるのがいいのかなぁ。。
人気のある方法を教えてください。
622デフォルトの名無しさん:2005/09/23(金) 03:20:36
人気投票でも設置しとけ。
623デフォルトの名無しさん:2005/09/23(金) 05:54:07
固定じゃなくて可変にしたいから
起動時にファイルから読んで
終了時にファイルへ保存
コンボボックスなら行単位
リストビューならCSV
624デフォルトの名無しさん:2005/09/24(土) 00:04:17
MFCで円を「中心座標+半径」で描画する方法(関数)ってありますか?
ArcにしろEllipseにしろ外接する四角形で指定するのはめんどくさいです。
ググってもなかなかいいものがないもので。。。
よろしくお願いします。
625デフォルトの名無しさん:2005/09/24(土) 00:13:22
んな程度なら自分で軽くラップすりゃええがな
626デフォルトの名無しさん:2005/09/24(土) 03:33:43
>>624
君はプログラムを組むのをやめたほうがええ
627デフォルトの名無しさん:2005/09/26(月) 09:24:31
idip.exeのソースくれ。もしくは同じ動作をするソースを書いてくれ。全ては俺のために。。
628デフォルトの名無しさん:2005/09/26(月) 10:36:21
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   |   コンナモンイラネ
     |        | ∧_∧ |   |
     |        |( ´∀`)つ ミ |
     |        |/ ⊃  ノ |   |
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |   ∧_∧
                       (>>627
                       ⊂ ⊂ )
                     ⊂ ⊂ ,ノo
629デフォルトの名無しさん:2005/09/28(水) 10:45:40
VC++6/MFCを使ってますが、InputBoxみたいなものはありまつか?
630デフォルトの名無しさん:2005/09/28(水) 11:11:11
>>629
InputBoxとは?
631デフォルトの名無しさん:2005/09/28(水) 11:17:38
VB/InputBoxで、

エディット1つとOk・キャンセルのボタン2つのダイアログ、
でつ。
632デフォルトの名無しさん:2005/09/28(水) 11:23:04
>>631
おーなるほど。

>>629
ダイアログエディタで自分で作ってください。
633デフォルトの名無しさん:2005/09/28(水) 12:29:48
MFCとは?
634デフォルトの名無しさん:2005/09/28(水) 12:44:20
また 不潔極まりない チンカス野郎か
635デフォルトの名無しさん:2005/09/28(水) 17:13:24
まだ何も言ってないのに・・・
636デフォルトの名無しさん:2005/09/28(水) 17:18:33
>>634が答えているんだよ。
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 です。
638637:2005/09/28(水) 21:31:44
一文字抜けてた orz

1行目:非 MFC DLL として作成したDLL、CStringなど(ダイアログは用いない)を
→「非 MFC DLL として作成したDLLを、CStringなど(ダイアログは用いない)を」
639デフォルトの名無しさん:2005/09/28(水) 21:59:38
>>637
グローバルオブジェクトのコンストラクタとかでCString::LoadString()してないか?
640613:2005/09/28(水) 22:08:34
>639
 いえ、普通の関数の中です。
641デフォルトの名無しさん:2005/09/28(水) 22:13:33
>>637
ウィザードでMFC拡張DLLとレギュラーDLLを作って比べた方がよかよ。
MFC拡張DLLにしかない処理のあるけんね。
AfxInitExtensionModule
AfxTermExtensionModule
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
とか。
642641:2005/09/28(水) 22:14:59
>>640(613)は俺じゃないが、>>613は俺だぞw
643640=637:2005/09/28(水) 22:24:12
orz
オートコンプリートなんてキライ……
644637:2005/09/28(水) 22:34:11
>641
ご指摘ありがとうございます。
 実はMFC拡張DLLとの比較は行っていまして、実証としてミニマムなコードを
作成して試したのですが、こちらでも同じ箇所で止まりました。
#resource.hをincludeして、export関数1個作成、中でCString::LoadString()した。
 元のDLLは空のDLLプロジェクトから作っていったものなので、そもそもMFCを
用いることに無理があるのかもしれません。
 指摘の点について調べてわからなければ、プロジェクト新規作成からやり直す
ことにします。
645デフォルトの名無しさん:2005/09/28(水) 23:35:29
もうMFC使いたくないよ・・・
646デフォルトの名無しさん:2005/09/29(木) 00:05:53
慣れると結構楽でいいぞ。
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 を返します。
返されるポインタは、一時的なポインタです。後で使用するために保存しておくことはできません。
649647:2005/09/29(木) 01:50:27
>>648
コピペミスでIDが重複していてアサートに引っかかっていただけでした。
スレ汚し失礼しました。
650デフォルトの名無しさん:2005/09/30(金) 10:00:47
突然すんません、
ディレクトリ操作関数が含まれている
MFCのクラスってございますか?
651デフォルトの名無しさん:2005/09/30(金) 10:13:57
無い
652デフォルトの名無しさん:2005/09/30(金) 10:28:35
CFileなど使うことによって間接的にディレクトリを操作することになるクラスなら
653デフォルトの名無しさん:2005/09/30(金) 11:41:55
OnDrawでクライアント領域に描画したものを印刷しようとすると
非常に小さくなってしまうのですが、
どうすれば大きくできるのでしょうか?
654デフォルトの名無しさん:2005/09/30(金) 11:54:07
COleVariantに入っている値は、構造体に変換してとかじゃないと直接参照できないんでしょうか?
適当に探すとCStringに変換して使う例はよく見かけるんですが、実数の集計がしたいのです。
できて当たり前なはずなので無いはずはないと思ってるんですがわからない。
すいません。教えて下さい。
655デフォルトの名無しさん:2005/09/30(金) 12:04:54
>>654
COleVariantはVARIANTから継承しているからVARIANTのメンバをそのまま読み書きすればいい。
COleVariant::ChangeTypeで型を変換してから触るほうが楽だと思う。
656デフォルトの名無しさん:2005/09/30(金) 15:44:46
エクスプローラみたいなものを作っています。
CImageListにSHGetFileInfo()でシステムのイメージリストのハンドルを取ってきて
CListCtrlに関連付けて表示しています。

このCListCtrlにオリジナルのアイコンも表示したいのですが、
CListCtrlにアイコンを表示させるにはCImageListしか見当たりません。
関連付けてあるのはシステムのだし、そこに追加もできないし。
なにかいい方法はありませんか。

というか、IEのアイコンがSHGetFileInfo()で取得できません。
ぐぐったらOfficeXPがはいっているととれないことがある、
ということまではわかったのですが・・・
なのでHTMLファイルをオリジナルのアイコンで表示しようかと思っているのです。
657デフォルトの名無しさん:2005/09/30(金) 16:45:34
>>655
ありがとうございます。
で、ChangeTypeを見てたんですが、型を変換するとVARIANTで参照できるようになる?
有効な(?)型を変更しているのかなとか思ったので、ChangeTypeをするメリットがよく
わからないのです。

というか、多分書いてもらった事が全然理解できてないかもですが。
658デフォルトの名無しさん:2005/09/30(金) 17:49:17
明らかに実数が入っているなら

COleVariant::dblVal

を参照すればいいんだけど。
659デフォルトの名無しさん:2005/09/30(金) 21:16:00
>>653
マッピングモードを変えてください
660デフォルトの名無しさん:2005/09/30(金) 22:47:00
>>657
658のいうとおりメンバCOleVariant::dblValからはdouble型で読み取れるんだけど、
当然COleVariantの値がdouble型で格納されている場合にしか使えない。
VARIANT(COleVariant)には値が整数型やdecimal型で格納されていたり、doubleへのポインタが格納されていたりするかもしれない。
そこでそういった内部の型の違いを吸収して指定された型に変換させるのがChangeType。
元が何型であっても、これでdoubleに変換しておけばその後は絶対にメンバdblValからdouble値を読み取れるようになる。
661デフォルトの名無しさん:2005/10/01(土) 00:38:59
受け取ったMessageによって、マウスカーソルを砂時計にしたり(操作不可)、戻したりする機能を作りたいんだけど、
メッセージ受け取って呼び出される関数内で砂時計にする処理を入れても、関数を抜けるとカーソルが戻ってしまう…
解除処理なんて入れてないのに…
関数抜けちゃダメならと、スレッド立てて、その中で砂時計にしようとしたら、thisポインタ渡しても一瞬たりとも砂時計にならず…
どなたかヘルプミー!orz
662デフォルトの名無しさん:2005/10/01(土) 00:50:04
まず砂時計のカーソルを用意しろ それからだ
663デフォルトの名無しさん:2005/10/01(土) 00:58:09
具体的には、どうやって砂時計にしてるの。
664デフォルトの名無しさん:2005/10/01(土) 01:27:32
>>663
AfxGetApp()->DoWaitCursor(1);
を使ってみたり、
SetCursor(LoadCursor(NULL,IDC_WAIT));
を使ってみたり、
CWaitCursorクラスを使ってみたりしました。
665デフォルトの名無しさん:2005/10/01(土) 01:27:34
関数抜けるとカーソルが戻っちゃう・・・ なんていってんだから
CWaitCursor でも使ってんだろ 

MSDN読め
スコープ外れたらデストラクタが以前のカーソルに戻すって書いてあんだろ
666デフォルトの名無しさん:2005/10/01(土) 01:32:54
>>665
CWaitCursorはスレッドで使えるかな?
と思ったけど、へたれな俺じゃ無理らしい。
667デフォルトの名無しさん:2005/10/01(土) 01:38:55
どんなプログラムかわからんけどCCmdTarget::BeginWaitCursorとかどうよ 
668デフォルトの名無しさん:2005/10/01(土) 02:07:21
OnSetCursorでカーソルを設定する。

はい次の質問↓
669デフォルトの名無しさん:2005/10/01(土) 03:10:11
>>658 >>660
ありがとうございました。
やっと理解できてきた気がします。
聞いた事覚えつつ、とりあえずもっかいCOleVariantあたりのヘルプを読み直してみます。
670デフォルトの名無しさん:2005/10/01(土) 16:25:55
*.DLLから*.libを作成することは可能でしょうか?
可能なとき、どのようにして作成すれば良いのでしょうか?
671デフォルトの名無しさん:2005/10/01(土) 17:45:58
VC+6.0を使っています。
基本クラスにHtmlViewを選択して、プロジェクトを作成しました。
リソースに組み込んだHTMLファイルを、起動と同時に表示させたいと思っています。
OnInitialUpdate内に記述するのかと思っているのですが、
どうすればよいのでしょうか。
672デフォルトの名無しさん:2005/10/01(土) 17:54:53
>>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が呼ばれるには何が不足してるのでしょうか?
教えてください。


674デフォルトの名無しさん:2005/10/02(日) 08:35:07
>>673
コード見ないとよく判らないけど、IDはIDC_STATIC以外のUniqな値にしている?
初めからCMyStaticに割り当てなかったのは何故か知らないけど、全部書き直した?
675673:2005/10/02(日) 08:53:17
おはようございます。

IDはID_MYSTATICとしています。あとプルダウンからCMyStaticが出てこなかったのでCStaticで作成しておいて
それをCMyStaticにしました。
676デフォルトの名無しさん:2005/10/02(日) 08:56:14
すみません。問題がわかりました。
class CMyStatic : CStaticという宣言のためpublic派生でないと判断され、
その結果DDX_Control(pDX, IDC_MYSTATIC, m_MyStatic);のところで
CMyStatic * _64がCStatic&に変換できないとかなんとか怒られていて
つい、DDX_Controlをコメントアウトにしていたのを忘れてました。
コイツを復活させてpublic派生にしたらちゃんときました。
ゴメンナサイ
677デフォルトの名無しさん:2005/10/02(日) 08:58:45
>>675
そこはプルダウンに出ないから自分で書けばいいはず。
そうすればそのクラスのあるファイルを指定できる。
678デフォルトの名無しさん:2005/10/02(日) 09:14:32
>>675
おはよう。
CMyStaticの作り方に問題がある。
一覧に出すためのおまじないが欠けている。
679653:2005/10/03(月) 09:39:11
>>659
解決しました。ありがとうございます。
http://forums.belution.com/ja/vc/000/186/73.shtml

680デフォルトの名無しさん:2005/10/04(火) 18:29:03
文字列をURLエンコードするメソッドとそのクラスを教えてください
681デフォルトの名無しさん:2005/10/04(火) 19:00:51
MFCにはありません。
682デフォルトの名無しさん:2005/10/04(火) 19:02:19
>>680
自分で作りなさい。

最近は探せない上に、自分で作れない子が多いね。
683680:2005/10/04(火) 20:28:22
なさそうなんで作った。解決。
684デフォルトの名無しさん:2005/10/04(火) 20:50:38
Win32APIにあるやん
685デフォルトの名無しさん:2005/10/04(火) 21:58:05
>>684
Win32APIはスレ違い。
686デフォルトの名無しさん:2005/10/05(水) 19:16:39
MFCでCOMポートって操作できるのでしょうか?

MSDNだとポートじゃない方のCOMしかでてこないのですが・・・
687デフォルトの名無しさん:2005/10/05(水) 19:18:39
しーファイルでオープンしたれや だめか? やまかんや
688デフォルトの名無しさん:2005/10/05(水) 19:21:01
CreateFileだべ
689デフォルトの名無しさん:2005/10/05(水) 19:26:05
ここはMFCスレだべ
690デフォルトの名無しさん:2005/10/05(水) 22:24:53
COMでRXCHARが到着してからReadFileすると、その間にもう一バイト到着してしまい
ReadFileで2バイト読み込んじゃうんだけど、そのことにきがつかずに
次にCOMのイベントチェックするとRXCHARが発生しているのでReadFileしようとするけど
さっき読んじゃったから次のバイトがくるまで固まるっていう不具合を避けるために1バイト
づつ読めっていう話があったけどいまだにそういうことに気をつけて作らないといけないの?
691デフォルトの名無しさん:2005/10/05(水) 22:31:34
>>690
それはMFC?
692デフォルトの名無しさん:2005/10/05(水) 22:35:03
もっちろんWin32!
693デフォルトの名無しさん:2005/10/06(木) 00:40:43
こらむしすんな
694デフォルトの名無しさん:2005/10/06(木) 10:06:37
>656
695デフォルトの名無しさん:2005/10/06(木) 23:46:55
MFCで、SDIのプログラムです。
ダイアログバーにボタンを貼り付けてそのボタンにたいして
GetDlgItem(ID_BTN1)->EnableWindow(TRUE);とやってあげます。
確かにウインドがEnableになるのですが、その後フレームワークにより
Disableにされてしまいます。
フレームワークはどういう条件でそんなことをしちゃうのでしょうか?
ちなみにソースはあまりキレイなものではなく(引き継いだ)
結構手作業でON_COMMANDやらON_UPDATE_UIやらを追加・削除なんかしてて
それなりに怪しいのですが。
696デフォルトの名無しさん:2005/10/07(金) 00:01:47
そのON_UPDATE_UIが関係している。
697デフォルトの名無しさん:2005/10/07(金) 00:04:31
そう思ってON_UPDATE_UIとON_UPDATE_UI_RANGEをみんなコメントアウトにしてみたけどダメでした。
698デフォルトの名無しさん:2005/10/07(金) 00:07:38
馬鹿だな。関係していると言ってるのに。
699デフォルトの名無しさん:2005/10/07(金) 00:10:21
ってことは逆にON_UPDATE_UIが削除されちゃってるのがまずいのですか?
700デフォルトの名無しさん:2005/10/07(金) 09:53:59
MFCで動画(aviかmpg)を読み込みフレームごとキャプチャして静止画にすることなんて
できますか?そのようなアプリケーションを探しているのですがないので
自作しようと思っています。
701デフォルトの名無しさん:2005/10/07(金) 11:30:11
MFCでもそういうプログラムは作れるが、
MFCの機能じゃないからスレ違い
702デフォルトの名無しさん:2005/10/07(金) 13:25:55
CWnd::MessageBoxの説明に、
「アプリケーションにメッセージ ボックスを実装するには、このメンバ関数ではなくグローバル関数 AfxMessageBox を使用してください。」
と書いてありますが、なぜなんでしょうか。
使ってはだめということじゃなくて、AfxMessageBoxの方が便利ですよ、ということだけなのかな?
703デフォルトの名無しさん:2005/10/07(金) 14:03:26
たぶんモードレスとモーダルの違い
704デフォルトの名無しさん:2005/10/07(金) 14:16:21
と思ったけどそういうことではないな
705デフォルトの名無しさん:2005/10/07(金) 15:26:47
AfxMessageBoxはCWinAppのm_pMainWndを親にした・・・ような希ガス。
まあ頑張ってソース読んでみては。
706デフォルトの名無しさん:2005/10/07(金) 15:33:25
アプリの中で複数のフレームウィンドウを使っている場合、
メインじゃないフレームウィンドウでAfxMessageBoxを使うと、
メインフレームを親にしちゃうからなぁ。
AfxMessageBox使えねー。
707デフォルトの名無しさん:2005/10/07(金) 16:53:29
AfxMessageBox()のソース見てから言え。
AfxMessageBox()もCWnd::MessageBox()も内部で::MessageBox()を呼ぶが、
CWnd::MessageBox()よりもはるかに複雑なことをやってるから。
708デフォルトの名無しさん:2005/10/07(金) 17:48:21
>>707
見ても解らんのです。教えて下さい。
709デフォルトの名無しさん:2005/10/07(金) 17:56:58
ちと教えてください

CDateTimeCtrlでエディットコントロール部分の
文字の色とか背景の色とか変える方法ってありますか?

google様によれば文字の色だけはあるっぽいのでつが・・・
710デフォルトの名無しさん:2005/10/07(金) 23:41:44
教えてください!!ダイアログにボタンを貼り付けてクラスウイザードで
メッセージハンドルを追加する際に「クリックされた時」か「ダブルクリックされた時」しかなく
「ボタンが押されている時」と「ボタンが離された時」のメッセージを
取りたいのですが何か良い方法はありませんか?なるべく簡単な方法で…(^-^A;
711デフォルトの名無しさん:2005/10/07(金) 23:45:25

     _. -ッ'"  ̄ ̄`' ー-、
   /、.....!......._,,::;;:'::::::::::::::ヽ
    i´厂`''''"´   `ー、‐::-::;;l
   }ノ-、    ,. -‐-、 ヽ;::::::::l
   l ̄二'ー 'フ,ニニ.ーrー}-レ ''7
   l : i.__゚〉r、::..ヽ.__゚ノ レ''}ノf´/
   `''r-- ノ:::`ー---‐'′:l-イ
    l  `_ ____,、  :l|::::|     >>710教えてあげません
.    ヽ.   ―    /:::|:リ     
       ヽ.   ,. -'-‐''"´|  ,.へ,
        r} ̄ _,,.. -‐ ''"フ‐''"_∠,`ー- ...,,_
     -‐ノハ ̄  _.=''´/    --`i '''' ー-′
       / l  /  /   '′ -ー{
            ,.ヘ.    '´_,.‐'′
712デフォルトの名無しさん:2005/10/08(土) 00:03:49
>>702
「アプリケーションに【ユーザ独自の】メッセージ ボックスを実装するには」
ということでしょう。で、その場合↓をオーバライドする。

>CWinApp::DoMessageBox
>AfxMessageBox 呼び出しのアプリケーション レベルの処理をカスタマイズするには、
>このメンバ関数をオーバーライドします。
713デフォルトの名無しさん:2005/10/08(土) 09:09:10
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' は戻り値の型またはパラメータ型が無効なため表示できません。
};
714デフォルトの名無しさん:2005/10/08(土) 09:11:02
>>713
1.CreateDispatch
2.1でできたオブジェクトのOnStart
715デフォルトの名無しさん:2005/10/08(土) 09:39:32
>>710
そんなメッセージは無い
716デフォルトの名無しさん:2005/10/08(土) 11:18:43
>>710
CButton派生の自作クラスを作って、メッセージを送出したらいいじゃない。
717デフォルトの名無しさん:2005/10/10(月) 13:49:09
質問です。
あるプロジェクトで作成したダイアログを、
他のプロジェクトで利用したいときはどうすればいいでしょう?

VC++6.0でSDI→MDI移植に挑戦してるけど、
ダイアログのソースファイルや.rcファイルをコピーしてもうまくいきません。
どなたか知恵をお貸しください。
718デフォルトの名無しさん:2005/10/10(月) 18:40:43
基本的にはできないと思う。
ダイアログをDLLで作ってあればまだしも
719デフォルトの名無しさん:2005/10/10(月) 18:54:15
リソースファイル開いてコピペするだけじゃないか?
何がうまくいかないのかよくわからん
720デフォルトの名無しさん:2005/10/10(月) 21:26:52
Resource.h
721デフォルトの名無しさん:2005/10/11(火) 19:49:50
CHtmlView上で、ハイパーリンク上にマウスカーソルが来た時を検知したいです。
この時に飛んでくるイベントなどありますでしょうか?
未熟者ゆえ、Spy++を眺めてもわからなかったとです。どうぞ御教示下され
VC++ 6 on Win2KSP4
722717:2005/10/11(火) 22:06:55
リソースファイルをコピペ&ソース・ヘッダファイルをコピペ、
でビルドしたところ"ID~が定義されていません"系エラー多発。
ソースを追うとリソースエディタのプロパティで確認できるIDと、
ヘッダファイル内のIDが異なっていることに気付く。
これは元プロジェクトも同様。
よってIDを結びつけるマッピング関数が記述されたファイルがどこかにあると思ったんだがorz

結局SDIプロジェクトに新規MDIプロジェクトからApp,Doc,Viewを移植することで
SDI→MDI移植計画中ですたい。
723デフォルトの名無しさん:2005/10/11(火) 22:24:18
ダイアログだけコピーならこれでいけると思うけど
http://www.microsoft.com/japan/developer/library/vcug/_asug_copying_resources.htm
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はこれを避けるための仕組み。
725デフォルトの名無しさん:2005/10/11(火) 22:51:39
SDI→MDI の移植って、いじる場所さえ分かってれば、
プロジェクトそのまま移行できたはず。

俺も具体的な手順は忘れたけど。
726デフォルトの名無しさん:2005/10/15(土) 00:09:04
質問です。

MFCダイアログベースのアプリで、メインのダイアログから、CDialog派生のダイアログを
DoModalで表示させています。
その派生ダイアログの中にCEditコントロールがあって、SetSelで選択範囲を指定している
んですが、Windows2000とXPで挙動が違うようなので困っています。

具体的には、たとえばテキストが"あいabcd"だとして、SetSel(2, 4)とすれば、2000環境では
"い"の部分が選択されますが、XP環境では"ab"の部分が選択されます。
どうやらXP環境ではバイト数ではなくマルチバイト文字数で選択範囲が決まっているようなんですが、
こういう仕様なんでしょうか?

727デフォルトの名無しさん:2005/10/15(土) 02:11:24
>>726
ヒント:UTF16
728デフォルトの名無しさん:2005/10/15(土) 02:52:47
>>726
MBCS版とWCS版を作ってみろ。
729デフォルトの名無しさん:2005/10/15(土) 03:02:31
自己レス>>726

XPでmanifestファイル、コモンコントロールv6.0を使用している場合、
テキスト関連(キャレット位置、選択範囲等)はだいたいバイト数ではなく
文字数での扱いになるようです。
そういう仕様なのだと…

730デフォルトの名無しさん:2005/10/15(土) 03:04:14
追記:
でもIsWindowUnicode()はFALSEを返すんですよね…
731デフォルトの名無しさん:2005/10/15(土) 10:51:33
>>728
MBCSでビルドしてもcomctl32.dll ver6.0だとWCHAR単位になるんだよ
732デフォルトの名無しさん:2005/10/15(土) 15:33:12
CMemFile の内容を、CHtmlView というか WebBrowser コントロールに
表示させたいのですが、実ファイルを作成せず、メモリファイルのまま
表示させる方法はないでしょうか?

733デフォルトの名無しさん:2005/10/16(日) 01:21:47
VisualStudio.net 2002を使っております。
MDIのプログラムから起動時に、
モードレスダイアログボックスを呼び出しています。

モードレスダイアログボックスがアクティブになっている時、
CxxxDialog::OnKeyDownでキーの取得が出来ないのですが、
どのようにすればよろしいのでしょうか。
メインウィンドウがアクティブになっているときは、
CxxxView::OnKeyDownでキーの取得はちゃんとできます。
また、CxxxDialog::OnMouseMoveでマウスの動きは取得できます。
キー入力だけ取得できないので困っております。

原因が分かる方おしえてください。
734733:2005/10/16(日) 01:37:03
PreTranslateMessage()であっさり拾えました。
735デフォルトの名無しさん:2005/10/16(日) 17:51:43
自作アプリでコマンド実行して、処理が遅いなーと思ったときに、
どのメソッド・関数で時間がかかっているか調べるようなツールはありませんか?
736デフォルトの名無しさん:2005/10/16(日) 17:55:19
>>735
関数などの処理の前後で現在時刻を取得しろ。ミリ秒単位で取得できるぞ。
737デフォルトの名無しさん:2005/10/16(日) 19:45:06
profiler
738デフォルトの名無しさん:2005/10/16(日) 19:51:21
>>735
ある。
739デフォルトの名無しさん:2005/10/16(日) 20:14:14
DevPartner
740デフォルトの名無しさん:2005/10/16(日) 21:47:49
>>737,738
詳しく教えてください
741デフォルトの名無しさん:2005/10/16(日) 21:58:04
>>740
googleで調べてください
742デフォルトの名無しさん:2005/10/16(日) 22:06:20
自前で測定する手間を省こうとするな馬鹿。
743デフォルトの名無しさん:2005/10/16(日) 22:30:44
VC++ 6.0のプロか
エンタープライズに付いているよ。
あまり高機能とは言えないけど。
744デフォルトの名無しさん:2005/10/16(日) 22:46:05
profiler の検索結果 約 6,440,000 件中 1 - 10 件目 (0.15 秒)
ある の検索結果 約 82,500,000 件中 1 - 10 件目 (0.03 秒)
745デフォルトの名無しさん:2005/10/16(日) 22:53:43
profiler ある の検索結果のうち 日本語のページ 約 44,300 件中 1 - 100 件目 (0.09 秒)
746デフォルトの名無しさん:2005/10/17(月) 13:33:32
>>743
VC6 のプロファイラか…
あれ、設定ダイアログに罠が仕込んであるからなあw
747デフォルトの名無しさん:2005/10/17(月) 21:26:09
>>746
kwsk
748デフォルトの名無しさん:2005/10/18(火) 01:20:36
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行おきに色をつけること等はできても
目的の選択行だけ色を・・・という所には行き着けません。
この方法、選択行の色を変える方法として正しくない気もします・・・
751デフォルトの名無しさん:2005/10/19(水) 08:55:45
>>750
1行おきに色をつけられるってことは、何行目かは判るってことでしょ。
その行が選択されているかどうかは得られるわけだから、カスタムドローでできそうだが。
752デフォルトの名無しさん:2005/10/19(水) 10:41:02
ダイアログ上の各コントロールにタブオーダーで順番を割り振っているのですが、
1番がラジオボタンだと、初期表示でラジオボタンにフォーカスが当たってくれません。
プロパティではタブストップTRUEにしています。

画面はこんな感じの構成になっています。

----グループボックス-----------------------------------------
スタティックテキスト  ○ラジオボタン1 ○ラジオボタン2
スタティックテキスト  ○ラジオボタンA ○ラジオボタンB
エディットコントロール [______]
-------------------------------------------------------------

タブ順は
『ラジオボタン1→ラジオボタン2→ラジオボタンA→ラジオボタンB
→エディットボックス』と設定していますが、初期表示でフォーカスが
エディットボックスに当たってしまいます。
きちんと設定したタブ順で遷移させたいのですが、何か原因がありましたら
ご指導お願います。
753デフォルトの名無しさん:2005/10/19(水) 10:42:19
ラジオボタンは、チェックされたものが無いとタブで止まらないよ
754デフォルトの名無しさん:2005/10/19(水) 10:56:56
最初にSetFocusしたらいいじゃない。
755デフォルトの名無しさん:2005/10/19(水) 11:21:41
>プロパティではタブストップTRUEにしています。
「グループ」をONにしてないんじゃまいか?
756デフォルトの名無しさん:2005/10/19(水) 13:44:01
>>755
グループはTRUEでグループ化しています。
チェック有無の制御も問題無く出来ています。

午前中いろいろ考えましたが、原因がわからないため
>>754さんの言うとおり、SetFocusで強制的にフォーカスを当てるように
作り直しました。ちょっと変な感じしますが、現状で問題なく動いてくれて
いるので由としてます。アドバイスありがとうございました。
757750:2005/10/21(金) 05:01:09
>>751
カスタムドローをベースに、選択行だけ背景と文字を自分で描くようにして
とりあえず解決しました。プチオーナードロー
758デフォルトの名無しさん:2005/10/21(金) 13:28:47
CArrayの使い方が良く分かりません
CArray<int, int> hoge;
と宣言すると ; が < の前に必要ですとかエラーが出ます。
でも、CArrayをググって見ると、上記で宣言してるソース見本がたくさんあります
これ、何がいけないんですか?
759デフォルトの名無しさん:2005/10/21(金) 13:51:09
>>758
エラーメッセージがアレだが、
「CArray って何よ?」
と訴えている。

#include <afxtempl.h>
760デフォルトの名無しさん:2005/10/21(金) 13:56:34
>>759
いけました、ありがとうございます
ウィザードで自動生成されたstdafx.hでインクルードされてるものだけじゃCArray使えないんですね・・・
勉強になりました
761デフォルトの名無しさん:2005/10/21(金) 15:42:54
CArrayなんて使うなよ。
762デフォルトの名無しさん:2005/10/21(金) 16:04:57
なんで?
763デフォルトの名無しさん:2005/10/21(金) 16:11:14
使うメリットが(std::vectorに対して)殆どないから。
764デフォルトの名無しさん:2005/10/21(金) 17:00:00
じゃあ、CArrayに対してstd::vector使うメリットは?

どうせMFC使うんだから、STL使わずにMFCだけでやろうと思ってCArrayにしたんだけどね
765デフォルトの名無しさん:2005/10/21(金) 17:03:15
<algorithm>が使える
766デフォルトの名無しさん:2005/10/21(金) 17:04:22
MSと心中するつもりならそれでも委員でない?
標準品があるのにわざわざ特殊仕様品を使う積極的な理由が他にあるとも思えないけど。
767デフォルトの名無しさん:2005/10/21(金) 17:06:16
Windows用プログラムなんだから別にMFCも特殊仕様品じゃないだろ?
768デフォルトの名無しさん:2005/10/21(金) 17:08:55
MFC自体が処理系依存なライブラリ。
769デフォルトの名無しさん:2005/10/21(金) 17:11:40
いやおまえ、処理系依存って、Windows以外にMFCを使おうとするヤツが居るとでも・・・
770デフォルトの名無しさん:2005/10/21(金) 17:20:24
処理系依存と環境依存を混同するな。
771デフォルトの名無しさん:2005/10/21(金) 17:34:06
>>765
だよねえ。
MFC のコンテナは C++ に STL が含まれて
居なかった頃の名残でしかないワケで
今更使う意味はないね。
772デフォルトの名無しさん:2005/10/21(金) 17:45:36
>>771
MFC嫌スレにでも行けば?
773デフォルトの名無しさん:2005/10/21(金) 17:47:12
>>765
CArrayを勧めるつもりではないが、CArrayでもおそらく&a[0]と&a[0] + a.GetSize()でいける。
774デフォルトの名無しさん:2005/10/21(金) 17:49:53
CArrayとCListのナントカ性がないのでCArrayからCListに直すのが面倒。
何て言うんだっけ。
775デフォルトの名無しさん:2005/10/21(金) 17:51:27
移植性?
776デフォルトの名無しさん:2005/10/21(金) 18:13:21
一貫性?
777774さん:2005/10/21(金) 18:19:16
直交性だった。

http://www.hey-to.net/ML-archive/vcppML/1999/msg03973.html

> MFCだと、たとえばCArrayで書いてた部分をCListに取り替えたとき、
> 書き直さなければならないコードの量がすんごいです。やってらんない。
> クラスとメソッドの直交性が皆無なんだな...
> MFCコレクションの唯一のメリットといえば、
> シリアライズがちょびっと楽なことくらいでしょうか。
778デフォルトの名無しさん:2005/10/21(金) 18:19:57
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.
779デフォルトの名無しさん:2005/10/21(金) 18:20:43
STLつかうと一気に実行ファイルサイズが10倍に?!
780デフォルトの名無しさん:2005/10/21(金) 18:35:49
最近EXEサイズを小さく抑えようとする努力を全く行わなくなった俺はきっとダメPG
781デフォルトの名無しさん:2005/10/21(金) 19:45:12
細菌 std::vectorに慣れてしまって使いまくっている。
それと、exeサイズを増やすことにロマンを感じてしまっている。
782デフォルトの名無しさん:2005/10/21(金) 19:48:16
>>781
コピコンに注意
783デフォルトの名無しさん:2005/10/22(土) 10:51:36
MyDialog : public CDialog {
  std::map<_bstr_t, std::vector< ComPtr<IStream> > >
};

はやくライブラリ統一されんかのか
784デフォルトの名無しさん:2005/10/23(日) 02:34:49
CListCtrlをダイアログに貼り付けたのですが、どうもアイテムの追加がうまくいきません。
何か足りないでしょうか。。

BOOL CDialog1::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: この位置に初期化の補足処理を追加してください
m_list.InsertItem(0, "テスト");
UpdateData(FALSE);

return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
// 例外: OCX プロパティ ページの戻り値は FALSE となります
}

>>784
努力が足りない。
786784: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を表示することができないのか、
どなたか宜しくお願い致します。
788デフォルトの名無しさん:2005/10/23(日) 22:30:45
>>787
COMの初期化とかはちゃんとしてる?
789デフォルトの名無しさん:2005/10/23(日) 22:35:48
afxwin1.inlの26行目を見たらいいじゃない。
790787:2005/10/23(日) 22:56:30
>788
的外れかもしれませんが、
InitInstanceでAfxEnableControlContainer はしています。

>789
25 _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
26 { ASSERT(afxCurrentResourceHandle != NULL);
27 return afxCurrentResourceHandle; }

のところです。
791デフォルトの名無しさん:2005/10/23(日) 23:14:13
>>790
では
ASSERT(afxCurrentResourceHandle != NULL);
の意味を考えてみよう。
792787:2005/10/24(月) 12:45:57
>791
遅くなって申し訳ございません。
afxCurrentResourceHandleの中を追っかけてたときは、値を返しているようなのですが、
どうも最終的にはNULLが返ってきます。

情けないことに、これまでこんなに奥深いところで悩んだことがなかったですので、
チンプンカンプンです。
793デフォルトの名無しさん:2005/10/25(火) 13:16:09
>>792
インタフェイス等で外部から呼ばれたときに、
ちゃんとAFX_MANAGE_STATEとかしてる?
794デフォルトの名無しさん:2005/10/26(水) 14:20:02
デバッガでトレースしてると、
関数なんかの引数でCStringがあると、
F11キー「CString::CString(const CString& stringSrc)」の中まで潜っちゃうんですが、
そうならない設定を教えて下さい。
795デフォルトの名無しさん:2005/10/26(水) 14:24:15
混合モードを表示して、その辺りのコンストラクタを抜けて肝心の関数に入る辺りまでF10でスキップする。
796デフォルトの名無しさん:2005/10/26(水) 14:38:23
変なところにステップインしたらステップアウトしてもう一回ステップイン
それの繰り返し
797デフォルトの名無しさん:2005/10/26(水) 17:02:08
指定のディレクトリにある関数にはステップインしないような
設定は欲しいなあとつくづく思う今日この頃。
798デフォルトの名無しさん:2005/10/26(水) 17:29:57
そんな変な仕様はありえない
799デフォルトの名無しさん:2005/10/26(水) 17:34:18
BCBならステップインしないユニット指定出来るんだけどな。
800デフォルトの名無しさん:2005/10/26(水) 17:48:33
ステップ インとステップ オーバーを使い分ければいいじゃない。
801デフォルトの名無しさん:2005/10/26(水) 18:21:41
素人はBCB使ってろということだな
802デフォルトの名無しさん:2005/10/27(木) 22:52:47
玄人ほどよい道具を使うものだが
803デフォルトの名無しさん:2005/10/27(木) 23:13:09
VCのデバッガは非常に強力という意見は良く聞くけど
使う人によって評価は分かれるんだね
804デフォルトの名無しさん:2005/10/27(木) 23:21:24
http://www.kaede-software.com/2004/10/bcbvc.html
デバッガはやっぱり、BCBではなく、VCの方を使いたい。
でも、いろいろと調べていくとBCBは独自のデバッグ情報を吐くらしい。
弱った。
無理なのだろうか?
805デフォルトの名無しさん:2005/10/27(木) 23:30:56
http://piza.2ch.net/tech/kako/974/974890090.html
57 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/03(日) 22:40

BCB:
VC++にくらべてデバッガとテキストエディタの出来が悪い
あとは非常によい
VC++:
全体にバランスがとれているが、なんかめんどくさい。
806デフォルトの名無しさん:2005/10/27(木) 23:40:27
>57
>VC++にくらべてデバッガとテキストエディタの出来が悪い
単なる慣れの問題です。

VC++5エディタなんてコード補完もついてない屑ですよ。
あとVC++のマクロ定義糞だるいんで覚える気しないですし
807デフォルトの名無しさん:2005/10/27(木) 23:44:04
59 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 00:28
>>58
何故わざわざ古いバージョンを持ち出す?


60 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 00:47
開発業務アプリの都合でVerUpできねんだよ、藁エ!
ケッ

61 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/12/04(月) 04:07
ハッハッハ!>60
808デフォルトの名無しさん:2005/10/28(金) 00:52:06
開発業務アプリの都合でVS5とVS6とVS2003を同時に使ってるよ。
正直、VS2003が一番なじめん。
809デフォルトの名無しさん:2005/10/28(金) 02:02:42
> BCB:
> VC++にくらべてデバッガとテキストエディタの出来が悪い

開発ってプログラム書いてデバッグするの繰り返しだよな。
エディタとデバッガの出来が悪かったら何が残る?
スプラッシュ? 外装? 分厚いマニュアル?
810デフォルトの名無しさん:2005/10/28(金) 02:40:34
>何が残る?
ボーランドの社員の涙
811デフォルトの名無しさん:2005/10/28(金) 09:47:56
アプリに文字列入力したいのですが、
デバッグ用途なのでわざわざダイアログを興したくありません。

簡単なインプットボックスは無いでつか?
812デフォルトの名無しさん:2005/10/28(金) 09:49:55
>>809
開発者なら使って評価してみな。

論理的な文章とか、機能の有る無いのマトリクス、だけでは気付けない、
アプリの全体構造というか開発手法という重要なものがあるから。
813デフォルトの名無しさん:2005/10/28(金) 10:21:38
へー

    ∩___∩
   /       ヽ
   |●   ●   ヽ      
  (_●_ )       | 
 彡 |∪|      ミ
   ヽノ      (
   /   ヽ /  )
  .( <|      /
   ヽ|      |
    |    )  )
 。。゚ |  /|   /
 。゚  | /  \ \
    ∪    〉  )
         (___ノ
814デフォルトの名無しさん:2005/10/28(金) 13:32:15
>>809
素晴らしいクラスライブラリ。

…ごめん知らん。言ってみただけだ。
815デフォルトの名無しさん:2005/10/28(金) 13:54:36
そう>>814

素晴らしいというより、普通のビジュアルコンポーネントクラスライブラリ。

普通のクラスライブラリ
 ↓
・コードが生成される部分が殆ど無くてチョコチョコっと書くと動作(ウィザードは×)
・開発は振る舞いを変える派生で、画面に貼るコンポの派生もおk(ActiveXは×)
・メソッドのオーバーライドすれば良い部分は一箇所に集約されてて特定にソース読める(ドトネトは×)
・標準的な動作(性能。依存度の低さ)で、ネットにフリーコンポーネントが溢れている(MFCは×)
816デフォルトの名無しさん:2005/10/28(金) 13:56:30
Menuの1アイテムを非表示にするにはどうしたら良いですか?
817デフォルトの名無しさん:2005/10/28(金) 16:21:39
>>815
なるほど、BCB厨は日本語が不自由と。
818デフォルトの名無しさん:2005/10/28(金) 16:27:07
Borland製品を使った上で言うわけだが、
自分のアプリから他のアプリにちょっかいを出すのが面倒。
Borlandのエディットボックス(もどき)にWM_SETTEXTを送って、
Spy++で見ると(目に見えない)タイトルはちゃんと変わってるが、
目に見える文字列が変わらない。

Windows標準であるのに、わざわざ独自仕様のを自前で作って何がうれしいんだろうね。
819デフォルトの名無しさん:2005/10/28(金) 16:34:28
残念>>818
それは絶対気のせい。

ウィンドウズ標準コントロールはちゃんとTWinControlの派生となってて、
その中の人が標準コントロール派生してる。
820デフォルトの名無しさん:2005/10/28(金) 16:36:19
>Windows標準であるのに、わざわざ独自仕様のを自前で作って何がうれしいんだろうね。

それが本当に独自コンポーネントだったとしたらだけど、
派生して数行で独自コンポーネント作りまくれるから超楽しい。
821デフォルトの名無しさん:2005/10/28(金) 16:41:33
そして独り善がりのど派手なUIが跳梁跋扈することになるわけですね。
822デフォルトの名無しさん:2005/10/28(金) 16:54:07
>独り善がりのど派手なUIが跳梁跋扈する

携帯機器の今の時代超重要。

だからMFC/ActiveXやブビアプリが滅んだわけさ。
823デフォルトの名無しさん:2005/10/28(金) 18:29:39
ウィンドウをCreateする前に、IsWindowVisible()すると、
エラーっぽいんですが、
Createの前後をチェックする方法ありましたっけ?
824デフォルトの名無しさん:2005/10/28(金) 18:46:07
Createしてないのは存在しない
825デフォルトの名無しさん:2005/10/28(金) 19:27:10
Createしてないウィンドウなんて存在しない。
826デフォルトの名無しさん:2005/10/28(金) 19:38:15
HWND
827デフォルトの名無しさん:2005/10/28(金) 23:45:01
今時MFCなんて…
828名無し募集中。。。:2005/10/29(土) 02:14:48
今どきMFCを使ったことが無い奴は珍しい
829デフォルトの名無しさん:2005/10/29(土) 22:49:10
MDIのアプリについて質問です。
メニューの新規作成を押した後でドキュメントの作成をキャンセルするにはどうしたらいいのでしょう。
830デフォルトの名無しさん:2005/10/29(土) 22:50:55
おい、エスパー!お呼びだぞ!
831デフォルトの名無しさん:2005/10/29(土) 23:11:38
ゝ   ,イ-ト、リ_ヽノ V´ レ',.-、 , )!    
. (/     )´、r‐o-=' /=c<,ィ ル'
  !  r‐、 }  ,,ー‐'  ( ー-' !/  ・・・・・・
  ヽ {.fi {( ;;;;;     _」  │   
.  ヽ. `ー;`'     r─-、´  /
    `ヽ {    └--‐'  /
832829:2005/10/29(土) 23:30:56
つまりメニューがクリックされると
CFrameWnd::OnCmdMsg()
CWinApp::OnFileNew()
MyDocument::OnNewDocument()
(途中一部略)
おおまかにこういう順番で呼ばれます。
このアプリではドキュメントが実際に作成される前にダイアログを出します。
そのダイアログはドキュメントに必要な属性値を前もって設定したり、ドキュメントの作成をキャンセルします。
しかしながら、キャンセルするためにダイアログをどの位置で呼び出せばいいのか、それがわかりません。
OnNewDocumentでFALSEを返したりOnFileNewをオーバーライドしてもダメでした。
教えてください。お願いします。
833デフォルトの名無しさん:2005/10/29(土) 23:41:01
試してないけど、
MyDocument::OnNewDocument()内で、
CDocument::OnNewDocument()の前でFALSEを返してもダメ?
834デフォルトの名無しさん:2005/10/29(土) 23:51:19
>>833
それでできました!どうもありがとうございました。
835デフォルトの名無しさん:2005/10/30(日) 09:53:09
最初からそうやってしっかり説明しろよ・・・
836デフォルトの名無しさん:2005/10/31(月) 14:26:35
CListCtrlのレポートビューで(プログラム側で)選択行を移動させたいんですけど
そういうメソッドありますか?
無ければ、やり方をお教えくださいませ・・・
837デフォルトの名無しさん:2005/10/31(月) 15:49:27
選択行を移動させる、ってなによ?
838デフォルトの名無しさん:2005/10/31(月) 16:00:27
まんま移動させるんじゃね?上下に
839デフォルトの名無しさん:2005/10/31(月) 16:08:53
だから、その「移動」の意味するところは?
840デフォルトの名無しさん:2005/10/31(月) 16:17:51
一行目を選んでいたら、それを二行目にしたいってだけだったんですが・・・
通じませんでしたか?
841デフォルトの名無しさん:2005/10/31(月) 16:32:00
>一行目を選んでいたら、それを二行目にしたいってだけだったんですが・・・

選択してる位置を移動させるのか、選択したデータ自体を移動させるのかどっちだ?
842デフォルトの名無しさん:2005/10/31(月) 16:56:02
MFCウイザードでMDIプロジェクトを名前hogeで作ると
ChogeView
ChogeDoc
CChildFrm
CMainFrm
が生成されますが、CChildFrmの存在意義がわかりません。
私はCHogeViewがMDI子ウインドウを表すクラスだと解釈しています。
ではなぜCChildFrmが必要なのでしょうか?
CChildFrm::OnCreateChildをオーバーライドすると一応使われて画面にも表示(?)されているようで疑問です。いったいこれは何なんですか。
843デフォルトの名無しさん:2005/10/31(月) 16:59:33
>>842
Childframeの中にViewがはまってる
844デフォルトの名無しさん:2005/10/31(月) 16:59:49
移動させるってったら、普通データの移動だろ
選択を変えるのを移動なんていうヤツイネェ
845842:2005/10/31(月) 17:00:02
すみません。
詳しくは
CChildFrm::OnCreateChildをオーバーライドしてデバッグ画面で呼び出しを確認すると、でした。
846デフォルトの名無しさん:2005/10/31(月) 17:00:28
>>842
わからんならDocument&Viewアーキテクチャの勉強してこい
847デフォルトの名無しさん:2005/10/31(月) 17:02:32
viewにはフレームないじゃん
viewはsdiでも使うからフレームの機能はわけたのでは?
848842:2005/10/31(月) 17:10:35
>>847
フーム、納得。CViewがCWndを継承しているからMDI子ウインドウがCViewそのものだと誤解していました。
CViewはCFrameWndとはまったく別のものだったんですね。
どうもありがとうございました。
849デフォルトの名無しさん:2005/10/31(月) 17:29:26
CWndを継承してるからって、
コントロールも全部Windowですよ?
850デフォルトの名無しさん:2005/10/31(月) 17:59:34
ええその通りです。それを忘れていました。
851デフォルトの名無しさん:2005/11/01(火) 20:51:27
画面にビットマップ貼るにはどうしたら良いですか?
852デフォルトの名無しさん:2005/11/01(火) 21:06:48
紙に印刷してテープで貼り付けてください
853デフォルトの名無しさん:2005/11/01(火) 21:10:25
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
);
856854:2005/11/02(水) 14:36:22
>>855
了解しました。
やっぱ、Win32なんですね。



次、MFCのCDialog側のメッセージハンドラの作り方調べなきゃ。。。
857デフォルトの名無しさん:2005/11/02(水) 15:08:29
画面から画面といったら別のパソコンにメッセージを送るのかと思った。
858854:2005/11/02(水) 15:09:17
受信するために、
CDialogに「::WindowProc(message, wParam, lParam);」を追加しますた。
これであってんのかなぁ。
859854:2005/11/02(水) 15:16:46
あれ?
WM_USERはいっぱいコールされるけどMFCが使用してる?
860デフォルトの名無しさん:2005/11/02(水) 15:23:02
画面が使ってる
861デフォルトの名無しさん:2005/11/02(水) 15:24:29
>>859
MFCというかWindowsの普通のコントロールが使っています。
WM_APP以降を使ったほうが安全です。

ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesmessages/wm_user.asp
862デフォルトの名無しさん:2005/11/02(水) 15:29:04
CDialogに::WindowProc追加かあ
確かにCDialogの場合は、RUNTIMEで束縛されて無いからその方法も有なのかな。
自分だったら、wizardに無いなら、MESSAGE_MAPに手コード追加すると思う。
863854:2005/11/02(水) 15:43:07
>>860-862
サンクス。

WM_APPしてみます。

メッセージマップに手書きでも良いのか。
864デフォルトの名無しさん:2005/11/02(水) 23:12:56
>>862
>CDialogの場合は、RUNTIMEで束縛されて無い
ってどーいうこと?
865デフォルトの名無しさん:2005/11/03(木) 06:13:33
結局ランタイムの上で踊らされてる罠。
866デフォルトの名無しさん:2005/11/03(木) 09:18:45
> SendMessage ::WindowProc
単にMFC知らないだけだろ
867デフォルトの名無しさん:2005/11/03(木) 09:29:03
オブジェクト指向すら分かってなさそうだ。
868デフォルトの名無しさん:2005/11/03(木) 10:00:52
>>864
RUNTIME_CLASS の事じゃね?
で、ウィザードでサポートしてないメッセージハンドラは
MESSAGE_MAP に手で追加するのが基本。
869デフォルトの名無しさん:2005/11/03(木) 10:07:37
MFCの場合は、throwで何投げますか?

C++のthorwって、int、const char*、exception等の派生と何でも投げれるって言うじゃなぃ?
870デフォルトの名無しさん:2005/11/03(木) 10:18:11
C++です
871デフォルトの名無しさん:2005/11/03(木) 10:42:18
さじを投げます。
872デフォルトの名無しさん:2005/11/03(木) 12:50:45
槍を投げます。
873デフォルトの名無しさん:2005/11/03(木) 15:45:05
賽を投げます
874デフォルトの名無しさん:2005/11/03(木) 16:10:16
>>869
MSDNで調べれ
すぐわかる
875デフォルトの名無しさん:2005/11/03(木) 17:28:15
MSDNをthrow
876デフォルトの名無しさん:2005/11/03(木) 18:04:09
窓からthrow
877デフォルトの名無しさん:2005/11/03(木) 18:09:34
岸部throw
878デフォルトの名無しさん:2005/11/03(木) 21:39:54
十catch花子
879デフォルトの名無しさん:2005/11/05(土) 05:19:44
ダイアログ上に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マクロの方にも手をいれないといけないのでしょうか?
880sage: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の手前に貼り付けるのが普通。
882879: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

それでできないなら自前で描画した方がいい。
884デフォルトの名無しさん:2005/11/05(土) 17:39:38
VC7で、
ダイアログのエディットボックスに変数を割り当てたいのですが
これをUINTにしてあげると数字以外を入力すると禁止されるんですよね?

しかしこのエディットボックスを編集したときにその数字を使って計算をして
計算結果を表示させたいのですが、EN_CHANGEを実装して、その関数で
UpdateData(TRUE)をして値を引こうとしたのですが、どうもまともに取れないです。
具体的には初期化されてない時の0xCDCDCDCDである3452816845という値になってしまいます。
私がやろうとしていることは無理なのでしょうか?
ソースはかなりいろんな人がいじくっているのでリソースIDとの関係がおかしくなっている可能性もあるので
こういうことはできる・できないという点でのアドバイスで結構ですのでお願いします。
885デフォルトの名無しさん:2005/11/05(土) 17:53:39
>>884
できる。
resource.hを手動で書き換えたらリビルドしろ。
886デフォルトの名無しさん:2005/11/05(土) 18:17:18
ありがとうございます。
もうちょっとがんばってみます。
最悪書き直しかも。
887879: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()を見てスクロールバーの新位置を決めなければ
ならないですよね。それってどこになるのでしょうか?
888881,883,885:2005/11/05(土) 18:48:49
>>887
キーを押したらCListCtrlの選択された項目が変化するのだから、
キー入力を意識する必要はない。
マウスクリックでCListCtrl内の項目がクリックされたときと同じ。
889デフォルトの名無しさん:2005/11/05(土) 19:05:43
>879
なんか前の親子孫の関係と、今のそれの関係がよく分からんけど、
俺だったら、CDialogの派生クラスのハンドラに仮想関数持ってきて、
強制的に孫を読ませるようにすると思う。
見当違いだったらごめんね。
890デフォルトの名無しさん:2005/11/05(土) 19:09:19
>>888
意識する必要がないとは?
マウスクリックの時はNM_CLICKイベントが発生しますけど、キーボードでPgUpや上下キーを押した時はNM_CLICKイベントは発生しませんよね。
それでリスト部はカーソルキーを押すだけスクロールしていき、自前のスクロールバーへの反映ができずにスクロール位置がズレていってしまいます。
891デフォルトの名無しさん:2005/11/05(土) 19:12:29
>>889
すみません!! >>879 >>882 >>887の流れで話しています。
それで仮想関数で強制的に孫を読ませるという意味がわかりません。もう少しヒントをくれませんか。
892デフォルトの名無しさん:2005/11/05(土) 19:34:07
>891
いやぁ、いきなり割り込んでしまった感があるけど、virtualの機能という面で見て、本にも書いてあると思うけど、
virtual関数呼ばれると、必然的に、その派生クラスのvirtualを継承した関数を探し、あった場合は継承したほうが呼ばれるでしょう。
これらを子と孫に適用してやる。
勘違いしてて、話し噛みあってないかもしれないから、具体的な方策は調べて?
余談として実行するまで呼ばれる関数は分からないという機能としても使える。
893デフォルトの名無しさん:2005/11/05(土) 19:40:56
ウィンドウの親子関係とクラスの継承は関係ない
MFC使わずにCのみで作ってもウィンドウの親子関係は存在する。
894デフォルトの名無しさん:2005/11/05(土) 19:44:11
質問です。

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)まで線を引こうと思ったとき、一体どの点が実際に塗られているのかを
判断する方法ってあるんですか?
895デフォルトの名無しさん:2005/11/05(土) 19:46:51
デバイスに依存するから決まってない。
例えば縦横の比率がデバイスによって違う。
896デフォルトの名無しさん:2005/11/05(土) 19:53:23
LineTo()の塗り方が気に入らなければ自分で塗るしかないしな。
897デフォルトの名無しさん:2005/11/05(土) 20:01:42
そういうわけにもいかないんです。
実は多角形の内部判定ルーチンを作っていまして
次のような場合に問題が起こるんですよ。

三角形(0,0) - (1,100) - (1,0)の内部に(0,1)が含まれているか?
っていう事を考えると、実際にPCに描画したときには内部に含まれるのに
単純に座標で考えると内部に含まれていない。

っていうことになって困っています。
もちろん、こういった個別の場合に対応すること自体は可能なのですが
LineToを使った描画アルゴリズムがわからない限り、応急処置的な
対応が完全かどうか、まったく保証が得られません。


あと、LineToは顧客が使うといっているため、
ここを変更する事はできないんです。。。どうしましょう。
898デフォルトの名無しさん:2005/11/05(土) 20:17:11
画像の取り込みとかに使う以外は使ったこと無いけど、
デバイスコンテキストのコンパチのメモリ上の架空のメモリデバイスコンテキストて
あれは、枠(RECT)の大きさも変わるんでしたっけ?Frameの大きさとか変えたりしても。
CreateCompatibleDCで作ったメモリデバイスコンテキストに座標なんか扱えるかどうか分からないけど、扱ったことないし。
899デフォルトの名無しさん:2005/11/05(土) 20:21:30
>>897
リージョンCRgnを使いなさい。
内部判定ルーチンなど作る必要がなくなる。
900デフォルトの名無しさん:2005/11/05(土) 20:42:30
おぉ、CRgnって言うのがあったのか・・・orz



どうも、ありがとうございました。
901デフォルトの名無しさん:2005/11/05(土) 20:52:42
orz

CRgn使ってみたのですが、結果は変わらず。
やっぱり、三角形(0,0) - (1,100) - (1,0)の内部に(0,1)が含まれているか?
っていう問題が解決しません。。。
902デフォルトの名無しさん:2005/11/05(土) 21:16:17
>901
WindowRectとClientRectを使ってるか、違いはどこか?
この辺どんなもんでしょ
903デフォルトの名無しさん:2005/11/05(土) 21:32:43
>>894
WinAPIの::LineDDA()はどう?
904901:2005/11/05(土) 21:47:29
>>902
えぇっと。使ってません。
ちゅーか、WindowRectって何ですか?

ぐぐってきます。
905901:2005/11/05(土) 21:52:41
>>903
おぉ……使えそうかも。。。今からやってみます。
906901: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ビルドならアサーションが起こると思われ。

910デフォルトの名無しさん:2005/11/06(日) 06:40:19
質問です。

DirectXのプログラムを作ってて、後にMFCで動くプログラムに、
その機能を載せ代えたくて、作業を進めているのですが、
DirectInputをどうやって使うのか分からないので、
何か使う方法があれば教えてください。

*App :: InitInstance()上で、
m_hInstanceをグローバル変数に格納し、
初期化に使ったのですが、うまくいきませんでした。

環境は、
VC++ .NET 2003
DirectX 9.0 SDK August 2005
です。
911デフォルトの名無しさん:2005/11/06(日) 19:02:37
>>909
サンクス。ES_NUMBERを設定するのを忘れるところでした。
912デフォルトの名無しさん:2005/11/07(月) 02:30:59
afxって何の略ですか?
913デフォルトの名無しさん:2005/11/07(月) 09:39:17
>>912
ググれ。10秒でわかる。
914デフォルトの名無しさん:2005/11/07(月) 09:48:53
>>912
ククレ。三分で食える。
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();
917915:2005/11/07(月) 10:46:57
>>916
CSE というソフトでは
データベースの反応時間と,
その結果を表示する時間の2種類が表示されるんですが,
前者の方はたぶん,おっしゃる方法ではなくて,
直接,データベースから値をもらってる
雰囲気があるのですが,
それができないかな,と思いまして

それともやっぱり >>916 の方法でやってるんですかね?
918デフォルトの名無しさん:2005/11/07(月) 11:01:50
データベースの質問ならそっちでやって
使い方もわからずにプログラム作ろうとしてるんだろうか
919デフォルトの名無しさん:2005/11/07(月) 11:04:11
データベースの機能なのかどうかもわかってないんじゃどうしようもないだろう。
920デフォルトの名無しさん:2005/11/07(月) 11:30:40
// 時刻1
rs.Open(~);
// 時刻2

// 時刻3
while (!rs.IsEOF()) {
rs.MoveNext();
}
// 時刻時刻4

この「時刻2-時刻1」、「時刻4-時刻3」をそれぞれ表示してるだけだろ。
921890:2005/11/07(月) 16:14:30
>>908
ありがとうございます。LVN_ITEMCHANGEDでやりたいことが実現できました!

はじめLVN_ITEMCHANGEDのイベント中にListCtrl::GetTopIndex()を取得して
自前のスクロールバーへSetScrollPos()してあげればいいかと思ってましたが
それだとListCtrl::GetTopIndex()は以前の値を返してしまうんですね。そこで
LVN_ITEMCHANGEDに渡ってくる現在行と1ページに表示できる行数を使って
画面上の先頭行を求めてSetScrollPos()してあげたらうまくいきました。
922デフォルトの名無しさん:2005/11/07(月) 17:50:01
初歩的なことを質問させてください。

ダイアログ(CDialog)にCStatic等のコントロールを乗せている状態で、
そのコントロールの左クリックイベントをCDialogが拾う、もしくはCDialogに
通知するにはどうしたらいいのでしょうか。
923デフォルトの名無しさん:2005/11/07(月) 17:58:07
普通にハンドラを追加する。
924922:2005/11/07(月) 18:22:00
>>923
ご助言ありがとうございます。
説明不足で申し訳ございません。
CStaicコントロールは、動的に不定数生成しており、
ON_CONTROL_RANGEでイベントをとっているのですが、
クリックされた際の座標が取得できないのです。
座標も取得できれば言うことはないのですが、簡単に取れますか?
925デフォルトの名無しさん:2005/11/07(月) 18:35:10
>>924
GetMessagePosしてScreenToClientする。
926888:2005/11/07(月) 18:54:23
>>921
>>888で言いたかったこと分かった?
だからキーかマウスかなんて関係ないんだよ。

888 :881,883,885:2005/11/05(土) 18:48:49
>>887
キーを押したらCListCtrlの選択された項目が変化するのだから、
キー入力を意識する必要はない。
マウスクリックでCListCtrl内の項目がクリックされたときと同じ。
927デフォルトの名無しさん:2005/11/07(月) 18:55:29
ああ、駄目な質問者の典型だな。
928922:2005/11/07(月) 19:14:36
>>925
ありがとうございました!
無事座標を取得できました。


もうひとつ不明な点があるのですが、コントロール上でのマウス移動やボタンアップイベントは
親ダイアログからはON_CONTOROLを使用して取得できないものなのでしょうか。
できるとしたら、イベントに何を指定すればいいのでしょうか。
くれくれ君ですみませんが,よろしくお願いいたします。
929922:2005/11/07(月) 19:26:02
自己レス

コントロールをサブクラス化して親へイベントを発行するようにしました。
どうもありがとうございました。
930デフォルトの名無しさん:2005/11/07(月) 19:58:58
>>926
>>908の説明でわかりました!感謝します。
931デフォルトの名無しさん:2005/11/07(月) 21:01:40
>>928-929
スタティックコントロールを作成する際に、「通知」属性をセットして
おけば、スタティックコントロール内のマウスイベントが親ウィンドウ
に通知される。

CStatic派生クラスを作る際に、CWnd::PreSubclassWindow()および、
CWnd::OnCreate()内で ...

ModifyStyle(0,SS_NOTIFY);

を呼び出せばよい。 PreSubclassWindow()も加えるのは、ダイアログの
初期化時やDDX_Control()でコントロールメンバをサブクラス化すると、
派生クラスのOnCreate()が呼ばれないから。

ダイアログリソースなら、迷わず「通知(N)」をチェックしる。

しかし、CEditのスタイルの説明からは「ES_NUMBER」が、CStaticの
スタイルの説明からは「SS_NOTIFY」が抜け落ちているのは、ナ~ゼ~。
932デフォルトの名無しさん:2005/11/07(月) 21:06:04
MSがバカだからさ
933デフォルトの名無しさん:2005/11/08(火) 05:14:13
CRgn rgn;
rgn.CreateRectRgnIndirect(rect); // (1)
rgn.DeleteObject(); // (1)のリージョンを解放
rgn.CopyRgn(rgn2); // ここでrgnがASSERT(m_hObject != NULL)で引っかかる

DeleteObject()した後でm_hObject変数にNULLをセットするのはプログラマーの役目なんですか?
それともCRgnのメンバ変数をリセットするような方法が他にありますか?
934デフォルトの名無しさん:2005/11/08(火) 05:33:11
>>933
勘違いしてました。orz
m_hObjectがNULLだからエラーになっているんですね。
CopyRgn()はCombineRgn()を呼び出しているのでコピー先がNULLでは使えないんですね。
新しいリージョンで上書きするというイメージで使おうとしていました。
935デフォルトの名無しさん:2005/11/08(火) 05:42:17
>>934
CopyRgn()はCombineRgn(RGN_COPY)で呼び出してるから上書きイメージで使えるんだった。orz
でもコピー前のリージョンをDeleteObject()で解放しなくて問題ないんですか?
CombineRgn()の中でやってくれている?
936デフォルトの名無しさん:2005/11/08(火) 08:31:04
rgnのハンドルが有効かどうか毎回確かめたらいいじゃない。

CRgn rgn;
...
if ((HRGN)rgn) {
//rgnに対する操作
}
937デフォルトの名無しさん:2005/11/08(火) 09:58:32
>>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でやったのですが、うまくいきません。
なにか違いがあるのでしょうか?
939デフォルトの名無しさん:2005/11/08(火) 10:37:44
>>938
SelectionModeはどないなってん?
940938:2005/11/08(火) 10:47:08
FocusRect = 0
SelectionMode = 1
HighLight = 1
です。プロパティでも設定していますし、動的にも設定してみました。
そしてSetColSel(GetCols() -1)をやっています。
941デフォルトの名無しさん:2005/11/08(火) 11:06:27
>>940
SetColSel()は要らんと思うけど。
VC.NETでC++からActiveX版のFlexGridを使ってるの?
#.NET版はプロパティが随分違うようだけど。
942デフォルトの名無しさん:2005/11/08(火) 11:36:04
>>937
Region が解放されるというわけではないけど、
DeleteObjectとかはしなくて良いよ。

CopyRegion とか CombineRgn の機能は、ターゲットのRegionを
得ようとする形状に変更する、というものだから。
943938:2005/11/08(火) 11:55:47
VC++.NETでActiveXコントロールの挿入→
Microsoft FlexGrid Control version 6.0 を入れています。
これで答えになってますか?
944941:2005/11/08(火) 12:46:59
>>943
納得。確かVC7.1にはFlexGridはついてきてなかったと思ったから確認したかった。
つーか、今やってみたらMFC42.LIBを要求されてしまった。
VC6のディレクトリをライブラリパスに追加したらビルドは通ったけどクリエートができない。
そっちではFlexGridの表示までは行っているの?
945デフォルトの名無しさん:2005/11/08(火) 12:50:48
FocusRect = Light
SelectionMode = By Row
Highlight = Always
にすればいいじゃない。

VC++.NETのプロパティでは数値でなくTrueとかAlwaysとか文字で出てないか?
946945: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;
947945: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)
948945:2005/11/08(火) 13:09:23
あー、あとうちではMFC42.LIBを要求されることなく普通に実行できた。
(実際に作って確認してる。)
環境変数の順位とかが関係あるのかしら。
949938:2005/11/08(火) 13:31:57
>944
表示&グリッド内への文字の表示は出来ています。
>945
FocusRect = Light
にすると、一番左の列のみに選択の囲いがいってしまいます。

VBにて「フレックス グリッドで行全体をハイライトしない不具合」
というのを見つけましたけど、関係ないですよね・・・
ttp://support.microsoft.com/default.aspx?scid=kb;ja;181912
950デフォルトの名無しさん:2005/11/08(火) 16:00:34
>>942
ありがとう。安心しました。
CreateRectRgnIndirect()のヘルプに、使い終わったらDeleteObject()しろと書いてあったから心配だったんだ。
951938:2005/11/08(火) 17:51:38
のあああ!解決しました。
違う人間がプロジェクトにグリッドを突っ込んだので、怪しいと思い、
あらためて新しいプロジェクトで作り直したらきちんと動きました。
つーかVC++6.0からクラスをコピーしてきたんじゃなかろうかってかんじです。
>946のenum定義もないし、おかしいと思って調べまくりました。
くだらないことにお付き合いいただきありがとうございました。
これから正しく?組み込みなおします。
952941:2005/11/08(火) 18:00:01
よかったよかった。

#私の端末で巧くビルドできなかったり実行できなかったりしたのは謎だけど。
953945: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
954941:2005/11/08(火) 19:15:29
>>953
あーいや、その組み合わせでは使わないから。
今度使うとしたらVC7+FlexGridProだろうな。
955938:2005/11/08(火) 19:30:32
舞い戻ってまいりました・・・
原因は固定行のマージにありました・・・orz
また明日、マージのところをきちんと調べて再挑戦します。
ありがとうございました。
956デフォルトの名無しさん:2005/11/09(水) 00:46:23
AppWizardを使わないで初心者向けにMFCの解説をしているような本やサイトで、お勧めがあったら教えていただけないでしょうか
957デフォルトの名無しさん:2005/11/09(水) 01:17:33
>>956
neko toka ?
958デフォルトの名無しさん:2005/11/09(水) 01:22:00
>>957
猫は一応読みました。もう少しGUIに関する部分で突っ込んだ説明が欲しいのですが・・・
959デフォルトの名無しさん:2005/11/09(水) 04:07:58
マイクロソフト公式解説書 プログラミングMicrosoft Visual C++ .NET〈Vol.1〉基礎編

いろいろ買った中で、これが一番役立った。
960デフォルトの名無しさん:2005/11/09(水) 04:10:29
>>959
ありがとう、明日本屋で立ち読みしてみます
でも確かその本はマネージドの事が主な内容だった気がするのですが・・・
MFCに関しても詳しく書かれてましたか?
961デフォルトの名無しさん:2005/11/09(水) 04:13:04
あ、ちと勘違いしておりました・・・
MFCの事も書かれてますね
962デフォルトの名無しさん:2005/11/09(水) 08:48:11
>AppWizardを使わないで初心者向けにMFC

標準講座MFC6.0
基本的にAppWizardを使わないが、AppWizardの解説も少しある。
963デフォルトの名無しさん:2005/11/09(水) 12:28:43
>>962
賛成票を投じます。

964デフォルトの名無しさん:2005/11/09(水) 13:02:06
ウィザードでメッセージハンドラを追加したら
それがソースにどう反映されるかを見た方が
手っ取り早く勉強になったりするけどな。
965956:2005/11/09(水) 15:41:32
ありがとうございます

>>962>>963
参考にさせて頂きます

>>964
自分がやろうと思ってるのはちょっと定形外な事なので…
一応、ウィザードで作られるコードは十分理解しているつもりです
966デフォルトの名無しさん:2005/11/09(水) 16:29:22
>>964
それは二歩目ということで。
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-
968デフォルトの名無しさん:2005/11/10(木) 20:47:58
>>967
そうじゃなくて向こうのスレの人はこっちへ来いというのではなく、
「CAsyncSocketがMFCのだから.Netアプリで使うなよ」
と言ったかったのだと思う。
969デフォルトの名無しさん:2005/11/10(木) 21:17:54
Socketというそのものズバリのクラスがあるだろ。
970デフォルトの名無しさん:2005/11/11(金) 03:17:14
無いよ。馬鹿な香具師
971デフォルトの名無しさん:2005/11/11(金) 03:19:50
       /\
     /   \
      ̄|  | ̄
    ___|  |__
   / ⌒   ⌒ ::: \   |\
   | (●), 、(●)、  ̄ ̄  \
   |  ,,ノ(、_, )ヽ、,,    左を見ろ>              こっちは右だバカ!
   |  `トェェェェイ'   .:::::__  ./
   \ `ニニ´  .:::/    |/
 l_!!! ,、 ,..-ヽー'',,.. ' ノ`丶--'ー--、 -―--、 + +   +
 | ! !_!|i::::::::::`´ー''´:::::::::::::::::::|:::::::::::::::::::::,..、::`ヽ  +     +
 .! ', ,|!::::::::::::::::::::::::::::::::::::::::::ヽ/---‐'´`\::::\   +
  !、_,イ:::ヽ::::::::::::::::::::::├┤:::/::|        \:::ヽ、_
  ',::::::',::::::|ヽ::::::::::::::::::::::::::::/:::::::l
972デフォルトの名無しさん:2005/11/12(土) 09:15:53
質問です
某アプリのプラグインをmfcで作ろうと思っています
その仕様を見ると最初にCreateProc()というコールバック関数の中で
ウィンドウを作成して、そのウィンドウハンドルを本体側に返さないといけないのですが
いつものようにウィンドウを作ると、内部のCWinApp::Run()で処理がループしてしまうので
返り値を本体側に渡す事が出来ません
どのようにしたら解決出来るでしょうか?
973デフォルトの名無しさん:2005/11/12(土) 09:28:12
age
974デフォルトの名無しさん:2005/11/12(土) 09:28:21
mfcを使わなければいい
975デフォルトの名無しさん:2005/11/12(土) 11:11:08
>>972
何のアプリか書いたら検証できるのに、頭が残念なやつだ。
976デフォルトの名無しさん:2005/11/12(土) 11:32:46
CWinAppでウインドウ作らなきゃいいし、
コールバック関数も使えるだろ
977デフォルトの名無しさん:2005/11/12(土) 11:45:42
>>972
Sleipnir1のパネルプラグインです。ごめんなさい

>>976
CWinApp以外でウィンドウを作る方法があるという事でしょうか。
イレギュラーな方法でなければ教えていただけると幸いです。
978975: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 に書く。
979デフォルトの名無しさん:2005/11/12(土) 22:48:29
>>978
うわ、助かります
ちょっと今から試してみます
980デフォルトの名無しさん:2005/11/13(日) 06:10:16
>>978
それで上手く行きました。ありがとうございました

ところでドキュメント/ビューを使うなら結局CWinAppを使うしかないのでしょうか
CHtmlViewを使いたいのですが、また詰まってます…
981デフォルトの名無しさん:2005/11/13(日) 06:18:06
SDK使ったほうが簡単ですよ
982デフォルトの名無しさん:2005/11/13(日) 06:52:23
CHtmlViewではなくて、ブラウザのような物を作ろうとするとWebBrowserControlを使う必要があって、
ATL/WTLを使うことになりますよね?(間違ってたらすいません)
そっちのほうが楽でしょうか?
いずれにしても、自分の力では何をやっても厳しいのは痛感しております
指針となるような情報を頂けると幸いです…orz
983デフォルトの名無しさん:2005/11/13(日) 09:49:49
>>982
Viewの基本クラスをCViewからCHtmlViewに変えれば出来るだろ。
984デフォルトの名無しさん:2005/11/13(日) 11:13:43
>>982
その程度が分からないなら、素直にCHtmlView使っとけ。
CHtmlViewの方がはるかに楽だ。
わからずにATL/WTLに特攻してもぐちゃぐちゃになるだけ。
985デフォルトの名無しさん:2005/11/13(日) 13:10:04
報告です。起動した後に
>Warning: Creating a pane with no CDocument.
>Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND
>Sleipnir.exe の 0x7c81eb33 で初回の例外が発生しました : Microsoft C++ exception: COleException @ 0x0012d0e0。
のように何だか分らない例外が投げられてますが(これまずいんですかね)、一応動くようにはなりました。
助けてくださった方々に感謝m(_ _)m
986975:2005/11/13(日) 15:32:48
>>972=>>980=>>982=>>985
勉強不足だな。CHtmlView使うのなら、
ウィザードが作ったスケルトンを見ながらDoc-Viewの仕組みを勉強しろ。
CView系はCDocument系と対で使うもの。
987985: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というイテレーターを使わずに読む方法ありますか?
989デフォルトの名無しさん:2005/11/14(月) 15:17:26
GetHead/GetTail
990デフォルトの名無しさん:2005/11/14(月) 15:24:50
サンクス。

でも、配列のIndexで取れないの?
991デフォルトの名無しさん:2005/11/14(月) 15:30:42
>>990
GetAt()はあるね。
まぁ、CObjectの派生クラスを使おうとしてしまった自分自身を呪うがいい。
992990:2005/11/14(月) 15:33:27
GetAtの引数はPOSITIONみたい...

>>991
CStringListライクで、CObject系以外のものがあるってこと?
993デフォルトの名無しさん:2005/11/14(月) 15:35:19
FindIndexとGetAtでいいじゃん。
なんでそんなにPOSITIONを忌み嫌う。

おれは嫌いだが。
994デフォルトの名無しさん:2005/11/14(月) 15:36:24
>>990
CArray<CString,CString&> なら GetAt(nIndex) できる。
995990:2005/11/14(月) 15:38:18
じゃ、これからCStringListにオサラバして、CArray使う系な人になりまつ。
996990:2005/11/14(月) 15:41:12
CArrayの使い方をググってみたら、CStringArrayってのもあるのか。
MFCってワケワカメ。
997デフォルトの名無しさん:2005/11/14(月) 15:46:37
なんだよ、既存のソースでCXXList使ってるのかと思ったら、
わかんなくてList使っちゃっただけか?
998994:2005/11/14(月) 15:48:28
>>990
CArray系とCList系は直交性がないから
最初にどっちにするかちゃんと決めておかないと後で直すのが面倒。
999990:2005/11/14(月) 15:49:26
既存ソースには、CStringListもCArrayもCStringArrayもなくてビクーリでつ。

自分、BCB/TStringList使ってたから、配列参照が欲しくて。
TStringListだとそれに対するNamesとかParamsとかでini形式の左右が取れたり便利だお。
1000990:2005/11/14(月) 15:49:54
>>998
どっちが良い?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。