MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCMaskedEditの使い方

 「CMFCMaskedEdit」は「CEdit」を改良したクラスで、入力文字を制限するだけでなく、入力形式まで指定できるので、用途によってはかなり使い道の多いクラスだと思います。
 このクラスの使い方については、サンプルを見れば大体わかると思いますが、ここでは補足的な感じで紹介したいと思います。

 まず、「CMFCMaskedEdit」は「CEdit」の派生クラスなので、エディットコントロールを設置するように、リソースエディタや直接コードを記入して作成します。
 リソースエディタで設置した場合は、メンバ変数の追加から「CMFCMaskedEdit」のメンバ変数(ここではm_mask_edit)を追加します。
 初期設定として「OnInitDialog」などで、許可する文字列の設定や入力形式を設定します。
 設定方法は、「EnableMask」で入力形式に添った入力可能文字や空白時の文字などを設定し、入力形式を「SetWindowText」で設定します。

 この他に「SetValidChars」で入力可能な文字を制限します。
 例えば、「EnableMask」で数字を入力可能にしたけど"0"は入力させたくないという場合に、「SetValidChars」で"123456789"を設定することで"0"は入力できなくなります。

 具体的なコードを書くと以下のようになります。
    m_mask_edit.EnableMask(_T("     AAAA AAAA AAAA AAAA"), // 英数字入力
        _T("S/N: ____-____-____-____"), // 入力の対応するところに"_"を入力する
        _T('_')); // 空白の箇所に入れる文字
    m_mask_edit.SetValidChars(NULL); // 入力可能な文字
    m_mask_edit.SetWindowText(_T("S/N: ABCD-0123-45678-9abc"));
 ここで上記のコードについて説明すると、まず、「EnableMask」の第一引数で、入力可能にする文字を文字単位で設定します。
 ここでは英数字を表す"A"を並べて記述していますが、最後の4つを数字だけにしたい場合は、"     AAAA AAAA AAAA DDDD"とします。

 次の第二引数で、入力するための形式を設定します。
 このとき、入力可能にする箇所には"_"を入力しておきます。
 ここで注意点として、第一引数と第二引数の文字列の長さが違う場合、コンパイルは通りますが実行時にエラーになります。

 第三引数は、空白時に表示させるための文字を設定します。
 ここでは省略していますが、第四引数は、次の行の「SetValidChars」と同様に、入力可能な文字を設定します。
 第四引数で設定するか「SetValidChars」の違いだけで、どちらかで設定すればいいです。
 両方で違う設定をすると、後から設定したものになります。
 デフォルトの"NULL"を設定すれば、第一引数で設定した制限だけになります。

 最後の行の「SetWindowText」は、最初に表示させておく文字列を設定するのですが、ここで初期表示設定をしないと何も入力できなくなるので、空白でもいいので設定しておきます。
 注意点として、ここで設定する文字列も、「EnableMask」で設定した第一引数・第二引数の文字列の長さと同じにしないと何も入力できなくなります。

 最後に、「SetWindowText」の第一引数で設定するときの制限文字の種類を掲載しておきます。
  • D → 数字
  • d → 数字または空白
  • + → 正符号 (+)、負符号 (-)、または空白
  • C → 英文字
  • c → 英文字または空白
  • A → 英数字
  • a → 英数字または空白
  • * → 印字可能な文字
ランキングへ     posted by 遠雷 | Comment(0) | コントロール

CMFCLinkCtrlの作成

 HTMLのハイパーリンクと同じような機能を持つ「CMFCLinkCtrl」の使い方について説明していきます。
 このクラスは、ボタンコントロールの派生クラスなので、ボタンコントロールを改良して使います。

 まず、通常のボタンコントロールをリソースエディタで配置し、メンバ変数を追加するときに変数の種類を「CButton」から「CMFCLinkCtrl」に変更します。
 このとき、ボタンコントロールのキャプションがハイパーテキストになります。

 次に、「OnInitDialog」などで以下のように設定します。
    // m_link_ctrlはCMFCLinkCtrlのメンバ変数
    m_link_ctrl.SetURL(_T("http://thunor.sblo.jp/"));    // このブログを開きます
    m_link_ctrl.SetTooltip(_T("MFC小技メモ集を開きます")); // オンマウスでポップアップ表示
    m_link_ctrl.SizeToContent();    // サイズ調整
 少し説明すると、「SetTooltip」でオンマウス時のポップアップ表示の文字列を設定し、「SizeToContent」でキャプションの長さに合わせてコントロールのサイズを変更します。

 この他に、HTML以外のものを開きたい場合は、「SetURLPrefix」を使ってプロトコルを設定します。
 例えば、メール送信のためのメーラーを起動させたい場合は、
    m_link_ctrl.SetURLPrefix(_T("mailto:"));
    m_link_ctrl.SetURL(_T("aaa@bbb.co.jp"));
とすることで、リンククリック時に規定のメーラーが起動され、送信先に設定アドレス(ここでは「aaa@bbb.co.jp」)が入った状態になります。
 「SetURLPrefix」を設定しないと「http:」接続になります。
ランキングへ     posted by 遠雷 | Comment(0) | コントロール

CMFCShellListCtrlでのフォルダ変更

 ここでは、「CMFCShellListCtrl」を使い、フォルダアイテムのダブルクリックなどでカレントフォルダが変わったとき、何か処理をする方法を紹介します。

 まず、処理をするための関数(ここでは「OnChangeFolder」)を用意します。
ヘッダファイル
    afx_msg LRESULT OnChangeFolder(WPARAM, LPARAM);
cppファイル
LRESULT CXXX::OnChangeFolder(WPARAM, LPARAM)
{
    // やりたい処理をここに書く

    return 0;
}
 次に、メッセージマップに以下のように追加します。
BEGIN_MESSAGE_MAP(CFolPane, CDockablePane)
    ON_REGISTERED_MESSAGE(AFX_WM_CHANGE_CURRENT_FOLDER, OnChangeFolder)
END_MESSAGE_MAP()
 これで、「CMFCShellListCtrl」内のカレントフォルダが変更されたとき、「OnChangeFolder」が呼ばれるので、関数内でやりたい処理をします。

 ここでの処理は、エクスプローラにあるアドレスバーのように、カレントフォルダのパスを表示したりするときに便利だと思います。
ランキングへ     posted by 遠雷 | Comment(0) | コントロール