ダイアログにハイパーリンクを作成する

ブラウザのリンクをダイアログ上に作成する方法です。
ハイパーリンクを作成するにあたって、最低やるべき事は以下の4つ。

1.リンクに下線を引く。
2.リンクの文字の色を変更する。
3.リンク上にカーソルが来たらカーソルを変更する。
4.リンクをクリックするとブラウザが立ち上がり、そのURLを開く。

あと、リンク上にカーソルが来た時、リンクの文字の色を変えるなども有りますが
今回は標準のハイパーリンクを作成するという事で説明は省きます。

さて、コードを書く前にダイアログにスタティックテキストを配置します。
このスタティックテキストをハイパーリンクに変えていくという訳です。
それからプロパティーでIDの変更と「スタイル」の「通知」にチェックを入れてください。
IDは何でも良いですが今回はIDS_URLに設定するものとします。

それではスタティックテキストを配置したらコードを書いていきましょう。
まずはリンクに下線を引く方法ですが、これは新しく下線付きのフォントを作成して
スタティックテキストに設定してやります。
下線付きのフォントの作成はCreateFont()を使用して
7番目の引数をTRUEにすると下線付きのフォントになります。

2000/7/19 追記
この時作成したフォントはダイアログを破棄するまで必要なので
メンバ変数として宣言しておきます。


      :
private:
        CFont m_font;  // 2000/7/19 追記 
      :

そしてこのフォントをSetFont()でスタティックテキストに設定してください。
以上の作業はクラスウィザードでOnInitDialog()を作成しその中で行います。


// スタティックテキストに下線を引く
BOOL CXXXDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();

    // フォントの作成
    m_font.CreateFont(12, 0, 0, 0, FW_DONTCARE, FALSE, TRUE, FALSE,
                      SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
                      CLIP_DEFAULT_PRECIS, DRAFT_QUALITY,
                      DEFAULT_PITCH, _T("MS Pゴシック"));  // 2000/7/19 修正

/* これではメモリリークするのでコメントアウトします。
    CFont *pFont = new CFont;
    pFont->CreateFont(12, 0, 0, 0, FW_DONTCARE, FALSE, TRUE, FALSE,
                      SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
                      CLIP_DEFAULT_PRECIS, DRAFT_QUALITY,
                      DEFAULT_PITCH, _T("MS Pゴシック"));
*/

    // スタティックテキストに設定
    GetDlgItem(IDS_URL)->SetFont(&m_font);  // 2000/7/19 修正

//  GetDlgItem(IDS_URL)->SetFont(pFont);

    return TRUE;
}

次はスタティックテキストの色の変更です。
ではクラスウィザードでOnCtlColor()を作成してください。
メッセージはWM_CTLCOLORです。
OnCtlColor()はスタティックテキストなどのコントロールを表示する直前に
コントロールの数だけフレームワークから呼び出されます。
引数で渡されるpWndには何のコントロールのポインタが入っているので
もし色を変更するスタティックテキストのコントロールならば
pDCを使いSetTextColor()で色を変更します。

比較方法はpWndがスタティックテキストのコントロールのポインタか
調べればいいのですがそのまま比較しても一致しないので
コントロールのウィンドウハンドルが一致するかで調べます。
スタティックテキストのコントロールのポインタはGetDlgItem()で取得し
ウィンドウハンドルはメンバ変数のm_hWndで取得可能です。


// 色の変更
HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // コントロールを調べテキストを青に変更
    if(pWnd->m_hWnd == GetDlgItem(IDS_URL)->m_hWnd)
        pDC->SetTextColor(RGB(0, 0, 255));

    return hbr;
}

今度はカーソルの変更ですがその前に指のカーソルを作っておく必要があります。
自分でVC等のエディタを使ってオリジナルのカーソルを作っても良いし
他のアプリからツールを使ってカーソルを引っこ抜くのも良いでしょう。
ちなみにIEの指のカーソルはWindowsフォルダにあるWINHELP32.exeに入ってます。
ネスケのカーソルならネスケのフォルダのRESDLL.DLLに入ってました。(Ver4.04で確認)
それからカーソルのホットスポットをきちんと指先に設定しておきましょう。
ホットスポットとはカーソルの指す位置の基準になる点(ポイント)の事です。
あと今回、カーソルのIDはIDC_FINGERするものとします。

ではスタティックテキストコントロール上にカーソルが来た時のカーソルの変更方法です。
まずはクラスウィザードでOnSetCursor()を追加してください。
メッセージはWM_SETCURSORです。

OnSetCursor()
はマウスがキャプチャされていない時CWndオブジェクト内で
カーソルを移動させるとフレームワークより呼び出されます。
引数のpWndでどのCWndオブジェクト(コントロール)上を移動したかが分かるので
これがスタティックテキストのコントロールのポインタならばカーソルを変更します。
コントロールのポインタの取得はGetDlgItem()でしたね。

カーソルの変更はSetCursor()で出来ますが変更するカーソルのハンドルが必要です。
変更するカーソルのハンドルはCWinAppメンバのLoadCursor()で取得します。
これでカーソルの変更は出来ましたがこれではすぐに元のカーソルに戻ってしまいます。
それを防止するには変更後TRUEを返して下さい。カーソルは保持されます。


// カーソルの変更
BOOL CXXXDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
    if(pWnd == GetDlgItem(IDS_URL))
    {
        HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_FINGER);
        ::SetCursor(hCursor);
        return TRUE;
    }
    return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

最後にスタティックテキストをクリックした時に指定のURLへ
通常使用しているブラウザを起動して接続する方法を説明します。

まずスタティックテキストをクリックしたかどうかを判定する方法は簡単。
通常のボタンと方法は全く同じです。
クラスウィザードでスタティックテキストのIDにBN_CLICKEDをメッセージマップします。
するとメンバ関数の追加とか出てくるのでそのままOKを押しましょう。
適当な関数名でメンバ関数が追加されます。今回はOnUrl()になるはずです。
この時スタティックテキストのプロパティーで「通知」にチェックが入っていないと
クリックしても何も起きないのでチェックは入れておいて下さい。

後は追加された関数内でブラウザを起動させます。
これも方法は簡単。ShellExecute()というAPIで一発起動できます。
3番目の引数に開きたいURLを指定するだけで良いです。
ちなみに応用として"mailto:abc@def.com"の様に引数にメールアドレスを指定すると
通常使われているメーラーが立ち上がります。


// ブラウザを起動し指定のURLを開く
void CXXXDlg::OnUrl() 
{
    ::ShellExecute(NULL, _T("open"), _T("http://akky.s25.xrea.com/"),
                   NULL, NULL, SW_SHOWNORMAL);
}

< 戻る << HOME ©1999-2001 by Akky, All right reserved.