Windowsプログラミングについて質問です。
自分の好きな拡張子のファイルアイコンにドラッグドロップの動作を付けたいと思っています。
レジストリにShellEx\DropHandlerを追加して、CLSIDを書きこめばできるっぽいという所まではわかりました。
ですがどのようなプログラムを組めばよいのか、それ以上わかりません。
MSDNライブラリを眺めてもIPersistFileとかIDropTargetとかを
使えば良さそうな感じなのか?というような程度しかわかりませんでした。

具体的にはドロップされた対象のフルパスとドロップされたファイルのフルパスのリストを得たいのですが、
わかりづらい質問内容かもしれませんが、どなたか教えていただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Microsoft PowerToysのSendTo Extensionsが実行ファイル以外のものに、ファイルを送るとかいう機構を使っているようなので、参考にならないかな(じしんなし)。



参考URL:http://plaza7.mbn.or.jp/~suto/pt.htm
    • good
    • 0

それってごく一般的に、自作アプリケーションにドラッグ&ドロップ


ってことですよね?
ご使用のライブラリはATLってことでよいでしょうか。
アプリケーション一個丸ごとATLで作ってるのでしょうか?
それとも、自作COMコンポーネントでDrag&Drop動作の
サポートのため・・・ということでしょうか。

IPersistFileは多分関係ないと思います。
IDropTargetインターフェイスを継承して、
RegisterDragDropで目的のウインドウをターゲットとして
登録してください。
その後、IDropTargetのDropメソッドを実装してください。
引数にIDataObjectのポインタがありますので、
こいつにアクセスしてGetDataメソッドを起動し、STGMEDIUM構造体へのポインタを得てください。
STGMEDIUM構造体にファイル名を示すメンバがありますよね?

私はやったことないので、ちょっとこれで上手く行くか断言出来ませんが
私がMSDNから読み取れるのはこの程度です。

あとはCOMコンテナにイベントをFireするなり何なりお好きに
いじればいいと思います。

この回答への補足

>自作アプリケーションにドラッグ&ドロップ
とは違うんですけど、同じ処理で問題無いということでしょうか?

>目的のウインドウをターゲットとして登録してください
下記の補足に書いた例でいうと、
「目的のウインドウ」とはa.txtとb.txtが表示されている
エクスプローラのウインドウのことでいいのでしょうか?


それとついでなのですが、
DropメソッドとDoDragDropメソッドの違いが
HELPからあまりよく理解できませんでした・・・
もしよければこの違いも教えていただけないでしょうか?

補足日時:2000/12/16 02:40
    • good
    • 0

ちょっとわかりづらい質問です。

。。
ウィンドウにドロップされたファイルのパスを取得するのであれば、DragAcceptFiles関数、DragQueryFile関数を調べてみてください。
IPersistFileとかIDropTargetについてはパスです。

この回答への補足

ウインドウにドロップするのではなく、
エクスプローラ上にあるアイコンにドロップしたいんです。
それも.exeにじゃなくて、自分が指定した拡張子のファイルに。

例えばa.txtのアイコンの上にb.txtをドロップさせたら
このソフトが起動して二つのファイルの内容を連結したものがa.txtに書きこまれた状態でメモ帳が起動する・・・
とかをやりたいんです。

ATLとかCOMとかの話しだと思うのですが、
どうもよくわからなくて・・・

補足日時:2000/12/15 01:25
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAS2をAS3にしたい

AS2で書かれたスクリプトの一部があります。下記をAS3にしたいのですが。
ちなみに、mcはインスタンス名です。

 onClipEvent (load) {  
   pointX = 10; 
   pointY = 20;
 }
 onClipEvent (mouseMove) { 
     _root.mc._x = _root._xmouse + pointX; 
     _root.mc._y = _root._ymouse + pointY; 
   }

Aベストアンサー

ActionScript 2.0 → 3.0 変換といよりも
ActionScript 1.0(一番初期) → 3.0 変換ですね。。。



ムービークリップ「mc」が存在する任意のタイムラインの,
任意の "フレーム(キーフレーム)" に書くスクリプト例です↓。

//============================
var pointX:Number=10;
var pointY:Number=20;

stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveFunc);

function mouseMoveFunc(e:MouseEvent):void {
MovieClip(root).mc.x=stage.mouseX+pointX;
MovieClip(root).mc.y=stage.mouseY+pointY;
}
//============================

QMSDNライブラリのダウンロード

テキスト編集ツールでWin32 APIを使ったプログラミングをしているのですが、そのときにいつもMSDN Libraryで関数を毎回調べながら作業を行っています。

なのでネットに繋げない環境ではMSDN Libraryに接続できなく、作業ができません。(けっこうそういう環境でPC触ることも多いです)

ちょっと見てみたんですけど、一括ダウンロードというのはMSDN Libraryでは見つけれませんでした(情報量が多すぎてどうやって探せばいいのかわからないというのが本音です)。
MSDN Libraryの情報の一括ダウンロードなどは提供されていないのでしょうか?

また、そうだとした場合、オフラインで作業をする手段はありますか?あったら教えてください。

Aベストアンサー

Visualstudioを購入するか、 MSDNを契約すればCD-ROMまたはDVDでついてきてローカルにインストール可能かと。

Qas2,flashCS4 横スライドフォトギャラリーの作り方

as2,flashCS4 横スライドフォトギャラリーの作り方

いつもお世話になっております。

下記URLのような、写真ギャラリーが作りたいです。
http://www.hm-andrei.ro/#panel-3


下記URLを参考にしながら、練習しているのですが、
無限にスクロールするメニュー
http://flashrave.org/anima/infinity_scroll/
なかなか上手くいきません。。。
(”「menu」というシンボルを作り”が、
”新規シンボル”なのか、”シンボルに変換”なのかがよくわかっていないからなのかもしれないですが。。。)

とにかく!
率直にやり方を教えて頂けるのが一番ありがたいですが、
参考資料なんかをコピペして教えて頂けると嬉しいです。

よろしくお願い申し上げます!!

Aベストアンサー

はじめまして。
私もまだまだ勉強中なのですが、この↑のサイトのようにしたいというのであれば、
フラッシュではないですが、サイト自体Jqueryのanythingsliderを使用しているので
そちらを利用したらいかがでしょうか?
http://css-tricks.com/anythingslider-jquery-plugin/

ただ私も、javascriptをフラッシュにcallしたいのですが、そこがまだ
理解できていないので、他の方のアドバイスを頂ければと思ってます。

Jqueryは簡単に取り入れられるし、いいかと思いますよ。

Qg++コンパイルしながら使用されたヘッダー・ライブラリのフルパスを表示させたい

宜しくお願い足します。

: posix
gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
g++: no input files

の環境です。

$ g++ -o hoge hoge.cc
としてコンパイルしながらにコンパイラがどのヘッダー、ライブラリを使用したかフルパスで表示させるにはどのようなオプションを指定すればいいのでしょうか?

Aベストアンサー

#2です。

#3の方の書かれた-Mの方がいいですね。

QAS2でカスタムカーサーを使ってMCをドラッグ

いつもお世話になっております。

AS2でMCをドラッグするという質問を前回させていただいた際に
適切なご回答を頂いたのですが、今回ドラッグするMC上にカスタムのカーサーを入れようと
すると、ドラッグができなくなってしまいました。

twolargeMC上にマウスをrolloverすると、オリジナルの手のカーサーが現れ、
ドラッグするとカーサーがグーをした手に変わり、更にtwolargeMCのイメージが
ドラッグできるようにしたいです。
どなたかご教授頂けますと幸いです。

カーサーはhandMCと名づけ、MCに直に
onClipEvent (load) {
handMC.startDrag(true);
Mouse.hide();
}を付けました。更にMC内に"image"(手のカーサーイメージ)、"grab"(グーをした手のイメージ)、"none"(何も入れてない)ラベル名を入れました。
現在は下記のスクリプトでオリジナルの手のカーサーだけ表示するのに成功したのですが、ドラッグができず、MouseDownの際にグーをした手のカーサーに変えるスクリプトがいまいち分かりません。
宜しくお願いいたします。

質問番号:6354856
下記のAppleショップのように、拡大イメージを表示した後、
そのイメージをDragでドラッグできるようにし、クリックすると
元の小さいイメージを表示できるようにしたいのですが、うまくいきません。
http://store.apple.com/uk/product/MC596ZM/A?fnod …

標準サイズのイメージをtwoMCとしてFrame20に入れ、Frame25に
拡大イメージ(twolargeMC)を入れました。
Frame20のアクション
twoMC.onRelease = function()
{
gotoAndStop(25);
}

Frame25のアクション
twolargeMC.onPress = function() {
startDrag(this);
}


twolargeMC.onRelease = function() {
gotoAndStop(20);

}
上記で一応イメージはドラッグできますが、マウスを離した途端
標準サイズのイメージになってしまいます。

これをドラッグした後も拡大イメージを表示しつつ、
再度クリックした際に標準サイズのイメージが表示できるようにしたいです。

どなたかご教授いただけますでしょうか。宜しくお願いします。

質問番号:6354856
No.1ベストアンサー20pt

回答者:BlurFiltan 回答日時:2010/12/01 18:51
元の Appleショップ サイトのJSで動くものが
私の環境では(だけ?)ドラッグできないので
したいことが今ひとつ理解しにくいです。。。
(何だか出来の悪いJS...。無理をゴリ押ししてみっともないことになってるApple。)


良くはわかりませんが,
「ドラッグを 『した』か 『していない』か というフラグとなる変数」を作って
それの変数の値を使って判断すれば良いのではないでしょうか。


--- Frame25 のアクション---------------
//ドラッグ 『した』『していない』のフラグをfalseにしておく
var drag_flg:Boolean = false;

//twolargeMCを押したときに実行するメソッドを定義
twolargeMC.onPress = function() {
//twolargeMCをドラッグ開始
startDrag(this);
//
//マウスが動いたときに実行するメソッドを定義
this.onMouseMove = function() {
//ドラッグ 『した』『していない』のフラグをtrueにする
drag_flg = true;
//即 このマウスが動いたときに実行するメソッドを削除
delete this.onMouseMove;
};
};

//twolargeMCを放したときと
//外で放したときに実行するメソッドを定義
twolargeMC.onRelease =
twolargeMC.onReleaseOutside = function () {
//もしドラッグ 『した』『していない』のフラグがfalseの場合
if (!drag_flg) {
gotoAndStop(20);
} else {
//ドラッグ終了
stopDrag();
//ドラッグ 『した』『していない』のフラグをfalseに戻す
drag_flg = false;
}
};
------------

いつもお世話になっております。

AS2でMCをドラッグするという質問を前回させていただいた際に
適切なご回答を頂いたのですが、今回ドラッグするMC上にカスタムのカーサーを入れようと
すると、ドラッグができなくなってしまいました。

twolargeMC上にマウスをrolloverすると、オリジナルの手のカーサーが現れ、
ドラッグするとカーサーがグーをした手に変わり、更にtwolargeMCのイメージが
ドラッグできるようにしたいです。
どなたかご教授頂けますと幸いです。

カーサーはhandMCと名づけ、MCに直に
onClipEv...続きを読む

Aベストアンサー

#1です。

前回のとき(つまりカスタムカーサーを入れる前)は,
「twolargeMC」をドラッグできていて
#1で回答したものを入れた後(つまり#1のカスタムカーサーを入れた後),
「twolargeMC」をドラッグできなくなったということですか?

それは謎ですね。

カーソル(カーサー)のスクリプトとドラッグのスクリプトは
あえて全く無関係にしていますから干渉し合うことはないと思いますが。
また,
実際に作成してみましたがそんなことにはなりませんでしたよ。

原因は他の部分にあるのでしょうね。
つまり
今回も前回も書かれていない箇所が原因でしょう。


以下は単に思いつくまま書くだけですが。

例えば
カーサームービークリップ「handMC」自体に
on(release){…} や
on(press){…} や
on(rollOve){…} などというような
ボタン由来の onイベントハンドラ を書いているとか。
もしくは
ムービークリップ「handMC」が存在するフレームに
handMC.onRelease=function(){…} や
handMC.onPress=function(){…} や
onRollOve=function(){…} などというような
ボタン由来の onイベントハンドラメソッド を書いているとか。

また例えば
ムービークリップで作っていたカーサー「handMC」を
ボタンで作り替えたとか。

また例えば
ドラッグする twolargeMC の上のレイヤーに
透明のボタンでも用意してしまったとか。
 

#1です。

前回のとき(つまりカスタムカーサーを入れる前)は,
「twolargeMC」をドラッグできていて
#1で回答したものを入れた後(つまり#1のカスタムカーサーを入れた後),
「twolargeMC」をドラッグできなくなったということですか?

それは謎ですね。

カーソル(カーサー)のスクリプトとドラッグのスクリプトは
あえて全く無関係にしていますから干渉し合うことはないと思いますが。
また,
実際に作成してみましたがそんなことにはなりませんでしたよ。

原因は他の部分にあるのでしょうね。
つま...続きを読む

QVBとかC#とかC++とか

Visual Studio2010でシステムを作るのですが、
VBやC#やC++などありますが、どれがどのようなのに向いているのですか?

VBは簡易ですが、処理などは遅いのでしょうか?
フォームをつくってデータベースとデータのやりとり(文字情報のみ)を
するシステムはどの言語が向いてますか?
一度に使用する人数は数十人いて、レスポンス重視です。
教えてください、お願いします。

Aベストアンサー

データベースと連携するならば、僕だったらVC#一択です。
C# 3.0以降はLINQというDB連携機能が言語仕様自体に組み込まれているし、インテリセンスなどのIDEの支援が最も手厚いのがVC#です。

VB.NETは機能的にはVC#とほぼ同等で、速度もほぼVC#と同等のものが出せますが、文法が美しくないので僕はあまり好きではありません。仕事でもなければ使いたくないです。

VC++は生産性・機能性の点でVC#に及ばないです。.NET用に拡張されたC++/CLIはVC++ 2010でのインテリセンスが機能しないのでお勧めしません。

実行速度面においては、たとえC#でも、.NETの癖を知った上で気をつけて実装すれば大抵の場合そうそう困ることはないです(スループットが重要な産業系の画像処理、CGレンダリング処理、あるいはゲームなどのリアルタイム系でなければ)。
ただし、従来のネイティブ コードの資産を流用しやすく、細かい制御がしやすいのはVC++です。

Qin as little as 2 weeks

次のNHKニュース:

Successful applicants may be allowed to begin offering the service in as little as 2 weeks.

で、weeksは長さか数なのでlittleではなくshortやfewが適切ではないでしょうか

Aベストアンサー

これからの時間なので、in as soon as two weeks とはできると思います。

これは weeks 自体が可算だから few というのでなく、
時間が不可算だから little になっています。

two hundred dollars と dollar については可算でも
how much と聞くのと同じ。

もっとも、no fewer than の代わりに no less than を使う
ということが標準語法となっている、という部分がないわけでもないですが。

Qフルパス名の取り出し

いつもお世話になっています。
VS2005でWindowsアプリケーション作成を行っています。

今回、フルパス名を仮に
 szPath = "c:\Test\Debug\test.exe"

とした場合、最後の"test.exe"を取り出すためには、
 _splitpath(szPath, drive, dir, name, ext);
 _makepath(path, drive, dir, NULL, NULL);

としますが、"Debug\test.exe"を取りたい場合も、
上記の関数を使ってできるのでしょうか?

ご教授お願いいたします。

Aベストアンサー

shlwapi.hの関数を使うとこんな感じ。

TCHAR szFilePath[MAX_PATH];
TCHAR szFileName[_MAX_FNAME + _MAX_EXT];
TCHAR szParentDirPath[_MAX_DIR];
TCHAR szParentDirName[_MAX_FNAME];
TCHAR szTargetPath[_MAX_PATH];

// 自分自身のフルパス(サンプル用)
::GetModuleFileName(NULL, szFilePath, _countof(szFilePath));
// ファイル名を取得
lstrcpy(szFileName, ::PathFindFileName(szFilePath));

// ファイル名を除いたパスを取得
lstrcpy(szParentDirPath, szFilePath);
::PathRemoveFileSpec(szParentDirPath);

// ルート以外なら親ディレクトリがある
if (!::PathIsRoot(szParentDirPath))
{
  // 親ディレクトリ名を取得
  lstrcpy(szParentDirName, ::PathFindFileName(szParentDirPath));
  // ファイル名と結合
  ::PathCombine(szTargetPath, szParentDirName, szFileName);
}
// ルートの場合は親ディレクトリがないが・・・?
else
{
  // 一応ファイル名だけ
  lstrcpy(szTargetPath, szFileName);
}

shlwapi.hの関数を使うとこんな感じ。

TCHAR szFilePath[MAX_PATH];
TCHAR szFileName[_MAX_FNAME + _MAX_EXT];
TCHAR szParentDirPath[_MAX_DIR];
TCHAR szParentDirName[_MAX_FNAME];
TCHAR szTargetPath[_MAX_PATH];

// 自分自身のフルパス(サンプル用)
::GetModuleFileName(NULL, szFilePath, _countof(szFilePath));
// ファイル名を取得
lstrcpy(szFileName, ::PathFindFileName(szFilePath));

// ファイル名を除いたパスを取得
lstrcpy(szParentDirPath, szFilePath);
::PathRemoveFileS...続きを読む

QAS2 初心者です オブジェクトの移動について 

Actionscript2 で上から落下してきたオブジェクトが下(地面?)でバウンドして
バウンドの幅がだんだん小さくなって行って止まる。
というのはどのようにしたらよいのでしょうか。

http://hakuhin.jp/as/move.html#MOVE_05
上記のサイト「放物線(自由落下)のように移動させたい」のように

横に弾んでいくのではなく、同じ場所で縦にのみバウンドする動きです。


また、バウンドがその場で止まったあと、横に少し転がって止まるようにもしたいのですが
それはどのようにしたらよいのでしょうか。

初歩的な質問ですみませんが、詳しい方がいましたら教えてください。
よろしくお願いします。

Aベストアンサー

> 横に弾んでいくのではなく、
> 同じ場所で縦にのみバウンドする動き

つまり単純に
「x座標方向(横方向)移動関係のスクリプトを全て消せば良い。」
それだけのことでしょう?

横に動く理由(原因)は
「x座標方向に動かしているからx座標方向に動く」
それだけのことです。
ですからこの理由(原因)を取り除けば良いだけです。

最初の「move_05_00_fla05_as1.fla」内の
「player(ボールMC)」自体に書かれたスクリプトを変更する場合は
次のようになります(x座標に関係する行を消しただけ)。

//---------------------------
onClipEvent (load) {
_y = 150;
dy = -10;
}

onClipEvent (enterFrame) {
dy += 0.5;
// 下方向に移動量を増やす
_y += dy;
// 地面に着いたらyの移動量を反転
if (_y>250) {
_y = 250;
dy *= -0.8;
}
}
//---------------------------

 

 
> また、バウンドがその場で止まったあと、
> 横に少し転がって止まる

私が上に書いたスクリプトでも 元のスクリプトでも,バウンドは決して止まりません。
-0.8倍 ずつ小さくなるだけです。

ですからまずは,
「『バウンドが止る』とはどういうことなのか」
を定義する必要があります。

その定義した状態(条件)になれば
『横に転がる』という動きをさせるわけですが
「どのように『横に転がる』のか」
これも書かれていないのでわかりません。

さらに「少し転がって」の
「『少し』とはどういうことなのか」
もわかりません。
『少し』とは
時間的に『少し』なのか,距離的に『少し』なのかすらもわかりません。

すべてにおいてアヤフヤですね(考える気すらもないのでしょうか?)。

もしスクリプトをコーディングするのでしたら
その前にこの辺のことはしっかりと "具体的に" 考えておく必要があります。
スクリプト以前(以下)の話です。


とにかく他人まかせ(または PCまかせ)でアヤフヤなことだらけなので
私が勝手に決めた定義と動きで行きます。

//---------------------------
onClipEvent (load) {
_y = 150;
dy = -10;
}

onClipEvent (enterFrame) {
dy += 0.5;
// 下方向に移動量を増やす
_y += dy;
// 地面に着いたらyの移動量を反転
if (_y>250) {
_y = 250;
dy *= -0.8;
//もし dy の絶対値が 1 未満になれば
if (Math.abs(dy)<1) {
//x座標を 80 に向けて 1/20 ずつ近づける
this._x +=(80-this._x)/20;
}
}
}
//---------------------------

 

気に入らない動きであれば自由に変更してください。

 

思うのですが,
何故このような動きにスクリプトを使う必要があるのでしょうか?

もし,ActionScript やそれ以前(以下)のことすら考える気もないのでしたら
最初からスクリプトなど使わずにモーショントゥイーンで作成すれば良いだけだと思います。

モーショントゥイーンを使えばもっと良い動き(情緒や感性あふれる動き)を簡単に作ることができますよ。

「移動するバウンドボール(オレンジのサンプルFLASH講座)」
http://orange.2-d.jp/flash/anime/03.html

「FLASH活用講座 トゥイーンアニメーションを作る」
http://juen-cs.dl.juen.ac.jp/html/flash/04/03/explanation.html

「24 リアルなボールのバウンド - MdN Design Interactive」
http://www.mdn.co.jp/di/articles/655/?page=4

> 横に弾んでいくのではなく、
> 同じ場所で縦にのみバウンドする動き

つまり単純に
「x座標方向(横方向)移動関係のスクリプトを全て消せば良い。」
それだけのことでしょう?

横に動く理由(原因)は
「x座標方向に動かしているからx座標方向に動く」
それだけのことです。
ですからこの理由(原因)を取り除けば良いだけです。

最初の「move_05_00_fla05_as1.fla」内の
「player(ボールMC)」自体に書かれたスクリプトを変更する場合は
次のようになります(x座標に関係する行を消しただけ)。

//-----------------...続きを読む

QMSDNがgethostbynameではなくgetaddrinfoを使えと言うわけ

gethostbyname関数は無駄がなく思えるのですが、MSDNでは「これからはgetddrinfoを使っていけ」みたいなことをgethostbyname関数の説明に加えています。

gethostbyname関数もIPの長さは可変に対応してますよね?
何の都合があってgetaddrinfoを使わなければいけないのでしょうか。

getaddrinfoって、なんだかややこしい割に得られる情報が大したことない(他の手段で簡単に得られる)し、ai_canonnameなど、指定した情報がそのまま格納されるだけな気がしますが・・。

Aベストアンサー

最大の理由は、gethostbyname が返す領域のメモリが非常に扱いにくいからだったかと。
古いC言語の関数にありがちな一見簡単に使えるが危険も多い用法で、戻り値の格納領域を gethostbyname の内部で持つので、この領域の開放タイミングがライブラリ提供側には判断ができず。
ユーザ側での排他制御を前提としたり、必要に応じて結果をコピーする必要がでたり、スレッドセーフティ等の面で問題が見えてきたので、これが getaddrinfo が新しく策定された動機のはずです。


人気Q&Aランキング

おすすめ情報