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 関数でテキストを取得し、SFXConfig の WriteSFXAnsiString 関数で データを書き込みます。
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 のソースコードをご覧ください。 |