Sync to Wine-20040716:

Mike McCormack <mike@codeweavers.com>
- Create a tooltip on demand in the Listview.
Robert Shearman <rob@codeweavers.com>
- Implemented PSM_HWNDTOINDEX.
- Add stubs for some new property sheet messages.
- Clean up the mask drawing code.
- Improve bitmap not found message.
- Start of balloon tip support.
Jon Griffiths <jon_p_griffiths@yahoo.com>
- Don't crash on NULL tab text.
Filip Navara <xnavara@volny.cz>
- Make the pattern drawing in TOOLBAR_DrawPattern look better.

svn path=/trunk/; revision=10425
This commit is contained in:
Gé van Geldorp 2004-08-08 20:04:00 +00:00
parent a4617084d5
commit 1c0c11dcb3
6 changed files with 410 additions and 124 deletions

View file

@ -8954,6 +8954,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_GETTILEVIEWINFO: */
case LVM_GETTOOLTIPS:
if( !infoPtr->hwndToolTip )
infoPtr->hwndToolTip = COMCTL32_CreateToolTip( hwnd );
return (LRESULT)infoPtr->hwndToolTip;
case LVM_GETTOPINDEX:

View file

@ -2490,6 +2490,133 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
}
}
/******************************************************************************
* PROPSHEET_InsertPage
*/
static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage)
{
if (!HIWORD(hpageInsertAfter))
FIXME("(%p, %d, %p): stub\n", hwndDlg, LOWORD(hpageInsertAfter), hpage);
else
FIXME("(%p, %p, %p): stub\n", hwndDlg, hpageInsertAfter, hpage);
return FALSE;
}
/******************************************************************************
* PROPSHEET_SetHeaderTitleW
*/
static void PROPSHEET_SetHeaderTitleW(HWND hwndDlg, int iPageIndex, LPCWSTR pszHeaderTitle)
{
FIXME("(%p, %d, %s): stub\n", hwndDlg, iPageIndex, debugstr_w(pszHeaderTitle));
}
/******************************************************************************
* PROPSHEET_SetHeaderTitleA
*/
static void PROPSHEET_SetHeaderTitleA(HWND hwndDlg, int iPageIndex, LPCSTR pszHeaderTitle)
{
FIXME("(%p, %d, %s): stub\n", hwndDlg, iPageIndex, debugstr_a(pszHeaderTitle));
}
/******************************************************************************
* PROPSHEET_SetHeaderSubTitleW
*/
static void PROPSHEET_SetHeaderSubTitleW(HWND hwndDlg, int iPageIndex, LPCWSTR pszHeaderSubTitle)
{
FIXME("(%p, %d, %s): stub\n", hwndDlg, iPageIndex, debugstr_w(pszHeaderSubTitle));
}
/******************************************************************************
* PROPSHEET_SetHeaderSubTitleA
*/
static void PROPSHEET_SetHeaderSubTitleA(HWND hwndDlg, int iPageIndex, LPCSTR pszHeaderSubTitle)
{
FIXME("(%p, %d, %s): stub\n", hwndDlg, iPageIndex, debugstr_a(pszHeaderSubTitle));
}
/******************************************************************************
* PROPSHEET_HwndToIndex
*/
static LRESULT PROPSHEET_HwndToIndex(HWND hwndDlg, HWND hPageDlg)
{
int index;
PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
PropSheetInfoStr);
TRACE("(%p, %p)\n", hwndDlg, hPageDlg);
for (index = 0; index < psInfo->nPages; index++)
if (psInfo->proppage[index].hwndPage == hPageDlg)
return index;
WARN("%p not found\n", hPageDlg);
return -1;
}
/******************************************************************************
* PROPSHEET_IndexToHwnd
*/
static LRESULT PROPSHEET_IndexToHwnd(HWND hwndDlg, int iPageIndex)
{
FIXME("(%p, %d): stub\n", hwndDlg, iPageIndex);
return 0;
}
/******************************************************************************
* PROPSHEET_PageToIndex
*/
static LRESULT PROPSHEET_PageToIndex(HWND hwndDlg, HPROPSHEETPAGE hPage)
{
FIXME("(%p, %p): stub\n", hwndDlg, hPage);
return -1;
}
/******************************************************************************
* PROPSHEET_IndexToPage
*/
static LRESULT PROPSHEET_IndexToPage(HWND hwndDlg, int iPageIndex)
{
FIXME("(%p, %d): stub\n", hwndDlg, iPageIndex);
return 0;
}
/******************************************************************************
* PROPSHEET_IdToIndex
*/
static LRESULT PROPSHEET_IdToIndex(HWND hwndDlg, int iPageId)
{
FIXME("(%p, %d): stub\n", hwndDlg, iPageId);
return -1;
}
/******************************************************************************
* PROPSHEET_IndexToId
*/
static LRESULT PROPSHEET_IndexToId(HWND hwndDlg, int iPageIndex)
{
FIXME("(%p, %d): stub\n", hwndDlg, iPageIndex);
return 0;
}
/******************************************************************************
* PROPSHEET_GetResult
*/
static LRESULT PROPSHEET_GetResult(HWND hwndDlg)
{
FIXME("(%p): stub\n", hwndDlg);
return -1;
}
/******************************************************************************
* PROPSHEET_RecalcPageSizes
*/
static BOOL PROPSHEET_RecalcPageSizes(HWND hwndDlg)
{
FIXME("(%p): stub\n", hwndDlg);
return FALSE;
}
/******************************************************************************
* PROPSHEET_GetPageIndex
*
@ -3348,6 +3475,85 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
PROPSHEET_SetFinishTextW(hwnd, (LPCWSTR) lParam);
return FALSE;
case PSM_INSERTPAGE:
{
BOOL msgResult = PROPSHEET_InsertPage(hwnd, (HPROPSHEETPAGE)wParam, (HPROPSHEETPAGE)lParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_SETHEADERTITLEW:
PROPSHEET_SetHeaderTitleW(hwnd, (int)wParam, (LPCWSTR)lParam);
return TRUE;
case PSM_SETHEADERTITLEA:
PROPSHEET_SetHeaderTitleA(hwnd, (int)wParam, (LPCSTR)lParam);
return TRUE;
case PSM_SETHEADERSUBTITLEW:
PROPSHEET_SetHeaderSubTitleW(hwnd, (int)wParam, (LPCWSTR)lParam);
return TRUE;
case PSM_SETHEADERSUBTITLEA:
PROPSHEET_SetHeaderSubTitleA(hwnd, (int)wParam, (LPCSTR)lParam);
return TRUE;
case PSM_HWNDTOINDEX:
{
LRESULT msgResult = PROPSHEET_HwndToIndex(hwnd, (HWND)wParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_INDEXTOHWND:
{
LRESULT msgResult = PROPSHEET_IndexToHwnd(hwnd, (int)wParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_PAGETOINDEX:
{
LRESULT msgResult = PROPSHEET_PageToIndex(hwnd, (HPROPSHEETPAGE)wParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_INDEXTOPAGE:
{
LRESULT msgResult = PROPSHEET_IndexToPage(hwnd, (int)wParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_IDTOINDEX:
{
LRESULT msgResult = PROPSHEET_IdToIndex(hwnd, (int)lParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_INDEXTOID:
{
LRESULT msgResult = PROPSHEET_IndexToId(hwnd, (int)wParam);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_GETRESULT:
{
LRESULT msgResult = PROPSHEET_GetResult(hwnd);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
case PSM_RECALCPAGESIZES:
{
LRESULT msgResult = PROPSHEET_RecalcPageSizes(hwnd);
SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
return TRUE;
}
default:
return FALSE;
}

View file

@ -1145,7 +1145,7 @@ static void TAB_SetItemBounds (HWND hwnd)
/* Set the leftmost position of the tab. */
infoPtr->items[curItem].rect.left = curItemLeftPos;
if (lStyle & TCS_FIXEDWIDTH)
if ((lStyle & TCS_FIXEDWIDTH) || !infoPtr->items[curItem].pszText)
{
infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left +
max(infoPtr->tabWidth, icon_width);
@ -1682,8 +1682,11 @@ TAB_DrawItemInterior
rcText.left = rcText.top = rcText.right = rcText.bottom = 0;
/* get the rectangle that the text fits in */
DrawTextW(hdc, infoPtr->items[iItem].pszText, -1,
&rcText, DT_CALCRECT);
if (infoPtr->items[iItem].pszText)
{
DrawTextW(hdc, infoPtr->items[iItem].pszText, -1,
&rcText, DT_CALCRECT);
}
/*
* If not owner draw, then do the drawing ourselves.
*
@ -1824,14 +1827,17 @@ TAB_DrawItemInterior
hFont = CreateFontIndirectA(&logfont);
SelectObject(hdc, hFont);
ExtTextOutW(hdc,
(lStyle & TCS_BOTTOM) ? drawRect->right : drawRect->left,
(!(lStyle & TCS_BOTTOM)) ? drawRect->bottom : drawRect->top,
ETO_CLIPPED,
drawRect,
infoPtr->items[iItem].pszText,
lstrlenW(infoPtr->items[iItem].pszText),
0);
if (infoPtr->items[iItem].pszText)
{
ExtTextOutW(hdc,
(lStyle & TCS_BOTTOM) ? drawRect->right : drawRect->left,
(!(lStyle & TCS_BOTTOM)) ? drawRect->bottom : drawRect->top,
ETO_CLIPPED,
drawRect,
infoPtr->items[iItem].pszText,
lstrlenW(infoPtr->items[iItem].pszText),
0);
}
DeleteObject(hFont);
}
@ -1841,14 +1847,17 @@ TAB_DrawItemInterior
debugstr_w(infoPtr->items[iItem].pszText), center_offset_h, center_offset_v,
drawRect->left, drawRect->top, drawRect->right, drawRect->bottom,
(rcText.right-rcText.left));
DrawTextW
(
hdc,
infoPtr->items[iItem].pszText,
lstrlenW(infoPtr->items[iItem].pszText),
drawRect,
DT_LEFT | DT_SINGLELINE
if (infoPtr->items[iItem].pszText)
{
DrawTextW
(
hdc,
infoPtr->items[iItem].pszText,
lstrlenW(infoPtr->items[iItem].pszText),
drawRect,
DT_LEFT | DT_SINGLELINE
);
}
}
*drawRect = rcTemp; /* restore drawRect */

View file

@ -407,7 +407,7 @@ TOOLBAR_GetImageListForDrawing (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMA
if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) {
if (btnPtr->iBitmap == I_IMAGENONE) return NULL;
ERR("index %d,%d is not valid, max %d\n",
ERR("bitmap for ID %d, index %d is not valid, number of bitmaps in imagelist: %d\n",
HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps);
return NULL;
}
@ -634,61 +634,53 @@ TOOLBAR_DrawPattern (LPRECT lpRect, NMTBCUSTOMDRAW *tbcd)
INT cy = lpRect->bottom - lpRect->top;
clrTextOld = SetTextColor(hdc, tbcd->clrBtnHighlight);
clrBkOld = SetBkColor(hdc, tbcd->clrBtnFace);
PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, PATCOPY);
PatBlt (hdc, lpRect->left + 2, lpRect->top + 2, cx - 4, cy - 4, PATCOPY);
SetBkColor(hdc, clrBkOld);
SetTextColor(hdc, clrTextOld);
SelectObject (hdc, hbr);
}
static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
HDC hdc, INT x, INT y)
static void TOOLBAR_DrawMasked(HIMAGELIST himl, int index, HDC hdc, INT x, INT y, UINT draw_flags)
{
int index;
HIMAGELIST himl =
TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index);
INT cx, cy;
HBITMAP hbmMask, hbmImage;
HDC hdcMask, hdcImage;
if (himl)
{
INT cx, cy;
HBITMAP hbmMask, hbmImage;
HDC hdcMask, hdcImage;
ImageList_GetIconSize(himl, &cx, &cy);
ImageList_GetIconSize(himl, &cx, &cy);
/* Create src image */
hdcImage = CreateCompatibleDC(hdc);
hbmImage = CreateBitmap(cx, cy, GetDeviceCaps(hdc,PLANES),
GetDeviceCaps(hdc,BITSPIXEL), NULL);
SelectObject(hdcImage, hbmImage);
ImageList_DrawEx(himl, index, hdcImage, 0, 0, cx, cy,
RGB(0xff, 0xff, 0xff), RGB(0,0,0), draw_flags);
/* Create src image */
hdcImage = CreateCompatibleDC(hdc);
hbmImage = CreateBitmap(cx, cy, GetDeviceCaps(hdc,PLANES),
GetDeviceCaps(hdc,BITSPIXEL), NULL);
SelectObject(hdcImage, hbmImage);
ImageList_DrawEx(himl, index, hdcImage, 0, 0, cx, cy,
RGB(0xff, 0xff, 0xff), RGB(0,0,0), ILD_NORMAL);
/* Create Mask */
hdcMask = CreateCompatibleDC(0);
hbmMask = CreateBitmap(cx, cy, 1, 1, NULL);
SelectObject(hdcMask, hbmMask);
/* Create Mask */
hdcMask = CreateCompatibleDC(0);
hbmMask = CreateBitmap(cx, cy, 1, 1, NULL);
SelectObject(hdcMask, hbmMask);
/* Remove the background and all white pixels */
SetBkColor(hdcImage, ImageList_GetBkColor(himl));
BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, SRCCOPY);
SetBkColor(hdcImage, RGB(0xff, 0xff, 0xff));
BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, NOTSRCERASE);
/* Remove the background and all white pixels */
SetBkColor(hdcImage, ImageList_GetBkColor(himl));
BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, SRCCOPY);
SetBkColor(hdcImage, RGB(0xff, 0xff, 0xff));
BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, NOTSRCERASE);
/* draw the new mask 'etched' to hdc */
SetBkColor(hdc, RGB(255, 255, 255));
SelectObject(hdc, GetSysColorBrush(COLOR_3DHILIGHT));
/* E20746 op code is (Dst ^ (Src & (Pat ^ Dst))) */
BitBlt(hdc, x + 1, y + 1, cx, cy, hdcMask, 0, 0, 0xE20746);
SelectObject(hdc, GetSysColorBrush(COLOR_3DSHADOW));
BitBlt(hdc, x, y, cx, cy, hdcMask, 0, 0, 0xE20746);
/* draw the new mask 'etched' to hdc */
SetBkColor(hdc, RGB(255, 255, 255));
SelectObject(hdc, GetSysColorBrush(COLOR_3DHILIGHT));
/* E20746 op code is (Dst ^ (Src & (Pat ^ Dst))) */
BitBlt(hdc, x + 1, y + 1, cx, cy, hdcMask, 0, 0, 0xE20746);
SelectObject(hdc, GetSysColorBrush(COLOR_3DSHADOW));
BitBlt(hdc, x, y, cx, cy, hdcMask, 0, 0, 0xE20746);
/* Cleanup */
DeleteObject(hbmImage);
DeleteDC(hdcImage);
DeleteObject (hbmMask);
DeleteDC(hdcMask);
}
/* Cleanup */
DeleteObject(hbmImage);
DeleteDC(hdcImage);
DeleteObject (hbmMask);
DeleteDC(hdcMask);
}
@ -721,7 +713,10 @@ TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top
{
himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DISABLED, &index);
if (!himl)
draw_masked = TRUE;
{
himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index);
draw_masked = TRUE;
}
}
else if ((tbcd->nmcd.uItemState & CDIS_HOT) && (infoPtr->dwStyle & TBSTYLE_FLAT))
{
@ -734,6 +729,9 @@ TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top
else
himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index);
if (!himl)
return;
if (!(infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) &&
(tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)))
offset = 1;
@ -746,8 +744,8 @@ TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top
index, himl, left, top, offset);
if (draw_masked)
TOOLBAR_DrawMasked (infoPtr, btnPtr, tbcd->nmcd.hdc, left + offset, top + offset);
else if (himl)
TOOLBAR_DrawMasked (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags);
else
ImageList_Draw (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags);
}
@ -5313,6 +5311,8 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
NMTOOLBARA nmtb;
BOOL bDragKeyPressed;
TRACE("\n");
if (infoPtr->dwStyle & TBSTYLE_ALTDRAG)
bDragKeyPressed = (GetKeyState(VK_MENU) < 0);
else

View file

@ -130,6 +130,12 @@ typedef struct
#define TOOLTIPS_GetInfoPtr(hWindow) ((TOOLTIPS_INFO *)GetWindowLongA (hWindow, 0))
/* offsets from window edge to start of text */
#define NORMAL_TEXT_MARGIN 2
#define BALLOON_TEXT_MARGIN (NORMAL_TEXT_MARGIN+10)
/* value used for CreateRoundRectRgn that specifies how much
* each corner is curved */
#define BALLOON_ROUNDEDNESS 20
LRESULT CALLBACK
TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uId, DWORD_PTR dwRef);
@ -144,6 +150,8 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
HFONT hOldFont;
HBRUSH hBrush;
UINT uFlags = DT_EXTERNALLEADING;
HRGN hRgn = NULL;
DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
if (infoPtr->nMaxTipWidth > -1)
uFlags |= DT_WORDBREAK;
@ -151,25 +159,63 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
uFlags |= DT_NOPREFIX;
GetClientRect (hwnd, &rc);
/* fill the background */
hBrush = CreateSolidBrush (infoPtr->clrBk);
FillRect (hdc, &rc, hBrush);
DeleteObject (hBrush);
hBrush = CreateSolidBrush(infoPtr->clrBk);
/* calculate text rectangle */
rc.left += (2 + infoPtr->rcMargin.left);
rc.top += (2 + infoPtr->rcMargin.top);
rc.right -= (2 + infoPtr->rcMargin.right);
rc.bottom -= (2 + infoPtr->rcMargin.bottom);
if (dwStyle & TTS_BALLOON)
{
/* create a region to store result into */
hRgn = CreateRectRgn(0, 0, 0, 0);
/* draw text */
GetWindowRgn(hwnd, hRgn);
/* fill the background */
FillRgn(hdc, hRgn, hBrush);
DeleteObject(hBrush);
hBrush = NULL;
/* calculate text rectangle */
rc.left += (BALLOON_TEXT_MARGIN + infoPtr->rcMargin.left);
rc.top += (BALLOON_TEXT_MARGIN + infoPtr->rcMargin.top);
rc.right -= (BALLOON_TEXT_MARGIN + infoPtr->rcMargin.right);
rc.bottom -= (BALLOON_TEXT_MARGIN + infoPtr->rcMargin.bottom);
}
else
{
/* fill the background */
FillRect(hdc, &rc, hBrush);
DeleteObject(hBrush);
hBrush = NULL;
/* calculate text rectangle */
rc.left += (NORMAL_TEXT_MARGIN + infoPtr->rcMargin.left);
rc.top += (NORMAL_TEXT_MARGIN + infoPtr->rcMargin.top);
rc.right -= (NORMAL_TEXT_MARGIN + infoPtr->rcMargin.right);
rc.bottom -= (NORMAL_TEXT_MARGIN + infoPtr->rcMargin.bottom);
}
/* already drawn the background; don't need to draw it again
* when drawing text */
oldBkMode = SetBkMode (hdc, TRANSPARENT);
SetTextColor (hdc, infoPtr->clrText);
hOldFont = SelectObject (hdc, infoPtr->hFont);
/* draw text */
DrawTextW (hdc, infoPtr->szTipText, -1, &rc, uFlags);
/* be polite and reset the things we changed in the dc */
SelectObject (hdc, hOldFont);
if (oldBkMode != TRANSPARENT)
SetBkMode (hdc, oldBkMode);
SetBkMode (hdc, oldBkMode);
if (dwStyle & TTS_BALLOON)
{
/* frame region because default window proc doesn't do it */
INT width = GetSystemMetrics(SM_CXDLGFRAME) - GetSystemMetrics(SM_CXEDGE);
INT height = GetSystemMetrics(SM_CYDLGFRAME) - GetSystemMetrics(SM_CYEDGE);
hBrush = GetSysColorBrush(COLOR_WINDOWFRAME);
FrameRgn(hdc, hRgn, hBrush, width, height);
}
if (hRgn)
DeleteObject(hRgn);
}
static void TOOLTIPS_GetDispInfoA(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr)
@ -322,10 +368,20 @@ TOOLTIPS_CalcTipSize (HWND hwnd, TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
SelectObject (hdc, hOldFont);
ReleaseDC (hwnd, hdc);
lpSize->cx = rc.right - rc.left + 4 +
infoPtr->rcMargin.left + infoPtr->rcMargin.right;
lpSize->cy = rc.bottom - rc.top + 4 +
infoPtr->rcMargin.bottom + infoPtr->rcMargin.top;
if (GetWindowLongW(hwnd, GWL_STYLE) & TTS_BALLOON)
{
lpSize->cx = rc.right - rc.left + 2*BALLOON_TEXT_MARGIN +
infoPtr->rcMargin.left + infoPtr->rcMargin.right;
lpSize->cy = rc.bottom - rc.top + 2*BALLOON_TEXT_MARGIN +
infoPtr->rcMargin.bottom + infoPtr->rcMargin.top;
}
else
{
lpSize->cx = rc.right - rc.left + 2*NORMAL_TEXT_MARGIN +
infoPtr->rcMargin.left + infoPtr->rcMargin.right;
lpSize->cy = rc.bottom - rc.top + 2*NORMAL_TEXT_MARGIN +
infoPtr->rcMargin.bottom + infoPtr->rcMargin.top;
}
}
@ -412,6 +468,18 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr)
AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE),
FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE));
if (GetWindowLongW(hwnd, GWL_STYLE) & TTS_BALLOON)
{
HRGN hRgn;
/* FIXME: need to add pointy bit using CreatePolyRgn & CombinRgn */
hRgn = CreateRoundRectRgn(0, 0, rect.right - rect.left, rect.bottom - rect.top, BALLOON_ROUNDEDNESS, BALLOON_ROUNDEDNESS);
SetWindowRgn(hwnd, hRgn, FALSE);
/* we don't free the region handle as the system deletes it when
* it is no longer needed */
}
SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_SHOWWINDOW | SWP_NOACTIVATE);
@ -531,6 +599,18 @@ TOOLTIPS_TrackShow (HWND hwnd, TOOLTIPS_INFO *infoPtr)
AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE),
FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE));
if (GetWindowLongW(hwnd, GWL_STYLE) & TTS_BALLOON)
{
HRGN hRgn;
/* FIXME: need to add pointy bit using CreatePolyRgn & CombinRgn */
hRgn = CreateRoundRectRgn(0, 0, rect.right - rect.left, rect.bottom - rect.top, BALLOON_ROUNDEDNESS, BALLOON_ROUNDEDNESS);
SetWindowRgn(hwnd, hRgn, FALSE);
/* we don't free the region handle as the system deletes it when
* it is no longer needed */
}
SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_SHOWWINDOW | SWP_NOACTIVATE );
@ -2024,22 +2104,6 @@ TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
static LRESULT
TOOLTIPS_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
RECT rect;
HBRUSH hBrush;
hBrush = CreateSolidBrush (infoPtr->clrBk);
GetClientRect (hwnd, &rect);
FillRect ((HDC)wParam, &rect, hBrush);
DeleteObject (hBrush);
return FALSE;
}
static LRESULT
TOOLTIPS_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
@ -2068,6 +2132,11 @@ TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
dwStyle &= 0x0000FFFF;
dwStyle |= (WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS);
/* WS_BORDER only draws a border round the window rect, not the
* window region, therefore it is useless to us in balloon mode */
if (dwStyle & TTS_BALLOON) dwStyle &= ~WS_BORDER;
SetWindowLongA (hwnd, GWL_STYLE, dwStyle);
dwExStyle |= WS_EX_TOOLWINDOW;
@ -2405,7 +2474,8 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_Destroy (hwnd, wParam, lParam);
case WM_ERASEBKGND:
return TOOLTIPS_EraseBackground (hwnd, wParam, lParam);
/* we draw the background in WM_PAINT */
return 0;
case WM_GETFONT:
return TOOLTIPS_GetFont (hwnd, wParam, lParam);

View file

@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v
retrieving revision 1.44
diff -u -r1.44 comctl32.spec
--- comctl32.spec 17 May 2004 20:51:27 -0000 1.44
+++ comctl32.spec 16 Jun 2004 06:51:02 -0000
+++ comctl32.spec 8 Aug 2004 13:10:59 -0000
@@ -106,13 +106,13 @@
412 stdcall RemoveWindowSubclass(long ptr long)
413 stdcall DefSubclassProc(long long long long)
@ -26,34 +26,13 @@ diff -u -r1.44 comctl32.spec
# Functions imported by name
Index: imagelist.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v
retrieving revision 1.85
diff -u -r1.85 imagelist.c
--- imagelist.c 27 Feb 2004 04:40:08 -0000 1.85
+++ imagelist.c 16 Jun 2004 06:51:02 -0000
@@ -1146,11 +1146,13 @@
PatBlt(hBlendMaskDC, 0, 0, cx, cy, PATCOPY);
SelectObject(hBlendMaskDC, hOldBrush);
+#if 0
/* Modify the blend mask if an Image Mask exist */
if(himl->hbmMask) {
BitBlt(hBlendMaskDC, 0, 0, cx, cy, hMaskListDC, lx, ly, 0x220326); /* NOTSRCAND */
BitBlt(hBlendMaskDC, 0, 0, cx, cy, hBlendMaskDC, 0, 0, NOTSRCCOPY);
}
+#endif
/* now apply blend to the current image given the BlendMask */
if (clrBlend == CLR_DEFAULT) clrBlend = GetSysColor (COLOR_HIGHLIGHT);
Index: listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.389
diff -u -r1.389 listview.c
--- listview.c 4 Jun 2004 17:58:29 -0000 1.389
+++ listview.c 16 Jun 2004 06:51:06 -0000
retrieving revision 1.390
diff -u -r1.390 listview.c
--- listview.c 6 Jul 2004 21:27:34 -0000 1.390
+++ listview.c 8 Aug 2004 13:11:03 -0000
@@ -147,6 +147,7 @@
#include <assert.h>
#include <ctype.h>
@ -62,13 +41,33 @@ diff -u -r1.389 listview.c
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
@@ -2023,7 +2024,8 @@
infoPtr->iconSize.cy + ICON_BOTTOM_PADDING;
Label.right = Label.left + labelSize.cx;
Label.bottom = Label.top + infoPtr->nItemHeight;
- if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight)
+ if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight &&
+ infoPtr->ntmHeight)
{
labelSize.cy = min(Box.bottom - Label.top, labelSize.cy);
labelSize.cy /= infoPtr->ntmHeight;
@@ -9517,7 +9519,8 @@
hOldFont = SelectObject(hdc, infoPtr->hFont);
/*Get String Length in pixels */
- GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz);
+ if(!GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz))
+ sz.cx = 0;
/*Add Extra spacing for the next character */
GetTextMetricsW(hdc, &textMetric);
Index: string.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/string.c,v
retrieving revision 1.4
diff -u -r1.4 string.c
--- string.c 17 May 2004 20:51:27 -0000 1.4
+++ string.c 16 Jun 2004 06:51:06 -0000
+++ string.c 8 Aug 2004 13:11:03 -0000
@@ -254,7 +254,7 @@
{
TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch));