| 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..17321e021547f2e26efa044bab572a7298cd325c 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 = {0};
|
| + 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,62 @@ 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));
|
| + instance->close_button_->m_ImageList.SetBkColor(CLR_NONE);
|
| +
|
| + // Free up the original bitmap.
|
| + DeleteObject(close_bitmap);
|
| +
|
| + // 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;
|
| }
|
|
|
|
|