【VC++】独自(オリジナル)メッセージボックスの簡単なサンプル

0

    <機能>
    (1)独自(オリジナル)メッセージボックスで詳細なメッセージを出力する
    (2)メッセージには置換可能なキーワードを3つまで設定できる($1$~$3$)
      例)$1$さんこんにちは→(パラメータとして「山田」を渡す)山田さんこんにちは
    (3)ピクチャーコントロールにシステムアイコン(エラー/疑問符/情報/感嘆符)を表示する
    アイコン種別、独自、メッセージボックス、VC

    <動作検証&開発環境>
    Visual Studio Community 2015

    <イメージ>
    メッセージ起動画面
    ・エラーコードをコンボボックスより指定
    ・アイコン種別をコンボボックスより指定
    ・メッセージ中の定文字列に置換する「$1$~$3$」パラメータを指定(最大3つ)
    エラー101サンプル、独自、メッセージボックス、VC

    実行結果(エラーアイコン)
    エラー101実行、独自、メッセージボックス、VC

    実行結果(感嘆符アイコン)
    実行結果104エラー、独自、メッセージボックス、VC

    <使い方>
    独自(オリジナル)メッセージボックスサンプルアプリを作成する手順を記載します。
    Visual Studio 2015での手順ですが他でもそんなに変わらないと思います。

    (1)MFCアプリケーション(ダイアログベース)でプロジェクトを作成(名前はMsgBoxとします)
    (2)構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を指定
    (3)メッセージボックスクラス(CMessageShow)を追加
    クラス ウィザード→[クラスの追加]押下しクラスを追加
    クラス名 : CMessageShow
    基底クラス : CDialog
    クラスを追加、独自、メッセージボックス、VC

    (4)画面にGUIを追加
    呼び出し元(IDD_MSGBOX_DIALOG)
    メイン画面、独自、メッセージボックス、VC
    メッセージボックス画面(IDD_MESSAGESHOW)
    ・IDC_STATIC_ICON(ピクチャーボックス)
      Type:Iconを指定
    ・IDC_LBL
    ・IDC_EDIT2
      MultiLine:True(文字列を折り返して複数行表示する)
      Read Only:True(読み取り専用)
      Want Return:True(改行を取得)
    メッセージ画面、独自、メッセージボックス、VC

    (5)メンバ変数を追加
    呼び出し元画面(IDD_MSGBOX_DIALOG)
    ・IDC_COMBO1
            種類:CComboBox コントロール変数:ON
            カテゴリ:Control 変数名:m_xCbo
    ・IDC_COMBO2
            種類:CComboBox コントロール変数:ON
            カテゴリ:Control 変数名:m_xCboIcon
    ・IDC_EDIT1
            種類:CString コントロール変数:ON
            カテゴリ:Value 変数名:m_cEdit1
    ・IDC_EDIT2
            種類:CString コントロール変数:ON
            カテゴリ:Value 変数名:m_cEdit2
    ・IDC_EDIT3
            種類:CString コントロール変数:ON
            カテゴリ:Value 変数名:m_cEdit3

    メッセージボックス画面(IDD_MESSAGESHOW)
    ・IDC_STATIC_ICON
            種類:CStatic コントロール変数:ON
            カテゴリ:Control 変数名:m_xStaticIcon
    ・IDC_LBL
            種類:CString コントロール変数:ON
            カテゴリ:Value 変数名:m_csLbl
    ・IDC_EDIT2
            種類:CString コントロール変数:ON
            カテゴリ:Value 変数名:m_csEdit

    (6)ヘッダファイルの追加
    [追加]→[新しい項目の追加]→ヘッダーファイル(.h)
    名前をMsgList.hとする

    (7)ソースの追加

     

    //MsgList.h

    //メッセージデータを格納するヘッダーファイル(CSVファイル等で切り出してもよい)

    #pragma once

     

    /***********************************************************
    独自(オリジナル)メッセージ定義
    (1)要素
        iCode  : コード
        cTitle : メッセージ
        cMsg   : メッセージ詳細
    (2)メッセージ詳細の$1$から$3$は置換対象の文字列とする(最大3つまで)
    (3)メッセージ詳細の改行は「¥r¥n」をセットする
    ***********************************************************/

    static const struct {
        unsigned int iCode;
        char cTitle[128];
        char cMsg[1024];
    }MsgList[] = {
        { 101,"在庫ファイルオープンエラー","在庫ファイル($1$)が開けませんでした。¥r¥n書き込みを続行するにはファイルを閉じて再度処理を実行してください。" },
        { 102,"レコードの種別が不明です","ファイル($1$)に不正なレコードが見つかりました。¥r¥n$2$に問い合わせを行ってください。" },
        { 103,"処理が正常に終了しました","売上データ保存先:$1$¥r¥nレコード総数:$2$件¥r¥n未収金データ:$3$件" },
        { 104,"売上管理レコードの商品コードが不正です","現在取り扱いを中止している商品コード($1$)が見つかりました。¥r¥n処理を継続する場合は$2$に問い合わせを行ってください。" },
        //データエンドマークとして末尾にコード=0をセット(読み込み終了判定用)
        { 0 },
    };

     

    //MsgBoxDlg.cpp

    //[メッセージ表示]押下イベントを追加しておく

     

    //インクルードファイル追加

    #include "MessageShow.h"

    #include "MsgList.h"

     

    BOOL CMsgBoxDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
        //〜省略〜
        SetIcon(m_hIcon, TRUE);   // 大きいアイコンの設定
        SetIcon(m_hIcon, FALSE);  // 小さいアイコンの設定
        int i;
        CString cwk;
        //MsgList.hに定義されているメッセージIDをコンボボックスにセット
        i = 0;
        while (1)
        {
            //データ読み込み終了判定
            if (MsgList[i].iCode == 0) break;
           
            //データをセット
            cwk.Format("%d", MsgList[i].iCode);
            m_xCbo.InsertString(-1, cwk);
            i++;
        }
        //先頭レコードを選択
        if (m_xCbo.GetCount() != CB_ERR) m_xCbo.SetCurSel(0);
       
        //アイコン選択コンボボックス
        m_xCboIcon.InsertString(-1, "IDI_ERROR");
        m_xCboIcon.InsertString(-1, "IDI_QUESTION");
        m_xCboIcon.InsertString(-1, "IDI_INFORMATION");
        m_xCboIcon.InsertString(-1, "IDI_WARNING");
        //先頭レコードを選択
        if (m_xCboIcon.GetCount() != CB_ERR) m_xCboIcon.SetCurSel(0);
        return TRUE;
    }

     

    //MessageShow.h

    //インクルードファイル追加

    #include "MsgList.h"

     

    class CMessageShow : public CDialog
    {
        DECLARE_DYNAMIC(CMessageShow)
        //〜省略〜
    public:
        int m_iIndex;           /* メッセージIDコンボのインデックス */
        CString m_csPara1;  /* 置換文字1($1$を置換) */
        CString m_csPara2;  /* 置換文字2($2$を置換) */
        CString m_csPara3;  /* 置換文字3($3$を置換) */
        CString m_csIcon;    /* アイコン種別 */
    protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
        DECLARE_MESSAGE_MAP()
    public:
        virtual BOOL OnInitDialog();
    private:
        CString m_csLbl;
        CString m_csEdt;
        CStatic m_xStaticIcon;
    };

     

    //MessageShow.cpp

    //OnInitDialogをクラスウィザードより追加しておく

     

    //インクルードファイル追加

    #include "MsgBox.h"

     

    BOOL CMessageShow::OnInitDialog()
    {
        CDialog::OnInitDialog();
        CString cwk;
        UINT uicon;
        m_csLbl.Format("%s", MsgList[m_iIndex].cTitle);
        m_csEdt.Format("%s",MsgList[m_iIndex].cMsg);
       
        //置換対象文字列を置換する
        m_csEdt.Replace("$1$", m_csPara1);
        m_csEdt.Replace("$2$", m_csPara2);
        m_csEdt.Replace("$3$", m_csPara3);
        //アイコンをセット
        if(m_csIcon == "IDI_ERROR") {
            //エラーアイコン
            uicon = (UINT)IDI_ERROR;
        }else if (m_csIcon == "IDI_QUESTION") {
            //疑問符アイコン
            uicon = (UINT)IDI_QUESTION;
        }else if (m_csIcon == "IDI_INFORMATION") {
            //情報アイコン
            uicon = (UINT)IDI_INFORMATION;
        }else if (m_csIcon == "IDI_WARNING") {
            //感嘆符アイコン
            uicon = (UINT)IDI_WARNING;
        }else {
            //ここに処理は来ないが上記以外はアプリケーションアイコンをセット
            uicon = (UINT)IDI_APPLICATION;
        }
        HICON icon = ::LoadIcon(NULL, (const char *)uicon);
        m_xStaticIcon.SetIcon(icon);
        SetIcon(icon, TRUE);    // 大きいアイコンを設定
        SetIcon(icon, FALSE);   // 小さいアイコンを設定
        cwk.Format("エラーコード:%d",MsgList[m_iIndex].iCode);
        this->SetWindowText(cwk);
        UpdateData(FALSE);
        return TRUE;
    }

     

    よろしければポチッと押してください

    プログラマー ブログランキングへ



    selected entries

    categories

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
    << November 2018 >>

    profile

    others

    archives