◀ANSI版開発トップへ
  • 1908 D&D一応動くようにできました
    • 1911 RE: D&D一応動くようにできました
      • 1916 Re2: D&D一応動くようにできました
        • 1917 Re3: D&D一応動くようにできました
        • 1921 Re3: D&D一応動くようにできました
          • 1927 ゴミが付くのは終端忘れ
            • 1928 RE: ゴミが付くのは終端忘れ
              • 1930 RE2: ゴミが付くのは終端忘れ
                • 1932 RE3: ゴミが付くのは終端忘れ
    • 1913 RE: D&D一応動くようにできました
    • 1919 編集ファイルD&D修正版
      • 1925 RE: 編集ファイルD&D修正版
        • 1934 Re2: 編集ファイルD&D修正版
          • 1935 ちょっと欲が
            • 1938 Re:ちょっと欲が
          • 1941 Re3: 編集ファイルD&D修正版
  • [1908] D&D一応動くようにできました おに 2002年04月18日 03:56

    システムメニューアイコンからの編集中ファイルのDrag&Dropです。
    eGroupの使用もこういう形での開発も初めてですので、
    下記の場所で良かったのか不安ですが、とりあえずこれです。

    http://www.egroups.co.jp/files/sakura-editor/Developer/Source/DragDropFrom2002-04-12.lzh

    「//by 鬼」とついている箇所が僕がいじった部分です。
    変更元はssrc_2002-04-12.zipです。

    問題点として、時々アイコンのダブルクリックによるがクローズが
    なかなか動作しない(しつこく繰り返していると動作する)ことがあります。
    メニューを表示してからダブルクリックの判定を後で行うようにしていますが、
    タイマーなどを使って、ダブルクリックとして有効な時間が過ぎてから
    システムメニューを表示するようにした方がいいかも知れません。
    • [1911] RE: D&D一応動くようにできました やざき 2002年04月18日 21:41


      いただきました。
      ファイルを開いていないときはドラッグ&ドロップできないんですね。あたりまえか。。。
      マウスカーソルが禁止マークになるといいかなぁと思ったりもしましたが、みなさまいかがでしょう?


      たしかにダブルクリックすると、メニューが出てすぐ消えることがあるみたいですね。

      それから、VC++のエディタ部分にドロップするとファイル名が表示されるのですが、
      ファイル名の後ろにゴミが出るみたいです。

      この2つ、直るとうれしいなぁ。
      とりあえず混ぜてみますので、反応よろしく > all
      • [1916] Re2: D&D一応動くようにできました おに 2002年04月18日 23:51

        最初考えもしなかった問題が続々と…。^_^

        > ファイルを開いていないときはドラッグ&ドロップできないんですね。あたりまえか。。。
        > マウスカーソルが禁止マークになるといいかなぁと思ったりもしましたが、みなさまいかがでしょう?
        左上アイコンの本来の意味はシステムメニューを表示するためのもので、システムメニューが禁止されているわけではないので、どうでしょうか?
        僕は不要と判断しましたが、禁止マークにしないと判りにくいという人が多数派であればそうするべきかも知れませんね。

        > たしかにダブルクリックすると、メニューが出てすぐ消えることがあるみたいですね。
        エクスプローラはダブルクリック時間が過ぎてダブルクリックでは無いことが確定してからメニューを出しています。
        そういう風に直すのが正解でしょうね…。
        タイマー作るのをさぼったのがいけませんでした。

        > それから、VC++のエディタ部分にドロップするとファイル名が表示されるのですが、
        > ファイル名の後ろにゴミが出るみたいです。
        ファイル「名」にも意味はある、として、テキストとしても記憶させています。
        で、ワードパッドとメッセンジャーでは再現しませんでした。
        僕はVC++を持っていないので、確認できません。
        この点のデバッグは、すみませんが、誰かお願いできませんか?

        後、アップしてからはっと気付いたのですが、ファイル名とパスを区切る処理でDBCS処理を忘れてました。
        ファイル名中に2バイト目に'\'が来る漢字があると誤動作するはずです。
        • [1917] Re3: D&D一応動くようにできました やざき 2002年04月19日 00:12


          >最初考えもしなかった問題が続々と…。^_^

          乗りかかった船と思ってください(^-^;


          最大化してシステムメニューをクリックすると、あらぬところからメニューが出ました。

          VC++へのドロップの件は、私には手が出せ無そうなのですが、ゴミがあるときと無いときがあって不思議。
          無いときはずっと無いんだよなぁ。不思議。
        • [1921] Re3: D&D一応動くようにできました げんた 2002年04月19日 17:09

          >> ファイル名の後ろにゴミが出るみたいです。
          >で、ワードパッドとメッセンジャーでは再現しませんでした。
          CEditWnd.cpp (3633)行目:
          CopyMemory(P, m_cEditDoc.m_szFilePath, Len);
          というのは,最後の'\0'をコピーし忘れていませんか?
          • [1927] ゴミが付くのは終端忘れ げんた 2002年04月19日 22:41

            >CEditWnd.cpp (3633)行目:
            >CopyMemory(P, m_cEditDoc.m_szFilePath, Len);
            >というのは,最後の'\0'をコピーし忘れていませんか?
            CF_TEXT Text format の説明MSDNでを見たら Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.

            となっているので最後の'\0'が必要みたいです.

            ここと,少し前の
            M.hGlobal = GlobalAlloc(GMEM_MOVEABLE, Len);
            をLen → Len + 1 にしたらゴミが出なくなりました.
            • [1928] RE: ゴミが付くのは終端忘れ やざき 2002年04月19日 23:08


              >ここと,少し前の
              >M.hGlobal = GlobalAlloc(GMEM_MOVEABLE, Len);
              >をLen → Len + 1 にしたらゴミが出なくなりました.

              CopyMemoryのほうも?
              • [1930] RE2: ゴミが付くのは終端忘れ げんた 2002年04月19日 23:26

                >>M.hGlobal = GlobalAlloc(GMEM_MOVEABLE, Len);
                >>をLen → Len + 1 にしたらゴミが出なくなりました.
                >
                >CopyMemoryのほうも?
                はい,そうです.
                • [1932] RE3: ゴミが付くのは終端忘れ やざき 2002年04月19日 23:34


                  つけました。ありがとう。
    • [1913] RE: D&D一応動くようにできました みく 2002年04月18日 22:05


      試してみました。

      >問題点として、時々アイコンのダブルクリックによるがクローズが
      >なかなか動作しない(しつこく繰り返していると動作する)ことがあります。

      なかなか閉じないです。違和感ありです。
    • [1919] 編集ファイルD&D修正版 おに 2002年04月19日 02:53

      いくつか修正しました。
      http://www.egroups.co.jp/files/sakura-editor/Developer/Source/DragDropFrom2002-04-12ver2.lzh

      タイマーを使ってエクスプローラの動作に似せてみました。
      状態を 1)ボタン押下 2)クリック 3)ダブルクリック で管理し、ドラッグが開始できるのは1)、システムメニューは2)かつ一定時間経過、クローズは3)という具合です。
      (前回mymessage.hに追加していたメッセージは使わなくなりました)
      動作の確実性は増しましたが、シングルクリックした時はメニューが出るまでじれったいです。(仕方ないかな)

      >最大化してシステムメニューをクリックすると、あらぬところからメニューが出ました。
      ポップアップメニューが負の座標に対応してない様子なのでX座標が負なら0を採用するようにしました。

      DBCS対応忘れも直してます。^^;
      VC++は…どうしましょう?

      あと、編集して保存していない時はどうするか、ですけど…
       案1) ユーザーが気を付けて手動で上書保存(つまり何もしない)
       案2) 保存されていないとドラッグが開始できなくする
       案3) 「ドラッグ開始時自動保存」のオプションを追加(OFF時は何もしない)
      • [1925] RE: 編集ファイルD&D修正版 やざき 2002年04月19日 22:23


        いやー。動いたでござるよ。ポップアップが出てくるまで時間がかかるのは、IEも同じくらい時間がかかるからいいんじゃないかと思います。
        VC++はなぜか問題なく。

        >あと、編集して保存していない時はどうするか、ですけど…
        > 案1) ユーザーが気を付けて手動で上書保存(つまり何もしない)

        何もしない。何もしないほうが融通が利くこともある。かもしれない。

        あと、SetTimerしたときに、KillTimerしなくてもいいの?
        • [1934] Re2: 編集ファイルD&D修正版 おに 2002年04月20日 00:17

          他の環境でも動いたみたいでよかったです。
          VC++も解決したようですね。ヌル文字が必要でしたか…。覚えておきます。

          > 何もしない。何もしないほうが融通が利くこともある。かもしれない。
          では、全ての問題が解決したということで、乗りかかった船おしまい(^^

          …と思ったけれど、後で気付いたのが一点あります。
          よく見てみるとシステムメニューのX座標が微妙に他と比べ左(窓の左端ぴったり)なので、GetSystemMetrics(SM_CXFRAME)をメニュー表示箇所のR.leftに足して下さい。
          「(R.left > 0)? R.left : 0,」を
          「(R.left + GetSystemMetrics(SM_CXFRAME) > 0)? R.left + GetSystemMetrics(SM_CXFRAME) : 0」に訂正。

          > あと、SetTimerしたときに、KillTimerしなくてもいいの?
          SysMenuTimer関数中でKillTimerで自殺(?)してませんか?
          • [1935] ちょっと欲が げんた 2002年04月20日 02:57

            エクスプローラだと右クリックでのドラッグだとドロップ時にメニューができますが、あれは難しいんでしょうか。

            あと、普通はシステムメニューが出た後にもう一回アイコンをクリックするとメニューが閉じるけど、これは閉じないので何となく違和感があります。
            • [1938] Re:ちょっと欲が おに 2002年04月20日 13:57

              > エクスプローラだと右クリックでのドラッグだとドロップ時にメニューができますが、あれは難しいんでしょうか。
              あれは受け手(エクスプローラ)がやっている処理なので、右ボタンの処理を追加すればいいと思います。
              現在WM_LBUTTONXX, WM_NCLBUTTONXXでやっている処理をWM_RBUTTONXX, WM_NCRBUTTONXXにも書いて、WM_MOUSEMOVEによるドラッグ開始処理中でどちらのボタンか認識してCDropSourceのコンストラクタに渡す値を変えれば多分。

              > あと、普通はシステムメニューが出た後にもう一回アイコンをクリックするとメニューが閉じるけど、これは閉じないので何となく違和感があります。
              気付きませんでした。正確には一回閉じてまた出るというか。
              …でも、エクスプローラも閉じませんね。

              無理やり対処するなら、

              終わったことを示すicEndを追加して
              enum {icNone, icDown, icClicked, icDoubleClicked, icEnd} m_IconClicked;

              その時は一連の処理を開始しないことにして
              LRESULT CEditWnd::OnNcLButtonDown(WPARAM wp, LPARAM lp)
              {
               LRESULT Result;

               if(m_IconClicked == icEnd)
               {
                m_IconClicked = icNone;
                Result = 0;
               }
               else if(wp == HTSYSMENU)
                …

              メニューがシステムメニュークリックで閉じられていたらicEndに
              void CEditWnd::OnSysMenuTimer()
              {
               if(m_IconClicked == icClicked)
               {
                ReleaseCapture();

                //システムメニュー表示
                HMENU SysMenu = GetSystemMenu(m_hWnd, FALSE);
                RECT R;
                GetWindowRect(m_hWnd, &R);
                DWORD Cmd = TrackPopupMenu(SysMenu, TPM_RETURNCMD | TPM_LEFTBUTTON |
                    TPM_LEFTALIGN | TPM_TOPALIGN,
                    (R.left + GetSystemMetrics(SM_CXFRAME) > 0)? R.left + GetSystemMetrics(SM_CXFRAME): 0,
                    R.top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME),
                    0, m_hWnd, NULL);
                if(Cmd != 0)
                 SendMessage(m_hWnd, WM_SYSCOMMAND, Cmd, 0);

                POINT P;
                GetCursorPos(&P);
                if((SendMessage(m_hWnd, WM_NCHITTEST, 0, P.x | (P.y << 16)) == HTSYSMENU) &&
                    (GetKeyState(VK_LBUTTON) && 0x80 != 0))
                 m_IconClicked = icEnd;
                else
                 m_IconClicked = icEnd;
               }
               else
                m_IconClicked = icNone;
              }

              …この修正で一応…
              ですが、GetKeyStateを用いたクリック判定は、最初にダブルクリック判定に用いてたまに効かなくなったやつでもありますので、不安です。
              エクスプローラが対処をしていないのは、単に手抜きか、何か問題があるからなのか…。
          • [1941] Re3: 編集ファイルD&D修正版 やざき 2002年04月20日 21:43


            >「(R.left > 0)? R.left : 0,」を
            >「(R.left + GetSystemMetrics(SM_CXFRAME) > 0)? R.left + GetSystemMetrics(SM_CXFRAME) : 0」に訂正。

            つけときます。ありがとう。

            >> あと、SetTimerしたときに、KillTimerしなくてもいいの?
            >SysMenuTimer関数中でKillTimerで自殺(?)してませんか?

            あー。なるほど。そういうことでしたか。
            1357を明示してKillTimerしてなかったので、あれ?と思ったのでした。失礼しました。