BREW スケジューラー 〜 BREW C++ vCalendar プログラミング 〜
TemplateApp の使い方
SophiaFramework UNIVERSE の Example フォルダにある TemplateApp は、アプリ共通のメニュー、ダイアログ、ソフトキーなどを使った「ひな型アプリ」です。
TemplateApp からアプリ作成手順
手順 1. Example フォルダ内の Template フォルダから、以下のファイルをプロジェクトにコピーします。
MainWindow.hpp MainWindow.cpp PreferenceDialog.hpp PreferenceDialog.cpp SoftkeyWindow.hpp SoftkeyWindow.cpp TemplateApp.hpp TemplateApp.cpp VersionDialog.hpp VersionDialog.cpp templateapp_res.h templateapp.bri templateapp.bar Resource フォルダの中身すべて
手順 2. これらのファイルの中に現れる「TemplateApp」「templateapp」「TEMPLATEAPP」をアプリ名に置換します。
手順 3. bid ファイルと mif ファイルを生成します。
手順 4. コンパイルし、エミュレータで起動するか確認します。
| <実行結果> | <右ソフトキーでメニュー表示> | <左ソフトキーでダイアログ表示> |
![]() |
![]() |
![]() |
手順 5. 次のマクロで囲まれているコードをすべて削除します。
#if defined USE_EXAMPLE_UI #endif
カレンダーの描画
MainWindow の定義
SFMTYPEDEFCLASS(MainWindow)
class MainWindow : public SFRPlainWindow {
SFMSEALCOPY(MainWindow)
// ↓ 描画時に必要な値として、以下を追加
private:
SInt16 _boxSize; // カレンダーの1マスの正方形の長さ
SInt16 _calLeft; // カレンダーの左端
// ↑ ここまで
public:
explicit MainWindow(SFRApplicationPtr director) static_throws;
virtual ~MainWindow(Void);
// ↓ 描画ハンドラとキーハンドラを追加
HANDLER_DECLARE_VOIDRENDER(OnRenderContent) // 追加
HANDLER_DECLARE_BOOLEVENT(OnKey) // 追加
// ↑ ここまで
// 以下省略
}
コンストラクタの修正
#define CAL_TOP_MARGIN (20)
#define CAL_SIDE_MARGIN (20)
MainWindow::MainWindow(SFRApplicationPtr director) static_throws
: SFRPlainWindow(director, SFXRectangle(0, 0, 0, 0),
BEHAVIOR_PLAINWINDOW, ATTRIBUTE_MAINWINDOW)
{
SoftkeyWindowPtr softkey;
SoftkeyWindow::Initialize(this);
// ↓ 追加
if (static_try()) {
// 描画ハンドラを登録
static_throw(RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT, HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
if (static_try()) {
// キー ハンドラを登録
static_throw(RegisterHandler(SFEVT_KEY,
HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
}
}
// ↑ ここまで
if (static_try()) {
static_throw(RegisterHandler(static_cast<SFCEventEnum>(
SoftkeyWindow::USEREVT_SOFTKEY), HANDLER_AFTER,
HANDLER_FUNCTION(OnSoftkey)));
if (static_try()) {
// 以下省略
}
}
// ↓ 追加
// カレンダーの1マスの正方形の長さ
_boxSize = (GetContentWorld().GetRight() - 2 * CAL_SIDE_MARGIN) / 7;
// カレンダーの左端
_calLeft = (GetContentWorld().GetRight() - 7 * _boxSize) / 2;
// 現在の日付を取得
_cursor = SFXDate::CurrentDate();
// ↑ ここまで
}
描画ハンドラとキーハンドラの追加
// 以下すべて追加
// 描画ハンドラ(ウィンドウ内に描画)
HANDLER_IMPLEMENT_VOIDRENDER(MainWindow, OnRenderContent, graphics)
{
// ウィンドウ内部のサイズを取得(SFXRectangle)
SFXRectangle screenRect(GetContentWorld());
SFXLine varLine; // 垂直線
SFXLine holLine; // 水平線
SInt16 i;
// 画面全体を白で塗りつぶす
graphics->FillRectangle(screenRect,
SFXRGBColor(0xff, 0xff, 0xff, 0x00));
graphics->SetForeColor(SFXRGBColor(0x00, 0x00, 0x00, 0x00));
varLine.Set(_calLeft, CAL_TOP_MARGIN,
_calLeft, CAL_TOP_MARGIN + 7 * _boxSize);
holLine.Set(_calLeft, CAL_TOP_MARGIN,
_calLeft + 7 * _boxSize, CAL_TOP_MARGIN);
for (i = 1; i <= 8; ++i) { // 垂直線を描画する
graphics->DrawLine(varLine);
varLine.Offset(_boxSize, 0); // 垂直線を _boxSize だけ右に動かす
}
for (i = 1; i <= 8; ++i) { // 水平線を描画する
graphics->DrawLine(holLine);
holLine.Offset(0, _boxSize); // 水平線を _boxSize だけ下に動かす
}
SFXRectangle calRect;
static ACharConst youbi[][3] = {"日", "月", "火", "水", "木", "金", "土"};
calRect.Set(_calLeft + 1, CAL_TOP_MARGIN + 1, _boxSize - 1, _boxSize - 1);
for (i = 1 ; i <= 7; ++i) { // 曜日を描画していく
graphics->FillRectangle(calRect, SFXRGBColor(187, 204, 0, 0));
graphics->SetForeColor(SFXRGBColor(0, 0, 0, 0));
graphics->DrawText(youbi[i - 1], calRect, IDF_ALIGN_CENTER);
calRect.AddX(_boxSize); // 四角形を右に動かす
}
calRect.SubX(_boxSize * 7); // 四角形を左に移動
calRect.AddY(_boxSize); // 四角形を下に移動
SInt16 dayOfWeek = 0;
// 1日からその月の最後の日まで数字などを描画していく
for (i = 1; i <= 31; ++i) {
if (_cursor.GetDay() == i) { // その日がカーソルの差す日付と一致するなら
// カーソルを描画する
graphics->FillRectangle(calRect, SFXRGBColor(255, 255, 153, 0));
}
graphics->DrawText(SFXAnsiString::Format("%2d",i),
calRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_CENTER); // 数字を描画
if (dayOfWeek == 6) { // 週末まで到達したら
dayOfWeek = 0;
calRect.SubX(_boxSize * 6); // 四角形を 1 番左の列に移動
calRect.AddY(_boxSize); // 四角形を 1 行下に移動
} else {
++dayOfWeek;
calRect.AddX(_boxSize); // 四角形を 1 マス右に移動
}
}
return;
}
// キー ハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(MainWindow, OnKey, event)
{
Bool result(false);
switch (event.GetP16()) {
case AVK_LEFT:
_cursor.SubDay(1); // カーソルを左へ
InvalidateContent(); // 再描画
result = true;
break;
case AVK_RIGHT:
_cursor.AddDay(1); // カーソルを右へ
InvalidateContent(); // 再描画
result = true;
break;
case AVK_UP:
_cursor.SubDay(7); // カーソルを上へ
InvalidateContent(); // 再描画
result = true;
break;
case AVK_DOWN:
_cursor.AddDay(7); // カーソルを下へ
InvalidateContent(); // 再描画
result = true;
break;
}
return result;
}
ここまでの実行結果
上下左右キーを押すとカーソルが動きます。























