トップページ⇒tech
1001コメント288KB

■MFC相談室 mfc13d.dll■

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん05/03/07 16:19:56
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/

過去ログは >>2-5 の辺り。
0809デフォルトの名無しさん2005/06/25(土) 02:01:20
もうねぇ(VC6)

// 三次元配列
list<list<list<int> > > stl;// OK..スッキリ
CArray<CArray<CArray<int, int&>, CArray<int, int&>&>, CArray<CArray<int, int&>, CArray<int, int&>&>&> mfc; //OK 込み入ってるし読めない
CList<CList<int, int&>, CList<int, int&>&> bad; // NG コンパイルすら通らない

これって嫌気が差したスレに書くべきかもしれないけど、MFCを妄信してる実装担当が回りに多くて
激しく鬱になって・・・
0810デフォルトの名無しさん2005/06/25(土) 02:09:10
恐ろしいコードだな。
0811デフォルトの名無しさん2005/06/25(土) 02:49:18
Document-View構造を使ってビットマップを表示させたいのですが、
SelectObjectでビットマップを表示させる場合
一つのビットマップしま表示できないです。

複数のビットマップを表示するにはどうすればよいのでしょうううか
0812デフォルトの名無しさん2005/06/25(土) 08:35:08
>>811
複数のCBitmapを用意しろ

とりあえず、ソースどんなん?
0813デフォルトの名無しさん2005/06/25(土) 22:47:29
HBITMAP bmpOUTPUT;
HBITMAP bmpAAA, bmpBBB, bmpCCC;

を宣言して、場合によって bmpOUTPUT = bmpAAA; とか
bmpOUTPUT = bmpBBB; とかして、
その直後に this->UpdateAllViews( NULL, 0, NULL ); すればよい。

CView の OnDraw では
SelectObject( hdcBMPOUTPUT, bmpOUTPUT );
BitBlt( hdcWindow, ...., hdcBMPOUTPUT, SRCCOPY );
しておくだけでいい。

bmpAAA と bmpBBB と bmpCCC の実体は必要だが、
bmpOUTPUT は画像選択出力用ポインタとして使う。
実行中に bmpOUTPUT が「ぬるぽ」だったら OnDraw を脱出すればよい。

フラグとしてグローバル変数を用意して OnDraw 内で、
bmpAAA と bmpBBB と bmpCCC の switch をする方法もあるが、
なんかシロウトっぽくてイヤだ。
0814デフォルトの名無しさん2005/06/26(日) 16:27:16
うわあ、シロウトだ。
0815デフォルトの名無しさん2005/06/27(月) 14:21:41
>>808
リソース内の値を書き換えたのでは。
0816デフォルトの名無しさん2005/06/27(月) 15:52:12
MFCでよい書籍を教えてください。

開発環境:VS.NET 2003
0817デフォルトの名無しさん2005/06/27(月) 18:11:39
ここ数年はMFCの新刊なんてほとんど出てないんじゃない?
書店でも全然見かけなくなったし
0818デフォルトの名無しさん2005/06/27(月) 18:21:58
VC6の時に出てたMFCの本は?
標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング Programmer’s SELECTION
0819デフォルトの名無しさん2005/06/27(月) 19:07:45
>>818
まともなMFC本と言ったらそれくらいかね
0820デフォルトの名無しさん2005/06/27(月) 19:53:00
MFCを使ってDllを作成しています。

呼び出し側からDllが呼び出されるとDll内でダイアログを表示したいのですが、
色々調べてDLL側で以下のようにプログラムしています。

AFX_MANAGE_STATE(AfxGetStaticModuleState());

Tdlg *pDlg;
pDlg = new Tdlg;

pDlg->Create(IDD_DIALOG1,CWnd::GetDesktopWindow() );
pDlg->ShowWindow(SW_SHOW);

しかし、このようにすると確かに表示はされるのですが、ダイアログがアクティブに
なりません。(ダイアログの上の青い部分が薄いまま) マウスでなんとか移動はで
きるのですが、アクティブになってスムーズに移動することはできません。何が原因
なのでしょうか?
0821デフォルトの名無しさん2005/06/27(月) 20:33:18
pDlg->Create(IDD_DIALOG1,NULL);
0822デフォルトの名無しさん2005/06/27(月) 23:36:28
>>820
親がデスクトップなので、デスクトップが非アクティブになると
ダイアログも非アクティブになるという動作です。

親をdllを呼び出している側のメインウィンドウ(?)にして
アクティブとかそこらへんの関係を適切にしたいなら、
dll の関数に親ウィンドウの HWND を渡してもらうか、
メインウィンドウらしきものを自力で探すしかないです。
0823デフォルトの名無しさん2005/06/28(火) 11:23:30
>>820
pDlg->Create(IDD_DIALOG1,::GetDesktopWindow() ); でもだめ?
0824デフォルトの名無しさん2005/06/28(火) 14:03:57
>823

pDlg->Create(IDD_DIALOG1,::GetDesktopWindow() );
はビルド時にエラーが出ます。

>822
なるほど分かりました。もとは親のハンドルを受け取るようにしていたのですが、それだとうまく
表示されなかったので親をデスクトップにしてみたのです。
親のハンドルに設定していると子ダイアログが親ウィンドウ内に表示され
てしまったり画像が移ってしまったりとうまく描画できなかったのでしか
たなく親をデスクトップにしてみたのですが。
0825デフォルトの名無しさん2005/06/28(火) 15:10:26
MFCの質問かどうか迷うのですが、
異なるようでしたら適切な場所を教えてください。

MFC拡張DLLにて namespace ごと
クラスをエクスポートしたいのですが
正しい方法がわかりません。

// 策 1
namespace hoge {
  class AFX_EXT_CLASS CHoge{
    // いろいろ
  };
}

// 策 2
namespace hoge{
  class CHoge;
}

class AFX_EXT_CLASS hoge::CHoge{
  // いろいろ
};


1,2 ともにDLLプロジェクトはコンパイルが通るのですが
他のプロジェクトで使おうとすると
> fuga.cpp(xxx): error C2653: 'hoge'' : 識別子がクラス名でも名前空間名でもありません。
とのエラーが出ます。
MFC拡張DLLにて名前空間をエクスポート可能なのでしょうか。
可能でしたら方法を教えていただけないでしょうか。
0826デフォルトの名無しさん2005/06/28(火) 15:58:44
名前空間てダイナミックにできちゃうのか?プリプロッセッサがあぼんするんじゃ
0827デフォルトの名無しさん2005/06/28(火) 16:34:05
>>825
使う側にもこれは書かないとだめじゃない?
namespace hoge{
  class CHoge;
}
0828デフォルトの名無しさん2005/06/28(火) 18:24:20
使う側はヘッダファイルを#includeしてるので
書いてるのと同じ状態です。
インテリセンスでの補完も働くようです。

しかしコンパイル通らず、、、

名前空間 jp::somewhere のクラス CComoplex と
名前空間無しのクラス CSimple のコンストラクタ(多分)は

??0CComplex@somewhere@jp@@QAE@XZ
??0CSimple@@QAE@XZ

上記のような名前付けになっていて、@の被る位置の判断とかがアレなのかな。
0829デフォルトの名無しさん2005/06/28(火) 18:41:37
>>828
>> fuga.cpp(xxx): error C2653: 'hoge'' : 識別子がクラス名でも名前空間名でもありません。

このエラーはどう見てもそんな高尚な話ではなく、単なる文法違反なわけで。
なにかのポカミスだと思います。
0830デフォルトの名無しさん2005/06/28(火) 21:11:01
>>824
> 親のハンドルに設定していると子ダイアログが親ウィンドウ内に表示され
WS_CHILD が指定されているとこうなるよ。
0831デフォルトの名無しさん2005/06/28(火) 23:01:08
CListCtrlのCtrl+Shiftクリックに対するデフォルトの選択方式を
Ctrlクリックと同じ選択方式に変更する方法はあるのでしょうか?
0832デフォルトの名無しさん2005/06/29(水) 06:11:54
いまのモニターの状況を取得する関数ないでしょうか?
Printscreenみたいな感じのものです。
0833デフォルトの名無しさん2005/06/29(水) 10:35:47
画面をキャプチャしたいんなら、デスクトップのDCを取得してメモリDCなりにBitBlt。
0834デフォルトの名無しさん2005/06/29(水) 19:12:20
時分秒を数字で表示するだけの時計プログラムなのに動かないの
最初に1回表示されるけどあと全然更新されない
Timer関数は動いてるみたいだけどデバッグで追いかけてると
現在の場所のソース コードを表示できません。とか言われて進まなくなる

↓OnPaintとOnTimerで呼び出してる。描画関数はこれで合ってる?
void CMainWnd::DrawClock()
{
  CRect rect;
  GetClientRect(&rect);

  CString string;
  string.Format(_T("%2d:%2d:%2d"), tmOldTime.GetHour(), tmOldTime.GetMinute(), tmOldTime.GetSecond());

  CPaintDC dc(this);
  dc.DrawText(string, -1, &rect, DT_SINGLELINE);
}
0835デフォルトの名無しさん2005/06/29(水) 19:31:28
>>834
OnTimer() では Invalidate() するだけでいいんじゃ?
08368342005/06/29(水) 19:37:21
やってみたけど変わらなかった
昼からずっと 9: 0: 0のまま
0837デフォルトの名無しさん2005/06/29(水) 20:05:31
CClientDC dc(this);
0838デフォルトの名無しさん2005/06/29(水) 20:08:52
>>834
tmOldTimeはどこで更新している?
見たところ、0のままで1970/1/1 9:0:0を指しているような気がするのだけれど。
08398342005/06/29(水) 21:48:12
>>837
数字は進まないけど画面がチラつくようになった

>>838
コンストラクタで0にしてTimer関数で更新してる
afx_msg void CMainWnd::OnTimer(UINT ID)
{
  CTime tmCurTime;
  tmCurTime.GetCurrentTime();

  if (tmOldTime == tmCurTime) {
    return;
  }

  tmOldTime = tmCurTime;
  DrawClock();
}
0840デフォルトの名無しさん2005/06/29(水) 22:01:26
>>839

すげぇ素朴な疑問なんだが、何故tmOldTimeとtmCurTimeの二つの
変数を用意する必要があるのだ?
呼び出し側では

CTime tmCurTime = CTime::GetCurrentTime();
DrawClock(tmCurTime);

としておき、DrawClock側では

void CMainWnd::DrawClock(const CTime& now)
{
CClientDC dc(this);
CRect rect;

GetClientRect(&rect);

CString str;
str.Format(_T("%2d:%2d:%2d"),now.GetHour(),now.GetMinute(),now.GetSecond());
dc.DrawText(str,-1,&rect,DT_SINGLELINE);
}

じゃ駄目なのか?
08418342005/06/29(水) 22:26:02
駄目も何も思いつかなかったんだもん
やっぱり 9: 0: 0で止まってチラつくだけだった
0842デフォルトの名無しさん2005/06/29(水) 22:58:18
>>841

デバッグモードにしてる?
リリースモードでもデバッグ情報を埋め込むことはできるが、煩雑?なので。
08438342005/06/29(水) 23:11:43
勿論
0844デフォルトの名無しさん2005/06/29(水) 23:32:49
tmCurTime.GetCurrentTime();ってやっても、tmCurTimeには現在時刻は代入されない希ガス。
CTime tmCurTime = CTime::GetCurrentTime();
0845デフォルトの名無しさん2005/06/29(水) 23:34:16
>>844
俺も今同じこと書こうとした。
CTime::GetCurrentTime()はスタティック関数だな。
08468342005/06/29(水) 23:44:13
おお!動いた!
なんでtmCurTime.GetCurrentTime()はダメなの?
0847デフォルトの名無しさん2005/06/29(水) 23:45:44
C++の勉強をやりなおしましょう
0848デフォルトの名無しさん2005/06/30(木) 00:19:05
MSDNくらい読もうや。
CTimeクラスの説明で、GetCurrentTime()は静的関数とあるぞ。
0849デフォルトの名無しさん2005/06/30(木) 08:23:51
だから静的関数だったら何なの?
08508382005/06/30(木) 08:46:46
>>849
つまりそれは、クラスの名前空間に束縛されている只の静的関数。
メンバが更新されるのではなく、戻り値として戻されるだけ。
08518342005/06/30(木) 09:21:27
全く以て意味不明
time.GetCurrentTime()とCTime::GetCurrentTime()はどう違うの?
どっちも現在時刻を取得する関数じゃないの?
0852デフォルトの名無しさん2005/06/30(木) 09:25:39
>>851
これだけ書かれても、それ以上自分で調べることもしないで思考停止に陥ってるなら
プログラミングなんて止めて自動販売機の空き缶いれでも探ってる方がいいよ。
0853デフォルトの名無しさん2005/06/30(木) 09:36:08
>>851
2つとも同じだ。同じなので>839は↓これと同じだ。 tmCurTime に値が入るわけ無いだろ。
afx_msg void CMainWnd::OnTimer(UINT ID)
{
  CTime tmCurTime;
  CTime::GetCurrentTime();
08548342005/06/30(木) 09:41:39
ああなるほど
現在時刻を取得したけどそれをどこにも代入してなかったわけだ
よくわかったありがとう
0855デフォルトの名無しさん2005/06/30(木) 09:43:44
>>854
これぐらいドキュメント見てわかるようになれよ。
08568342005/06/30(木) 09:45:29
がんばる
静的メンバ関数はもう間違えない
0857デフォルトの名無しさん2005/06/30(木) 11:45:15
静的メンバ関数を普通のメンバ関数のように time.GetCurrentTime() で
呼び出せてしまうC++の文法は個人的にあまり好きじゃない。
thisポインタが渡されるわけじゃないのに紛らわしい。
0858デフォルトの名無しさん2005/06/30(木) 19:58:11
ダイアログに2つリストコントロール(Aリスト、Bリスト)を置いて、
両方に「OnNMClickList」ハンドラを割り当てているのですが、
Aリストの項目をクリックした後、Bリストの空白の場所をクリックしても
OnNMClickListが呼ばれず、再度クリックすると呼ばれます。

1クリックでBリストのOnNMClickListを呼び出す方法ってないですか?

メニューからこのダイアログを呼び出したとき、どちらのリストも最初の
1クリックでちゃんとOnNMClickListが呼ばれます。
このことから、おそらく原因はAリストをクリックしたときに取得した項目が
Bリストをクリックしたときにもまだ選択状態にあるという点だと思うのですが。
そこで、

AList.SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED)

を使って選択解除の方法を試しているのですが、うまくいきません。
どなたかご指導お願します。環境はVC++.NET2003です
0859デフォルトの名無しさん2005/06/30(木) 20:37:26
試してみたが、クリックする時のマウスボタン押し下げの
動作がうまく伝わらないみたいだね。クリックはマウスボタンを
押して上げるという動作だからCListCtrlの派生クラスを
作ってWM_L(R)BUTTONDOWNのメッセージを処理すればうまく行く。
ただ、この時はマウスポインタを動かすとドラッグ操作みたいに
四角い枠が出てしまうことがあるので、その派生クラスの中で
適切に処置してあげないといけない。
0860デフォルトの名無しさん2005/06/30(木) 21:30:11
ありがとうございました
0861デフォルトの名無しさん2005/06/30(木) 22:18:41
DeleteAllItems()の後に再度InsertItem()を行うと
何も表示されなくなります。解決法ありませんか?
0862デフォルトの名無しさん2005/06/30(木) 22:49:28
>>861
ListCtrlですか?

InsertItem()する前に構造体のアイテムとサブアイテムに正しく番号
ふっておかないと表示されないです。
アイテム:0 サブアイテム:0 のときはInsertItem()、
アイテム:0 サブアイテム:1〜のときはSetItem()、
で入れないと正しく表示されません。この辺は大丈夫ですか?
0863デフォルトの名無しさん2005/06/30(木) 23:45:27
>>862
CTreeCtrlです。
書いたつもりが書いてませんでした。
0864デフォルトの名無しさん2005/07/01(金) 01:44:42
.NETをつい最近使い出しました。

VC6 のMFCクラスウィザートのように、自分の作ったクラスのオブジェクトに対し、
メッセージや変数を追加したいのですが、どうも見つかりません。
関数のオーバーライドや、ダイアログコントロールに対して変数を設定するのに
重宝していたのですが・・・
友人から本体部分だけ貰ったんで、MSDNがないんです。^^;
サイトのMSDNで調べても要領を得ないんで、こちらに来てみました。よろしくお願いします。

Visual Stdio .NET 2003
VC++ .NET 7 です
0865デフォルトの名無しさん2005/07/01(金) 02:02:04
クラスのプロパティから行ってください
0866デフォルトの名無しさん2005/07/01(金) 02:05:31
>>864
http://www.microsoft.com/japan/msdn/library/ja/vccore/html/vcgrfWhereIsClassWizardInVisualCNET.asp
08675752005/07/01(金) 02:07:31
865さん、速攻のRESありがとうございます。
無事、オーバーライドできました。
0868864,8672005/07/01(金) 02:16:05
嬉しさのあまり名前欄の番号間違えてるし・・・しかも全然違う orz
>866さん、リンクありがとうございます。私の探し方が甘すぎの模様です。
0869デフォルトの名無しさん2005/07/01(金) 17:23:56
>>859
858です。
問題はリストコントロールのプロパティで「フォーカスを持たないときでも
項目を選択」みたいなやつをTRUE(リストとフォーカスの関係を無視する)
にすることで解決しました。フォーカスの存在は盲点でした。
リストのOnNMClickListイベントは自分自身のフォーカスを持ってないと反応
しないらしく、2度クリックしないと反応しない原因は、1度目のクリックで
リストのフォーカスを取得。2度目のクリックでOnNMClickList反応という流れ
のようです。ですので↑にあるプロパティ項目の変更で、1クリックで
直接OnNMClickListようにする必要があるみたいです。

この変更をした場合、以前に選択した項目が薄いグレーで見えてしまうので、
必要ないときは
SetItemState( -1, 0, LVNI_SELECTED );//選択項目(グレーの部分)を解除
SetItemState( -1, 0, LVNI_FOCUSED );//選択項目(点線の枠)を解除
をすることで、処理できます。
ひとつ勉強になりました。ありがとうございました。
0870デフォルトの名無しさん2005/07/01(金) 19:26:08
ODBC接続で

RCS.Open( CSimDBAc::snapshot,
 _T( "select * from table where POINT > 50"),CRecordset::readOnly );
とした後GetRecordCount()でレコード数を受け取ろうとしたのですが、
POINT>50 であるレコードはいくつもあるのに1が帰ってきます。これは
なぜなのでしょうか?
0871デフォルトの名無しさん2005/07/01(金) 19:38:15
末尾のレコードに移動してカウント
だめならSQLをちがうのにかえてみる。
0872デフォルトの名無しさん2005/07/01(金) 19:51:01
>871
どうやって末尾にいどうすればいいのですか?
0873デフォルトの名無しさん2005/07/01(金) 20:01:44
ムーヴラスト
0874デフォルトの名無しさん2005/07/01(金) 20:03:57
まぁこのあたり
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_crecordset_class_members.asp
0875デフォルトの名無しさん2005/07/01(金) 20:05:18
ムーブラストでも駄目でした。
0876デフォルトの名無しさん2005/07/01(金) 20:42:32
↓MSDN
MoveLast 関数を呼び出してもレコード数は更新されません。
ユーザーが独自にレコード数を数えるには、IsEOF が 0 以外を返すまで
MoveNext を繰り返し呼び出します。
0877デフォルトの名無しさん2005/07/01(金) 20:56:31
あれ? CRecordsetはそうだったのか。
MoveNextなんか繰り返し呼んでると、場合(DBMSとかレコードセットの種類とか)によっては
ものすごく時間がかかるので、count(MFCじゃないぞ)でも使った方がいいな。
0878デフォルトの名無しさん2005/07/01(金) 21:04:27
>876

あなたの言うとうりでした。
解決しました
0879デフォルトの名無しさん2005/07/01(金) 23:24:29
theAppを直接使うのはイケナイ子のすることですか?
0880デフォルトの名無しさん2005/07/02(土) 02:28:43
>>879

イケナイ子かどうかは判らん。
でも大抵AfxGetApp()で間に合ってる。おいらの場合。
0881デフォルトの名無しさん2005/07/02(土) 03:38:18
>>879
theAppを直接使うのは泣きべそで弱虫のするすることだ。
0882デフォルトの名無しさん2005/07/03(日) 14:39:27
リソースエディタでダイアログを作ったのですが、
その後モードレスダイアログとして表示させようとして、以下のようにしたら
アプリケーションがエラーを起こします。

なぜなのでしょうか。

CProgressDlg prgDlg;
prgDlg.Create(CProgressDlg::IDD, NULL);
CProgressCtrl* pPrgCtrl=(CProgressCtrl*)prgDlg.GetDlgItem(IDC_STATIC);
CStatic* pStc=(CStatic*)prgDlg.GetDlgItem(IDC_STATIC);
pStc->SetWindowText("aaa"); ←ここでエラー

DoModalでないと、ダイアログ内部のコントロールは自動的に作られず、こちら側でCreateしないといけないということでしょうか?
0883デフォルトの名無しさん2005/07/03(日) 15:00:15
yes
08848322005/07/03(日) 15:10:15
それだと、リソースダイアログの場合、モードレスではコントロールを配置させる意味が無いんですね。
あくまでリソースダイアログはモーダルのときのみと。
0885デフォルトの名無しさん2005/07/03(日) 15:14:54
CProgressDlg* prgDlg=new CProgressDlg();
prgDlg->Create(IDD_DIALOG1, NULL);
CProgressCtrl* pPrgCtrl=(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_STATIC));
CStatic* pStc=(CStatic*)(prgDlg->GetDlgItem(IDC_STATIC));
pStc->SetWindowText("aaa");
0886デフォルトの名無しさん2005/07/03(日) 15:23:38
>>882
IDC_STATIC が重複してるだけ。
各 control にちゃんと固有の ID 付けること。
当然 dialog resource template で作って modeless で動く。
08878322005/07/03(日) 15:26:13
>>885
それでも例外になりました。

ちなみに、
CProgressCtrl* pPrgCtrl=(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_STATIC));
は
CProgressCtrl* pPrgCtrl=(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_PROGRESS1));
と修正します。
すいませんでした。

(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_PROGRESS1));で返ってくる値がNULLなので。
0888デフォルトの名無しさん2005/07/03(日) 15:27:12
>>882
それから 885 の指摘は prgDlg object の寿命のことを言っている。
modal じゃないのだから function 内の寿命ではダメだ。
modeless なら 885 のように free store 内に作るか、static な寿命にすること。
08898322005/07/03(日) 15:29:01
>>886
失礼しました。
(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_PROGRESS1));
で値のあるポインタが返ってきましたが、

(CStatic*)(prgDlg->GetDlgItem(IDC_STATIC));
では、まだNULLのままです。
IDC_STATICというIDも間違ってません。

いま現在のソースはこれです。
CSAPProgressDlg* prgDlg=new CSAPProgressDlg();
prgDlg->Create(IDD_PROGRESS,NULL);
CProgressCtrl* pPrgCtrl=(CProgressCtrl*)(prgDlg->GetDlgItem(IDC_PROGRESS1));
CStatic* pStc=(CStatic*)(prgDlg->GetDlgItem(IDC_STATIC));
pStc->SetWindowText("aaa");
0890デフォルトの名無しさん2005/07/03(日) 15:34:44
>>889
>(CStatic*)(prgDlg->GetDlgItem(IDC_STATIC));
>では、まだNULLのままです。
じゃあダメにきまってる。

>IDC_STATICというIDも間違ってません。
resource editor で IDC_STATIC じゃなくて何か固有の ID 作ること。
0891デフォルトの名無しさん2005/07/03(日) 15:35:14
Windowsプログラム実行時にシステムの表示可能色数の設定を調べる事はできるんでしょうか?
コントロールパネルの画面設定でやる256色とかHighColorとかTrueColorとかの現在の設定を知りたいんです。
スレ違いだったらゴメンなさい。
08928322005/07/03(日) 15:37:32
>>890
解決しました。
他のダイアログリソースとIDが重複していたみたいです。
他のダイアログリソースは同じ会社の人が作ったものでしたが、気がつきませんでした。

皆様、ありがとうございました。
08938822005/07/03(日) 15:38:07
832→882
0894デフォルトの名無しさん2005/07/03(日) 15:40:43
>>892
「IDC_STATIC」はデフォルト値として特別な意味を持ってるんだよ。
他のリソースと重複していることが問題の本質ではない。
08958822005/07/03(日) 15:44:45
>>894
そうなんですか。。。
IDはダイアログリソース単位での管理でいいんですね。
大変失礼しました&ありがとうございました。
0896デフォルトの名無しさん2005/07/03(日) 15:48:09
>>894
別に特別な意味はないでしょ。MFC が reserve してるだけで。
892 の問題は dialog control ID の重複であなく dialog ID の重複という
落ちだったらしいし。ほっとけばいい。
08978822005/07/03(日) 15:50:11
いえ、dialog control IDの重複でした。
IDC_STATIC以外は問題なかったので。
0898デフォルトの名無しさん2005/07/03(日) 15:51:25
>>896
IDC_STATICは編集できないって基本だろ
0899デフォルトの名無しさん2005/07/03(日) 15:57:25
ほっとけないよぉ〜♪
0900デフォルトの名無しさん2005/07/03(日) 15:59:45
>>897
>いえ、dialog control IDの重複でした。
>>892 で
>他のダイアログリソースとIDが重複していたみたいです。
て言うからさ。

しかし dialog control ID の重複なら >>889 で
>(CStatic*)(prgDlg->GetDlgItem(IDC_STATIC));
>では、まだNULLのままです。
てことはないだろう。意図した control は取れないが何か取れるはずだ。
0901デフォルトの名無しさん2005/07/03(日) 16:01:09
>>898
編集って何を指してる?
SetWindowText() はできるよ。
0902デフォルトの名無しさん2005/07/03(日) 16:04:47
NULLぽにSetWindowTextはできないだろ
0903デフォルトの名無しさん2005/07/03(日) 16:07:48
dialog 上に IDC_STATIC である dialog control が 1 つしかなければ
それを GetDlgItem(IDC_STATIC) で意図どおり取得できるし、
なおかつそれが static control だったら SetWindowText() もできる
って言ってるのさ。
0904デフォルトの名無しさん2005/07/04(月) 10:07:38
MFCでresource dialogを作ったのですが、
returnキーを押すとWM_CLOSEが飛ぶようで、returnキーを押してもWM_CLOSEが飛ばないようにするためには
どうすればいいのでしょうか?

よろしくお願いします。
0905デフォルトの名無しさん2005/07/04(月) 10:42:08
>>904
OnOKをoverrideしたmethod作って、実装は空にするとか。
Escapeで閉じないようにするには、OnCancelに同じ事を。

タイトルバーの×ボタンを押したらダイアログを閉じるようにするには、
WM_CLOSEメッセージを捕まえたOnCloseハンドラで、CloseDialogとか
呼べばOKだったような希ガス
0906デフォルトの名無しさん2005/07/04(月) 10:42:29
エディットボックスのIME制御ってどうやるのですか?

フォーカスをあわせると日本語入力のモードに切り替わるようにしたいのですが
0907デフォルトの名無しさん2005/07/04(月) 12:45:27
IMEのON/OFFはsetfocusのとき
ImmGetContext();
ImmSetOpenStatus(, TRUE);
killfocusのとき
ImmSetOpenStatus(, FALSE);
ImmReleaseContext();

日本語モードの制御は
ImmSetConversionStatus();
0908デフォルトの名無しさん2005/07/04(月) 22:11:20
>>904
Returnキーでダイアログが閉じるのは当たり前の挙動だけど、
それを敢えてそうさせたくない理由は?
レス数が900を超えています。1000を超えると表示できなくなるよ。