(for Internet Explorer)
キーワード:
ウィンドウ、フレーム、キャッシュ
関連
デバッグするときは、SvgCats_MultiWindowDebug を 1 にします。
CMainFrame
CSVGCatApp::m_Frames
CSVGCatApp::m_HideFrames
Canvas
m_prims
m_file
生成されているすべてのウィンドウ
非表示になっているウィンドウ(次に再利用する順になっている)
ウィンドウ
SVG ファイル
CadPrim
キャンバス
図形
m_UndoBuf
Undo_Buf
SVGCat_File
アンドゥバッファ
SVG ファイルを新規作成するときも、
[ ファイル | 新規作成 | 新規ファイル ] や、通知領域のアイコンを左クリックすると、
新しい SVG ファイルのためのウィンドウが開きます。
ただし、保存しない限り、実際にファイルにはなりません。 自動保存も行われません。
ソース
で処理します。
CSVGCatApp::OpenSub
 /* 新規ファイル */
関連
新しいファイルを作成すると、
をリードします。
CMainFrame::InitWindowPos
新規ファイルのウィンドウの位置
openPath[0] == '\0' か、ファイルサイズ=0
テスト
新規ファイルを開いたとき、キャンバスにファイル名と同じタイトルがあること
CSVGCatApp::InitInstance
最初のウィンドウを開く
起動時
DDE通信時
CSVGCatApp_onOpenDdeMsg
ハイパーリンク時
CMainFrame::OnOpenLink
新規ウィンドウ
同じウィンドウ
別形式ファイル
CMainFrame::New
CMainFrame::Load
CMainFrame::OnClose2
CFrameWnd::OnClose() で delete
CMainFrame::RestoreWindow
CMainFrame::ShowToolBars
CMainFrame::OpenSub
△/* 同じファイルのリンク先を選択する */
/* インターネット・ブラウザで開く(1) */
/* 新規 No Title にする */
/* フォルダを開く */
/* SVG ファイルを開く */
□/* 新しい、または指定のウィンドウで
   SVG ファイルを開く */ → App::OpenSub
◎/* キャッシュにあるウィンドウに切り替える */
   → App::OpenSub
○/* 同じウィンドウで SVG ファイルを開く */
  → Load
  subName → Frame::OpenSub
/* その他のファイルを開く */
/* テンプレートをロードする */
表示状態へ:
ウィンドウ位置:
CMainFrame::OnCreateClient
CMainFrame::OnCreate
CMainFrame::InitWindowPos
CMainFrame::OnClose
閉じるとき
CMainFrame::OnClose2
ListX_remove( &app->m_Frames, this );  /* キャッシュからはずす {Frames} */
app->m_bAppExiting = 1
SVG Cats を終了するとき
CMainFrame::OnAppExit
メインウィンドウ(最後に閉じる)を閉じたら、MFC が呼び出す
CMainFrame::OnDelIcon
アイコンから終了のとき
CMainFrame::HideClose
CMainFrame::HideWindow
ShowWindow( SW_HIDE );
PostMessage( WM_COMMAND, CMainFrame_HideClose )
ツールバーの表示状態を取得。
(Hide する前でないと取れないため)
メインウィンドウを閉じる
ツールバーを非表示にする
CMainFrame::OnSaveOv
CSVGCatApp::Save
SVG保存
同時保存ファイル(Canvas::m_CorrImagePath)も保存
CSVGCatApp::Finish
CChildView::OnClose2
CFrameWnd::OnClose
app->m_pMainWnd->PostMessage( WM_CLOSE ); // メインウィンドウを閉じる
file->m_pages, prims の delete
ink ファイルの削除
Undo_Buf::ClearAll
CSVGCatApp::Finish_imp
アンドゥバッファのクリア
保存ダイアログを表示しないとき
保存ダイアログを表示
CMainFrame::HideWindow
保存ダイアログを表示するとき
CMainFrame::m_bShowToolBars
CMainFrame::OnClose2
非表示にするとき、m_CloseStep = 0
アプリを終了するとき、m_CloseStep = 2
CMainFrame::OnClose2
非表示にする
保存する
終了する
ファイルメニューに、開いたファイル、閉じたファイルの履歴が表示されます。
通知領域のアイコンを右クリックしても、履歴が表示されます。
この機能を使って、閉じたファイルを、すぐに開くことができます。
CMainFrame::DefWindowProc
/* 履歴メニューを足す */
CMainFrame::OpenRecentFile
CMainFrame::OnRecent1 〜 8
通知領域のアイコンを右クリックしたとき:
履歴にあるファイルを選んだとき:
chgToMenuString
CSVGCatApp::SetRecentFile
履歴を更新する
指定のパスを履歴の先頭にもってくる
CSVGCatApp::RemoveRecentFile
指定のパスを履歴から削除する
CSVGCatApp::WriteRecentFile
履歴をファイルに保存する
関連
CSVGCatApp:m_RecentPath
CSVGCatApp:m_RecentTitle
%prof%\recent.ini
chgToMenuString
履歴に表示する文字列を作成する
title - file.svg (%path_var%)
履歴は、次の形式で表示されます。
title - 開いていたページのタイトル (複数ページのファイルのときのみ表示)
file.svg - ファイル名
(%patg_var%) - パス変数 (パス変数が登録されたフォルダの中のときのみ表示)
Bar
Window 1
Window 2
閉じても非表示にするだけ
キャッシュにあれば、表示状態へ
キャッシュになければ、ロードして表示状態へ
キャッシュ数を超えても、表示数が大きければ生成する。
キャッシュ数を超えたときに閉じたとき、非表示のキャッシュ数が最小非表示
キャッシュ数より大きくなったら、本当に閉じる。
最も最初に閉じた(非表示にした)キャッシュから再利用する
ウィンドウを変えずにキャッシュにあるファイルを開いたら、ウィンドウを変える
(NoTitle) は複数にもできること
どれか閉じたとき、常に1つは(NoTitle) をキャッシュに入れておく。
(NoTitle)
(NoTitle)









閉じた順番を示す非表示リスト
m_nCacheFrame
全部閉じてもキャッシュに残す数 = 最小数
m_minHideFrame
Frame の消去を開始する非表示の数
ListX_Plus  CSVGCatApp::m_HideFrames
m_nCacheFrame = 2, m_minHideFrame = 1 のとき、
□=キャッシュにないファイルを新規ウィンドウで
○=キャッシュにないファイルをウィンドウ再利用で
◎=キャッシュにあるファイルを表示状態に
△=表示中のファイルを手前に
×=閉じたとき
表示中の数
0
1
非表示の数
0
0
×
0
1
1
1
2
0
3
0
×
1
2
×
1
1
×
2
0
1
1
0
9
8
7
6
5
4
3
2
1
ステップ
ステップ 3 : キャッシュになくても、m_nCacheFrame より小さいので、新規に作成する。
ステップ 4 : キャッシュにヒットしたらそのまま表示状態にする。
ステップ 5 : m_nCacheFrame, m_minHideFrame に関わらず、非表示がなければ、新規に作成する。
ステップ 6 : m_nCacheFrame より大きくても、m_minHideFrame に満たなかったので、非表示にする。
ステップ 7 : m_nCacheFrame より大きくて、m_minHideFrame に満たしているので、削除する。
ステップ 8 : m_minHideFrame を満たしているが、m_nCacheFrame より小さくなるようであれば、非表示にする。
ステップ 9 : キャッシュにヒットしなくても、表示中+非表示の数がm_nCacheFrame 以上であれば、ファイルを変えて再利用。

上記の動きをするには、ファイル A 開く(起動)、A 閉じる、B 開く、A 開く、C 開く、C 閉じる、B 閉じる、A 閉じる、C 開く
操作
デバッグ
テストケース
開いたり閉じたりして、キャッシュを再利用します。
パス条件
再利用状況を記録し、チェックします。
not_pass
書きかけ
再現方法 [openA] - キャッシュにないファイルを新規ウィンドウで
再現方法 [openA_app] - アプリ起動時
アプリケーションが起動していない状態で、コマンドラインにファイルを指定します。
アプリケーションを任意に起動してから、ファイルを開きます。
キャッシュがあるときは、処理の再現方法や、ある位置のコードを実行することが難しいので、
以下に手順を示します。
関連
再現方法 [openAxA] - キャッシュにあるファイルを表示状態に
再現方法 [openAA] - 表示中のファイルを手前に
1. m_nCacheFrame の値の数だけ、別々のファイルを開きます。
2. 1つファイルを閉じます。
3. さらに別のファイルを、[ ファイル | オープン ] か 履歴から開きます。
1. ファイルを開きます。(アプリ起動時でもOK)
2. ファイルを閉じます。
3. 同じファイルを、[ ファイル | オープン ] か 履歴から開きます。
1. ファイルを開きます。(アプリ起動時でもOK)
2. DDE通信で、開いているファイルを指定します。
開く関数は、CSVGCatApp::OpenSub と CMainFrame::OpenSub があります。
前者は、バッチファイルから、後者は、SVG ファイルのリンクから開くようにします。
→ test_tool1
(CMainFrame::OpenSub は呼ばれないので、svg はありません)
→ openA_appStart.bat
→ openA.bat
以下のバッチファイルや SVG ファイルは、m_nCacheFrame = 2, m_minHideFrame = 1 で
ビルドしたもので正しく動作します。
→ for_MainFrm_OpenSub.svg [openA]
→ openB_openC.bat
→ openA.bat
1つファイルを閉じます。
→ for_MainFrm_OpenSub.svg [openB,C,x,A]
→ openA.bat
A を閉じます。
→ openA.bat
→ for_MainFrm_OpenSub.svg [OpenAxA]
→ openA.bat
→ openA.bat
→ for_MainFrm_OpenSub.svg [OpenAA]
MFC でメイン・ウィンドウは、動的に変わることができる。
メイン・ウィンドウに特別な意味は持たないが、
閉じるとき、他にウィンドウがあれば、メイン・ウィンドウを変えて、
アプリケーションが終了しないようにする。
最後のウィンドウのときも、非表示にするだけ。
メニューから 「ファイル - アプリケーションの終了」で、アプリを終了する。
!履歴機能
app->m_pMainWnd
SVG Cats は、ウィンドウを閉じると、まず非表示状態にしてから保存を行います。
これで、軽快に閉じるように見せます。
キャンバスのプロパティの「同時保存ファイル」にJPG などのファイルを指定すると、保存時に
指定の形式で同時に保存することもできます。 形式は拡張子で判断します。
JPEG 画像ファイル
.jpg
.png
PNG 画像ファイル
.htm
HTML(VML) ファイル (イントラネット形式)
.mht
.html
HTML(VML) ファイル (FTP形式)
MHTML 形式ファイル
出力するページに指定
先頭ページに指定
出力するページに指定
先頭ページに指定
先頭ページに指定
→ テスト:コマンドラインを実行したときのウィンドウキャッシュの動き
・ハイパーリンクから、2ページ目にジャンプすること
・2回目(キャッシュヒット時)も、2ページ目にジャンプすること
TestMain
・起動時に1を開く
・2を開く
・2をビューアモードにして閉じる
・新規ファイル作成
削除したファイルがないというエラーが出る
・起動時に1を開く
・2を開く
・2を閉じる
・2のファイルを削除する(ファイルは退避しておく)
・新規ファイル作成
新規ファイルでツールバーが無い
→ テストフォルダ
・test1a.bat を実行する(起動時に1を開く)
・プロパティ・バーを表示状態にする
・menu [ Test | PropBar ]
・1を閉じる
・アイコンの履歴から 1を開く
・menu [ Test | PropBar ]
・[ ファイル | アプリケーションの終了 ]
・test1b.bat を実行する(テストログのチェック)
・2回目のオープンで Load しないこと
・プロパティバーが復帰すること
SvgCats_WindowTest を 1 にしてビルドした実行ファイルで行ってください。
パス条件
テスト手順
テストケース
→ test1_ans.txt
閉じてから同じファイルを開く。 非表示ウィンドウを表示する。
[ 06.11.22 ]
→ テストフォルダ
SvgCats_WindowTest を 1 にしてビルドした実行ファイルで行ってください。
(ウィンドウキャッシュが 2つであること)
テスト手順
テストケース
ウィンドウを再利用する。 前のファイルと別ファイル。
・別ファイルのツリーの表示非表示が閉じたときの状態に合っていること
・別ファイルのプロパティバーが復帰すること
・別ファイルのビューアモードが合っていること
パス条件
3.bat を実行します。 (3.svg が開きます)
3.svg をツリーを表示、プロパティバーを非表示、非ビューアモードにします。
アプリケーションを終了します。
1.bat を実行します。 (1.svg が開きます)
2.svg を新規ウィンドウで開きます(ハイパーリンクをクリックします)
1.svg と 2.svg を閉じます
アイコンを右クリックして、履歴から 3.svg を開いたとき(再利用したとき)、
非ビューアモード、ツリー表示、プロパティバー非表示をチェックします。
[ 06.11.06 ]
[ 06.11.22 ]
1.svg、 2.svg とも、ビューアモードなら非ビューアモードにしてから、
ツリー非表示、プロパティバー表示にしてから、
ビューアモードにします。
3.svg を、ツリー非表示、プロパティバー表示にします。
アプリケーションを終了します。
1.svg、 2.svg とも、非ビューアモードにして、
ツリー表示、プロパティバー非表示にします。
アイコンを右クリックして、履歴から 3.svg を開いたとき(再利用したとき)、
ビューアモードになっていることをチェックします。
非ビューアモードにしたとき、ツリー非表示、プロパティバー表示をチェック
します。
1.svg と 2.svg を閉じます
2.svg を新規ウィンドウで開きます(ハイパーリンクをクリックします)
1.bat を実行します。 (1.svg が開きます)
アプリケーションを終了します。
[ 06.11.22 ]
[ 06.11.22 ]
テストサブ手順1
テストサブ手順2
(テストサブ手順2へ)
ビューアモードにします。
メニュー [ Test | PropBar ] と、[ Test | WindowPos ] を選びます。
メニュー [ Test | PropBar ] と、[ Test | WindowPos ] を選びます。
b.bat を実行します。 (ウィンドウ位置などが pos1.txt などに保存されます)
c.bat を実行します。 (ウィンドウ位置などをチェックします)
[ 06.11.22 ]
メニュー [ Test | PropBar ] と、[ Test | WindowPos ] を選びます。
アプリケーションを終了します。
b.bat を実行します。 (ウィンドウ位置などが pos1.txt などに保存されます)
c.bat を実行します。 (ウィンドウ位置などをチェックします)
3.bat を実行します。 (3.svg が開きます)
メニュー [ Test | PropBar ] と、[ Test | WindowPos ] を選びます。
[ 06.11.22 ]
テストケース
ファイルを新規作成したときに開いたウィンドウの状態やモードをチェックします。
パス条件
・ダブルクリックで矩形テキストが作られること
・ビューアモードではないこと
・ツリーが表示されていないこと
[ 06.11.22 ]
テスト手順
SvgCats_WindowTest を 1 にして、ビルドします。
SVG Cats をパラメータなしで起動します。
・ダブルクリックで矩形テキストが作られること
・ビューアモードではないこと
・ツリーが表示されていないこと
下記をチェックします。
[ 06.11.22 ]
[ 06.11.22 ]
[ 06.11.22 ]
通知領域のアイコンをクリックして、新規作成します。
2つのウィンドウを下記のようにします。
・丸枠テキストモードにしてテキストを作成(すぐ消してもよい)
・ツリー表示
・ビューアモード
2つのウィンドウを閉じます。
通知領域のアイコンをクリックして、新規作成します。
[ 06.11.22 ]
[ 06.11.22 ]
[ 06.11.22 ]
・ダブルクリックで矩形テキストが作られること
・ビューアモードではないこと
・ツリーが表示されていないこと
下記をチェックします。
アプリケーションを終了します。
m_nCacheFrame = 1;  m_minHideFrame = 0; にします。
・閉じた後、別のファイルでキャッシュがあふれても、常駐していること
・常駐ファイルからリンクしたら別のウィンドウを使うこと
・ノートバーで起動
・リンク先の SVG を開く
・ノートバーを閉じる
・リンク先の SVG からアプリ終了
・普通に起動
・リンク先を開く
・閉じる
・エクスプローラのDDEで起動
・リンク先を開く
・閉じる
Frame1
Frame2
menu
Videoデータ
Frame1
menu
「開く」には2種類ある。
・同じウィンドウで別のデータを開く
・自分は閉じて、別のウィンドウを表示する
閉じる
Frame1
Videoデータ
再表示
自分を OnClose2() で閉じたあと、bCloseAfter で、
WM_CLOSE を Post したら NG (Windows が遅くなる)
テスト手順