Menu

#57 ウィンドウを閉じるときの挙動改善

closed
nobody
None
5
2012-11-09
2006-10-20
ryoji
No

data:5502の件の改善パッチです。

BetterClose.patch

[変更箇所]
・画面右上隅の[×]ボタンクリックなどでの挙動変更
(WM_SYSCOMMAND SC_CLOSE)
・タブバー上にも[×]ボタンを追加
・まとめ表示時、編集ウィンドウが1個だけなら「閉じる」
は「閉じて無題」に
・[Alt]-[F4]のデフォルトキー割り当てをなくして閉じるボ
タンと同じ挙動に
・「すべてのウィンドウを閉じる」は「すべて閉じる」に表
示統一
タブバーの[×]は、タブをまとめない設定では[XX](すべて閉
じる)にしています。
で、タブを表示して使う人はツールバーに「閉じる」/「す
べて閉じる」ボタンを入れる必要がなくなります。

まとめ表示のときの各種バー表示や「常に手前に表示」など
も同期したほうが良いとか、
更に改善の余地があると思いますが、気が向いたときにでも
できたらなぁ~、と。

--------------------

[5502] New 【要望】本体を閉じた時の挙動 返信 削除
▽ 2006/10/20 (金) 12:07:55 なす
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.8.0.8pre) Gecko/20061019 Firefox/1.5.0.8pre
現在では、複数のファイルをタブで開いている時に、右上の
閉じるボタンを押すと
その時に開いていたファイルのみを閉じるようになっていま
すが、
閉じるボタンを押した時には、サクラエディタ自体を終了で
きるようにして頂きたいです。

[5503] New Re: 【要望】本体を閉じた時の挙動 返信 削除
▽ 2006/10/20 (金) 12:25:34 しみづ
INCM1.23c

閉じるボタンを押した時には、サクラエディタ自体を終了で
きるようにして頂きたいです。

私はツールバーに「サクラエディタの全終了」を登録して
います。
 登録するには、「設定」-「共通設定」-「ツールバー」
で、種別「ファイル操作系」の一番下にあります。

[5504] New Re:【要望】本体を閉じた時の挙動 修正 返信 削除
▽ 2006/10/20 (金) 21:54:09 ryoji
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja;
rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7
▼ なすさん
私もしみずさんのようにして使ってます。(私はツールバー
に「すべて閉じる」ですが...)
これまでこの要望をあまり見かけなかったのは、ヘルプに
「仕様です」と書かれているとか、慣れてしまうと違和感が
なくなる、といったこともあるかな~と思います。

でも、やはり通常のタブ型アプリとは違った動作なので気に
なりますよね。
サクラエディタだけちょっと動作が特殊という感じで。
シングルウィンドウ・マルチバッファ的な見かけに適した動
作になるよう、ソースをいじって改善提案してみようと思い
ます。
タブに別途「閉じる」ボタンをつけるようなことも含めて。

Discussion

  • ryoji

    ryoji - 2006-10-20

    ウィンドウを閉じるときの挙動改善

     
  • ryoji

    ryoji - 2006-11-01

    Logged In: YES
    user_id=1480046

    Win 9x/NT4.0 でタブバーの[×]、[××]ボタンの×の形状がいびつに
    なるのを修正しました。
    どのバージョンのWindowsでも同じイメージになるように。

    BetterClose2.patch

     
  • ryoji

    ryoji - 2006-11-01

    ×形状描画の改善

     
  • Genta

    Genta - 2006-11-25

    Logged In: YES
    user_id=86076
    Originator: NO

    タブの×ボタンを押した瞬間に閉じてしまうのはちょっと違和感があります.
    普通は離して初めてクリックが有効になるので.

    ボタンとリストボタン,独立したクラスに切り出せないですかねぇ.
    切り出してあると他で再利用しやすくなるのではと思います.
    特に閉じるボタンの絵を描くところとか他でも使えそうです.

    ウィンドウハンドルと領域だけ渡しておいてタイマーIDは親で管理することにし,mousemove/up/down,タイマー受信をイベントに応じて呼びだす感じで切り出したらどうでしょう?

    Hoverボタンの実装をマウスキャプチャを利用して行う方法もあるようですね.カーソルが中に入ったらキャプチャして,MOUSEMOVEで範囲から外れたらキャプチャ解除するようです.でもTABでキャプチャを使っているのでそれとぶつからないように実装するのは困難かも.

     
  • ryoji

    ryoji - 2006-11-27

    Logged In: YES
    user_id=1480046
    Originator: YES

    >タブの×ボタンを押した瞬間に閉じてしまうのはちょっと違和感があります.
    あまり気にすることもないかと思って手抜きしてました。
    修正版です。
    ->BetterClose3.patch

    >ボタンとリストボタン,独立したクラスに切り出せないですかねぇ.
    再利用を意識してるのはドッキングウィンドウでしょうか。
    それなら、汎用ドッキングウィンドウクラスをCWnd派生で作成し、
    そのクラスの中に[×]ボタン描画や閉じる処理まで入れてしまうのが
    良さそうです。
    #実際のドッキングウィンドウは上記汎用クラスを派生して作る
    #もちろん仮想関数を使ってカスタマイズ可能なように
    で、その汎用クラスがタブバーにも利用できるようなら差し替える。

    >Hoverボタンの実装をマウスキャプチャを利用して行う方法もあるようですね.
    自分が知る限りでは、その方法はうまくないです。
    マウスボタンが押し下げられた状態でキャプチャ開始しないと、
    スクリーン全体ではなく自スレッドのウィンドウ内でしか
    キャプチャは有効にならないので、マウスをすっ飛ばすと
    画面外に出たことを検出できません。
    TrackMouseEvent APIを利用する方法もありますが、
    それはWin95では使えないので、タイマー利用が定石かと。

     
  • ryoji

    ryoji - 2006-11-27

    [×]ボタンを離したときに閉じる

     
  • Genta

    Genta - 2006-12-24

    Logged In: YES
    user_id=86076
    Originator: NO

    data:5717 より転載
    ▼rastiv さん
    [共通設定]シート内の[全般]タブにあります,
    [終了の確認をする]ていうチェックボックスがあるので,
    (それをありがたく使わせていただいている者でして)
    できれば,ウインドウ右上の×印をクリックして
    全てのタブを閉じようとするときも,
    問い合わせてくださるとより安心感があって
    いい感じです.

     
  • ryoji

    ryoji - 2006-12-25

    [すべて閉じる]で他に編集用のウィンドウがあれば確認する

     
  • ryoji

    ryoji - 2006-12-25

    Logged In: YES
    user_id=1480046
    Originator: YES

    「終了の確認をする」はタスクトレイから全終了を選択したときに
    編集ウィンドウがあれば問合せするのが主目的のように思えます。
    (編集ウィンドウからならタスクトレイも閉じる問合せ)
    やはり目的が違うような...

    IE7やFireFox2には「同時に複数のタブを閉じるときは確認する」
    のような設定がありますね。
    これと同様な設定を「終了の確認をする」とは別に追加してみました。
    「[すべて閉じる]で他に編集用のウィンドウがあれば確認する」オプションです。
    複数開いた状態では編集用ウィンドウからの[すべて閉じる]で問合せします。
    ひとつだけの状態でもタスクトレイからの[すべて閉じる]では問合せします。
    File Added: BetterClose4.patch

     
  • ryoji

    ryoji - 2006-12-29

    Logged In: YES
    user_id=1480046
    Originator: YES

    現状、1個だけタブを開いた状態で次のマクロ
    S_WinClose();
    S_Char(65); // 'A'を入力
    を実行すると閉じる前にAが画面に入力されてしまいます。
    (特殊ケースなので気にしなくてもいいのかもしれませんが)

    Command_WINCLOSE()の中からF_FILECLOSEを
    ポストするようにしたからですね。
    F_FILECLOSEのHandleCommand全体が実行されるのもちょっと違う
    ような気がするので、ここではF_FILECLOSEをポストするかわりに
    Command_FILECLOSE()を呼ぶようにしようかと思うんですが、
    HandleCommand内のF_FILECLOSEの処理を見ると
    /* 再帰処理対策 */というのが目につきました。

    この、/* 再帰処理対策 */って必要なんでしょうか?
    HandleCommandでは必ずm_pcOpeBlkをNULLにして
    処理を抜けるようにしているみたいなので、上位の
    HandleCommandで同じものを再登録してしまうような問題は
    おきないと思うのですが...
    何かこのあたりのしくみはややこしいですね~。

     
  • Genta

    Genta - 2006-12-29

    Logged In: YES
    user_id=86076
    Originator: NO

    この、/* 再帰処理対策 */って必要なんでしょうか?
    HandleCommandでは必ずm_pcOpeBlkをNULLにして
    処理を抜けるようにしているみたいなので、上位の
    HandleCommandで同じものを再登録してしまうような問題は
    おきないと思うのですが...
    たとえばCommand_FILECLOSE()の処理を追ってみると,
    CEditDoc::OnFileClose()を内部で呼んでいます.
    ファイルが(無題)で編集後に保存していない場合には
    「名前をつけて保存」が開きますよね.
    そこで,ダイアログを開くためにHandleCommand()を呼んでいるようです.

    ただ,HandleCommandを再帰的に呼んだとしても,
    既にバッファが割り当てられている場合にはそれをそのまま使うようなので
    メモリリークは発生しないと思います.
    操作が一続きに登録されてしまうのを防ぐため?にしては
    編集操作→HandleCommand→別の編集操作 というケースがすぐには思いつきません.

     
  • ryoji

    ryoji - 2006-12-30

    ファイル操作でHandleCommand()を呼ばないように

     
  • ryoji

    ryoji - 2006-12-30

    Logged In: YES
    user_id=1480046
    Originator: YES

    /* 再帰処理対策 */については何か釈然としないものがありますが...

    >たとえばCommand_FILECLOSE()の処理を追ってみると,
    >CEditDoc::OnFileClose()を内部で呼んでいます.
    >ファイルが(無題)で編集後に保存していない場合には
    >「名前をつけて保存」が開きますよね.
    >そこで,ダイアログを開くためにHandleCommand()を呼んでいるようです.

    ここはHandleCommand()にする必然性は無く、同等の処理が動けばいいんですよね。
    例えば、HandleCommand(F_FILESAVE)のかわりにCEditView::Command_FILESAVE()と
    同じ処理が動けば。そうすれば、F_FILECLOSEではF_FILESAVEなどと同じように
    ちょっと目障りな/* 再帰処理対策 */が不要になる、と。

    早速、↑のように変更してみました。(sakura/trunk#1046ベース)

    ファイル処理関係については、
    CEditView::Command_FILECLOSE()
    CEditView::Command_FILECLOSEOPEN()
    CEditView::Command_FILESAVE()
    CEditView::Command_FILESAVEAS_DIALOG()
    CEditView::Command_FILESAVEAS()
    の処理本体部分を、新規関数
    CEditDoc::FileClose()
    CEditDoc::FileCloseOpen()
    CEditDoc::FileSave()
    CEditDoc::FileSaveAs_Dialog()
    CEditDoc::FileSaveAs()
    に移動し、元の関数はそれらを呼ぶだけにしています。
    もともとこれらの中身はCEditDocの操作が主体なので、本来あるべき場所に移した、
    という感じ?です。

    問題のCEditDoc::OnFileClose()では、HandleCommand(F_FILESAVE)のかわりに
    従来のCEditView::Command_FILESAVE()と同じCEditDoc::FileSave()を呼ぶよう
    にするなどの変更をしています。

    で、Command_WINCLOSE()の中からはF_FILECLOSEをポストするのではなく、
    Command_FILECLOSE()を呼ぶようにしました。これが本来の目的、
    >S_WinClose();
    >S_Char(65); // 'A'を入力
    >を実行すると閉じる前にAが画面に入力されてしまいます。
    の対策です。(汗)

    その他、
    ・Command_PLSQL_COMPILE_ON_SQLPLUS()からもHandleCommand()は呼ばない
    ・CEditView::TagJumpSub()ではジャンプしてから閉じる
    (タブが1個だけの場合に元タブが無題で残ってしまう対策)
    の変更をしています。

    File Added: BetterClose5.patch

     
  • Genta

    Genta - 2007-01-27

    Logged In: YES
    user_id=86076
    Originator: NO

    CTabWnd::Refresh( void )に
    @date 2006.10.21 ryoji タブバーの再描画を追加(ボタン再描画のため)
    とコメントがありますが,本体の変更は無いみたいです.

    1週間くらいTABモードで使っていますが特に不具合には遭遇していません.
    パッチの方も目を通しましたが気になるところはありませんでした.

    上のRefreshのところが明確になればcommitしても良いのではないでしょうか.

    --- 変更点まとめ ---
    [CEditApp.cpp]

    CEditApp::CloseAllEditor( BOOL bCheckConfirm, HWND hWndFrom )
    呼び出し元ウィンドウハンドル,確認フラグ追加
    * 複数のウィンドウを閉じる際に確認する機能のため

    CEditApp::TerminateApplication( HWND hWndFrom )
    呼び出し元ウィンドウハンドル追加
    (CloseAllEditorに渡すため)

    [CEditDoc.cpp/h]
    CEditView_Commandから移動
    void FileClose( void ); /* 閉じて(無題) */ // 2006.12.30 ryoji
    void FileCloseOpen( const char *filename = NULL, int nCharCode = CODE_AUTODETECT, BOOL bReadOnly = FALSE );
    BOOL FileSave( bool warnbeep = true, bool askname = true ); /* 上書き保存 */
    BOOL FileSaveAs_Dialog( void ); /* 名前を付けて保存ダイアログ */
    BOOL FileSaveAs( const char *filename ); /* 名前を付けて保存 */

    HandleCommand呼び出しの排除

    [CEditDoc_new.cpp]
    上記新関数の実体

    [CEditView_Command.cpp]
    HandleCommand内の"再帰処理対策"を除去

    CEditView::TagJumpSub()
    Close処理を末尾へ移動

    Command_PLSQL_COMPILE_ON_SQLPLUS()
    HanleCommandの除去

    Command_WINCLOSE()
    タブまとめ表示で残ウィンドウが1個の場合は「閉じて無題」

    [CEditWnd.cpp]
    WM_SYSCOMMAND/SC_CLOSEで,タブまとめ表示の場合は「すべて閉じる」

    ファイル→「すべて閉じる」へメニュー名変更

    [CPropCommon.cpp]
    [CShareData_new.cpp]
    [CShareData.h/cpp]
    [sakura.hh]
    [sakura_rc.h]
    新オプション
    - [すべて閉じる]で他に編集用のウィンドウがあれば確認する
    (bCloseAllConfirm)

    Alt-F4の割付を解除.標準のCLOSEを経由してタブ状態に応じた処理が動くように.

    [CWnd.cpp/h]
    OnCaptureChangedをオーバーライド出来るように

    [sakura_rc.rc]
    名称変更: 全てのウィンドウを閉じる→全て閉じる
    「他に編集用のウィンドウがあれば確認」のオプション追加
    「全終了の確認をする」に名称変更

    [CTabWnd.cpp/h]

    追加メンバ
    m_bCloseBtnHilighted : 閉じるボタンがHover中かどうか
    m_eCaptureSrc : 閉じるボタン用マウスキャプチャ

    追加・変更関数
    OnCaptureChanged: 「閉じる」キャプチャ解除
    OnLButtonDown: 閉じるボタン処理を追加
    OnMouseMove : 閉じるボタンのHover処理追加
    OnPaint : 閉じるボタンの描画
    DrawBtnBkgnd : ボタン背景描画を独立した関数に
    DrawCloseBtn : 実際に閉じるボタンを描画するs
    GetCloseBtnRect : 閉じるボタン領域取得

    ----------
    CloseAllEdiorのフラグの使い分け
    (複数ウィンドウを閉じるときの問い合わせ)

    CEditApp:
    - すべてのウィンドウを閉じるでは問い合わせる→TRUE
    - QueryEndSessionでは問い合わせない→FALSE
    - WM_CLOSEでは問い合わせない→FALSE ←通常は呼ばれない?
    - TerminateApplication
    1つでもウィンドウがあれば終了時の確認対象.
    確認しなかった場合だけ問い合わせを行う.
    (終了時と複数ウィンドウの両方が有効でも問い合わせは1回)

    Command_FILECLOSEALL()

     
  • ryoji

    ryoji - 2007-01-27

    Logged In: YES
    user_id=1480046
    Originator: YES

    commitしました。
    rev.1050

    CTabWnd::Refreshのコメントは作業中の変更で除去し忘れたものなので、除去しておきました。
    いつも細部まで見ていただいて、ありがとうございます。

     

Log in to post a comment.

MongoDB Logo MongoDB