• 締切済み

秀丸のテキストをドラッグ&ドロップで受け入れる

tadokoro1です。こんばんは。 ドラッグ&ドロップ(非MFC)で、秀丸のテキストを受け入れたいのですがうまくいきません。 m_pDataObject->QueryGetData関数で確認したのですが、0~16の何れのフォーマットも該当しませんでした。 以下、DragEnter(DragOverも同様)のコードです。 FORMATETC fe; WORD fmt; for (fmt = 0; ; fmt ++) { fe.cfFormat = fmt; fe.ptd = NULL; fe.dwAspect = NULL; fe.lindex = NULL; fe.tymed = TYMED_HGLOBAL; hr = m_pDataObject->QueryGetData(&fe); if (fmt >= 16) break; } どのように取得したら良いのか、ご教授をお願いします。

みんなの回答

  • chie65535
  • ベストアンサー率43% (8542/19421)
回答No.1

>ドラッグ&ドロップ(非MFC)で、秀丸のテキストを受け入れたい これは「秀丸エディタを開き、秀丸エディタで全選択または部分選択をして、選択したテキストをドラッグ&ドロップで受け入れる」ですよね? >m_pDataObject->QueryGetData関数で確認したのですが、0~16の何れのフォーマットも該当しませんでした。 http://ddev.blog46.fc2.com/blog-entry-64.html の「フォーマットの列挙」を参照。 フォーマットは「標準で定義されている物が、CF_TEXT~CF_LOCALEの17種類ある」と言うだけで、これ以外に「ユーザーが定義した物」や「OEM定義の物」など、色々な物があります。 例えば、IEからURLをドラッグ&ドロップした場合「CF_XXXXとして定義されていない値」が使われます。 なので「定数で0~16」とかでフォーマットを指定してはいけません。 必ず「enumFormatEtc()などで、データオブジェクトが持っている有効なフォーマットを列挙」しなければいけません。

tadokoro1
質問者

お礼

tadokoro1です。こんばんは。 GetDataの呼び出しを、以下のように変更しましたら成功しました。 fe.cfFormat = CF_UNICODETEXT; fe.ptd = NULL; fe.dwAspect = DVASPECT_CONTENT; fe.lindex = -1; fe.tymed = TYMED_HGLOBAL; hr = m_pDataObject->GetData(&fe, &stm); 貴重な意見、有難うございました。

tadokoro1
質問者

補足

tadokoro1です。こんばんは。 早速のご回答有難うございます。 ご指摘の通り、enumFormatEtc()を使用してフォーマットを列挙してみました。 列挙されたフォーマットは、13(CF_UNICODETEXT)と1(CF_TEXT)でした。 しかし、これらを引数にGetData()を呼び出しても、戻り値が「-2147221397」のエラーとなってしまいます。 fe.cfFormat = CF_UNICODETEXT; fe.ptd = NULL; fe.dwAspect = NULL; fe.lindex = NULL; fe.tymed = TYMED_HGLOBAL; hr = pDataObject->GetData(&fe, &stm); なぜ、列挙されたフォーマットでデータが取得出来ないのか良く解りません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ダイアログでのDragDropでマウスカーソルの形状について

    こんにちは。tadkoro1です。 ダイアログボックス上でDragDrop(非MFC)の処理を行っています。 エクスプローラからファイルを選択し、ダイアログに向かってマウスカーソルを進めます。 ダイアログ内に入った時は、マウスカーソルがドロップ禁止の形をしていますが、ファイルを受け取るテキストボックスに入った時点でドロップ可能の形(矢印と"+")に変わります。 ドロップせずにテキストボックスの外に移動させても、ダイアログ上では、ドロップ可能の形(矢印と"+")のままですが、ドロップ禁止の形に戻したいです。 以下の様にコーディングしています。 (1).DropTargetの登録はダイアログのハンドルを渡しています。 ※DropTargetの登録処理 RegisterDragDrop(hDlg, g_pDropTarget); (2).DrapEnterとDragOver処理で、マウス座標ptを元に対象のウィンドウハンドルとテキストボックスのIDを求めます。 IDがテキストボックスのものでなければ、pdwEffectにDROPEFFECT_NONEをセットします。(これでカーソルが戻るはずだと思いますが) ※DragOver関数の内容 *pdwEffect = DROPEFFECT_NONE; //初期値を設定 point.x = pt.x; point.y = pt.y; ScreenToClient(hDlg, &point); hWnd = ChildWindowFromPointEx(hDlg, point, CWP_ALL); id = GetWindowLong(hWnd, GWL_ID); switch(id) { case IDC_EDIT1: //対象ウィンドウのIDです // エクスプローラからのドラッグをチェック fe.cfFormat = CF_HDROP; fe.ptd = NULL; fe.dwAspect = NULL; fe.lindex = NULL; fe.tymed = TYMED_HGLOBAL; hr = m_pDataObject->QueryGetData(&fe); if (hr == S_OK) { pdwEffect = DROPEFFECT_COPY; return(S_OK); } } return(S_OK); } 何かよい方法がありましたらご教授をお願いします。

  • アイコンにドラッグアンドドロップ

    VisualStudio 2005 で c++でダイアログベースのアプリケーションを作成しています。 ファイルをアイコンにドラッグアンドドロップして開くということをやりたいのですが、ファイルを開いたときにエラーが発生してしまいうまくいきません。対処方法を教えてください。 ソースファイル ::OnInitDialog(){ : : : : // TODO: 初期化をここに追加します。 DragAcceptFiles(); char *p = AfxGetApp()->m_lpCmdLine; CFile fin; if(p[0]!=NULL){ AfxMessageBox(p); fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); } AfxMessageBox(p)でドロップしたファイルのパスは表示できています。

  • Windowをドラッグして伸縮するとwebbrowserの画面がちらつく

    環境はVC++6.0 Windows XP(SP2)です 手順は (1)MFC Wizard を使ってSDI 基本クラスはFormViewで    スケルトンをつくる (2)プロジェクトにWeb Browser コントロールを追加し    Formに貼り付ける (3)Viewに変数を追加    CWebBrowser2 m_Web; (4)ViewのOnInitialUpdate()に    m_Web.Navigate("http://www.yahoo.co.jp/"    ,NULL, NULL, NULL, NULL);    を追加 (5)ビルドして実行 です ホームページがwebbrowserに出て安定してから ウインドウの右下の角をドラッグしてウインドウを 伸縮すると webbrowserコントロールのなかの画面がちらつくのですが これをちらつかせないようにするにはどのような方法があるでしょうか ご教授いただけませんでしょうか

  • 秀丸へのドラック&ドロップ

    秀丸へのドラック&ドロップができなくなってしまいました。 秀丸を開いていて、 そこに他のテキストファイルやc、c++ファイルなどを ドラック&ドロップで持っていこうとしても、 秀丸上でアイコンが禁止マーク(?)のようなものになってしまい、 ドロップできません。 突然このような状態になってしまいました。 それと同時に秀丸を起動する度ユーザーアカウント制御のダイアログが表示されるようになってしまい、 大変うざくなってしまいました。 何か設定があるのでしょうか。 情報をお持ちの方がいらっしゃいましたら、 お教え願えませんか。 よろしくお願い致します。

  • CListCtrlに表示している複数ファイルを他アプリへドラッグ&ドロップするには

    CListCtrlに表示している複数ファイルを他アプリへドラッグ&ドロップするソースに手間取っていますのでご教授をお願いします。 (VC++ 6.0のサンプルコードがあまりなくて) なんとか、1つのファイルはできるようになったのですが複数にするやり方がわかりません。 どのようにすればよいでしょうか? また、おかしい箇所などありましたら合わせてお願いします。 ※単純の繋げるだけじゃないんですよね?※ CString fname = "C:\\aaa.txt"; fname += "C:\\bbb.txt"; -環境- ・VC++ 6.0 ・MFC ・ダイアログベース -ソース- void aaaDlg::OnBegindragListView(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください if(pNMListView->iItem != -1) { CString fname = "C:\\aaa.txt"; // 動作確認のため固定 HDROP hptr = DragCreateFiles(fname); if (hptr == NULL) { *pResult = 0; return; } m_DropData.CacheGlobalData(CF_HDROP, hptr); CRect rect(0,0,0,0); DROPEFFECT effect = m_DropData.DoDragDrop(DROPEFFECT_COPY, rect); } *pResult = 0; } static HDROP DragCreateFiles (LPCSTR fname) { HDROP hDrop; LPDROPFILES lpDropFileStruct; // Allocate dynamic memory for the DROPFILESTRUCT data // structure and for the extra zero-character identifying // that there are no pathnames in the block yet. int flen = lstrlen(fname); hDrop = (HDROP)GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DROPFILES) + flen + 2); // If unsuccessful, return NULL if (hDrop == NULL) return(hDrop); // Lock block and initialize the data members lpDropFileStruct = (LPDROPFILES) GlobalLock(hDrop); memset(lpDropFileStruct,0,sizeof(DROPFILES) + flen + 2); lpDropFileStruct->pFiles = sizeof(DROPFILES); lpDropFileStruct->pt.x = 0; lpDropFileStruct->pt.y = 0; lpDropFileStruct->fNC = FALSE; lpDropFileStruct->fWide = FALSE; char* szPathA = (char*) (&lpDropFileStruct[1]); lstrcpy(szPathA,fname); // Unlock the block and return its handle. GlobalUnlock(hDrop); return(hDrop); }

  • テキストをドラッグドロップで入力

    WindowsXPのSP2のinternet explorer6で、 例えば、yahooの検索窓に、ブラウザ内のテキストを選択し、それをそのままドラッグドロップで入れる場合、 入るWindows XPマシンと入らないWindows XPマシンがあります。 入るようにしたいのですが、何か設定でもあるのでしょうか?

  • 【C# 2010】 テキストへのドラック&ドロップ

    VisualStudio C#2010 Express の環境で、テキストボックスにエクスプローラからフォルダを指定(複数)して、ドラック&ドロップすると、そのフォルダのフルパスをテキストボックスへ表示させるアプリケーションを作成しております。 調べながら作成し、フォルダのフルパスをテキストボックスへ表示させられるようになったのですが、わからない点として、複数のフォルダを指定しても、テキストボックスに表示されるのは1フォルダ分のフルパスだけになってしまうという点です。 テキストボックス側のプロパティで、複数行で表示させる設定(Multiline)は有効(True)にしてありますし、ユーザーがドラックしたデータを受け入れるかの設定(AllDrop)も有効にしてあります。 その他、気づいた点として、☆ ドロップイベントの配列(pass)には指定したフォルダ分のフルパスが格納されていますが、textbox1.Text = pass[i] の部分で全てのフルパスがテキストに表示されません。 原因を考えましたが、どうしてもわからなかったので、どなたかお分かりになられる方がいらっしゃい ましたら、ご教授のほどお願いできますでしょうか? 何卒、よろしくお願いいたします。 ----------------------------------------------------------------------------- public Form1() { InitializeComponent(); this.textBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.textBox1_DragDrop); this.textBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.textBox1_DragEnter); } // ☆ ドラッグイベント private void textBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; else e.Effect = DragDropEffects.None; } // ☆ ドロップイベント private void textBox1_DragDrop(object sender, DragEventArgs e) { string[] pass = (string[])e.Data.GetData(DataFormats.FileDrop, false); int i; for (i = 0; i < pass.Length; i++) { textBox1.Text = pass[i]; } }

  • テキスト1文字をドラッグ&ドロップするには

    <div id="from">あいうえお</div> <div id="to">かきくけこ</div> とあって、「あ」の文字をドラッグ&ドロップで「か」と「き」の間に挿入させるようなことがしたいのですが、何か良い方法とかライブラリとかありますか?よろしくお願いします! # <div>は2つとも任意の場所にあって、絶対位置指定ではありません。

  • テキストファイルの内容を配列に格納したい

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> テキストファイルの内容(数字)を読み込み、double[][]に格納 する方法はありますか? 以下のソースではxxx.txtの内容をCStringで取得・表示できたのですが、 文字を数字に変換し、数字を一つずつdouble[][]に格納したいです。 例えば double[0][0] = 0; double[0][1] = 1; double[1][2] = 5; のように格納したいです。 <現時点でのソース> void CMyDlg::OnReadText() {  CString csBuf;  CStdioFile ifp;  m_Display = "";//m_Displayはエディットボックスのメンバ変数  if(ifp.Open("xxx.txt",CFile::modeRead)==NULL) return;  while(TRUE){   if(ifp.ReadString(csBuf)==NULL) break;   m_Display += csBuf + "\r\n";  }  UpdateData(FALSE);UpdateWindow();  ifp.Close(); } <xxx.txt>   0  1  2   3  4  5   6  7  8   9 10  11  12  13  14 数字はタブで間隔が開いています。 宜しければご指摘お願い致します。

  • ドラッグ&ドロップ出来なくなりました‥

     実は先日ADSLを導入したのですが、その前後からMacの調子が劇的に悪くなってしまい、かなり途方に暮れています。  最初は「マウス操作の調子がおかしい」という程度でした。プルダウン式の表示を見ようとしても、指が外れたかのように途中項目を選択してしまう。クリックに対する反応が異常に軽く、軽く一押ししただけでもダブルクリックの反応を示す等々。  ところが昨晩になって状況がさらに悪化し、アイテムが一切ドラッグできなくなってしまいました。アップルメニューを見ようとすれば、「キシキシ‥」 という感じの高い音がしたり(Macが動作しているときのカリカリいう音とは違います)。  「これはヤバい」と思い、Norton Disk DoctorによるチェックからOSの再インストール(新規インストール)からコンセントを抜いての休養、あげくにリストアまでしましたが、事態は変わらず。  この「教えて!goo」にログインしようにも、一度間違ったパスワードを入れただけで、勝手に10回試行したらしくロックアウトされてしまう始末。どなたか直し方を御存じでしたら是非教えてやってください。機種はiMacDV、OSはMac OS9(再インストール前は9.1でした)です。

    • ベストアンサー
    • Mac