+ // 互換ビットマップにDirect2Dで描画し、
+ // アイコンにして返すメソッド
+ icon create_icon()
+ {
+ // アイコンサイズの取得
+ icon_size_ = D2D1::SizeU(::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON));
+ // ビットマップヘッダのセットアップ
+ BITMAPV5HEADER bi = {0};
+ bi.bV5Size = sizeof(BITMAPV5HEADER);
+ bi.bV5Width = icon_size_.width;
+ bi.bV5Height = icon_size_.height;
+ bi.bV5Planes = 1;
+ bi.bV5BitCount = 32;
+ bi.bV5Compression = BI_BITFIELDS;
+ bi.bV5RedMask = 0x00FF0000;
+ bi.bV5GreenMask = 0x0000FF00;
+ bi.bV5BlueMask = 0x000000FF;
+ bi.bV5AlphaMask = 0xFF000000;
+
+ // デスクトップHDCの取得
+ {
+ get_dc dc(NULL);
+
+ // DIBセクションの作成
+ bmp_.reset(
+ ::CreateDIBSection(
+ dc.get(),reinterpret_cast<BITMAPINFO *>(&bi),DIB_RGB_COLORS,0,NULL,0));
+ {
+
+ // DC互換レンダーターゲットのセットアップ
+ D2D1_RENDER_TARGET_PROPERTIES
+ props = D2D1::RenderTargetProperties(
+ D2D1_RENDER_TARGET_TYPE_DEFAULT,
+ D2D1::PixelFormat(
+ DXGI_FORMAT_B8G8R8A8_UNORM,
+ D2D1_ALPHA_MODE_PREMULTIPLIED),
+ 0,
+ 0,
+ D2D1_RENDER_TARGET_USAGE_NONE,
+ D2D1_FEATURE_LEVEL_DEFAULT
+ );
+
+ throw_if_err<>()(factory_->CreateDCRenderTarget(&props,&dcr_));
+ }
+ }
+
+ draw_icon();
+ return std::move(icon(bmp_,icon_size_.width,icon_size_.height));
+ };
+ void update_icon()
+ {
+ draw_icon();
+ icon_ = icon(bmp_,icon_size_.width,icon_size_.height);
+ icon_holder ic_backup((HICON)::SetClassLongPtrW(hwnd_,GCLP_HICON,(LONG_PTR)icon_.get()));
+ }
+
+ void update_status(uint32_t s)
+ {
+ switch(s)
+ {
+ case stop:
+ status_ = stop;
+ result_time_ = INTERVAL_SEC1;
+ timer_.stop();
+ break;
+ case active:
+ result_time_ = INTERVAL_SEC1;
+ if(status_ == stop)
+ {
+ timer_.start();
+ }
+ status_ = active;
+ break;
+ case sleep:
+ status_ = sleep;
+ result_time_ = INTERVAL_SEC2;
+ break;
+ }
+ update_ui_status();
+ }
+
+ void update_ui_status()
+ {
+ switch(status_)
+ {
+ case stop:
+ {
+ // タイトルバー
+ text(std::wstring(L"ミニタイマー(停止)"));
+
+ if(taskbar_.is_create()){
+ // サムネイル・ツールバー・ボタン
+ thumb_button_manager_
+ .at(0)
+ .tool_tip(L"開始")
+ .set_icon(thumb_icons_[0]);
+ taskbar_.update_thumb_buttons(*this,thumb_button_manager_);
+
+ // プログレス
+ taskbar_.progress_state(*this,taskbar::error);
+ taskbar_.progress_value(*this,0,0);
+ }
+
+ }
+ break;
+ case active:
+ {
+ ::MessageBeep(MB_OK);
+
+ // タイトルバー
+ text(std::wstring(L"ミニタイマー(活動中)"));
+
+ if(taskbar_.is_create()){
+ // サムネイル・ツールバー・ボタン
+ thumb_button_manager_
+ .at(0)
+ .tool_tip(L"停止")
+ .set_icon(thumb_icons_[1]);
+ taskbar_.update_thumb_buttons(*this,thumb_button_manager_);
+
+ // プログレス
+ taskbar_.progress_state(*this,taskbar::indeterminate);
+ taskbar_.progress_value(*this,result_time_,INTERVAL_SEC1);
+ }
+ }
+ break;
+ case sleep:
+ {
+ ::MessageBeep(MB_ICONEXCLAMATION);
+ // タイトルバー
+ text(std::wstring(L"ミニタイマー(休憩中)"));
+
+ if(taskbar_.is_create()){
+ // プログレス
+ taskbar_.progress_state(*this,taskbar::paused);
+ taskbar_.progress_value(*this,result_time_,INTERVAL_SEC2);
+ }
+
+ }
+ break;
+ }
+ update_icon();
+ invalidate_rect();
+ }
+
+ void draw_icon()
+ {
+ get_dc dc(NULL);
+ // 互換DCの作成
+ compatible_dc cdc(dc.get());
+ {
+ // 描画先への切り替え
+ select_object s(cdc.get(),bmp_.get());
+ RECT rect = {0,0,icon_size_.width,icon_size_.height};
+ // 互換DCへのバインド
+ dcr_->BindDC(cdc.get(),&rect);
+ //// ブラシのセットアップ(背景の赤丸)
+ //ID2D1SolidColorBrushPtr brush_e;
+ //throw_if_err<>()(
+ // dcr->CreateSolidColorBrush(
+ // D2D1::ColorF(D2D1::ColorF::Red,0.8f), &brush_e));
+
+ // アイコンに描画する文字の生成
+ std::wstring t((boost::wformat(L"%s\n%02d:%02d") % (status_ == active?L"活動中":(status_ == sleep?L"休憩中":L"停止中")) % (result_time_ / 60) % (result_time_ % 60)).str());
+ D2D1_RECT_F l = D2D1::RectF(0.0f,0.0f,icon_size_.width,icon_size_.height);
+ // Text Formatの作成
+ IDWriteTextFormatPtr f;
+ write_factory_->CreateTextFormat(
+ L"メイリオ", // Font family name.
+ NULL, // Font collection (NULL sets it to use the system font collection).
+ DWRITE_FONT_WEIGHT_REGULAR,
+ DWRITE_FONT_STYLE_NORMAL,
+ DWRITE_FONT_STRETCH_NORMAL,
+ 10.0f,
+ L"ja-jp",
+ &f
+ );
+
+ f->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
+ f->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
+
+ // 文字描画用ブラシのセットアップ
+ ID2D1SolidColorBrushPtr brush;
+ dcr_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &brush);
+ // 描画開始
+ dcr_->BeginDraw();
+ // ビットマップクリア
+ dcr_->Clear(D2D1::ColorF(D2D1::ColorF::Black,0.0f));
+ //// 赤丸を描く
+ //dcr_->FillEllipse(D2D1::Ellipse(D2D1::Point2F(16.0f,16.0f),14,14),brush_e);
+ // テキストを表示する
+ dcr_->DrawTextW(t.c_str(),t.size(),f,&l,brush);
+ // 描画終了
+ dcr_->EndDraw();
+ }
+
+
+ }
+
+ void create_task_bar()
+ {
+ taskbar_.create();
+ taskbar_.overlay_icon(*this,icon(),std::wstring(L"ミニタイマー"));
+ taskbar_.progress_state(*this,taskbar::indeterminate);
+ taskbar_.progress_value(*this,100,100);
+
+ thumb_icons_.push_back(icon(THUMB_START));
+ thumb_icons_.push_back(icon(THUMB_STOP));
+
+ thumb_button_manager_
+ .add_thumb_button(THUMB_START,thumb_icons_[1],std::wstring(L"停止"))
+ .enable(true);
+
+ //thumb_button_manager_
+ // .add_thumb_button(THUMB_STOP,thumb_icons_[1],std::wstring(L"停止"))
+ // .enable(true);
+
+ taskbar_.add_thumb_buttons(*this,thumb_button_manager_);
+ }