DXライブラリのD&D関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 8年前
住所: 東京

DXライブラリのD&D関数について

#1

投稿記事 by MoNoQLoREATOR » 7年前

DXライブラリの「D&Dされた絶対パスを取得する関数」は、複数ファイル/フォルダのD&Dには対応していないのでしょうか?

D&Dされた絶対パスが一つ一つNULLで区切られているものだと仮定して、下記のようなコードを組んだのですが、表示結果はめちゃくちゃになります。
正確に言うと、一つ目のNULLが出現するまでの文字列はちゃんとした文字列ですが、それ以降の表示結果は文字列だとは言えないものになっています。

↓ソースコード

コード:

#define _CRT_SECURE_NO_DEPRECATE

#include "DxLib.h"
#include <vector>
#include <string>

namespace o{

std::vector<std::string> nullice(const char * str, size_t num){
	std::vector<std::string> vs;
	vs.push_back("");
	size_t strNum=0;
	for(size_t i=0;i<num;i++){
		while(str[strNum] != NULL) vs[i] += str[strNum], strNum++;
		vs.push_back("");
		strNum++;
	}

	return vs;
}

}

std::vector<std::string> DDpath(){
	std::vector<std::string> vs;
	
	if(size_t num = GetDragFileNum() ){
		char * c = new char[1000];
		GetDragFilePath(c);
		vs = o::nullice(c, num);
		DragFileInfoClear();
		delete c;
	}

	return vs;
}

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(true);
	SetOutApplicationLogValidFlag(false);
	SetWindowText("DxLib");
	if(DxLib_Init() == -1) return(-1);
	SetAlwaysRunFlag(false);
	SetDrawScreen(DX_SCREEN_BACK);
	SetDragFileValidFlag(true);

	std::vector<std::string> show;
	SetFontSize(12);

	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
        ClsDrawScreen();

		std::vector<std::string> r = DDpath();
		if(r.size() ) show = r;

		for(size_t i=0;i<show.size();i++) DrawString(0,15*i, show[i].c_str(), 0xffffff);

		ScreenFlip();
	}

	DxLib_End();
	return(0);
}
ご教授よろしくお願い致します。

アバター
みけCAT
記事: 6182
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: DXライブラリのD&D関数について

#2

投稿記事 by みけCAT » 7年前

ここを参考にどうぞ。
使えるかはわかりませんが。
http://unkar.org/r/gamedev/1238429676/Tree:161
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
沖 滉均
記事: 237
登録日時: 8年前
住所: K県F市

Re: DXライブラリのD&D関数について

#3

投稿記事 by 沖 滉均 » 7年前

公開関数じゃないんですかね?
ちょっと見当たらなかったのでコード覗いてみました。

GetDragFileNum関数でD&Dされたファイル数を取得
その後、1回GetDragFilePath関数を呼ぶ毎に1ファイルずつ取得できるようです
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
MoNoQLoREATOR
記事: 284
登録日時: 8年前
住所: 東京

Re: DXライブラリのD&D関数について

#4

投稿記事 by MoNoQLoREATOR » 7年前

>>みけCATさん
>>沖 滉均さん
返信ありがとうございます。

なるほど、何度も呼び出すことによって全ての情報を取得するタイプの関数でしたか。
私はこのタイプのものは好きではありませんね。
専用の構造体などを作って、先頭アドレスと要素数を返せば良いのに・・・といつも思います。

なにはともあれ解決しました。ありがとうございました。

アバター
沖 滉均
記事: 237
登録日時: 8年前
住所: K県F市

Re: DXライブラリのD&D関数について

#5

投稿記事 by 沖 滉均 » 7年前

解決したのであれば解決にチェックを…
オフトピック
と、もうひとつこちらは単純な興味というか疑問ですが
GetDragFilePath関数って公開関数ではないですよね?
どのような経緯で見つけて、なぜNULLで区切られていると仮定したのでしょうか?
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
MoNoQLoREATOR
記事: 284
登録日時: 8年前
住所: 東京

Re: DXライブラリのD&D関数について

#6

投稿記事 by MoNoQLoREATOR » 7年前

あ、すみません。解決チェックを忘れていました。

>>どのような経緯で
DXライブラリにそんな関数があればいいな~と思って検索してみたらHITした次第です。
DXライブラリに隠し関数が存在することをしったのはこのページをみつけたからですね。
このページに出会ったおかげで、たとえ公式リファレンスに載っていなくても、希望の関数がある可能性があるということを知りました。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 8年前
住所: 東京

Re: DXライブラリのD&D関数について

#7

投稿記事 by MoNoQLoREATOR » 7年前

P.S.
>>なぜNULLで区切られていると仮定したのでしょうか?

WindowsAPIのファイル参照ダイアログ表示関数から返されたファイルパスが複数の場合はNULLで区切られていた記憶があったからです。うろ覚えですが・・・。

アバター
沖 滉均
記事: 237
登録日時: 8年前
住所: K県F市

Re: DXライブラリのD&D関数について

#8

投稿記事 by 沖 滉均 » 7年前

返信遅くなってしまいましたがもう1点お伝えしたいことがありましたので。

なるほど、そういうAPIもあるのですね。
Win32APIは大分忘れてしまっているので…
MoNoQLoREATOR さんが書きました:DXライブラリにそんな関数があればいいな~と思って検索してみたらHITした次第です。
この点に関してです。
DXライブラリは改造希望の方へとしてソースコードが公開されています。
こんな関数はないかな?って思った時などに、調べてみるとまだまだ便利な関数が隠されているかもしれませんね。
そして、リファレンスには載っていないものですのでコードを見て使い方を調べてみると良いですね。

そこまで難しいコードではないので何かしら別の活用方法もあるかもしれませんし、勉強にもなると思います。
ただし、それでも使い方が分からない場合などもあるでしょう。
今回のように公開されてない関数を質問する際はその旨どこかに記述しておいた方が良いです。
あとバージョン毎でもしかすると隠し関数が使えなくなってしまう場合もあるかもしれないのでDXライブラリのバージョンも書いてあると回答者にわかりやすいと思います。
There is no royal road to learning.
codeタグで指定できる言語
画像

閉鎖

“C言語何でも質問掲示板” へ戻る