ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW POP / SMTP メーラー

BREW メーラー 〜 BREW C++ POP/SMTP プログラミング 〜

ユーザーインターフェイス

メイン画面 ( MainWindow )

メイン画面 ( MainWindow ) には、「メール送信」ボタン、「メール受信」ボタン、「設定」ボタン、「アプリ終了」ボタンがあります。

コンストラクタ

MainWindow::MainWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
	SFXGraphics::GetDeviceRectangle(), "Simple Mailer") static_throws
{
    // キー ハンドラを登録
    if (static_try()) {
        static_throw(
            RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
    }

    // フォントの高さを取得
    SInt16 fontHeight = SFXGraphics::GetFontHeight(AEE_FONT_NORMAL);
    // ボタンの幅を計算
    SInt16 width = SFXGraphics::MeasureText(AEE_FONT_NORMAL, "メール送信");
  
	// 端末のスクリーンの幅さと高さを取得
SFXDevice device;
UInt16 ScreenWidth = device.GetScreenWidth();
SInt16 ScreenHeight = device.GetScreenHeight();
// 端末のスクリーンの真中でボタン位置を計算
SInt16 position_X = ( ScreenWidth- (width + 2 * MARGIN))/2;
SInt16 position_Y = ( ScreenHeight- ( 4 * fontHeight + 3 * MARGIN )- fontHeight )/2;
SFXRectangle rectangle(position_X, position_Y, width + 2 * MARGIN, fontHeight + 2); // ボタンの作成 SFRButtonControlPtr button1 = ::new SFRButtonControl(this, rectangle, "メール送信"); rectangle.AddY(fontHeight + MARGIN); SFRButtonControlPtr button2 = ::new SFRButtonControl(this, rectangle, "メール受信"); rectangle.AddY(fontHeight + MARGIN); SFRButtonControlPtr button3 = ::new SFRButtonControl(this, rectangle, "設定"); rectangle.AddY(fontHeight + MARGIN); SFRButtonControlPtr button4 = ::new SFRButtonControl(this, rectangle, "終了"); // ボタンハンドラの登録 if (static_try() && button1 != null) { static_throw( button1->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnButtonControl1))); if (static_try()) { // フォーカスを当てる button1->SetStatusFocus(true); } } if (static_try() && button2 != null) { static_throw( button2->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnButtonControl2))); } if (static_try() && button3 != null) { static_throw( button3->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnButtonControl3))); } if (static_try() && button4 != null) { static_throw( button4->RegisterHandler( SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnButtonControl4))); } return; }

ボタンハンドラ

ボタンハンドラの定義

// 「メール送信」ボタンを押したとき
HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnButtonControl1, result, control)
{
    // 送信ウインドウの作成
    ::new SendingWindow();
}

// 「メール受信」ボタンを押したとき
HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnButtonControl2, result, control)
{
    // メールの受信準備と受信開始

    // 次の章で解説
}

// 「設定」ボタンを押したとき
HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnButtonControl3, result, control)
{
    // 設定ウィンドウの作成
    ::new OptionWindow();
}

// 「終了」ボタンを押したとき
HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnButtonControl4, result, control)
{
    // アプリーケーションを終了する
    SFRApplication::Terminate();
}

ハンドラの宣言 ( MainWindow の定義 )

SFMTYPEDEFCLASS(MainWindow)
class MainWindow : public SFRTitleWindow {
    SFMSEALCOPY(MainWindow)
private:
    SFXPOP3Receiver _receiver; // POP3 受信用
    SFRMessageDialogPtr _dialog; // ダイアログ
public:
    MainWindow(Void) static_throws;
    virtual ~MainWindow(Void);
private:
    HANDLER_DECLARE_BOOLEVENT(OnKey)     // キーハンドラ
    HANDLER_DECLARE_VOIDDIALOG(OnDialog) // ダイアログハンドラ
    // ボタンハンドラ
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl4)
    CALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback) // メール受信時のコールバック
};

設定画面 ( OptionWindow )

設定画面には SMTP サーバ アドレスとポート番号、POP3 サーバ アドレスとポート番号、POP3 用のユーザー名とパスワードを入力するテキストボックスがあります。

それから、受信メールの削除を選択するチェックボックスと、設定ボタン、キャンセルボタンがあります。

設定画面 ( OptionWindow ) の定義

設定画面 ( OptionWindow ) にある 6 種類のテキスト コントロールとチェック ボックスをメンバ変数として宣言します。

SFMTYPEDEFCLASS(OptionWindow)
class OptionWindow : public SFRTitleWindow {
    SFMSEALCOPY(OptionWindow)
private:
    // テキストコントロール
SFREditboxControlPtr _textControlSMTPServer;
SFREditboxControlPtr _textControlSMTPPort;
SFREditboxControlPtr _textControlPOP3Server;
SFREditboxControlPtr _textControlPOP3Port;
SFREditboxControlPtr _textControlUser;
SFREditboxControlPtr _textControlPassword;
// チェックボックス
SFRCheckboxControlPtr _checkboxEraseMail;
SFRCheckboxControlPtr _checkboxUseSSL;
//ラジオバトン
SFRRadiobuttonControlPtr _radioSSLTrustmode[4];
SFRRadiobuttonControlPtr _radioSMTPAuth[5];
SFRLabelControlPtr _ssltext;
SFRResponderPtr next; public: OptionWindow(Void); virtual ~OptionWindow(Void); private: HANDLER_DECLARE_BOOLEVENT(OnKey) // キーハンドラ HANDLER_DECLARE_VOIDCONTROL(OnButtonControlOk) // ボタンハンドラ HANDLER_DECLARE_VOIDCONTROL(OnButtonControlCancel) // ボタンハンドラ };

コンストラクタ ( コントロールの生成とハンドラの登録 )

最初に、SimpleMailer アプリクラスの SMTP サーバのアドレスなどの設定データを取得します。

次に、

option->ReadSFXAnsiString(OPTION_SMTPSERVER, "");

により、SMTP サーバのアドレスをテキスト コントロールに表示できるようにします。

最後にある SelectHandler ハンドラの登録はテキスト コントロールへの文字列入力のためです。

OptionWindow::OptionWindow(Void) : SFRTitleWindow(
    SFRApplication::GetInstance(), SFXGraphics::GetDeviceRectangle(), "設定")
{
    // SimpleMailer アプリクラスから設定データを取得
    SFXConfigPtr option = SimpleMailer::GetOption();


    ...   略   ...
    

    // ラベルを作成

    ::new SFRLabelControl(this, rectLeft, "SMTPサーバ");
    ::new SFRLabelControl(this, rectRight, "ポート");


    ...   略   ...
    

    // テキストコントロールを作成

    _textControlSMTPServer = ::new SFREditboxControl(pan1,
        rectLeft, option->ReadSFXAnsiString(OPTION_SMTPSERVER, ""));


    ...   略   ...
    
    
    // チェックボックスを作成
    _checkboxEraseMail = ::new SFRCheckboxControl(pan1, rectLeft,
        "メールを消去する");
    if (_checkboxEraseMail != null) {
        // データを読み込んで、チェックボックスにチェックをつける (はずす)
        _checkboxEraseMail->SetStatusCheck(
            option->ReadBool(OPTION_ERASEMAIL, false));
    }


    ...   略   ...

    
    // ボタンを作成
    SFRButtonControlPtr buttonOk = ::new SFRButtonControl(pan1,
        rectLeft, BUTTON_LABEL_OK);

	// チェックボックスを作成
    _checkboxUseSSL = ::new SFRCheckboxControl(pan2, rectLeft,"SSL接続使用");

	// ラベルを作成
	_ssltext = new SFRLabelControl(pan2, rectLeft, "SSL認証モード:");

	//ラジオボタンを作成
    _radioSSLTrustmode[0] = new SFRRadiobuttonControl(pan2,rectLeft, "Fail");
_radioSSLTrustmode[1] = new SFRRadiobuttonControl(pan2,rectRight, "Check");
_radioSSLTrustmode[2] = new SFRRadiobuttonControl(pan2,rectLeft, "Ingore");
_radioSSLTrustmode[3]= new SFRRadiobuttonControl(pan2,rectRight, "Always"); //ラベルを作成 ::new SFRLabelControl(pan2, rectLeft, "SMTP認証モード:"); //ラジオボタンを作成 _radioSMTPAuth[0] = new SFRRadiobuttonControl(pan2,rectLeft, "None");
_radioSMTPAuth[1] = new SFRRadiobuttonControl(pan2,rectRight, "Plain");
_radioSMTPAuth[2] = new SFRRadiobuttonControl(pan2,rectLeft, "Login");
_radioSMTPAuth[3] = new SFRRadiobuttonControl(pan2,rectRight, "Cram MD5");
_radioSMTPAuth[4] = new SFRRadiobuttonControl(pan2,rectLeft, "Digest MD5"); // ボタンを作成
buttonOk = ::new SFRButtonControl(pan2, rectLeft, BUTTON_LABEL_OK);
... 略 ... if (_textControlSMTPServer != null) { // テキストコントロールの最大サイズを設定 _textControlSMTPServer->SetMaxSize(64); // フォーカスを当てる _textControlSMTPServer->SetStatusFocus(true); } ... 略 ... // セレクトキーを押したときのハンドラを登録 (テキストコントロール用) if (static_try()) { static_throw( RegisterHandler( SFEVT_KEY, AVK_SELECT, HANDLER_AFTER, HANDLER_FUNCTION(SelectHandler))); } return; }

ボタン ハンドラ

設定画面 ( OptionWindow ) のテキスト コントロールに入力されたデータを保存します。

テキスト コントロールの GetText 関数でテキストを取得し、SFXConfigWriteSFXAnsiString 関数で データを書き込みます。

WriteSFXAnsiString 関数の第 1 引数には以下の値を指定します。

// SFXConfig に保存するデータのタグ
#define OPTION_SMTPSERVER  1 // SMTPサーバのアドレス SFXAnsiString
#define OPTION_SMTPPOPT 2 // SMTPサーバのポート番号 UInt16
#define OPTION_POP3SERVER 3 // POP3サーバのアドレス SFXAnsiString
#define OPTION_POP3PORT 4 // POP3サーバのポート番号 UInt16
#define OPTION_USER 5 // ユーザ SFXAnsiString
#define OPTION_PASSWORD 6 // パスワード SFXAnsiString
#define OPTION_ERASEMAIL 7 // メールを削除するか Bool
#define OPTION_USESSL 8 // SSL接続使用するか Bool
#define OPTION_SSLTRUSTMODE 9 // SSL認証モード SInt16
#define OPTION_SMTPAUTHMODE 10 // SMTP認証モード SInt16
HANDLER_IMPLEMENT_VOIDCONTROL(OptionWindow, OnButtonControlOk, result, control)
{
    // 設定画面 (OptionWindow) のテキスト コントロールに入力されたデータを保存
 SFXConfigPtr option = SimpleMailer::GetOption();
option->WriteSFXAnsiString(OPTION_SMTPSERVER,
_textControlSMTPServer->GetText());
option->WriteUInt16(OPTION_SMTPPOPT,
static_cast<UInt16>(_textControlSMTPPort->GetText().AsUInt32()));
option->WriteSFXAnsiString(OPTION_POP3SERVER,
_textControlPOP3Server->GetText());
option->WriteUInt16(OPTION_POP3PORT,
static_cast<UInt16>(_textControlPOP3Port->GetText().AsUInt32()));
option->WriteSFXAnsiString(OPTION_USER,
_textControlUser->GetText());
option->WriteSFXAnsiString(OPTION_PASSWORD,
_textControlPassword->GetText());
option->WriteBool(OPTION_ERASEMAIL,
_checkboxEraseMail->GetStatusCheck());
option->WriteBool(OPTION_USESSL,
_checkboxUseSSL->GetStatusCheck());
for (SInt16 t=0; t<=3;t++) {
if (_radioSSLTrustmode[t]->GetStatusCheck()) {
option->WriteSInt16(OPTION_SSLTRUSTMODE,t);
}
}
for (SInt16 s=0; s<=4;s++) {
if (_radioSMTPAuth[s]->GetStatusCheck()) {
option->WriteSInt16(OPTION_SMTPAUTHMODE,s);
}
}
option->Save(); // ウィンドウを閉じる Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true)); }

メール送信画面 ( SendingWindow )

メール送信画面には From アドレス、To アドレス、題名、本文を入力するテキストボックスと、送信ボタン、キャンセルボタンがあります。

プログラミング方法は設定画面 ( OptionWindow ) と同様です。詳細は SendingWindow のソースコードをご覧ください。