前回も同じような質問をしたんですが、
CHrefStaticクラスの利用方法がよくわかりません。
サンプルソースなどありましたら、教えて頂けないでしょうか。
CHrefStaticのインスタンスを作成して、使用するんですよね。
ウィンドウハンドルの取得でエラーになってしまってます。
※青色で下線がつくまではいってます。
よろしくお願いします。
ウィンドウハンドルの取得はGetSafeHwnd()の事ですか?
ちゃんと取得出来るのですが.......
ソースなど、提示してみてはどうでしょうか?
ご返信ありがとうございます。
デバックしてみたところ、SetToolTipの呼び出しで
エラーが発生していました。
void CHrefStatic::SetToolTip(LPCTSTR lpStr)
{
m_dispToolTip = TRUE;
CWnd *pWnd = GetParent(); ←ここで、エラー
m_toolTip.Create(pWnd,TTS_ALWAYSTIP);
m_toolTip.AddTool( this, lpStr);
m_toolTip.Activate(TRUE);
}
よろしくお願いします。
SetToolTip() を、OnInitDialog() でやっていますか?
CDialogクラスを作成して。
以下の処理で、呼び出しています。
CAboutDlg aboutDlg;
aboutDlg.DoModal();
OnInitDialog() では、呼びだしていません。
> CDialogクラスを作成して。
> 以下の処理で、呼び出しています。
>
> CAboutDlg aboutDlg;
> aboutDlg.DoModal();
これのどこで? DoModal()の中ですか?
> CWnd *pWnd = GetParent(); ←ここで、エラー
このエラーは具体的にどんなエラーでしょうか?
あ、お昼食べてたらいっぱいレスが(^^;)
> これのどこで? DoModal()の中ですか?
『OnInitDialogではなく、DoModalでダイアログを呼び出しています』という風に勘違いされ
ているのではないでしょうか?←それは無いか
それか、コンストラクタでSetToolTipを呼び出しているとか。
説明不足ですいません。こんな感じです。
以下の記述で、SetToolTipを使うにはどうすれば
いいですか?すいません。宜しくお願いします
↓
// testDlg.cpp : インプリメンテーション ファイル
//
#include stdafx.h
#include test.h
#include testDlg.h
#include HrefStatic.h
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// ダイアログ データ
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
CHrefStatic m_TEST;
//}}AFX_DATA
// ClassWizard は仮想関数のオーバーライドを生成します
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV のサポー
ト
//}}AFX_VIRTUAL
// インプリメンテーション
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Control(pDX, IDC_TEST, m_TEST);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// メッセージ ハンドラがありません。
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestDlg ダイアログ
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
// メモ: この位置に ClassWizard によってメンバの初期化が追加され
ます。
//}}AFX_DATA_INIT
// メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しませ
ん。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
// メモ: この場所には ClassWizard によって DDX と DDV の呼び出し
が追加されます。
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestDlg メッセージ ハンドラ
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// バージョン情報... メニュー項目をシステム メニューへ追加します。
// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,
strAboutMenu);
}
}
// このダイアログ用のアイコンを設定します。フレームワークはアプリケーション
のメイン
// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定
// TODO: 特別な初期化を行う時はこの場所に追加してください。
return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われませ
ん。
}
記載するのを忘れていました。
バージョン情報の方で使いたいです。
お願いします。
コンストラクタで呼び出した場合、親ウィンドウが作成されていないので今の場所でエラーが出
ますから、コンストラクタで呼び出していると思われます。
OnInitDialogでSetToolTipを呼び出せばOKですね。
ああ!ソースが!
すみません行き違いになりました。
て、事で、CAboutDlgのOnInitDialog内で呼べばOKですね。
でも、ドコにもSetToolTipを呼び出している個所がないのに、なぜエラーが出たんでしょう
か?
CAboutDlg::CAboutDlg()にOnInitDialogをつくるんですか?
クラスウイザードではつくれないですよね。
自作ダイアログにはありますが。
メニューの「表示(V)→ClassWizard(W)...」でクラスウィザードダイアログを出し、
「メッセージマップ」タブを押して「クラス名(N):」コンボから「CAboutDlg」を選択、
次に「オブジェクトID(I):」リスト内の先頭にある「CAboutDlg」を選択、
次に「メッセージ(G):」リスト内の「WM_INITDIALOG」を選択、
すると「関数の追加(A)」ボタンが有効になるのでそれをクリックすれば
CAboutDlg クラスに OnInitDialog() が追加されます。
> CAboutDlg::CAboutDlg()にOnInitDialogをつくるんですか?
CAboutDlg::CAboutDlg()はコンストラクタですので、その中には作れません。念の為。
> クラスウイザードではつくれないですよね。
いえ、クラスウィザードで作れます。
WM_INITDIALOGを選択して関数追加して下さいませ。