if (m_ImageList == NULL ||
!SendMessageW(BCM_GETIDEALSIZE, 0, (LPARAM) &Size))
{
- Size.cx = 2 * GetSystemMetrics(SM_CXEDGE);
- Size.cy = 2 * GetSystemMetrics(SM_CYEDGE);
-
- if (hbmStart == NULL)
- {
- hbmStart = (HBITMAP) SendMessageW(BM_GETIMAGE, IMAGE_BITMAP, 0);
- }
-
- if (hbmStart != NULL)
- {
- BITMAP bmp;
-
- if (GetObject(hbmStart, sizeof(bmp), &bmp) != 0)
- {
- Size.cx += bmp.bmWidth;
- Size.cy += max(bmp.bmHeight, GetSystemMetrics(SM_CYCAPTION));
- }
- else
- {
- /* Huh?! Shouldn't happen... */
- goto DefSize;
- }
- }
- else
- {
-DefSize:
- Size.cx += GetSystemMetrics(SM_CXMINIMIZED);
- Size.cy += GetSystemMetrics(SM_CYCAPTION);
- }
+ Size.cx = 2 * GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CYCAPTION) * 3;
+ Size.cy = 2 * GetSystemMetrics(SM_CYEDGE) + GetSystemMetrics(SM_CYCAPTION);
}
/* Save the size of the start button */
m_Size = Size;
}
- BOOL CreateImageList()
- {
- HICON hIconStart;
- SIZE IconSize;
-
- if (m_ImageList != NULL)
- return TRUE;
-
- IconSize.cx = GetSystemMetrics(SM_CXSMICON);
- IconSize.cy = GetSystemMetrics(SM_CYSMICON);
-
- /* Load the start button icon and create a image list for it */
- hIconStart = (HICON) LoadImageW(hExplorerInstance,
- MAKEINTRESOURCEW(IDI_START),
- IMAGE_ICON,
- IconSize.cx,
- IconSize.cy,
- LR_SHARED | LR_DEFAULTCOLOR);
-
- if (hIconStart == NULL)
- return FALSE;
-
- m_ImageList = ImageList_Create(IconSize.cx,
- IconSize.cy,
- ILC_COLOR32 | ILC_MASK,
- 1, 1);
- if (m_ImageList == NULL)
- return FALSE;
-
- int s = ImageList_ReplaceIcon(m_ImageList, -1, hIconStart);
- if (s < 0)
- {
- /* Failed to add the icon! */
- ImageList_Destroy(m_ImageList);
- m_ImageList = NULL;
-
- return FALSE;
- }
-
- return TRUE;
- }
-
- HBITMAP CreateBitmap()
- {
- WCHAR szStartCaption[32];
- HFONT hFontOld;
- HDC hDC = NULL;
- HDC hDCScreen = NULL;
- SIZE Size, SmallIcon;
- HBITMAP hbmpOld, hbmp = NULL;
- HBITMAP hBitmap = NULL;
- HICON hIconStart;
- BOOL Ret;
- UINT Flags;
- RECT rcButton;
-
- /* NOTE: this is the backwards compatibility code that is used if the
- Common Controls Version 6.0 are not available! */
-
- if (!LoadStringW(hExplorerInstance,
- IDS_START,
- szStartCaption,
- _countof(szStartCaption)))
- {
- return NULL;
- }
-
- /* Load the start button icon */
- SmallIcon.cx = GetSystemMetrics(SM_CXSMICON);
- SmallIcon.cy = GetSystemMetrics(SM_CYSMICON);
- hIconStart = (HICON) LoadImageW(hExplorerInstance,
- MAKEINTRESOURCEW(IDI_START),
- IMAGE_ICON,
- SmallIcon.cx,
- SmallIcon.cy,
- LR_SHARED | LR_DEFAULTCOLOR);
-
- hDCScreen = ::GetDC(NULL);
- if (hDCScreen == NULL)
- goto Cleanup;
-
- hDC = CreateCompatibleDC(hDCScreen);
- if (hDC == NULL)
- goto Cleanup;
-
- hFontOld = (HFONT) SelectObject(hDC, m_Font);
-
- Ret = GetTextExtentPoint32(hDC,
- szStartCaption,
- wcslen(szStartCaption),
- &Size);
-
- SelectObject(hDC, hFontOld);
- if (!Ret)
- goto Cleanup;
-
- /* Make sure the height is at least the size of a caption icon. */
- if (hIconStart != NULL)
- Size.cx += SmallIcon.cx + 4;
- Size.cy = max(Size.cy, SmallIcon.cy);
-
- /* Create the bitmap */
- hbmp = CreateCompatibleBitmap(hDCScreen,
- Size.cx,
- Size.cy);
- if (hbmp == NULL)
- goto Cleanup;
-
- /* Caluclate the button rect */
- rcButton.left = 0;
- rcButton.top = 0;
- rcButton.right = Size.cx;
- rcButton.bottom = Size.cy;
-
- /* Draw the button */
- hbmpOld = (HBITMAP) SelectObject(hDC, hbmp);
-
- Flags = DC_TEXT | DC_INBUTTON;
- if (hIconStart != NULL)
- Flags |= DC_ICON;
-
- Ret = DrawCaptionTemp(NULL,
- hDC,
- &rcButton,
- m_Font,
- hIconStart,
- szStartCaption,
- Flags);
-
- SelectObject(hDC, hbmpOld);
-
- if (!Ret)
- goto Cleanup;
-
- /* We successfully created the bitmap! */
- hBitmap = hbmp;
- hbmp = NULL;
-
-Cleanup:
- if (hDCScreen != NULL)
- {
- ::ReleaseDC(NULL, hDCScreen);
- }
-
- if (hbmp != NULL)
- DeleteObject(hbmp);
-
- if (hDC != NULL)
- DeleteDC(hDC);
-
- return hBitmap;
- }
-
VOID Initialize()
{
- NONCLIENTMETRICS ncm;
-
SetWindowTheme(m_hWnd, L"Start", NULL);
- if (m_Font == NULL)
+ /* Get the system fonts, we use the caption font, always bold, though. */
+ NONCLIENTMETRICS ncm = {sizeof(ncm)};
+ if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, FALSE))
{
- /* Get the system fonts, we use the caption font, always bold, though. */
- ncm.cbSize = sizeof(ncm);
- if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, FALSE))
- {
- ncm.lfCaptionFont.lfWeight = FW_BOLD;
- m_Font = CreateFontIndirect(&ncm.lfCaptionFont);
- }
+ ncm.lfCaptionFont.lfWeight = FW_BOLD;
+ m_Font = CreateFontIndirect(&ncm.lfCaptionFont);
}
SetFont(m_Font, FALSE);
- if (CreateImageList())
- {
- BUTTON_IMAGELIST bil;
-
- /* Try to set the start button image. this requires the Common
- Controls 6.0 to be present (XP and later) */
- bil.himl = m_ImageList;
- bil.margin.left = bil.margin.right = 1;
- bil.margin.top = bil.margin.bottom = 1;
- bil.uAlign = BUTTON_IMAGELIST_ALIGN_LEFT;
-
- if (SendMessageW(BCM_SETIMAGELIST, 0, (LPARAM) &bil))
- {
- /* We're using the image list, remove the BS_BITMAP style and
- don't center it horizontally */
- SetWindowStyle(m_hWnd, BS_BITMAP | BS_RIGHT, 0);
-
- UpdateSize();
- return;
- }
-
- /* Fall back to the deprecated method on older systems that don't
- support Common Controls 6.0 */
- ImageList_Destroy(m_ImageList);
- m_ImageList = NULL;
- }
+ m_ImageList = ImageList_LoadImageW(hExplorerInstance,
+ MAKEINTRESOURCEW(IDB_START),
+ 0, 0, 0,
+ IMAGE_BITMAP,
+ LR_LOADTRANSPARENT | LR_CREATEDIBSECTION);
- HBITMAP hbmStart = CreateBitmap();
- if (hbmStart != NULL)
- {
- UpdateSize(hbmStart);
-
- HBITMAP hbmOld = (HBITMAP) SendMessageW(BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbmStart);
-
- if (hbmOld != NULL)
- DeleteObject(hbmOld);
- }
+ BUTTON_IMAGELIST bil = {m_ImageList, {1,1,1,1}, BUTTON_IMAGELIST_ALIGN_LEFT};
+ SendMessageW(BCM_SETIMAGELIST, 0, (LPARAM) &bil);
+ UpdateSize();
}
HWND Create(HWND hwndParent)
szStartCaption,
_countof(szStartCaption)))
{
- szStartCaption[0] = L'\0';
+ wcscpy(szStartCaption, L"Start");
}
- DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER | BS_BITMAP;
+ DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_PUSHBUTTON | BS_LEFT | BS_VCENTER;
m_hWnd = CreateWindowEx(
0,
break;
case ID_SHELL_CMD_CUST_NOTIF:
+ ShowCustomizeNotifyIcons(hExplorerInstance, m_hWnd);
break;
case ID_SHELL_CMD_ADJUST_DAT:
return hMon;
}
+ VOID AdjustSizerRect(RECT *rc, DWORD pos)
+ {
+ switch (pos)
+ {
+ case ABE_TOP:
+ rc->bottom -= GetSystemMetrics(SM_CXSIZEFRAME);
+ break;
+ case ABE_BOTTOM:
+ rc->top += GetSystemMetrics(SM_CXSIZEFRAME);
+ break;
+ case ABE_LEFT:
+ rc->right -= GetSystemMetrics(SM_CYSIZEFRAME);
+ break;
+ case ABE_RIGHT:
+ rc->left += GetSystemMetrics(SM_CYSIZEFRAME);
+ break;
+ }
+
+ }
+
VOID MakeTrayRectWithSize(IN DWORD Position,
IN const SIZE *pTraySize,
IN OUT RECT *pRect)
*pRect = *pScreen;
- /* Move the border outside of the screen */
- InflateRect(pRect,
- GetSystemMetrics(SM_CXEDGE),
- GetSystemMetrics(SM_CYEDGE));
+ if(!IsThemeActive())
+ {
+ /* Move the border outside of the screen */
+ InflateRect(pRect,
+ GetSystemMetrics(SM_CXEDGE),
+ GetSystemMetrics(SM_CYEDGE));
+ }
MakeTrayRectWithSize(Position, pTraySize, pRect);
}
entire window size, not just the client size. However, we
use a thinner border than a standard thick border, so that
the start button and bands are not stuck to the screen border. */
- sr.Size.cx = StartBtnSize.cx + (2 * (EdgeSize.cx + DlgFrameSize.cx));
- sr.Size.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy));
+ if(!IsThemeActive())
+ {
+ sr.Size.cx = StartBtnSize.cx + (2 * (EdgeSize.cx + DlgFrameSize.cx));
+ sr.Size.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy));
+ }
+ else
+ {
+ sr.Size.cx = StartBtnSize.cx - EdgeSize.cx;
+ sr.Size.cy = StartBtnSize.cy - EdgeSize.cy;
+ if(!Locked)
+ sr.Size.cy += GetSystemMetrics(SM_CYSIZEFRAME);
+ }
/* Use the primary screen by default */
rcScreen.left = 0;
loaded from the registry are at least. The windows explorer behaves
the same way, it allows the user to save a zero width vertical tray
window, but not a zero height horizontal tray window. */
- WndSize.cx = 2 * (EdgeSize.cx + DlgFrameSize.cx);
- WndSize.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy));
+ if(!IsThemeActive())
+ {
+ WndSize.cx = 2 * (EdgeSize.cx + DlgFrameSize.cx);
+ WndSize.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy));
+ }
+ else
+ {
+ WndSize.cx = StartBtnSize.cx;
+ WndSize.cy = StartBtnSize.cy - EdgeSize.cx;
+ }
if (WndSize.cx < sr.Size.cx)
WndSize.cx = sr.Size.cx;
return;
}
- /* Limit the Start button width to the client width, if neccessary */
+ /* Limit the Start button width to the client width, if necessary */
StartSize = m_StartButton.GetSize();
if (StartSize.cx > rcClient.right)
StartSize.cx = rcClient.right;
{
HDC hdc;
RECT rect;
- int backoundPart;
+ int backgroundPart;
GetWindowRect(&rect);
OffsetRect(&rect, -rect.left, -rect.top);
- hdc = GetDCEx(hRgn, DCX_WINDOW | DCX_INTERSECTRGN | DCX_PARENTCLIP);
+ hdc = GetWindowDC();
switch (m_Position)
{
case ABE_LEFT:
- backoundPart = TBP_SIZINGBARLEFT;
+ backgroundPart = TBP_SIZINGBARLEFT;
rect.left = rect.right - GetSystemMetrics(SM_CXSIZEFRAME);
break;
case ABE_TOP:
- backoundPart = TBP_SIZINGBARTOP;
+ backgroundPart = TBP_SIZINGBARTOP;
rect.top = rect.bottom - GetSystemMetrics(SM_CYSIZEFRAME);
break;
case ABE_RIGHT:
- backoundPart = TBP_SIZINGBARRIGHT;
+ backgroundPart = TBP_SIZINGBARRIGHT;
rect.right = rect.left + GetSystemMetrics(SM_CXSIZEFRAME);
break;
case ABE_BOTTOM:
default:
- backoundPart = TBP_SIZINGBARBOTTOM;
+ backgroundPart = TBP_SIZINGBARBOTTOM;
rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZEFRAME);
break;
}
- if (IsThemeBackgroundPartiallyTransparent(m_Theme, backoundPart, 0))
+ if (IsThemeBackgroundPartiallyTransparent(m_Theme, backgroundPart, 0))
{
DrawThemeParentBackground(m_hWnd, hdc, &rect);
}
- DrawThemeBackground(m_Theme, hdc, backoundPart, 0, &rect, 0);
+ DrawThemeBackground(m_Theme, hdc, backgroundPart, 0, &rect, 0);
ReleaseDC(hdc);
return 0;
if (AlwaysOnTop)
dwExStyle |= WS_EX_TOPMOST;
- DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
- WS_BORDER | WS_THICKFRAME;
+ DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+ if(!IsThemeActive())
+ {
+ dwStyle |= WS_THICKFRAME | WS_BORDER;
+ }
ZeroMemory(&rcWnd, sizeof(rcWnd));
if (m_Position != (DWORD) -1)
}
}
- if (Locked && m_Theme)
+ if (m_Theme)
{
- SetWindowStyle(m_hWnd, WS_THICKFRAME | WS_BORDER, 0);
- }
- else
- {
- SetWindowStyle(m_hWnd, WS_THICKFRAME | WS_BORDER, WS_THICKFRAME | WS_BORDER);
+ /* Update cached tray sizes */
+ for(DWORD Pos = ABE_LEFT; Pos <= ABE_BOTTOM; Pos++)
+ {
+ RECT rcGripper = {0};
+ AdjustSizerRect(&rcGripper, Pos);
+
+ if(Locked)
+ {
+ m_TrayRects[Pos].top += rcGripper.top;
+ m_TrayRects[Pos].left += rcGripper.left;
+ m_TrayRects[Pos].bottom += rcGripper.bottom;
+ m_TrayRects[Pos].right += rcGripper.right;
+ }
+ else
+ {
+ m_TrayRects[Pos].top -= rcGripper.top;
+ m_TrayRects[Pos].left -= rcGripper.left;
+ m_TrayRects[Pos].bottom -= rcGripper.bottom;
+ m_TrayRects[Pos].right -= rcGripper.right;
+ }
+ }
}
- SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
-
+ SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER);
}
return bPrevLock;
SetWindowsFont();
}
- /* Move the tray window to the right position and resize it if neccessary */
+ /* Move the tray window to the right position and resize it if necessary */
CheckTrayWndPosition();
/* Align all controls on the tray window */
else
m_Theme = NULL;
- if (Locked && m_Theme)
+ if (m_Theme)
{
SetWindowStyle(m_hWnd, WS_THICKFRAME | WS_BORDER, 0);
}
/* Load the saved tray window settings */
RegLoadSettings();
- /* Move the tray window to the right position and resize it if neccessary */
+ /* Move the tray window to the right position and resize it if necessary */
CheckTrayWndPosition();
/* Align all controls on the tray window */
return TRUE;
}
+ LRESULT OnNcCalcSize(INT code, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+ {
+ RECT *rc = NULL;
+ /* Ignore WM_NCCALCSIZE if we are not themed or locked */
+ if(!IsThemeActive() || Locked)
+ {
+ bHandled = FALSE;
+ return 0;
+ }
+ if(!wParam)
+ {
+ rc = (RECT*)wParam;
+ }
+ else
+ {
+ NCCALCSIZE_PARAMS *prms = (NCCALCSIZE_PARAMS*)lParam;
+ if(prms->lppos->flags & SWP_NOSENDCHANGING)
+ {
+ bHandled = FALSE;
+ return 0;
+ }
+ rc = &prms->rgrc[0];
+ }
+
+ AdjustSizerRect(rc, m_Position);
+
+ return 0;
+ }
+
LRESULT OnRebarAutoSize(INT code, LPNMHDR nmhdr, BOOL& bHandled)
{
#if 0
MESSAGE_HANDLER(TWM_DOEXITWINDOWS, OnDoExitWindows)
MESSAGE_HANDLER(WM_CLOSE, OnDoExitWindows)
MESSAGE_HANDLER(WM_HOTKEY, OnHotkey)
+ MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
ALT_MSG_MAP(1)
END_MSG_MAP()
TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
- mii.fType |= MFT_RADIOCHECK;
-
::InsertMenuItemW(hPopup, i + 1, TRUE, &mii);
}