■MFC相談室 mfc17d.dll■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/21(火) 10:38:31前スレ
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0002デフォルトの名無しさん
2006/11/21(火) 10:54:080003デフォルトの名無しさん
2006/11/21(火) 14:30:37>>1乙
0004デフォルトの名無しさん
2006/11/21(火) 23:02:46> 意外と使えるCMemFile
その CMemFileの内容を、ディスクに保存せずに、CHtmlView で
表示出来ないかなぁ。
0005デフォルトの名無しさん
2006/11/21(火) 23:38:42今SDIアプリケーションで開発しているのですが
メインフレームのタイトルが
xxxxx - xxxxxxxxxx
のようにハイフンがついております。
このハイフンを消すことは可能でしょうか?
0006デフォルトの名無しさん
2006/11/22(水) 00:11:42〜\n\n〜\n\n\n〜\n〜
となっていると思うけれど、このうちのどれかの〜がメインフレームのタイトルになっていて、そのハイフンを消せばタイトルからハイフン消える。
CHtmlView::GetHtmlDocumentでhtmlドキュメントのIDispatchを取得して、
IHTMLDocument2::writeで注入。
0009デフォルトの名無しさん
2006/11/22(水) 22:05:49できれば2、3冊くらい
0010デフォルトの名無しさん
2006/11/22(水) 22:58:590011デフォルトの名無しさん
2006/11/23(木) 02:55:20いや、そうは思わんけど・・・w
0012デフォルトの名無しさん
2006/11/23(木) 06:21:35↓
MFCのライブラリのソース読む
MFCはこれぐらいで十分
あとはwin32apiでもやった方がいい
0013デフォルトの名無しさん
2006/11/23(木) 15:28:54子画面の作成方法は分かったのですが、
それにダイアログのようにコントロールを貼り付ける方法が分かりません・・・
CFormViewを土台にクラスを作ると子画面にできないですし、
CMDIChildWndを土台にクラスを作るとコントロールが使えません
両方の良いとこ取りをしたようなクラスはありませんか?
もしくは子画面でコントロールを使う方法を知りませんか?
(上は標準作成の子画面ではなく自作するクラスの方の話です)
0014デフォルトの名無しさん
2006/11/23(木) 15:36:460015デフォルトの名無しさん
2006/11/23(木) 16:03:54色々と試してみたのですが無理でした
クラスの新規作成でCMDIChildWndを継承したクラスを作り、
グローバル関数でインスタンス生成して呼び出していますが、
表示されないですし、コントロールも貼り付けられませんです
0016デフォルトの名無しさん
2006/11/23(木) 16:36:100017デフォルトの名無しさん
2006/11/23(木) 16:41:34標準で作られる子画面ではなくてですか?
0018デフォルトの名無しさん
2006/11/23(木) 16:45:09初心者向けの入門書でも読んどけ
0019デフォルトの名無しさん
2006/11/23(木) 17:44:38通常はウィザードで選択したViewで表示を行い、特定のDocumentを扱う場合のみ
新しいView(FormView派生)で表示したいってことかな?
0021デフォルトの名無しさん
2006/11/23(木) 19:26:44任意のviewで表示できるけど
0022デフォルトの名無しさん
2006/11/23(木) 19:58:58FormViewのMDI子ウィンドウはウィザードで普通にできるけれど、
もしかして、スプリッタやろうとしてるんじゃないのかな?
それならウィザードじゃ、FormViewはじかれて、できない。
FormViewの派生自作し、CreateStaticでスプリッタ作らないと。
Doc2つ作ってそれぞれにDoc-View割り付ける方法もあるらしいけれど、
オーソドックスに行くなら、この例ならTreeViewをウィザード使ってDoc-View使って、FormViewはDoc-View使わず、他のクラスからのアクセスはFormViewのオブジェクト宣言。
002322
2006/11/23(木) 20:02:04作ってみればわかるけど、スクロールバーでボタンなどのコントロールが隠れたりして、
ありえないというか、まずチマタじゃ見ないFormになる。
蛇流ゆえに作っていくと色々とワナがあるよ。
002422
2006/11/23(木) 20:12:08CVIEWで作って、CMDIChildWndのハンドル取得して、オーナードローがいいよ。
DDX使えなくて、MFCの恩恵は使えないけど。
0025デフォルトの名無しさん
2006/11/23(木) 20:29:23{
m_button1.ShowWindow(SW_HIDE);
}
これにより、ボタン2を押すとボタン1は非表示状態になるのですが、
void CTestDlg::OnButton3()
{
m_button1.SetRedraw(FALSE);
m_button1.SetRedraw(TRUE);
m_button1.Invalidate();
}
としてボタン3を押すと、ボタン1が再び出てきてしまいます。
Invalidateだけだと出てきません。
SetRedrawって、SW_HIDEも勝手に戻してしまうものなのでしょうか?
これから作ろうとしているものは、
SetRedraw(FALSE)〜SetRedraw(TRUE)の間でいろいろ内部情報の更新をして、
その結果に合わせて表示状態も切り替えようとしているのですが、
非表示にしても、最後のSetRedraw(TRUE)で表示状態に戻ってしまいます…。
0026デフォルトの名無しさん
2006/11/23(木) 20:47:56非表示なものにSetRedraw()やInvalidate()をする意味は?
非表示の間は描画処理は必要ないでしょ。
0027デフォルトの名無しさん
2006/11/23(木) 20:48:11SetRedrawの実際の処理WM_SETREDRAWをMSDNで見ても何も書いてないね。
m_button1の表示状態見て処理するしかないんじゃない?
002825
2006/11/23(木) 21:30:17>>27
非表示なものにSetRedrawをするわけではなくて、
SetRedrawの最中に、更新結果によっては非表示にする
ということをやりたかったのです。
SetRedraw(FALSE)をした以上は、
最後は必ずSetRedraw(TRUE)を呼ばないとダメですよねぇ。
0029デフォルトの名無しさん
2006/11/23(木) 21:31:21this->SetRedraw(TRUE);
this->Invalidate();
もしくは
SetRedraw(FALSE);
SetRedraw(TRUE);
Invalidate();
にしたらうまくいったけど、なんでか分からん。
0030デフォルトの名無しさん
2006/11/23(木) 22:04:46いいんでしょうか?
誰か教えてください。
それと勉強できるホームページとか。
よろしくです。
0031デフォルトの名無しさん
2006/11/23(木) 23:33:34つ[MSDN]
003213
2006/11/23(木) 23:40:38返事が遅くなって申し訳ございません
>>19
そうです
普段はウィザード生成の標準子画面で操作を行い、
ボタンが押されたときに別の子画面を表示する感じです
(他にも同じ子画面が複数表示されないような制御も
行いたいと考えています)
>>22-24
基本的にやりたいことは単純にダイアログのようにコントロールが
貼り付けられて、それへの操作を処理のトリガとする子画面を持つ
MDIアプリを作りたいだけです
しかし、思ったように上手く、とても困っている状況です
つい数ヶ月前までVBしか経験のない状態でしたので、VC++6.0(MFC)の
ドキュメントビューアーキテクチャなども理解できていません
MFCで作れないWindowsアプリは無いと聞いたのと処理速度の問題から
こちらの言語での開発を始めたのですが・・・
0033デフォルトの名無しさん
2006/11/23(木) 23:59:31「フォーム ベースの MFC アプリケーションの作成を開始するには」
これでフォームひとつはできるはず。
0034デフォルトの名無しさん
2006/11/24(金) 00:32:44MSDNにのってるよ。
http://support.microsoft.com/kb/141499/JA/
このサンプルでは切り替える時に今までのViewを削除してるので
ちょっと変更が必要。切り替えより生成が面倒な感じ。
SDIで切り替える場合はこっち
http://support.microsoft.com/kb/141334/JA//
0035デフォルトの名無しさん
2006/11/24(金) 00:40:42ありがとうございます
それらのサイトで調べてみます
0036デフォルトの名無しさん
2006/11/24(金) 00:54:031:新規MFCウィザードMDI、後すべてデフォルトでプロジェクト作成。
2:リソースで新規ダイアログ作る
3:新規フォームじゃなく新規クラスでCFormViewの派生クラスを作る(2のリソースID指定)
4:新規クラスでCDocumentの派生クラスを作る
5:リソースstringテーブルに次を追加する
Form\n\nForm(*.frm)\n.frm
注)\n\nの間に何か入れるとアプリケーション立ち上がり時、もしくはメニュー>新規作成時にCViewとCFormView選択可になる。
今は、CViewのみ立ち上がる。
6:C〜AppのInitInstance実装のAddDocTemplate(pDocTemplate);の下に以下を追加
pDocTemplate = new CMultiDocTemplate(
IDR_〜,//5のstringID
RUNTIME_CLASS(C〜Doc),//4のクラス名
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(C〜View));//3のクラス名
AddDocTemplate(pDocTemplate);
6:このファイルの頭の#includeの後に追加した、FormViewとDocumentクラスの.hファイルを#includeを記述
7:これで実行(Formを確認したい時は4の\n\nの間に何か入れる)
けれど、C++はできるなら、VCは普通はWIN32アプリから入るんだけど、この先かなり難儀するかもしれないな。
0037デフォルトの名無しさん
2006/11/24(金) 01:00:01細かなご回答、ありがとうございます
その手順で試してみます
0038デフォルトの名無しさん
2006/11/24(金) 01:03:03003913
2006/11/24(金) 01:08:10教えて頂いたことを試してみます
0040デフォルトの名無しさん
2006/11/24(金) 01:22:00CViewのメニューなりからのイベントでCFormViewを開く時は、
CChildFrameのオブジェクトを取得して(CViewクラスからならGetParentFrameで取得できる。
ドキュメントテンプレにdoc-frame-viewの枠組みは登録されているので、新たにnewしてはいけない。)
これを*pChldFrmとすると、
イベントハンドラに
if(!pChldFrm->LoadFrame(・・・
{
return FALSE;//もしくは失敗した時の例外処理
}というようにFormを作り、
pChldFrm->ShowWindow(〜/*定数*/);
pChldFrm->UpdateWindow();
して表示してやる。
0041デフォルトの名無しさん
2006/11/24(金) 01:30:34Form\n\nForm(*.frm)\n.frm
を
\nForm\n\nForm(*.frm)\n.frm
しておいてもらえるかな。やれば意味わかると思う。
0042デフォルトの名無しさん
2006/11/24(金) 01:55:21#include"C〜Doc.h"
#include"C〜View.h"
の順番で。たまたまコンパイルビルドとおっちゃうかもしれないけど、
includeの順番はとっても重要だから。
0043デフォルトの名無しさん
2006/11/25(土) 13:15:51ありがとうございました
この件に関しての問題は解決しました
次はDLL側にある子画面を呼び出し側(MDI)で表示/利用することに
挑戦しようと思います
また質問に来るかもしれませんが、よろしくお願いします
0044デフォルトの名無しさん
2006/11/26(日) 14:17:52このクラスで256色以上のビットマップを
貼り付けるにはどうしたらよいのでしょうか?
リソースエディタ上は16色しかでません。
何かうまい方法ありましたらご教授願いたいです。
004544
2006/11/26(日) 14:33:200046デフォルトの名無しさん
2006/11/26(日) 16:02:20http://www.google.co.jp/search?q=CToolBar+256+&ie=Shift_JIS&oe=Shift_JIS&hl=ja
256bitmap使うだけなら簡単だけど、あれこれカスタマイズしようとすると結構大変。
004744
2006/11/26(日) 16:32:370048デフォルトの名無しさん
2006/11/26(日) 18:01:17class CMyList : public CListView
としたのですけど、以下の一連の処理、
OnPreparePrinting()
OnBeginPrinting()
OnPrepareDC()
OnPrint()
OnEndPrinting()
が、ファイルメニューの印刷プレビュー項目を選択すると呼び出されるのですが、
同じく、印刷項目からですと何の反応もありません。
標準的な機能として呼び出されるのが当たり前と思っていたので、
ちょっと困ってしまっています。
OnPrint()に印刷処理を記述してプリンターに出力したいのですが、
どのようにしたら良いのかご存知の方、教えていただけませんか。
環境は.NET2003+XP SP.2です。
(後々のメンテナンスのことも考えて、
あまりトリッキーなことをしないで実装できるのが理想です。。。)
0049デフォルトの名無しさん
2006/11/27(月) 21:30:49試していただきたいんですけど、
・SDIアプリケーションをデフォルトのままビルド
・デバッグ開始してツールバーをフローティングさせる
・そのツールバーをセカンダリモニタ上に移動
とやったあと、そのツールバーをサイズ変更できますか?
自分の環境(VC6.0)ではセカンダリモニタ上ではサイズ変更できないんですけど…。
0050デフォルトの名無しさん
2006/11/27(月) 22:15:40このダイアログの上で他のウィンドウをぐりぐり動かすとダイアログが再描画された時に
背景が部分的に欠けてしまう(ダイアログの地の色が出る)事があるんですが、
これってどんな理由が考えられるでしょうか。
005150
2006/11/27(月) 22:27:390052デフォルトの名無しさん
2006/11/27(月) 22:40:320053デフォルトの名無しさん
2006/11/27(月) 23:30:570054デフォルトの名無しさん
2006/11/28(火) 00:13:23標準的なCViewのサブクラスは印刷時に
CView::OnFilePrint();を呼び出している。
ただしCListViewから呼び出しても印刷できるかどうか
わからん。
0055デフォルトの名無しさん
2006/11/28(火) 19:46:02試した。確かにサイズ変更できない。
原因は非公開クラスのCDockContext内のStretch()にあって
dockcont.cppの314-315行目のサイズ取得のところ。
最新のMFCではこっそりと修正されてる。
(VC6SP6)
HWND hWndDesk = ::GetDesktopWindow();
::GetWindowRect(hWndDesk, &rectDesk);
(VC2005)
rectDesk.left=GetSystemMetrics(SM_XVIRTUALSCREEN);
rectDesk.top=GetSystemMetrics(SM_YVIRTUALSCREEN);
rectDesk.right=rectDesk.left+GetSystemMetrics(SM_CXVIRTUALSCREEN);
rectDesk.bottom=rectDesk.top+GetSystemMetrics(SM_CYVIRTUALSCREEN);
VC6ではCToolBarとCDockContextを派生させて対処するしかない(当方では一応成功)。
非公開クラスなのでググってもほとんど情報がないけど
修正内容は違うがCDockContextを弄ってるのはあった。
http://www.ddj.com/184410272 英語だがStep3,Step4の文章が多少参考になる。
http://www.tkb-soft.hmcbest.com/diary_2005_03.htm 日本語。最後の方がグダグダでかなり強引。
0056デフォルトの名無しさん
2006/11/29(水) 01:44:19フォルダやファイルのフルコントロール拒否ってどうやってみたらいいでしょうか?
今はとりあえず、書きこんで見て書けなかったら・・・とかやっています。
もっとスマートな方法はないでしょうか?
0057デフォルトの名無しさん
2006/11/29(水) 06:17:19IEの履歴ウィンドウみたいなのあるじゃないですか?
あのスプリッタに「X 閉じるボタン」が付いてるやつ。
あれってMFCの機能で実現出来るものですかね?
スプリッタウィンドウにして一つのViewをFormViewにして
その中に各種のコントロールを設置すればそれっぽくなりますけど
閉じるボタンが押された時に、スプリッタを完全に非表示にしないといけない訳で
スプリッタの大きさ0じゃなく、動的にスプリッタの数を変更とか出来るのでしょうか?
0058デフォルトの名無しさん
2006/11/29(水) 08:58:38あれはBrowser Extension の Explorer Bar
http://msdn2.microsoft.com/en-us/library/aa753587.aspx
>あれってMFCの機能で実現出来るものですかね?
本人次第
0059デフォルトの名無しさん
2006/11/29(水) 09:49:59サブクラスで操作(数だけじゃないよ)すればできる。
流れ書こうかと思ったけどCodeGuruとか見たほうが早い。
ペインが左右に1つずつしかないなら、ほんの数行で済むはず。
0060デフォルトの名無しさん
2006/11/29(水) 10:31:28なるほど… そういう物だったんですね…
>>59
今、色々試していた所、CDialogBarを利用して
似たような事が出来るかも知れないと思いました。
出来ればVC++のIDEみたく、ドッキング可能にもしたかったので
こっちの方がより理想に近いのかもしれません。
006149
2006/11/29(水) 20:45:04試していただきありがとうございます。
やっぱりこれグラフィックカードの問題とかではなかったんですか…。
ツールバーももちろんなんですが、
http://support.microsoft.com/kb/143255/ja
↑を参考にサイズ変更可能なダイアログバーを用意したんですけど、
セカンダリモニタ上でサイズ変更ができないのがかなり痛いです。
これって、VC6のままMFCだけ最新のものを使うということは無理で、
VC2005の環境にしてしまうか、派生クラスを自分で作ることになるんですよね?
ドッキングを捨ててモードレスダイアログにしてしまったほうがいいのかな…。
まずは教えていただいたサイトなどを元にして
なんとか挑戦してみたいと思います。
ありがとうございました。
0062デフォルトの名無しさん
2006/11/29(水) 22:26:25仕組みそのものは簡単で、アプリケーションからグローバル関数を通じて呼び出されます
グローバル関数は子画面ごとに用意し、関数の引数にポインタを指定する形でデータの受け渡しを行います
それで早速これを作り始めたのですが、自分の知識が乏しいこともあって問題が発生してしまいました
それは、ウィンドウを上手く表示させて処理させることができないということです
ダイアログの方はモーダル表示であるためか、特に問題なく表示させて処理させることができました
しかし、ウィンドウの方は違いました
新規クラス作成でCFormViewを継承したクラスを追加しているのですが、生成の段階で問題が発生してしまいます
コンストラクタがprotectedとなっているため、newで生成したときにエラーとなるのです
これは手動でpublicに変えることで表面上は解決しました
しかし、標準でprotectedになっていたことには何か意味があるのではないかと不安に思えてきました
大丈夫なのでしょうか?
また他にも問題があります
それは、メモリの開放です
ウィンドウはモーダルではないため、基本的にグローバル変数として使っています
これが問題となるのはユーザが閉じるボタンでウィンドウをデストロイした場合です
グローバス関数では、対応するウィンドウのグローバル変数がNULLでない場合に明示的にDestroyWindowを呼んでいます
その後にdeleteをしております
しかし、ユーザがすでにウィンドウをデストロイしていた場合、エラーが発生します
これをどうにか防ぎたいのです
ウィンドウがすでにデストロイされていることを知る手段はありませんか?
またはメモリが未開放であることを知る手段はありませんか?
とても困っております
知恵を貸してください
0063デフォルトの名無しさん
2006/11/29(水) 23:18:34Viewの作成は通常newは使わず
CView *MyView = (CView *)RUNTIME_CLASS(CMyView)->CreateObject();
context設定して MyView->Create( ・・・ );
とかいう感じ。
後半はframeを保持しているのがどっちか不明なのでパス。
006462
2006/11/30(木) 00:09:29レスに大感謝です
参考にさせて頂きます
グローバル変数を保持しているのはDLLです
つまり、ウィンドウ&ダイアログは常にDLLの管理下にあります
アプリケーションは子画面の表示を指示するのとデータ受け渡しのみです
0065デフォルトの名無しさん
2006/11/30(木) 00:50:100066デフォルトの名無しさん
2006/11/30(木) 04:17:02私も興味あります。
VC++6というか、VisualStudioのようなMDIを実現する方法。
■ このスレッドは過去ログ倉庫に格納されています