【VC++】独自(オリジナル)メッセージボックスの簡単なサンプル
<機能>
(1)独自(オリジナル)メッセージボックスで詳細なメッセージを出力する
(2)メッセージには置換可能なキーワードを3つまで設定できる($1$~$3$)
例)$1$さんこんにちは→(パラメータとして「山田」を渡す)山田さんこんにちは
(3)ピクチャーコントロールにシステムアイコン(エラー/疑問符/情報/感嘆符)を表示する
<動作検証&開発環境>
Visual Studio Community 2015
<イメージ>
メッセージ起動画面
・エラーコードをコンボボックスより指定
・アイコン種別をコンボボックスより指定
・メッセージ中の定文字列に置換する「$1$~$3$」パラメータを指定(最大3つ)
実行結果(エラーアイコン)
実行結果(感嘆符アイコン)
<使い方>
独自(オリジナル)メッセージボックスサンプルアプリを作成する手順を記載します。
Visual Studio 2015での手順ですが他でもそんなに変わらないと思います。
(1)MFCアプリケーション(ダイアログベース)でプロジェクトを作成(名前はMsgBoxとします)
(2)構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を指定
(3)メッセージボックスクラス(CMessageShow)を追加
クラス ウィザード→[クラスの追加]押下しクラスを追加
クラス名 : CMessageShow
基底クラス : CDialog
(4)画面にGUIを追加
呼び出し元(IDD_MSGBOX_DIALOG)
メッセージボックス画面(IDD_MESSAGESHOW)
・IDC_STATIC_ICON(ピクチャーボックス)
Type:Iconを指定
・IDC_LBL
・IDC_EDIT2
MultiLine:True(文字列を折り返して複数行表示する)
Read Only:True(読み取り専用)
Want Return:True(改行を取得)
(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"
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
CString cwk;
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);
}
//MessageShow.h
//インクルードファイル追加
#include "MsgList.h"
{
DECLARE_DYNAMIC(CMessageShow)
int m_iIndex; /* メッセージIDコンボのインデックス */
CString m_csPara1; /* 置換文字1($1$を置換) */
CString m_csPara2; /* 置換文字2($2$を置換) */
CString m_csPara3; /* 置換文字3($3$を置換) */
CString m_csIcon; /* アイコン種別 */
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
public:
virtual BOOL OnInitDialog();
private:
CString m_csLbl;
CString m_csEdt;
CStatic m_xStaticIcon;
};
//MessageShow.cpp
//OnInitDialogをクラスウィザードより追加しておく
//インクルードファイル追加
#include "MsgBox.h"
{
CDialog::OnInitDialog();
CString cwk;
UINT uicon;
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;
}
m_xStaticIcon.SetIcon(icon);
SetIcon(icon, FALSE); // 小さいアイコンを設定
this->SetWindowText(cwk);
UpdateData(FALSE);
}
よろしければポチッと押してください