1

バックストーリー: 人気のあるゲーム開発スイートである Game Maker の拡張機能を作成しています。拡張機能は、組み込みのスクリプト言語に新しい機能を追加する DLL ですが、C や Pascal などで記述されています。通常、ゲームが外部ライブラリを使用できるようにするために使用されます。

私の場合、FMOD サポートを追加しています。これは関係ありません。関連するのは、デバッグの目的で、ライブラリの内部状態を示す実行時に表示するダイアログも追加していることです。このウィンドウについて助けが必要です。私は文字通り、今日まで生の Win32 フォーム プログラミングをまったく行っていません (.NET WinForms 4eva)。

ともかく。リストボックスがあり、リスト ボックスに項目を追加したいのですが、追加しようとすると失敗します。私のコード:

extern DebugDialog * debugDialog;

DebugDialog::DebugDialog(HWND owner, HINSTANCE hInst) {
    this->hWnd = 0;

    HWND hWnd = CreateDialogParam(hInst,
                        MAKEINTRESOURCE(IDD_DEBUGDIALOG),
                        owner,
                        DialogProc,
                        reinterpret_cast<LPARAM>(this));

    ShowWindow(hWnd, SW_SHOW);

}

DebugDialog::~DebugDialog(void) {
    DestroyWindow(this->getHWnd());
    debugDialog = NULL;
}

BOOL CALLBACK DebugDialog::DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    DebugDialog * self;

    if(message == WM_INITDIALOG) {
        self = reinterpret_cast<DebugDialog *>(lParam);
        self->hWnd = hWnd;
        SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(self));
    } else {
        self = reinterpret_cast<DebugDialog*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
    }

    if(self) {
        return self->HandleMessage(message, wParam, lParam);
    } else {
        return FALSE;
    }
}


BOOL DebugDialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch(uMsg) {
        case WM_INITDIALOG:
            MessageBox(this->getHWnd(), "Okay!", "Debug", 0);
            return TRUE;

        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case ID_CLOSE:
                case IDOK:
                case IDCANCEL:
                    delete this;
                    return TRUE;
                default:
                    return FALSE;
            }
            return TRUE;
    }

    return false;
}

void DebugDialog::loadedSound(FMODGM_Sound * sound) {
    HWND hwndList = GetDlgItem(this->getHWnd(), IDC_LIST);

    LPARAM sound_text = (LPARAM)sound->file.c_str();

    LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, sound_text);
    SendMessage(hwndList, LB_SETITEMDATA, lResult, (LPARAM)sound);

}

DebugDialogは、ウィンドウをラップする単純なクラスであり、外部から操作できるようにします。基本的に、他の時点で、私はこれを行います:

debugWindow = new DebugDialog(owner, hInst);

そして、興味深いことを実行して実行するときは、次のようにします。

FMODGM_Sound * sound = ...;

if(debugWindow) debugWindow->loadedSound(sound);

loadedSound、リストボックスに「やあ、ここに項目があります。どうぞ、追加してください」というメッセージを送ったところ、エラーは返されませんでした。ただし、ボックスには何も追加されません。呼び出すたびに0を返します。ドキュメントによると、0 は、インデックスが 0 のアイテムが追加されたことを意味します。ただし、そのアイテムは存在しません。

なぜそれが機能しないのかについて、私は理論を持っています。Game Maker が実行するメッセージ ポンプを制御することはできません。そのため、おかしな動作をしていても、それについてはわかりませんし、変更することもできません。とはいえ、ダイアログの移動、[閉じる] ボタンのクリック、リストボックス内のマーキーのマウスによる描画など、ダイアログに関する他のすべての機能が動作します。

誰か、私がひどく間違っていることを教えてください:(

編集:誰かが構造体について尋ねたFMODGM_Soundので、ここにあります:

struct FMODGM_Sound {
FMOD::Sound * sound;
std::vector<FMOD::Channel*> channels;
    std::string file;

public:
    FMODGM_Sound() {
        sound = NULL;
    }
};

特に派手なものはありません。

4

3 に答える 3

0

FMODGM_Sound 構造体とファイル フィールドの宣言を表示できますか?

交換したらどうなる

LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, sound_text);

と ?

LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, "some constant text");
于 2011-04-20T10:49:54.887 に答える
0

DLL は Unicode バージョンまたはマルチバイト バージョンとしてコンパイルされていますか?

Unicode の場合、sound_text は Unicode 文字列にする必要があります。ファイルは std::string だと思うので、 file.c_str() はマルチバイト文字列を返します。

于 2011-04-20T11:19:39.253 に答える