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 のソースコードをご覧ください。 |
|---|






















