Written in Japanese(UTF-8)
2021.02.02
INASOFT

/トップ/目次/管理人のひとこと/リッチエディットコントロールよりSysLinkコントロールでリンクを実現したほうがラクだったのでメモ

2660499 (+0431)[+0683]

管理人のふたこと

リッチエディットコントロールよりSysLinkコントロールでリンクを実現したほうがラクだったのでメモ



公開日:2021/02/02

昨日、リッチエディットコントロール2.0でリンクを実現する方法が今更必要になったのでメモという記事を書いたのですが、コメントにて、「SysLinkコントロールを使う方法もある」とのご意見をいただきました。これについては知らなかったため、調べたところ、背景色を変えることを除けば、リッチエディットコントロールで作成するよりも簡単そうに見えましたので、そちらで作り直してみることにしました。

これはそのメモ記事になります。

まぁこちらについても、今更、C++でSysLinkコントロールを使おうという需要があるかは分かりませんけどね。


  1. Visual Studioのダイアログ用のツールボックスから SysLink Control を連れてきます。
    SysLink Control

  2. プロパティよりCaptionに、表示したい文字列を入力します。クリッカブルテキストにしたい箇所は、HTMLのようにaタグのような記号を使います。idで識別をするため、この画像のように入力します
    Captionに文字列を入力。クリッカブルテキスト部分はaタグを使用

  3. プログラム中の、ダイアログを表示するよりも前のところに、コモンコントロールを利用するための指示を入れます。プログラム開始時でもよいです。
        InitCommonControls();
    
    なお、この方法だと、全てのコモンコントロールを読み込んでしまいます。メモリを節約&速度向上を図りたい場合は、InitCommonControlsEx();を使って、読み込むコモンコントロールを制限します。この場合、引数の構造体のdwICCには 0x00008000 (ICC_LINK_CLASS) を設定することになるかと思います。なお、今となってはあまり関係ないですが、InitCommonControlsEx(); はWindows 98以降でしか使えないため、もし、Windows 95で動かしたいプログラムを作っている場合は、InitCommonControls(); を使うことになります。Windows 95でSysLinkコントロールが使えるかは分かりませんけどね。

  4. リンクがクリックされたイベントを捕捉して、必要なコマンドが実行できるようにします。
    case WM_NOTIFY:
        if (wParam == (WPARAM)IDC_SYSLINK_ABOUTTASK) { // SysLinkコントロールからの通知メッセージ
                    switch (((LPNMHDR)lParam)->code) {
                        case NM_CLICK:   // 通常はこちらが使われます
                        case NM_RETURN:  // この通知は、リターン呼び出しに必要です。さもないとコントロールはキーボードからアクセスできません。
                            {
                                PNMLINK pNMLink = (PNMLINK)lParam;
                                LITEM   item    = pNMLink->item;
    
                                if (lstrcmp(item.szID, _T("tmrun")) == 0) { // タスク スケジューラ呼び出し
                                    TCHAR sysdir[MAX_PATH*2] = L"\\";
                                    GetSystemDirectory(sysdir, _countof(sysdir));
                                    ShellExecute(hDlg, _T("open"), _T("taskschd.msc"), _T("/s"), sysdir, SW_SHOWNORMAL);
                                }
                                else if (wcscmp(item.szID, _T("tmhelp")) == 0) {
                                    HtmlHelp(hwnd, _T(".\\mousefr.chm::/_RESOURCE/HLP000013.html"), HH_DISPLAY_TOPIC, NULL); // タスク スケジューラの設定方法を書いたページを開く
                                }
                                break;
                            }
                    }
                }
        break;
    

    リンクをクリックしたときのイベントは、WM_NOTIFYNM_CLICKで飛んできます。WM_NOTIFYを補足すると、wParamに出元のコントロールIDが入っていますので、そこを確認し、SysLinkコントロールから来たメッセージであることを調べます。aタグのidで指定した文字列がpNMLink->itemszIDに入ってきますので、この文字列を比較することでどこがクリックされたかを把握して、コマンドを実行してやります。

    リターン呼び出し(return invoke)云々はよくわかりませんが、MSDNライブラリにそう書けと書いてあったので、そのまま書きました。

これにより、クリッカブルテキスト(青色文字でアンダーバーが引かれている部分)にマウスカーソルを合わせれば、マウスカーソルの形が指の形に変わります。そこでマウスをクリックすれば、指定の挙動が実行されます。


追加メモ:Common Controlのバージョンが6.0以上である必要があるらしいため、アプリケーションのマニフェストにその旨記載が必要。




本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。


/トップ/目次/管理人のひとこと/リッチエディットコントロールよりSysLinkコントロールでリンクを実現したほうがラクだったのでメモ