1

ここに私の問題があります:私のソリューションには、2つのプロジェクトがあります。1つは、リソースファイル(mylib.rc)とその中にダイアログテンプレートを作成したlibです。次に、CDialogを継承し、このテンプレートを使用するクラスを作成しました。しかし、それをインスタンス化してDoModal()を呼び出すと、何も追加されません...

ここに私のクラスのコードがありますが、何か問題がありますか?

MyDialog.h

/*MyDialog.h*/
#pragma once
#include "../../../resource.h"

class MyDialog : public CDialog
{
    enum {IDD=IDD_DLGTEMPLATE};
public:
    MyDialog(CWnd* pParent = NULL);  
    virtual ~MyDialog();

protected:
    virtual BOOL OnInitDialog();

    DECLARE_MESSAGE_MAP()
private:
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedCancel();
};

MyDialog.cpp

/*MyDialog.cpp*/
#include "stdafx.h"
#include "MyDialog.h"

MyDialog::MyDialog(CWnd* pParent /*=NULL*/) : CDialog(IDD_DLGTEMPLATE, pParent) {}
MyDialog::~MyDialog() {}

BOOL MyDialog::OnInitDialog() { return TRUE; }

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_BN_CLICKED(IDOK, &MyDialog::OnBnClickedOk)
    ON_BN_CLICKED(IDCANCEL, &MyDialog::OnBnClickedCancel)
END_MESSAGE_MAP()

void MyDialog::OnBnClickedOk() { OnOK(); }
void MyDialog::OnBnClickedCancel() { OnCancel(); }
4

3 に答える 3

2

ライブラリと静的にリンクしていますか?

はいの場合、理由の1つは、リッチエディットコントロールを使用しているが、RICHED20.DLLまたはRICHEDIT.DLL.3を初期化していないことである可能性があります。AfxInitRichEdit2またはAfxInitRichEditを呼び出す必要があります。ダイアログのリソースがDLLにある場合は、ダイアログを呼び出す前に、リソースハンドルをDLLモジュールのハンドルに設定する必要があります。

AfxGetResourceHandleを呼び出して現在のハンドルを保存し、AfxSetResourceHandleを呼び出してハンドルをDLLに設定します。

ダイアログが表示されたら、AfxSetResourceHandleを使用して、保存されたハンドルを使用してハンドルを設定します。

于 2012-06-28T18:03:55.497 に答える
1

への呼び出しの直前に次を配置してみてくださいDoModal()

AFX_MANAGE_STATE(AfxGetStaticModuleState());
于 2012-06-28T19:19:43.600 に答える
0

私はついにそれを見つけました。2番目のリソースファイル(* .rc)を使用していました。「コンパイル時のディレクティブ」として、「リソースビュー」の「SetIncludes」ダイアログボックスを使用して、2番目のファイルを最初のファイルに含める必要がありました。

とにかくみんなありがとう!

于 2012-06-29T07:36:22.207 に答える