トップページ⇒tech
944コメント318KB

■ VisualC++(MFC限定)相談室 3■

■ このスレッドは過去ログ倉庫に格納されています
0001MFCNGNG
VC++.NETになったって、MFCも使う所存!
0153デフォルトの名無しさんNGNG
MFCでスケルトンで作成したWindowのビューの大きさを変更するにはどうしたら良いんですか?
最初は、フレームのクライアント領域一杯に合わせて作成されるみたいですけど
この大きさを変更したいのです。
0154デフォルトの名無しさんNGNG
treectrlの削除した時削除したアイテムの情報を取得したいんですがうまく逝きません

void xxxx::OnDeleteitemTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;//←クラスウィザードに憑いていたコード
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
TV_TIEM item=pNMTreeView->itemNew;//ここに情報が格納されると思ったけど駄目
*pResult = 0;
}


typedef struct _TV_ITEM { tvi
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPSTR pszText;
int cchTextMax;

int iImage;

int iSelectedImage;
int cChildren;
LPARAM lParam;
} TV_ITEM, FAR *LPTV_ITEM;

根本的に間違ってるのかな?
0155154NGNG
スマソ自分で勝手に勘違いしてました。上で問題ないです。
0156ともくんNGNG
HVITEM構造体のmaskのHDI_HEIGTHとHDI_WIDTHが同じ値(0x0001)であるため、
リストコントロールのヘッダーの高さが変更できません。
どうしたらいいんでしょう?
0157デフォルトの名無しさんNGNG
>>152
ダイアログユニット(DLU)
詳しくはGetDialogBaseUnitsとかのヘルプを見て下ちい。
0158デフォルトの名無しさんNGNG
CToolBarCtrl::EnableButton でツールバーのボタンを淡色表示したいのですが変化ありません。
戻り値は1です。
CToolBarCtrl::HideButton は非表示になります。

なぜCToolBarCtrl::EnableButtonで淡色表示にならないのでしょうか。
0159デフォルトの名無しさんNGNG
>>153
WM_SIZEを受け取って自前で大きさを変える。
ついでに WM_GETMINMAXINFO で検索してみたまい。
0160デフォルトの名無しさんNGNG
>>158
MFCには独自のやりかたがあるよ。
UPDATE_COMMAND_UIハンドラで
pCmdUI->Enable(FALSE);
してね。
0161デフォルトの名無しさんNGNG
>>158
ずばり前スレの
http://pc.2ch.net/test/read.cgi/tech/1008031675/783
に出てるんだけどな。
0162デフォルトの名無しさんNGNG
ダイアログベースのスケルトンで、

void CHogeDlg::OnPaint()
{
  if (IsIconic())
  {
  この部分

と、

// システムは、ユーザーが最小化ウィンドウをドラッグしている間、
// カーソルを表示するためにここを呼び出します。
HCURSOR CHogeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

の部分って、いつ呼ばれるんです? ダイアログを最小化しても呼ばれないみたいだし。
っていうか、何のためにあるのか分かりません。何で?
「最小化ウィンドウをドラッグ」ってどういうことですか?
0163デフォルトの名無しさんNGNG
勘違いしているかもしれないけど、
explorer以外のシェルを使うとわかるかも。l
0164デフォルトの名無しさんNGNG
>>162
俺はその部分削除してるけど問題ない
クラスウィザードから削除しましょう
0165デフォルトの名無しさんNGNG
>>162
NT3.51などのprogmanがシェルだったころの名残だろ。
http://www.microsoft.com/japan/support/kb/articles/J013/3/34.asp
0166162NGNG
>>163 >>164 >>165
納得です。
0167デフォルトの名無しさんNGNG
質問させてください。
ATL COM AppWizardで
MFCをサポートするようにしたんだけど
CRecordsetクラスから派生したODBCで外部DBにアクセスするクラスを生成しようとすると
CRecordsetが定義されていないとエラーが出ます。
#include <afxdb.h>としても
windows.h includedとかってエラーが出ちゃうんですが
解決策のヒントでもいいんでご教授お願いします。
0168デフォルトの名無しさんNGNG
エラーの内容くらい読め
嫁
夜目餘目
0169デフォルトの名無しさんNGNG
クラスの中のメンバーの持つ関数をオーバーライドするにはどうしたらよいのでしょうか?
たとえばmySocketクラスをCSocketを継承しないで作った場合、

class mySocket {
CArchive *m_paout;
CArchive *m_pain;
CSocketFile* m_psf;
CSocket *m_ps;
}
こんな感じにメンバーがいてソケットにデータを送った場合
データ変身があるとm_psのOnRecieveが呼び出されますよね?
このときのOnReceiveをmySocketクラスからオーバーライドするには
どうしたら良いのでしょうか?
0170デフォルトの名無しさんNGNG
なんのこっちゃ
0171デフォルトの名無しさんNGNG
CSocket *m_ps;
って書いてあるところにそのままCSocketを使うのではなく
CSocketから派生させたクラスを作って、そのクラスでオーバー
ライドするよ。普通は。
0172デフォルトの名無しさんNGNG
委譲ではオーバーライドはできない。
継承すれ。

class mySocket : public CSocket {
CArchive *m_paout;
CArchive *m_pain;
CSocketFile *m_pst;
void OnReceive(int);
};
0173デフォルトの名無しさんNGNG
http://techtips.belution.com/ja/vc/0056/

このページにのってる方法で、
MDIアプリケーションでのドキュメントのポインタを得ようとしているのですが、
(後半のサンプル)
CxxxDoc* pDoc = (CxxxDoc*)GetDocument(pView);
引数として指定するpViewをどのようにすべきかがわかりません。
そもそもViewへのポインタが得られていればそこからGetDocument
できるような気がしてしまうのですが・・・・・
0174デフォルトの名無しさんNGNG
>171,172

お二方、どうもありがとうございます。
無事解決しました。同じようなケースになることがたまにあるのですが、
それは設計が悪いのですね・・
CFormViewの中に設置したアイテム一つ一つの関数をオーバーライドしようとするときなどに
やっぱりこんな問題にぶつかります。
0175デフォルトの名無しさんNGNG
> そもそもViewへのポインタが得られていればそこからGetDocument
> できるような気がしてしまうのですが・・・・・

その Web ページちゃんと読んだ ?

> しかし、ビューをドキュメントに関連付けずに作成した場合などは、
> m_pDocument にドキュメントへのポインタは入っていません。
> したがって GetDocument() は使えないということになります。
> でも、どうしてもドキュメントへのポインタが必要なときがあります。

の時の話だよ。普通は、GetDocument() でいいんだよ。
0176173NGNG
>175
いえ、ビューの中から呼ぶのではなく別のところから
自分で作った新規クラスから呼びたいのです。
MDIですのでMAinView+MainDoc以外にも
いくつかのView+Docのくみあわせがあります。
その中で特定のDocを得ようとしているのですあ・・・

0177デフォルトの名無しさんNGNG
MDIのようなものをウィザードに頼らずに、ソース手書きで作りたいのですが、
どうすればよいかわかる方はおられますか?
そう、ちょうどタグブラウザのウィンドウシステムみたいにしたいのです。
0178 NGNG
vc++.netで、dllをリンクする項目がみあたりません。
以前の設定+リンクの項目ってどこへいったのでしょか。。
0179 NGNG
>178
ライブラリの設定なら、なくなったんじゃないかな。
指定しなくてもソースから自動でリンクをするようになってると思う。
0180デフォルトの名無しさんNGNG
CPropertySheetをDoModalで開いて
そのダイアログにサイズ変更枠をつけたいんだけど
どうすればいいのでしょう?
0181デフォルトの名無しさんNGNG
>>180
俺も前にやろうとしたけど・・・
無理だと思う・・・
0182デフォルトの名無しさんNGNG
サイズ変更枠をつけることはできる。
ただ、それをつかってサイズを変更できるかは
知らないけど。
0183173NGNG
すみません。もう少し一般的な質問に戻させてもらってよいでしょうか?
TreeViewを使ったプログラムなのですが、
ViewでもDocでもない
新規クラスをつくりDocのメンバ変数とします。
そしてそこから、Docの中身を変更したときに
TreeViewを再描画させたいのです。ですのでDocのポインタと取り
UpdateAllViewsするのがいいのだろうかと思ったのですが、
このようなケースの時はどのような方法がベストでしょうか・・?
0184デフォルトの名無しさんNGNG
>>177
ウィザードで作ったスケルトンのソースを見れば良いと思います。

>>183
> Docのポインタと取りUpdateAllViewsする
という方法がいいと思います。
0185173NGNG
>184
そうですか、やっぱりそこまでの方針は正しかったのですね・・・

強引にCMyCLassから
CMyCLass::Update(){
MainView* pView;
MainDoc * pD = (MainDoc*)GetDocument(pView);
pD->UpdateAllViews(pView);
}
こんな風にしてみましたが、だめでした・・
これは当然でしょうね・・・

↓この関数を呼びたいのですが・・・
CDocument* GetDocument(CView* pView)
{
// pAppにCWinApp オブジェクトへのポインタを取得
CWinApp* pApp= AfxGetApp();

// 最初のドキュメントテンプレートの位置を取得
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
while (posTemplate != NULL)
{
// ドキュメントテンプレートへのポインタを取得
CDocTemplate* pTemplate = pApp->GetNextDocTemplate(posTemplate);

// 最初のドキュメントの位置を取得
POSITION posDoc = pTemplate->GetFirstDocPosition();
while (posDoc != NULL)
{
// pDocにドキュメントへのポインタを設定
CDocument* pDoc = pTemplate->GetNextDoc(posDoc);

// 最初のビューの位置を取得
POSITION posView = pDoc->GetFirstViewPosition();
while (posView != NULL)
{
// pDocViewにビューへのポインタを設定
CView* pDocView = pDoc->GetNextView(posView);

// 取得できたビューが指定されたビューならpDocをリターン
if (pDocView == pView)
return pDoc;
}
}
}
return NULL;
}
0186デフォルトの名無しさんNGNG
GetActiveDocument( )は使えないかな?
0187173NGNG
>186
GetActiveDocumentはCFrameWndのメンバですよね。
こうなると今度はCFrameWndのとり方がわからなかったりします・・。
うーん結局問題は
自作クラスとMFCクラスとの連携かも・・・
自作クラスからMFCのViewクラス、Docクラス、Frameクラス
あたりのポインタを手に入れる方法がわかれば何とかなりそうなのですが・・
アプリケーション全体へのポインタならAfxGetApp()
で手に入れることができるのはわかるのですが・・・
しかし問題は自作クラスと、MFCクラスの連携にあるとすると、
メッセージハンドラを使った連携なども可能そうですね。
例えば自作クラスから任意のハンドラをアプリケーションに返したり
なんてことは出来るのでしょうか?
できるならWM_UPDATEを自作クラスから発信して
Viewクラスでそれを受けて更新処理をすればいいのではと思います。

0188デフォルトの名無しさんNGNG
CFrameWndはAfxGetMainWnd( )で取れます。
SendMessageもできますし、CMainFrameでキャストすれば
GetActiveDocumentできます。
0189173NGNG
>188
ありがとうございます。
だんだん核心に近づいてきたかんじです。
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
こんな感じでやってみました。
これでMainDocへのポインタを手に入れることが出来ました。
そして
pMd->UpdateAllViews(

しようとすると・・・・
UpdateAllViewsの第一引数pView pSenderが・・・・
入れるものがないです・・・。
Viewへのポインタが結局必要なのでしょうか・・・

SendMessageの方は
CWndから送れるようですので、
試してみます。
しかしWM_UPDATEってメッセージないんですね・・・
てっきりOnUpdateを呼ぶメッセージがあるきがしてたのですが・・・
0190デフォルトの名無しさんNGNG
とりあえず0でいいよ。
とりあえず0でいいよ。
とりあえず0でいいよ。
0191デフォルトの名無しさんNGNG
>>189
勘違いしてるようだけど、UpdateAllViewsの第一引数には
更新したいビューではなくて、更新したくないビューのポインタを入れる。
ビューを更新したいならNULLで。
0192180NGNG
>>181,182
レスどうもです
しょうがないのでCTabCtrl使って自作しました
0193173NGNG
190,191さん
どうもありがとうございます
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
pMd->UpdateAllViews(NULL);
このようにしたらコンパイルをちゃんととおり
よーし!っと思って実行すると
こんどはUpdateAllView関数内の
POSITION pos = GetFirstViewPosition();
ここでエラーが出ている模様・・・・・・。
これはいったい・・・・・
0194デフォルトの名無しさんNGNG
全然確認しないで発言するけど
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
pMf->GetActiveDocument()->UpdateAllViews(NULL);
もできないかな?
0195デフォルトの名無しさんNGNG
ファイル名、フォルダ名両方とも取得できるダイアログボックスってないですか?
ちなみに1度に複数選択できるようにしたいです。

フォルダ名が取得できなかったりして困っております。
0196173NGNG
>194
んーと、やっぱり同じ現象です。
どうやらGetActiveDocumentが
CMainFrame *pMf = (CMainFrame*)AfxGetMainWnd();
if (pMf == NULL){AfxMessageBox("error11");}
MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
if (pMd == NULL){AfxMessageBox("error12");}
pMd->UpdateAllViews(NULL);


結局"error12"とメッセージボックスが開き
GetActiveDocument()がエラーを返す模様。
んーよく考えたらMDIだから
メインフレーム→子フレーム→GetActiveDocument()としなきゃならないのかもしれませんね。
0197デフォルトの名無しさんNGNG
CFormView内にエディットボックスを配置しましたが、
内容更新時に垂直スクロールバーが表示される場合のみ、以前のテキストが消されずに残ってしまいます。
また、その内容をスクロールしても、テキストが残されたままスクロールされ、ゴミが残ります。
正常な処理を行うには、

m_edit1 = cNewData;
UpdateData(FALSE);

だけではだめなのでしょうか?

m_edit1 = "";

を挟んでみたのですが、結果は変わりませんでした。
テキストの量がエディットボックス内に収まる場合(スクロールバーが現れない場合)は正常に更新されます。
更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。
どうか、ご教示お願いします。

リソースエディタでは複数数行、垂直スクロール、改行を許可、境界線、にチェックを入れています。
初歩的な質問で申し訳ありません。よろしくお願いします。
0198デフォルトの名無しさんNGNG
>>196
MDIは作ったことないんだけど、
>MainDoc * pMd = (MainDoc*)pMf->GetActiveDocument();
は
MainDoc * pMd = (MainDoc*)(pMf->GetActiveDocument());
かなぁと。
あと、ドキュメントが複数あるようだけど、MainDocはアクティブになってるのかな??
0199をNGNG
>>197
>更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。

これの意味が良くわからないけど、とりあえず
UpdateWindow()とかInvalidate()とかしてみるのは堂でしょおう

0200197NGNG
>>199さん
ありがとうございます。
Invalidate()を使って更新時に正常に描写されるようになりました。
スクロール時にゴミが残るはまだ対処できていません。
OnCtlColor()でフォームビューの背景の色を変えていたのですが、この辺にも原因がありそうです。
こちらの方を、もう少し調べてみます。

>更新のタイミングは、メッセージパンドラは拾わず、手動で行っています。
説明下手で申し訳ありません。自分でも何を言っているのかわからなくなってしまいました。
0201173NGNG
>198
どうもそれでもダメなようです。

もう一度整理してみます
フレームの構成としては
CMainFrame→CChildFrame
     →CChildFrame2
となっており
それぞれCChildFrameにMainDoc+MainView
CCHildFrame2にSubDoc+SubView
となっています。
このとき自作クラスCMyClassからMainViewに再描画の命令を出したいのです。

この場合はCMainFrameではなく
CChildFrameへのポインタを手に入れ
そこからGetActiveDocumentすればいいのではないかと、考えています。
しかし親フレームから子フレームのポインタを手に入れる、
もしくはアプリケーション全体へのポインタから特定の子フレームの
ポインタを手に入れる方法がわからず悩んでいます。
0202デフォルトの名無しさんNGNG
>201
自作クラスから View/Doc/Frame へのポインタを手に入れようとするから複雑になる。
自作クラスに View/Doc/Frameが自分へのポインタを自己申告すれば良いんでは?(初期化のときとかに)

あとは、自作クラスからやりたい放題。
見当違いだったらゴメンね。
0203173NGNG
>202
ありがとうございます。なるほど発想の転換ですね。
自作クラスというのがサーバの情報をもつクラスなのですが、複数あり、
それがMainDocのメンバとなっています。
ですのでMainDocの関数の中から自作クラスのオブジェクトを作るときに
MyServer("www.***.com","80",this)//アドレス、ポート、MainDocへのポインタ
を渡してthisを
自作クラスのメンバpMainDocに代入したら、
pMainDoc->UpdateAllViews(NULL)で出来ました。
しかしこの場合、あるオブジェクトが自分を保持しているクラスの
ポインタがわからないから、あらかじめ教えてもらうという方法ですよね。

クラスA →メンバとして所持→ クラスB

という関係の場合AからBへのポインタはすぐ手に入りますが
BからAは難しいんですね。
0204173NGNG
すみません。もうひとつ質問してよろしいでしょうか?
MDIアプリケーションで
子ウインドウが一つ開いていて
そこからもう一つ別の種類の子ウインドウを開くときにはどうすべきでしょうか?

先ほどと同じなのですが
CMainViewもしくはDocから
ChildFrame2+SubDoc+SubViewの組み合わせを
一つ新たに開きたいのです。

これが出来ればMDIについてだいぶ使えるようになるかと思うのですが・・・
DocumentTemplateに新たな子ウインドウへのポインタを追加すると
起動時に二つ(もしくは複数)のウインドウから選ぶ画面が出ますよね。
あのとき選ばなかった方を動的に作り出したいのです。
0205173NGNG


ChatFrame *cFrm = new ChatFrame();
CRect cr = CRect(0,0,400,400);
cFrm->Create(NULL,"test",WS_OVERLAPPEDWINDOW,cr,(CMainFrame*)AfxGetMainWnd(),NULL);
cFrm->ShowWindow(SW_SHOW);

SubDocら強引にこんな感じで開いてみました。
すると
Warning: Creating a pane with no CDocument.
まあこれはエラーでるだろうな・・・と思ったのですが・・・
0206173NGNG
むう悩みまくって知恵熱が・・・

いろいろ試行錯誤してようやく問題が整理できました。
つまるところMainFrameのメニューからウインドウ→新しくウインドウを開くを
するとウインドウを開くことが出来ますよね。
これをボタンかなにかでそのボタンを押したら動的にウインドウが開く
といった風にしたいのです。結局新しくウインドウを開くメニューでは
ID_WINDOW_NEWメッセージを送っているようですが、
これでは開くべきドキュメントテンプレートが複数あるときに
それを選択できませんよね?

MfcによるWindowsプログラミングと新VisualC++6.0入門を持っていますが、
MDIアプリに関する情報って少ないんですね。需要が無いんでしょうか・・・
0207デフォルトの名無しさんNGNG
>>206
需要が無いわけじゃないんだろうが、よほどの事がないと今はMDIにしないな。
最近はSDI、ていうかもっとExplorerスタイルのスプリッタ画面が主流かも。
2chブラウザのギコナビとかもそうでしょ。
0208デフォルトの名無しさんNGNG
「MFCによるWindowsプログラミング」を持ってるならわかると思うが
MDIは推奨されてないってことになってるしな
0209173NGNG
>207,208
そうですね。確かに推奨されてないというのは知っていました。
しかし、代替えの方式として提案されているものの作り方がわからないんですよ・・
こちらも情報が無い・・
「MFCによるWINDOWSプログラミング」の688ページ
(持ってない人すみません)に載ってるワークブックモデルが理想に近いのですが
(タブブラウザのようなものを想定しています)
MDIが作れるようになったら、こっちへ移行して〜っと思っていたのですが、
最初からワークブックモデルを目指した方がいいのかな・・・
タブブラウザのようなワークブックモデルのアプリケーションの解説って何かありませんでしょうか?
今手元にある書籍「mfcによる〜」「新Visualc++6.0、ビギナー編、シニア編」
「VisualC BlackBook」
のどれにも記載が無いのです。
0210デフォルトの名無しさんNGNG
「MFCによる〜」で言えばP657に自分でコントロールビューを
作る例としてタブ付きビューの作り方がちょこっと出てる。
たしか「Best of MSDN magazine 下巻」だったと思うけど、
その本にはExcelのワークシート風のタブウィンドウの作り方が載ってたような。
「VisualC++5.0プログラミング入門」というVC++5.0LearnigEditionに
付いてきた本(市販もされてるはず)には複数View&複数DocのMDI
アプリケーションの作り方が出てる。

あとはCodeGuruやCodeProjectにサンプルがないかなぁ。
0211デフォルトの名無しさんNGNG
ダイアログやメニューのリソースだけを入れたDLLを用意して、DLLを切り替えること
によって多国語対応しているソフトありますよね?
これってどうやるんでしょうか?
一応外部DLLからダイアログを表示することはできたんですけどそのあとがわかりません。

CDialog dlg;
HINSTANCE hInst;
RSRC hDlgInit;

hInst = ::LoadLibrary("jpn.lng");
hDlgInit = ::FindResource(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),RT_DIALOG);
hResource = ::LoadResource(hInst, hDlgInit);

if (hResource != NULL)
{
LPDLGTEMPLATE lpTemplate;

lpTemplate = (LPDLGTEMPLATE)GlobalLock(hResource);
GlobalUnlock(hResource);
dlg.InitModalIndirect(lpTemplate);
}

dlgg.DoModal();

本当はCDialogクラスから派生したCAboutDlgでやりたいんですけど、InitModalIndirect()
呼び出したあとにASSERTでとまっちゃいます。
0212デフォルトの名無しさんNGNG
ChildFrame2+SubDoc+SubViewの組み合わせを登録したCDocTemplateのポインタを
適当なところ(CXXXApp::m_pSubDocTemplateとか)に保存しておけばいいんじゃないか。

で、適当なユーザ定義メッセージ(WM_APP_OPENFRAMEとかなんとか)を定義して、
そのハンドラ(CXXXApp::OnAppOpenFrame())で
m_pSubDocTemplate->OpenDocumentFile(NULL);
するって感じではどうか。
0213デフォルトの名無しさんNGNG
MFCの上でWinsockを使ってHTTP://へアクセスしたいんですけどどうすればいいでしょう?
一応、WinMain()からDosで扱うのは、解ったのですが、
MFCに入れると、スレッドが作成できなかったり、エラーが出てどうしようもありません。

0214デフォルトの名無しさんNGNG
>>209
タブブラウザは、ただタブコントロール使ってるだけじゃん。
何が難しいの?
タブコントロールの使い方が分からんの?
0215デフォルトの名無しさんNGNG
タブコントロールの議論ではなくて、MDIの議論ですよ。
0216デフォルトの名無しさんNGNG
MDIで、内側の子フォームをロードするときに、ダイアログボックスをロードすることって、できるんですかね。
0217デフォルトの名無しさんNGNG
そういやMFC7.0に新しいViewクラスって追加されたのかね。
0218デフォルトの名無しさんNGNG
MFCは7なの?
5,6どこいったよ!
0219デフォルトの名無しさんNGNG
CsplitterWndを使ったViewで
一つのDocに複数のViewがあるとき
GetDocumentでDocへのポインタをえるにはどうしたらいいのでしょう?
AppクラスのInitInstanceのRUNTIME_CLASS
ではViewを一個しか指定できないですよね。
0220173NGNG
>210
そのタブビューの作り方はやってみました。
でもそのタブの動的作成が難しそうだなあ・・と思って作っただけで放置してました。
もう一回チャレンジしてみます。

>212
ありがとうございます。
とりあえずその遣り方で解決しました。
0221デフォルトの名無しさんNGNG
正直、MDIで成功してるのはMSDEVか、Nifterm位なもん。
0222デフォルトの名無しさんNGNG
>>219
どのViewからGetDocument()しても、
Documentへのポインタは取得できますが・・・
0223173NGNG
やはりいろいろ難しいところがありますねMDIは。
結局TabViewでやることにしました。
まあタブビューも資料がそんなにあるわけではないですが、
とりあえず
Best of MSDN magazine 下巻
を買いにいきまっす。
基本的に不思議なのがタブビューは一つのビューですよね。
一つ一つのタブの中身を3分割してそれぞれにまた別のビューを割り当てる
ということがしたいのですが、その場合はビューの下にビューを作るということですよね。
そういうことは可能なのでしょうか?
うーーん。先は長そうだ・・・
0224デフォルトの名無しさんNGNG
>ビューの下にビュー
それはスプリッタウィンドウでいいのでは?
0225名無しさん@EmacsNGNG
>>211
コンストラクタでリソースID渡してない?
その時点でリソースロードしちゃってるんだと思う。
クラスウィザードに吐かせたクラスはそうなってるはずだから
手で消せばいいかと思う。遅レスごめん。
0226名無しさん@EmacsNGNG
>>211
>>225
追加。
CDialogから派生したクラスのコンストラクタで >>211の
ようなことをやるようにして、他のソースの"CDialog"を
作ったクラス名で全部置換すれば動くべ。
0227173NGNG
とりあえずいろいろ指向錯誤しまくりでまだMDIに挑戦中。
同じドキュメントテンプレートから生み出した複数Frameの区別って
どこでするものでしょう?
それと複数のフレームは単一のDocオブジェクトを参照すべきなんでしょうか?
それとも一つのフレームに付き1つのオブジェクトってのが自然なのかなあ・・・・
この辺のポリシーがわからないので、設計がめちゃくちゃになってきました・・・
0228デフォルトの名無しさんNGNG
MDIは今風のアプリ設計にはあわないぞ。

男らしく全部ダイアログですませ。
0229デフォルトの名無しさんNGNG
>>228
いや、MDI って発表された時から「糞」だの「吐き気がする」だの
散々叩かれてますが。
0230173NGNG
>227,229
ぐへー。やはりそうですか・・・
とりあえずタブブラウザのMoonBrowzerのようなアプリが目標なんです。
例えばMoon Browzerとかはタブブラウザですが、
タブじゃないですよね。こういうのはMDIから作るのかなと思ってるのですが、
ちがうのですか・・・??
0231デフォルトの名無しさんNGNG
うわ、レスついてる。遅レスなんてとんでもない、感謝感激です^^

早速、コンストラクでID渡してるところを削除しましたらASSERTでなくなりました。

CAboutDlg::CAboutDlg()// : CDialog(CAboutDlg::IDD); →ここをコメントにしました。
{
HINSTANCE hInst = ::LoadLibrary("JPN.lng");
HRSRC hDlgInit = ::FindResource(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), RT_DIALOG);
HGLOBAL hResource = ::LoadResource(hInst, hDlgInit);

if (hResource != NULL)
{
LPDLGTEMPLATE lpTemplate;
lpTemplate = (LPDLGTEMPLATE)GlobalLock(hResource);
GlobalUnlock(hResource);
InitModalIndirect(lpTemplate);
}else{
//jpn.lngがなかった場合、自前リソースを使用。
}

}

こうすると、ダイアログ呼ぶ方は何も変更しなくていいのでスッキリしますね。
で、ちょっとまだ検証中なんですが、外部リソースDLLがなかった場合自前の
リソースを利用するようににしたいと思ってます。

実は上のコードでも、FindResourceをNULLで呼ぶと自ファイルから検索するみたい
で、うまく機能します。
ただ、コメントにした" : CDialog(CAboutDlg::IDD)"を処理しなくていいのかは
もう少し調べてみます。

乱文失礼しました。
0232デフォルトの名無しさんNGNG
絵描き系とか音系のアプリにはMDI必須だと思うけどなあ。
ウィンドウパカパカ開くから、
SDIだとデスクトップや他のアプリのウィンドウが見えてしまって混乱する。
0233232NGNG
ついでに、一つの作業プラットホームとして成立しているソフトは
MDIにすべし、という説を提唱してみるテスト
そうでなければむやみにMDIにすべきではないミタイナー
0234デフォルトの名無しさんNGNG
プロパティシートにページを複数表示しているのですが、
タブを使用禁止にすることは出来るでしょうか?
シートのOnInitDialog()でGetPage(0)->EnableWindow(FALSE)
としてみたのですが、出来ませんでした。
何かいい方法はないでしょうか??
0235デフォルトの名無しさんNGNG
>>230
ん?タブじゃない?
あれはどう見てもタブだと思うが。
0236デフォルトの名無しさんNGNG
議題変えて悪いのですが、
C++(MFC)で作った実行ファイルの置いてあるディレクトリを取得
(自分のFullPathを取得)するのにはどうすればいいでしょう?
0237デフォルトの名無しさんNGNG
>>236
GetModuleFileName()
0238デフォルトの名無しさんNGNG
>232
同意。MDIが駄目かどうかはアプリのタイプによるから一概には言えない。

opera5は MDIだったが、なんか圧迫感があった。
(6になってSDI/MDI/タブが選べるようになったが)
ブラウザみたいに一つのウィンドウに多くの情報を提示するような
アプリだと MDIは向かないのかも。
0239デフォルトの名無しさんNGNG
EXCELがMDIなのはなんだかウザいよな
0240デフォルトの名無しさんNGNG
申し訳ないです。
GetModuleFileName()で実行するとエラーばかり出て、
MSDNを見てもいまいち解決しません。
実行している自分自身のパスを取得するサンプルか何か教えていただけないでしょうか?
0241デフォルトの名無しさんNGNG
>>240
http://search.acty-net.ne.jp/mfc_search/archive/1998-1/msg01541.html
0242デフォルトの名無しさんNGNG
>>241
有難うございます。助かりました!
0243デフォルトの名無しさんNGNG
>234
に追加です。
VBのTabEnabledのようなものがあればいいと思うのですが、
誰か知りませんか?
本当に困っているので、よろしくお願いします。
0244デフォルトの名無しさんNGNG
INI ファイルを読み込むときに、

CString t1;char cs[100];
GetPrivateProfileString("window", "width", "0", cs, 0, spath);
t1.Format("%s", cs);

こう書いたのですが、まともに読み取れません。
解決法を知っておられる方はおられますか?
0245デフォルトの名無しさんNGNG
>>244
nSize が0じゃ何も読めないと思うがどうか。
0246デフォルトの名無しさんNGNG
MDIと見せかけてツールバーをフローティング表示とか言ってみるテスト。

>>243
「最新Windowsプログラミングテクニック ワンポイント・レッスン」
て本の1069ページに出てる。
0247デフォルトの名無しさんNGNG
Cでの質問なのですが。。
ある文字列があって、その文字列の左からn番目の文字列を取得したいの
ですが、このような関数ってあります?
MSDN探しててもそれっぽい関数ないのですが・・・
0248デフォルトの名無しさんNGNG
文字列wchar_t *pで、n番目の文字は、p[n]
n番目からの文字列は、(n+p)
MultiByteCodeSet? 知らんね。
0249デフォルトの名無しさんNGNG
VC++のダイアログボックスなどコントロールのプロパティのダイアログあるじゃないですか。
あのように、ダイアログの外をクリックしたら自動的に消えるようにしたいのですが、
どうすればよいか知ってるかたおられますか?
0250デフォルトの名無しさんNGNG
なぜここでCの質問をするのかと問いたい
0251デフォルトの名無しさんNGNG
>>249
フォーカスが無くなると自分自身を破棄するとか?
0252173NGNG
>235
タブじゃないという言い方は変だったかもしれません、
プロパティとかに表示される耳のような部分がないので
そのように思ったのです、MoonBrowserのようなアプリは
MDIから作るのでしょうかSDIから作るのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています