Chromium Code Reviews| Index: chrome_frame/turndown_prompt/turndown_prompt_window.cc |
| diff --git a/chrome_frame/turndown_prompt/turndown_prompt_window.cc b/chrome_frame/turndown_prompt/turndown_prompt_window.cc |
| index 851f1c01add6c2e9f2102b0825fc48d5d48af7f2..29860f2cd4cabee12649dc27a9032f9d7738e71a 100644 |
| --- a/chrome_frame/turndown_prompt/turndown_prompt_window.cc |
| +++ b/chrome_frame/turndown_prompt/turndown_prompt_window.cc |
| @@ -13,6 +13,7 @@ |
| #include "chrome_frame/simple_resource_loader.h" |
| #include "chrome_frame/utils.h" |
| #include "grit/chrome_frame_dialogs.h" |
| +#include "grit/chrome_frame_resources.h" |
| #include "grit/chromium_strings.h" |
| // atlctrlx.h requires 'min' and 'max' macros, the definition of which conflicts |
| @@ -22,6 +23,35 @@ |
| #include <minmax.h> // NOLINT |
| #include <atlctrlx.h> // NOLINT |
| +namespace { |
| +const uint32 kBitmapImageSize = 18; |
| +} // namespace |
| + |
| +// WTL's CBitmapButton's drawing code is horribly broken when using transparent |
| +// images (specifically, it doesn't clear the background between redraws). |
| +// Fix it here. |
| +class CFBitmapButton: public CBitmapButtonImpl<CFBitmapButton> |
| +{ |
| + public: |
| + DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName()) |
| + |
| + CFBitmapButton() |
| + : CBitmapButtonImpl<CFBitmapButton>(BMPBTN_AUTOSIZE | BMPBTN_HOVER, |
| + NULL) {} |
| + |
| + // "Overridden" from CBitmapButtonImpl via template hackery. See |
| + // CBitmapButtonImpl::OnPaint() in atlctrlx.h for details. |
| + void DoPaint(CDCHandle dc) { |
| + RECT rc; |
|
cpu_(ooo_6.6-7.5)
2013/07/24 02:05:09
lets rc = {0} or check error on the Get. I vote fo
robertshield
2013/07/24 14:02:54
Done.
|
| + GetClientRect(&rc); |
| + dc.FillRect(&rc, reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1)); |
| + |
| + // Call original implementation. |
| + CBitmapButtonImpl<CFBitmapButton>::DoPaint(dc); |
| + } |
| +}; |
| + |
| +// static |
| base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance( |
| InfobarContent::Frame* frame, |
| UrlLauncher* url_launcher, |
| @@ -48,6 +78,8 @@ base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance( |
| instance->link_->SetHyperLinkExtendedStyle(HLINK_NOTIFYBUTTON, |
| HLINK_NOTIFYBUTTON); |
| + SetupBitmapButton(instance.get()); |
| + |
| // Substitute the proper text given the current IE version. |
| CWindow text = instance->GetDlgItem(IDC_TD_PROMPT_MESSAGE); |
| string16 prompt_text(GetPromptText()); |
| @@ -69,11 +101,59 @@ TurndownPromptWindow::TurndownPromptWindow( |
| TurndownPromptWindow::~TurndownPromptWindow() {} |
| +// static |
| +void TurndownPromptWindow::SetupBitmapButton(TurndownPromptWindow* instance) { |
| + DCHECK(instance); |
| + CWindow close_window = instance->GetDlgItem(IDDISMISS); |
| + instance->close_button_.reset(new CFBitmapButton()); |
| + |
| + // Set the resource instance to the current dll which contains the bitmap. |
| + HINSTANCE old_res_module = _AtlBaseModule.GetResourceInstance(); |
| + HINSTANCE this_module = _AtlBaseModule.GetModuleInstance(); |
| + _AtlBaseModule.SetResourceInstance(this_module); |
| + |
| + HBITMAP close_bitmap = static_cast<HBITMAP>( |
| + LoadImage(this_module, MAKEINTRESOURCE(IDB_TURNDOWN_PROMPT_CLOSE_BUTTON), |
| + IMAGE_BITMAP, 0, 0, 0)); |
| + |
| + // Restore the module's resource instance. |
| + _AtlBaseModule.SetResourceInstance(old_res_module); |
| + |
| + // Create the image list with the appropriate size and colour mask. |
| + instance->close_button_->m_ImageList.Create(kBitmapImageSize, |
| + kBitmapImageSize, |
| + ILC_COLOR8 | ILC_MASK, 4, 0); |
| + instance->close_button_->m_ImageList.Add(close_bitmap, RGB(255, 0, 255)); |
|
cpu_(ooo_6.6-7.5)
2013/07/24 02:05:09
does the imagelist own the close_bitmap? I forgot
robertshield
2013/07/24 14:02:54
I thought it did, but indeed it doesn't. Thanks fo
|
| + instance->close_button_->m_ImageList.SetBkColor(CLR_NONE); |
| + |
| + // Configure the button states and initialize the button. |
| + instance->close_button_->SetImages(0, 1, 2, 3); |
| + instance->close_button_->SubclassWindow(close_window); |
| + |
| + // The CDialogResize() implementation incorrectly captures the size |
| + // of the bitmap image button. Reset it here to ensure that resizing works |
| + // as desired. |
| + |
| + // Find the resize data. The parameters here must match the resize map in |
| + // turndown_prompt_window.h. |
| + _AtlDlgResizeData resize_params = { IDDISMISS, DLSZ_CENTER_Y | DLSZ_MOVE_X }; |
| + int resize_index = instance->m_arrData.Find(resize_params); |
| + DCHECK(resize_index > -1 && resize_index < instance->m_arrData.GetSize()); |
| + |
| + // Fiddle CDialogResize's internal data to fix up the size for the image |
| + // control. |
| + _AtlDlgResizeData& resize_data = instance->m_arrData[resize_index]; |
| + resize_data.m_rect.right = resize_data.m_rect.left + kBitmapImageSize; |
| + resize_data.m_rect.top = 0; |
| + resize_data.m_rect.bottom = kBitmapImageSize; |
| +} |
| + |
| void TurndownPromptWindow::OnFinalMessage(HWND) { |
| delete this; |
| } |
| void TurndownPromptWindow::OnDestroy() { |
| + close_button_->m_ImageList.Destroy(); |
| frame_ = NULL; |
| } |