[COMCTL32]

* Sync with Wine 1.7.1.

svn path=/trunk/; revision=60117
This commit is contained in:
Amine Khaldi 2013-09-14 20:06:00 +00:00
parent 18cfc3961c
commit 1db9e9e88a
15 changed files with 360 additions and 526 deletions

View file

@ -48,21 +48,12 @@ list(APPEND SOURCE
treeview.c
updown.c
stubs.c
rsrc.rc
${CMAKE_CURRENT_BINARY_DIR}/comctl32.def)
add_library(comctl32 SHARED ${SOURCE})
add_library(comctl32 SHARED ${SOURCE} rsrc.rc)
set_module_type(comctl32 win32dll UNICODE)
target_link_libraries(comctl32 uuid wine ${PSEH_LIB})
add_delay_importlibs(comctl32 winmm uxtheme)
add_importlibs(comctl32
user32
gdi32
advapi32
msvcrt
kernel32
ntdll)
add_importlibs(comctl32 user32 gdi32 advapi32 msvcrt kernel32 ntdll)
add_pch(comctl32 comctl32.h)
add_cd_file(TARGET comctl32 DESTINATION reactos/system32 FOR all)

View file

@ -75,7 +75,7 @@ typedef struct
INT nb_items; /* Number of items */
BOOL unicode; /* TRUE if this window is Unicode */
BOOL NtfUnicode; /* TRUE if parent wants notify in Unicode */
CBE_ITEMDATA *edit; /* item data for edit item */
CBE_ITEMDATA edit; /* item data for edit item */
CBE_ITEMDATA *items; /* Array of items */
} COMBOEX_INFO;
@ -273,9 +273,9 @@ static void COMBOEX_NotifyDragBegin(const COMBOEX_INFO *infoPtr, LPCWSTR wstr)
static void COMBOEX_FreeText (CBE_ITEMDATA *item)
{
if (is_textW(item->pszText)) Free(item->pszText);
item->pszText = 0;
item->pszText = NULL;
Free(item->pszTemp);
item->pszTemp = 0;
item->pszTemp = NULL;
}
@ -455,15 +455,15 @@ static void COMBOEX_SetEditText (const COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item
}
static CBE_ITEMDATA * COMBOEX_FindItem(const COMBOEX_INFO *infoPtr, INT_PTR index)
static CBE_ITEMDATA *COMBOEX_FindItem(COMBOEX_INFO *infoPtr, INT_PTR index)
{
CBE_ITEMDATA *item;
INT i;
if ((index >= infoPtr->nb_items) || (index < -1))
return 0;
return NULL;
if (index == -1)
return infoPtr->edit;
return &infoPtr->edit;
item = infoPtr->items;
i = infoPtr->nb_items - 1;
@ -481,7 +481,7 @@ static CBE_ITEMDATA * COMBOEX_FindItem(const COMBOEX_INFO *infoPtr, INT_PTR inde
/* *** CBEM_xxx message support *** */
static UINT COMBOEX_GetListboxText(const COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
static UINT COMBOEX_GetListboxText(COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
{
CBE_ITEMDATA *item;
LPCWSTR str;
@ -519,7 +519,7 @@ static UINT COMBOEX_GetListboxText(const COMBOEX_INFO *infoPtr, INT_PTR n, LPWST
}
static INT COMBOEX_DeleteItem (const COMBOEX_INFO *infoPtr, INT_PTR index)
static INT COMBOEX_DeleteItem (COMBOEX_INFO *infoPtr, INT_PTR index)
{
TRACE("(index=%ld)\n", index);
@ -534,7 +534,7 @@ static INT COMBOEX_DeleteItem (const COMBOEX_INFO *infoPtr, INT_PTR index)
}
static BOOL COMBOEX_GetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
static BOOL COMBOEX_GetItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
{
INT_PTR index = cit->iItem;
CBE_ITEMDATA *item;
@ -555,7 +555,7 @@ static BOOL COMBOEX_GetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
}
static BOOL COMBOEX_GetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
static BOOL COMBOEX_GetItemA (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
{
COMBOBOXEXITEMW tmpcit;
@ -754,7 +754,7 @@ static HIMAGELIST COMBOEX_SetImageList (COMBOEX_INFO *infoPtr, HIMAGELIST himl)
return himlTemp;
}
static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, const COMBOBOXEXITEMW *cit)
static BOOL COMBOEX_SetItemW (COMBOEX_INFO *infoPtr, const COMBOBOXEXITEMW *cit)
{
INT_PTR index = cit->iItem;
CBE_ITEMDATA *item;
@ -805,7 +805,7 @@ static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, const COMBOBOXEXITEMW
return TRUE;
}
static BOOL COMBOEX_SetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA const *cit)
static BOOL COMBOEX_SetItemA (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA const *cit)
{
COMBOBOXEXITEMW citW;
LPWSTR wstr = NULL;
@ -863,7 +863,7 @@ COMBOEX_FindStringExact (const COMBOEX_INFO *infoPtr, INT start, LPCWSTR str)
}
static DWORD_PTR COMBOEX_GetItemData (const COMBOEX_INFO *infoPtr, INT_PTR index)
static DWORD_PTR COMBOEX_GetItemData (COMBOEX_INFO *infoPtr, INT_PTR index)
{
CBE_ITEMDATA const *item1;
CBE_ITEMDATA const *item2;
@ -903,7 +903,7 @@ static INT COMBOEX_SetCursel (COMBOEX_INFO *infoPtr, INT_PTR index)
}
static DWORD_PTR COMBOEX_SetItemData (const COMBOEX_INFO *infoPtr, INT_PTR index, DWORD_PTR data)
static DWORD_PTR COMBOEX_SetItemData (COMBOEX_INFO *infoPtr, INT_PTR index, DWORD_PTR data)
{
CBE_ITEMDATA *item1;
CBE_ITEMDATA const *item2;
@ -1003,24 +1003,14 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
/* (allow space for the icons). */
infoPtr->hwndCombo = CreateWindowW (WC_COMBOBOXW, NIL,
/* following line added to match native */
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL |
CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST |
/* was base and is necessary */
WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED |
GetWindowLongW (hwnd, GWL_STYLE),
cs->y, cs->x, cs->cx, cs->cy, hwnd,
(HMENU) GetWindowLongPtrW (hwnd, GWLP_ID),
(HINSTANCE)GetWindowLongPtrW (hwnd, GWLP_HINSTANCE), NULL);
/*
* native does the following at this point according to trace:
* GetWindowThreadProcessId(hwndCombo,0)
* GetCurrentThreadId()
* GetWindowThreadProcessId(hwndCombo, &???)
* GetCurrentProcessId()
*/
SetWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID,
(DWORD_PTR)hwnd);
infoPtr->font = (HFONT)SendMessageW (infoPtr->hwndCombo, WM_GETFONT, 0, 0);
@ -1037,12 +1027,6 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
(HMENU) GetWindowLongPtrW (hwnd, GWLP_ID),
(HINSTANCE)GetWindowLongPtrW (hwnd, GWLP_HINSTANCE), NULL);
/* native does the following at this point according to trace:
* GetWindowThreadProcessId(hwndEdit,0)
* GetCurrentThreadId()
* GetWindowThreadProcessId(hwndEdit, &???)
* GetCurrentProcessId()
*/
SetWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID,
(DWORD_PTR)hwnd);
@ -1090,16 +1074,6 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
COMBOEX_AdjustEditPos (infoPtr);
/*
* Create an item structure to represent the data in the
* EDIT control. It is allocated zero-filled.
*/
infoPtr->edit = Alloc (sizeof (CBE_ITEMDATA));
if (!infoPtr->edit) {
COMBOEX_Destroy(infoPtr);
return -1;
}
return 0;
}
@ -1127,19 +1101,6 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
return SendMessageW (parent, WM_COMMAND, wParam, (LPARAM)infoPtr->hwndSelf);
case CBN_CLOSEUP:
SendMessageW (parent, WM_COMMAND, wParam, (LPARAM)infoPtr->hwndSelf);
/*
* from native trace of first dropdown after typing in URL in IE4
* CB_GETCURSEL(Combo)
* GetWindowText(Edit)
* CB_GETCURSEL(Combo)
* CB_GETCOUNT(Combo)
* CB_GETITEMDATA(Combo, n)
* WM_NOTIFY(parent, CBEN_ENDEDITA|W)
* CB_GETCURSEL(Combo)
* CB_SETCURSEL(COMBOEX, n)
* SetFocus(Combo)
* the rest is supposition
*/
ShowWindow (infoPtr->hwndEdit, SW_SHOW);
InvalidateRect (infoPtr->hwndCombo, 0, TRUE);
if (infoPtr->hwndEdit) InvalidateRect (infoPtr->hwndEdit, 0, TRUE);
@ -1225,17 +1186,6 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
return SendMessageW (parent, WM_COMMAND, wParam, (LPARAM)infoPtr->hwndSelf);
case CBN_KILLFOCUS:
/*
* from native trace:
*
* pass to parent
* WM_GETTEXT(Edit, 104)
* CB_GETCURSEL(Combo) rets -1
* WM_NOTIFY(CBEN_ENDEDITA) with CBENF_KILLFOCUS
* CB_GETCURSEL(Combo)
* InvalidateRect(Combo, 0, 0)
* return 0
*/
SendMessageW (parent, WM_COMMAND, wParam, (LPARAM)infoPtr->hwndSelf);
if (infoPtr->flags & WCBE_ACTEDIT) {
GetWindowTextW (infoPtr->hwndEdit, wintext, 260);
@ -1316,17 +1266,17 @@ static BOOL COMBOEX_WM_DeleteItem (COMBOEX_INFO *infoPtr, DELETEITEMSTRUCT const
}
static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT const *dis)
static LRESULT COMBOEX_DrawItem (COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT const *dis)
{
static const WCHAR nil[] = { 0 };
CBE_ITEMDATA *item = 0;
CBE_ITEMDATA *item = NULL;
SIZE txtsize;
RECT rect;
LPCWSTR str = nil;
UINT xbase, x, y;
INT len;
COLORREF nbkc, ntxc, bkc, txc;
int drawimage, drawstate, xioff;
int drawimage, drawstate, xioff, selected;
TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
dis->CtlType, dis->CtlID);
@ -1378,7 +1328,7 @@ static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT con
/* If draw item is -1 (edit control) setup the item pointer */
if (dis->itemID == 0xffffffff) {
item = infoPtr->edit;
item = &infoPtr->edit;
if (infoPtr->hwndEdit) {
/* free previous text of edit item */
@ -1427,36 +1377,30 @@ static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT con
drawimage = -2;
drawstate = ILD_NORMAL;
selected = infoPtr->selected == dis->itemID;
if (item->mask & CBEIF_IMAGE)
drawimage = item->iImage;
if (item->mask & CBEIF_SELECTEDIMAGE && selected)
drawimage = item->iSelectedImage;
if (dis->itemState & ODS_COMBOEXLBOX) {
/* drawing listbox entry */
if (dis->itemState & ODS_SELECTED) {
if (item->mask & CBEIF_SELECTEDIMAGE)
drawimage = item->iSelectedImage;
if (dis->itemState & ODS_SELECTED)
drawstate = ILD_SELECTED;
}
} else {
/* drawing combo/edit entry */
if (IsWindowVisible(infoPtr->hwndEdit)) {
/* if we have an edit control, the slave the
* selection state to the Edit focus state
*/
if (infoPtr->flags & WCBE_EDITFOCUSED) {
if (item->mask & CBEIF_SELECTEDIMAGE)
drawimage = item->iSelectedImage;
if (infoPtr->flags & WCBE_EDITFOCUSED)
drawstate = ILD_SELECTED;
}
} else {
} else
/* if we don't have an edit control, use
* the requested state.
*/
if (dis->itemState & ODS_SELECTED) {
if (item->mask & CBEIF_SELECTEDIMAGE)
drawimage = item->iSelectedImage;
if (dis->itemState & ODS_SELECTED)
drawstate = ILD_SELECTED;
}
}
}
if (infoPtr->himl && !(infoPtr->dwExtStyle & CBES_EX_NOEDITIMAGEINDENT)) {
@ -1479,17 +1423,17 @@ static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT con
if (drawimage == I_IMAGECALLBACK) {
NMCOMBOBOXEXW nmce;
ZeroMemory(&nmce, sizeof(nmce));
nmce.ceItem.mask = (drawstate == ILD_NORMAL) ? CBEIF_IMAGE : CBEIF_SELECTEDIMAGE;
nmce.ceItem.mask = selected ? CBEIF_SELECTEDIMAGE : CBEIF_IMAGE;
nmce.ceItem.lParam = item->lParam;
nmce.ceItem.iItem = dis->itemID;
COMBOEX_NotifyItem(infoPtr, CBEN_GETDISPINFOW, &nmce);
if (drawstate == ILD_NORMAL) {
if (!selected) {
if (nmce.ceItem.mask & CBEIF_DI_SETITEM) item->iImage = nmce.ceItem.iImage;
drawimage = nmce.ceItem.iImage;
} else if (drawstate == ILD_SELECTED) {
} else {
if (nmce.ceItem.mask & CBEIF_DI_SETITEM) item->iSelectedImage = nmce.ceItem.iSelectedImage;
drawimage = nmce.ceItem.iSelectedImage;
} else ERR("Bad draw state = %d\n", drawstate);
drawimage = nmce.ceItem.iSelectedImage;
}
}
if (overlay == I_IMAGECALLBACK) {
@ -1576,10 +1520,7 @@ static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr)
if (infoPtr->hwndEdit)
RemoveWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
COMBOEX_FreeText (infoPtr->edit);
Free (infoPtr->edit);
infoPtr->edit = 0;
COMBOEX_FreeText (&infoPtr->edit);
COMBOEX_ResetContent (infoPtr);
if (infoPtr->defaultFont)
@ -1666,6 +1607,15 @@ static LRESULT COMBOEX_Size (COMBOEX_INFO *infoPtr, INT width, INT height)
return 0;
}
static LRESULT COMBOEX_SetFont( COMBOEX_INFO *infoPtr, HFONT font, BOOL redraw )
{
infoPtr->font = font;
SendMessageW( infoPtr->hwndCombo, WM_SETFONT, (WPARAM)font, 0 );
if (infoPtr->hwndEdit) SendMessageW( infoPtr->hwndEdit, WM_SETFONT, (WPARAM)font, 0 );
COMBOEX_ReSize( infoPtr );
if (redraw) InvalidateRect( infoPtr->hwndCombo, NULL, TRUE );
return 0;
}
static LRESULT COMBOEX_SetRedraw(const COMBOEX_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
@ -1743,9 +1693,6 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_ERASEBKGND:
/*
* The following was determined by traces of the native
*/
hDC = (HDC) wParam;
obkc = SetBkColor (hDC, comctl32_color.clrWindow);
GetClientRect (hwnd, &rect);
@ -1761,23 +1708,6 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
switch ((INT)wParam)
{
case VK_ESCAPE:
/* native version seems to do following for COMBOEX */
/*
* GetWindowTextW(Edit,&?, 0x104) x
* CB_GETCURSEL to Combo rets -1 x
* WM_NOTIFY to COMBOEX parent (rebar) x
* (CBEN_ENDEDIT{A|W}
* fChanged = FALSE x
* inewSelection = -1 x
* txt="www.hoho" x
* iWhy = 3 x
* CB_GETCURSEL to Combo rets -1 x
* InvalidateRect(Combo, 0) x
* WM_SETTEXT to Edit x
* EM_SETSEL to Edit (0,0) x
* EM_SETSEL to Edit (0,-1) x
* RedrawWindow(Combo, 0, 0, 5) x
*/
TRACE("special code for VK_ESCAPE\n");
GetWindowTextW (infoPtr->hwndEdit, edit_text, 260);
@ -1802,27 +1732,6 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
break;
case VK_RETURN:
/* native version seems to do following for COMBOEX */
/*
* GetWindowTextW(Edit,&?, 0x104) x
* CB_GETCURSEL to Combo rets -1 x
* CB_GETCOUNT to Combo rets 0
* if >0 loop
* CB_GETITEMDATA to match
* *** above 3 lines simulated by FindItem x
* WM_NOTIFY to COMBOEX parent (rebar) x
* (CBEN_ENDEDIT{A|W} x
* fChanged = TRUE (-1) x
* iNewSelection = -1 or selected x
* txt= x
* iWhy = 2 (CBENF_RETURN) x
* CB_GETCURSEL to Combo rets -1 x
* if -1 send CB_SETCURSEL to Combo -1 x
* InvalidateRect(Combo, 0, 0) x
* SetFocus(Edit) x
* CallWindowProc(406615a8, Edit, 0x100, 0xd, 0x1c0001)
*/
TRACE("special code for VK_RETURN\n");
GetWindowTextW (infoPtr->hwndEdit, edit_text, 260);
@ -1850,7 +1759,7 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
if (COMBOEX_NotifyEndEdit (infoPtr, &cbeend, edit_text)) {
/* abort the change, restore previous */
TRACE("Notify requested abort of change\n");
COMBOEX_SetEditText (infoPtr, infoPtr->edit);
COMBOEX_SetEditText (infoPtr, &infoPtr->edit);
RedrawWindow (infoPtr->hwndCombo, 0, 0, RDW_ERASE |
RDW_INVALIDATE);
return 0;
@ -1942,9 +1851,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_ERASEBKGND:
/*
* The following was determined by traces of the native
*/
hDC = (HDC) wParam;
obkc = SetBkColor (hDC, comctl32_color.clrWindow);
GetClientRect (hwnd, &rect);
@ -2013,18 +1919,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return 0;
case EN_KILLFOCUS:
/*
* Native does:
*
* GetFocus() retns AA
* GetWindowTextW(Edit)
* CB_GETCURSEL(Combo) (got -1)
* WM_NOTIFY(CBEN_ENDEDITA) with CBENF_KILLFOCUS
* CB_GETCURSEL(Combo) (got -1)
* InvalidateRect(Combo, 0, 0)
* WM_KILLFOCUS(Combo, AA)
* return 0;
*/
focusedhwnd = GetFocus();
if (infoPtr->flags & WCBE_ACTEDIT) {
GetWindowTextW (infoPtr->hwndEdit, edit_text, 260);
@ -2044,21 +1938,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return 0;
case EN_SETFOCUS: {
/*
* For EN_SETFOCUS this issues the same calls and messages
* as the native seems to do.
*
* for some cases however native does the following:
* (noticed after SetFocus during LBUTTONDOWN on
* on dropdown arrow)
* WM_GETTEXTLENGTH (Edit);
* WM_GETTEXT (Edit, len+1, str);
* EM_SETSEL (Edit, 0, 0);
* WM_GETTEXTLENGTH (Edit);
* WM_GETTEXT (Edit, len+1, str);
* EM_SETSEL (Edit, 0, len);
* WM_NOTIFY (parent, CBEN_BEGINEDIT)
*/
NMHDR hdr;
SendMessageW (infoPtr->hwndEdit, EM_SETSEL, 0, 0);
@ -2070,10 +1949,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
}
case EN_CHANGE: {
/*
* For EN_CHANGE this issues the same calls and messages
* as the native seems to do.
*/
LPCWSTR lastwrk;
cmp_func_t cmptext = get_cmp_func(infoPtr);
@ -2084,7 +1959,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
GetWindowTextW (infoPtr->hwndEdit, edit_text, 260);
if (selected == -1) {
lastwrk = infoPtr->edit->pszText;
lastwrk = infoPtr->edit.pszText;
}
else {
CBE_ITEMDATA *item = COMBOEX_FindItem (infoPtr, selected);
@ -2109,37 +1984,6 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
}
case LBN_SELCHANGE:
/*
* Therefore from traces there is no additional code here
*/
/*
* Using native COMCTL32 gets the following:
* 1 == SHDOCVW.DLL issues call/message
* 2 == COMCTL32.DLL issues call/message
* 3 == WINE issues call/message
*
*
* for LBN_SELCHANGE:
* 1 CB_GETCURSEL(ComboEx)
* 1 CB_GETDROPPEDSTATE(ComboEx)
* 1 CallWindowProc( *2* for WM_COMMAND(LBN_SELCHANGE)
* 2 CallWindowProc( *3* for WM_COMMAND(LBN_SELCHANGE)
** call CBRollUp( xxx, TRUE for LBN_SELCHANGE, TRUE)
* 3 WM_COMMAND(ComboEx, CBN_SELENDOK)
* WM_USER+49(ComboLB, 1,0) <=============!!!!!!!!!!!
* 3 ShowWindow(ComboLB, SW_HIDE)
* 3 RedrawWindow(Combo, RDW_UPDATENOW)
* 3 WM_COMMAND(ComboEX, CBN_CLOSEUP)
** end of CBRollUp
* 3 WM_COMMAND(ComboEx, CBN_SELCHANGE) (echo to parent)
* ? LB_GETCURSEL <==|
* ? LB_GETTEXTLEN |
* ? LB_GETTEXT | Needs to be added to
* ? WM_CTLCOLOREDIT(ComboEx) | Combo processing
* ? LB_GETITEMDATA |
* ? WM_DRAWITEM(ComboEx) <==|
*/
default:
break;
}/* fall through */
@ -2301,6 +2145,12 @@ COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SIZE:
return COMBOEX_Size (infoPtr, LOWORD(lParam), HIWORD(lParam));
case WM_GETFONT:
return (LRESULT)infoPtr->font;
case WM_SETFONT:
return COMBOEX_SetFont( infoPtr, (HFONT)wParam, LOWORD(lParam) != 0 );
case WM_SETREDRAW:
return COMBOEX_SetRedraw(infoPtr, wParam, lParam);

View file

@ -42,9 +42,6 @@
extern HMODULE COMCTL32_hModule DECLSPEC_HIDDEN;
extern HBRUSH COMCTL32_hPattern55AABrush DECLSPEC_HIDDEN;
/* has a value of: 0, CCS_TOP, CCS_NOMOVEY, CCS_BOTTOM */
#define CCS_LAYOUT_MASK 0x3
/* Property sheet / Wizard */
#define IDD_PROPSHEET 1006
#define IDD_WIZARD 1020
@ -80,23 +77,6 @@ extern HBRUSH COMCTL32_hPattern55AABrush DECLSPEC_HIDDEN;
#define IDB_HIST_SMALL 130
#define IDB_HIST_LARGE 131
/* Month calendar month menu popup */
#define IDD_MCMONTHMENU 300
#define IDM_JAN 301
#define IDM_FEB 302
#define IDM_MAR 303
#define IDM_APR 304
#define IDM_MAY 305
#define IDM_JUN 306
#define IDM_JUL 307
#define IDM_AUG 308
#define IDM_SEP 309
#define IDM_OCT 310
#define IDM_NOV 311
#define IDM_DEC 312
#define IDM_TODAY 4163
#define IDM_GOTODAY 4164

View file

@ -61,6 +61,7 @@
340 stdcall -ordinal DPA_CreateEx(long long)
341 stdcall -noname SendNotify(long long long ptr)
342 stdcall -noname SendNotifyEx(long long long ptr long)
345 stdcall -ordinal TaskDialogIndirect(ptr ptr ptr ptr)
350 stdcall -noname StrChrA(str str)
351 stdcall -noname StrRChrA(str str long)
352 stdcall -noname StrCmpNA(str str long)
@ -189,6 +190,5 @@
@ stdcall PropertySheetA(ptr)
@ stdcall PropertySheetW(ptr)
@ stdcall RegisterClassNameW(wstr)
@ stdcall TaskDialogIndirect(ptr ptr ptr ptr)
@ stdcall UninitializeFlatSB(long)
@ stdcall _TrackMouseEvent(ptr)

View file

@ -235,7 +235,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
break;
case DLL_PROCESS_DETACH:
/* clean up subclassing */
if (lpvReserved) break;
/* clean up subclassing */
THEMING_Uninitialize();
/* unregister all common control classes */
@ -263,14 +264,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
/* delete local pattern brush */
DeleteObject (COMCTL32_hPattern55AABrush);
COMCTL32_hPattern55AABrush = NULL;
DeleteObject (COMCTL32_hPattern55AABitmap);
COMCTL32_hPattern55AABitmap = NULL;
/* delete global subclassing atom */
GlobalDeleteAtom (LOWORD(COMCTL32_wSubclass));
TRACE("Subclassing atom deleted: %p\n", COMCTL32_wSubclass);
COMCTL32_wSubclass = NULL;
break;
}
@ -1013,7 +1011,7 @@ HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
ERR("create_manifest failed!\n");
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}

View file

@ -293,6 +293,41 @@ static void HEADER_GetHotDividerRect(const HEADER_INFO *infoPtr, RECT *r)
}
}
static void
HEADER_FillItemFrame(HEADER_INFO *infoPtr, HDC hdc, RECT *r, const HEADER_ITEM *item, BOOL hottrack)
{
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
if (theme) {
int state = (item->bDown) ? HIS_PRESSED : (hottrack ? HIS_HOT : HIS_NORMAL);
DrawThemeBackground (theme, hdc, HP_HEADERITEM, state, r, NULL);
GetThemeBackgroundContentRect (theme, hdc, HP_HEADERITEM, state, r, r);
}
else
{
HBRUSH hbr = CreateSolidBrush(GetBkColor(hdc));
FillRect(hdc, r, hbr);
DeleteObject(hbr);
}
}
static void
HEADER_DrawItemFrame(HEADER_INFO *infoPtr, HDC hdc, RECT *r, const HEADER_ITEM *item)
{
if (GetWindowTheme(infoPtr->hwndSelf)) return;
if (!(infoPtr->dwStyle & HDS_FLAT))
{
if (infoPtr->dwStyle & HDS_BUTTONS) {
if (item->bDown)
DrawEdge (hdc, r, BDR_RAISEDOUTER, BF_RECT | BF_FLAT | BF_ADJUST);
else
DrawEdge (hdc, r, EDGE_RAISED, BF_RECT | BF_SOFT | BF_ADJUST);
}
else
DrawEdge (hdc, r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
}
}
static INT
HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESULT lCDFlags)
@ -329,43 +364,13 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU
return phdi->rect.right;
}
if (theme != NULL) {
int state = (phdi->bDown) ? HIS_PRESSED :
(bHotTrack ? HIS_HOT : HIS_NORMAL);
DrawThemeBackground (theme, hdc, HP_HEADERITEM, state,
&r, NULL);
GetThemeBackgroundContentRect (theme, hdc, HP_HEADERITEM, state,
&r, &r);
}
else {
HBRUSH hbr;
/* Fill background, owner could draw over it. */
HEADER_FillItemFrame(infoPtr, hdc, &r, phdi, bHotTrack);
if (!(infoPtr->dwStyle & HDS_FLAT))
{
if (infoPtr->dwStyle & HDS_BUTTONS) {
if (phdi->bDown) {
DrawEdge (hdc, &r, BDR_RAISEDOUTER,
BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
}
else
DrawEdge (hdc, &r, EDGE_RAISED,
BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
}
else
DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
}
hbr = CreateSolidBrush(GetBkColor(hdc));
FillRect(hdc, &r, hbr);
DeleteObject(hbr);
}
if (phdi->bDown) {
r.left += 2;
r.top += 2;
}
if (phdi->fmt & HDF_OWNERDRAW) {
if (phdi->fmt & HDF_OWNERDRAW)
{
DRAWITEMSTRUCT dis;
BOOL ret;
dis.CtlType = ODT_HEADER;
dis.CtlID = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID);
@ -377,11 +382,32 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU
dis.rcItem = phdi->rect;
dis.itemData = phdi->lParam;
oldBkMode = SetBkMode(hdc, TRANSPARENT);
SendMessageW (infoPtr->hwndNotify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
ret = SendMessageW (infoPtr->hwndNotify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
if (oldBkMode != TRANSPARENT)
SetBkMode(hdc, oldBkMode);
if (!ret)
HEADER_FillItemFrame(infoPtr, hdc, &r, phdi, bHotTrack);
/* Edges are always drawn if we don't have attached theme. */
HEADER_DrawItemFrame(infoPtr, hdc, &r, phdi);
/* If application processed WM_DRAWITEM we should skip label painting,
edges are drawn no matter what. */
if (ret) return phdi->rect.right;
}
else {
else
{
HEADER_FillItemFrame(infoPtr, hdc, &r, phdi, bHotTrack);
HEADER_DrawItemFrame(infoPtr, hdc, &r, phdi);
}
if (phdi->bDown) {
r.left += 2;
r.top += 2;
}
/* Now text and image */
{
UINT rw, rh, /* width and height of r */
*x = NULL, *w = NULL; /* x and width of the pic (bmp or img) which is part of cnt */
/* cnt,txt,img,bmp */
@ -499,7 +525,7 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU
SetBkMode(hdc, oldBkMode);
}
HEADER_FreeCallbackItems(phdi);
}/*Ownerdrawn*/
}
return phdi->rect.right;
}

View file

@ -132,13 +132,6 @@
*
* Functions:
* -- LVGroupComparE
*
* Known differences in message stream from native control (not known if
* these differences cause problems):
* LVM_INSERTITEM issues LVM_SETITEMSTATE and LVM_SETITEM in certain cases.
* LVM_SETITEM does not always issue LVN_ITEMCHANGING/LVN_ITEMCHANGED.
* WM_CREATE does not issue WM_QUERYUISTATE and associated registry
* processing for "USEDOUBLECLICKTIME".
*/
#include <config.h>
@ -6284,6 +6277,7 @@ again:
{
lvItem.iItem = nItem;
lvItem.iSubItem = 0;
lvItem.pszText = szDispText;
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) continue;
if (lvItem.mask & LVIF_PARAM)
@ -7923,17 +7917,6 @@ static BOOL LISTVIEW_RedrawItems(const LISTVIEW_INFO *infoPtr, INT nFirst, INT n
* nearest number of pixels that are a whole line. Ex: if line height
* is 16 and an 8 is passed, the list will be scrolled by 16. If a 7
* is passed, then the scroll will be 0. (per MSDN 7/2002)
*
* For: (per experimentation with native control and CSpy ListView)
* LV_VIEW_ICON scrolling in any direction is allowed
* LV_VIEW_SMALLICON scrolling in any direction is allowed
* LV_VIEW_LIST dx=1 = 1 column (horizontal only)
* but will only scroll 1 column per message
* no matter what the value.
* dy must be 0 or FALSE returned.
* LV_VIEW_DETAILS dx=1 = 1 pixel
* dy= see above
*
*/
static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy)
{

View file

@ -123,7 +123,6 @@ typedef struct
int width_increment;
INT delta; /* scroll rate; # of months that the */
/* control moves when user clicks a scroll button */
int visible; /* # of months visible */
int firstDay; /* Start month calendar with firstDay's day,
stored in SYSTEMTIME format */
BOOL firstDaySet; /* first week day differs from locale defined */
@ -1302,8 +1301,8 @@ MONTHCAL_GetMonthDelta(const MONTHCAL_INFO *infoPtr)
if(infoPtr->delta)
return infoPtr->delta;
else
return infoPtr->visible;
return MONTHCAL_GetMonthRange(infoPtr, GMR_VISIBLE, NULL);
}

View file

@ -544,7 +544,7 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
case WM_CREATE:
{
DWORD dwExStyle = GetWindowLongW (hwnd, GWL_EXSTYLE);
theme = OpenThemeData (hwnd, themeClass);
dwExStyle &= ~(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE);
@ -690,17 +690,25 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
return infoPtr->CurVal;
case PBM_SETBARCOLOR:
{
COLORREF clr = infoPtr->ColorBar;
infoPtr->ColorBar = (COLORREF)lParam;
InvalidateRect(hwnd, NULL, TRUE);
return 0;
return clr;
}
case PBM_GETBARCOLOR:
return infoPtr->ColorBar;
case PBM_SETBKCOLOR:
{
COLORREF clr = infoPtr->ColorBk;
infoPtr->ColorBk = (COLORREF)lParam;
InvalidateRect(hwnd, NULL, TRUE);
return 0;
return clr;
}
case PBM_GETBKCOLOR:
return infoPtr->ColorBk;

View file

@ -46,11 +46,11 @@
* - RB_SETTOOLTIPS
* - WM_CHARTOITEM
* - WM_LBUTTONDBLCLK
* - WM_MEASUREITEM
* - WM_PALETTECHANGED
* - WM_QUERYNEWPALETTE
* - WM_RBUTTONDOWN
* - WM_RBUTTONUP
* - WM_SYSCOLORCHANGE
* - WM_VKEYTOITEM
* - WM_WININICHANGE
* Notifications:
@ -137,6 +137,9 @@ typedef struct
HWND hwndPrevParent;
} REBAR_BAND;
/* has a value of: 0, CCS_TOP, CCS_NOMOVEY, CCS_BOTTOM */
#define CCS_LAYOUT_MASK 0x3
/* fStatus flags */
#define HAS_GRIPPER 0x00000001
#define HAS_IMAGE 0x00000002
@ -1049,14 +1052,6 @@ REBAR_MoveChildWindows (const REBAR_INFO *infoPtr, UINT start, UINT endplus)
lpBand->rcChild = rbcz.rcChild; /* *** ??? */
}
/* native (IE4 in "Favorites" frame **1) does:
* SetRect (&rc, -1, -1, -1, -1)
* EqualRect (&rc,band->rc???)
* if ret==0
* CopyRect (band->rc????, &rc)
* set flag outside of loop
*/
GetClassNameW (lpBand->hwndChild, szClassName, sizeof(szClassName)/sizeof(szClassName[0]));
if (!lstrcmpW (szClassName, strComboBox) ||
!lstrcmpW (szClassName, WC_COMBOBOXEXW)) {
@ -1108,15 +1103,6 @@ REBAR_MoveChildWindows (const REBAR_INFO *infoPtr, UINT start, UINT endplus)
if (infoPtr->DoRedraw)
UpdateWindow (infoPtr->hwndSelf);
/* native (from **1 above) does:
* UpdateWindow(rebar)
* REBAR_ForceResize
* RBN_HEIGHTCHANGE if necessary
* if ret from any EqualRect was 0
* Goto "BeginDeferWindowPos"
*/
}
/* Returns the next visible band (the first visible band in [i+1; infoPtr->uNumBands) )
@ -3317,29 +3303,6 @@ REBAR_NCCreate (HWND hwnd, const CREATESTRUCTW *cs)
infoPtr->hFont = infoPtr->hDefaultFont = tfont;
}
/* native does:
GetSysColor (numerous);
GetSysColorBrush (numerous) (see WM_SYSCOLORCHANGE);
*GetStockObject (SYSTEM_FONT);
*SetWindowLong (hwnd, 0, info ptr);
*WM_NOTIFYFORMAT;
*SetWindowLong (hwnd, GWL_STYLE, style+0x10000001);
WS_VISIBLE = 0x10000000;
CCS_TOP = 0x00000001;
*SystemParametersInfo (SPI_GETNONCLIENTMETRICS...);
*CreateFontIndirect (lfCaptionFont from above);
GetDC ();
SelectObject (hdc, fontabove);
GetTextMetrics (hdc, ); guessing is tmHeight
SelectObject (hdc, oldfont);
ReleaseDC ();
GetWindowRect ();
MapWindowPoints (0, parent, rectabove, 2);
GetWindowRect ();
GetClientRect ();
ClientToScreen (clientrect);
SetWindowPos (hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER);
*/
return TRUE;
}
@ -3725,6 +3688,7 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_COMMAND:
case WM_DRAWITEM:
case WM_NOTIFY:
case WM_MEASUREITEM:
return SendMessageW(REBAR_GetNotifyParent (infoPtr), uMsg, wParam, lParam);
@ -3750,8 +3714,6 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_LBUTTONUP:
return REBAR_LButtonUp (infoPtr);
/* case WM_MEASUREITEM: supported according to ControlSpy */
case WM_MOUSEMOVE:
return REBAR_MouseMove (infoPtr, lParam);

View file

@ -1023,37 +1023,18 @@ static void TAB_SetupScrolling(
/*
* Calculate the position of the scroll control.
*/
if(infoPtr->dwStyle & TCS_VERTICAL)
{
controlPos.right = clientRect->right;
controlPos.left = controlPos.right - 2 * GetSystemMetrics(SM_CXHSCROLL);
controlPos.right = clientRect->right;
controlPos.left = controlPos.right - 2 * GetSystemMetrics(SM_CXHSCROLL);
if (infoPtr->dwStyle & TCS_BOTTOM)
{
controlPos.top = clientRect->bottom - infoPtr->tabHeight;
controlPos.bottom = controlPos.top + GetSystemMetrics(SM_CYHSCROLL);
}
else
{
controlPos.bottom = clientRect->top + infoPtr->tabHeight;
controlPos.top = controlPos.bottom - GetSystemMetrics(SM_CYHSCROLL);
}
if (infoPtr->dwStyle & TCS_BOTTOM)
{
controlPos.top = clientRect->bottom - infoPtr->tabHeight;
controlPos.bottom = controlPos.top + GetSystemMetrics(SM_CYHSCROLL);
}
else
{
controlPos.right = clientRect->right;
controlPos.left = controlPos.right - 2 * GetSystemMetrics(SM_CXHSCROLL);
if (infoPtr->dwStyle & TCS_BOTTOM)
{
controlPos.top = clientRect->bottom - infoPtr->tabHeight;
controlPos.bottom = controlPos.top + GetSystemMetrics(SM_CYHSCROLL);
}
else
{
controlPos.bottom = clientRect->top + infoPtr->tabHeight;
controlPos.top = controlPos.bottom - GetSystemMetrics(SM_CYHSCROLL);
}
controlPos.bottom = clientRect->top + infoPtr->tabHeight;
controlPos.top = controlPos.bottom - GetSystemMetrics(SM_CYHSCROLL);
}
/*
@ -1917,9 +1898,8 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
/* Draw the text */
if(infoPtr->dwStyle & TCS_VERTICAL) /* if we are vertical rotate the text and each character */
{
static const WCHAR ArialW[] = { 'A','r','i','a','l',0 };
LOGFONTW logfont;
HFONT hFont = 0;
HFONT hFont;
INT nEscapement = 900;
INT nOrientation = 900;
@ -1930,21 +1910,9 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
}
/* to get a font with the escapement and orientation we are looking for, we need to */
/* call CreateFontIndirectA, which requires us to set the values of the logfont we pass in */
if (!GetObjectW((infoPtr->hFont) ?
infoPtr->hFont : GetStockObject(SYSTEM_FONT),
sizeof(LOGFONTW),&logfont))
{
INT iPointSize = 9;
lstrcpyW(logfont.lfFaceName, ArialW);
logfont.lfHeight = -MulDiv(iPointSize, GetDeviceCaps(hdc, LOGPIXELSY),
72);
logfont.lfWeight = FW_NORMAL;
logfont.lfItalic = 0;
logfont.lfUnderline = 0;
logfont.lfStrikeOut = 0;
}
/* call CreateFontIndirect, which requires us to set the values of the logfont we pass in */
if (!GetObjectW(infoPtr->hFont, sizeof(logfont), &logfont))
GetObjectW(GetStockObject(DEFAULT_GUI_FONT), sizeof(logfont), &logfont);
logfont.lfEscapement = nEscapement;
logfont.lfOrientation = nOrientation;

View file

@ -945,11 +945,6 @@ TOOLBAR_DrawButton (const TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc,
tbcd.clrHighlightHotTrack = 0;
tbcd.nStringBkMode = TRANSPARENT;
tbcd.nHLStringBkMode = OPAQUE;
/* MSDN says that this is the text rectangle.
* But (why always a but) tracing of v5.7 of native shows
* that this is really a *relative* rectangle based on the
* the nmcd.rc. Also the left and top are always 0 ignoring
* any bitmap that might be present. */
tbcd.rcText.left = 0;
tbcd.rcText.top = 0;
tbcd.rcText.right = rcText.right - rc.left;
@ -5118,7 +5113,6 @@ TOOLBAR_GetIdealSize (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
switch(wParam) {
case 0:
if (lpsize->cx == -1) {
/* **** this is wrong, native measures each button and sets it */
lpsize->cx = infoPtr->rcBound.right - infoPtr->rcBound.left;
}
else if(HIWORD(lpsize->cx)) {
@ -5481,8 +5475,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
btnPtr->bDropDownPressed = FALSE;
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
/* find and set hot item
* NOTE: native doesn't do this, but that is a bug */
/* find and set hot item */
GetCursorPos(&pt);
ScreenToClient(infoPtr->hwndSelf, &pt);
nHit = TOOLBAR_InternalHitTest(infoPtr, &pt, &button);
@ -5663,9 +5656,6 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
TOOLBAR_SendNotify (&hdr, infoPtr,
NM_RELEASEDCAPTURE);
/* native issues TBN_ENDDRAG here, if _LBUTTONDOWN issued the
* TBN_BEGINDRAG
*/
memset(&nmtb, 0, sizeof(nmtb));
nmtb.iItem = btnPtr->idCommand;
TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr,
@ -5957,39 +5947,6 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
SetWindowLongPtrW (hwnd, GWLP_HINSTANCE, (LONG_PTR)hInst);
}
/* native control does:
* Get a lot of colors and brushes
* WM_NOTIFYFORMAT
* SystemParametersInfoW(0x1f, 0x3c, adr1, 0)
* CreateFontIndirectW(adr1)
* CreateBitmap(0x27, 0x24, 1, 1, 0)
* hdc = GetDC(toolbar)
* GetSystemMetrics(0x48)
* fnt2=CreateFontW(0xe, 0, 0, 0, 0x190, 0, 0, 0, 0, 2,
* 0, 0, 0, 0, "MARLETT")
* oldfnt = SelectObject(hdc, fnt2)
* GetCharWidthW(hdc, 0x36, 0x36, adr2)
* GetTextMetricsW(hdc, adr3)
* SelectObject(hdc, oldfnt)
* DeleteObject(fnt2)
* ReleaseDC(hdc)
* InvalidateRect(toolbar, 0, 1)
* SetWindowLongW(toolbar, 0, addr)
* SetWindowLongW(toolbar, -16, xxx) **sometimes**
* WM_STYLECHANGING
* CallWinEx old new
* ie 1 0x56000a4c 0x46000a4c 0x56008a4d
* ie 2 0x4600094c 0x4600094c 0x4600894d
* ie 3 0x56000b4c 0x46000b4c 0x56008b4d
* rebar 0x50008844 0x40008844 0x50008845
* pager 0x50000844 0x40000844 0x50008845
* IC35mgr 0x5400084e **nochange**
* on entry to _NCCREATE 0x5400084e
* rowlist 0x5400004e **nochange**
* on entry to _NCCREATE 0x5400004e
*
*/
/* I think the code below is a bug, but it is the way that the native
* controls seem to work. The effect is that if the user of TBSTYLE_FLAT
* forgets to specify TBSTYLE_TRANSPARENT but does specify either

View file

@ -499,12 +499,12 @@ TRACKBAR_DrawOneTic (const TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos, int fla
offsetthumb = (infoPtr->rcThumb.bottom - infoPtr->rcThumb.top)/2;
rcTics.left = infoPtr->rcThumb.left - 2;
rcTics.right = infoPtr->rcThumb.right + 2;
rcTics.top = infoPtr->rcChannel.top + offsetthumb + 1;
rcTics.bottom = infoPtr->rcChannel.bottom - offsetthumb;
rcTics.top = infoPtr->rcChannel.top + offsetthumb;
rcTics.bottom = infoPtr->rcChannel.bottom - offsetthumb - 1;
} else {
offsetthumb = (infoPtr->rcThumb.right - infoPtr->rcThumb.left)/2;
rcTics.left = infoPtr->rcChannel.left + offsetthumb + 1;
rcTics.right = infoPtr->rcChannel.right - offsetthumb;
rcTics.left = infoPtr->rcChannel.left + offsetthumb;
rcTics.right = infoPtr->rcChannel.right - offsetthumb - 1;
rcTics.top = infoPtr->rcThumb.top - 2;
rcTics.bottom = infoPtr->rcThumb.bottom + 2;
}
@ -612,19 +612,105 @@ TRACKBAR_DrawTics (const TRACKBAR_INFO *infoPtr, HDC hdc)
}
}
static void
TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc)
#define POINT_COUNT 6
static int
TRACKBAR_FillThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, HBRUSH hbrush)
{
HBRUSH oldbr;
HPEN oldpen;
RECT thumb = infoPtr->rcThumb;
int BlackUntil = 3;
int PointCount = 6;
const RECT *thumb = &infoPtr->rcThumb;
POINT points[6];
int fillClr;
int PointDepth;
HBRUSH oldbr;
if (infoPtr->dwStyle & TBS_BOTH)
{
FillRect(hdc, thumb, hbrush);
return 0;
}
if (infoPtr->dwStyle & TBS_VERT)
{
PointDepth = (thumb->bottom - thumb->top) / 2;
if (infoPtr->dwStyle & TBS_LEFT)
{
points[0].x = thumb->right-1;
points[0].y = thumb->top;
points[1].x = thumb->right-1;
points[1].y = thumb->bottom-1;
points[2].x = thumb->left + PointDepth;
points[2].y = thumb->bottom-1;
points[3].x = thumb->left;
points[3].y = thumb->top + PointDepth;
points[4].x = thumb->left + PointDepth;
points[4].y = thumb->top;
points[5].x = points[0].x;
points[5].y = points[0].y;
}
else
{
points[0].x = thumb->right;
points[0].y = thumb->top + PointDepth;
points[1].x = thumb->right - PointDepth;
points[1].y = thumb->bottom-1;
points[2].x = thumb->left;
points[2].y = thumb->bottom-1;
points[3].x = thumb->left;
points[3].y = thumb->top;
points[4].x = thumb->right - PointDepth;
points[4].y = thumb->top;
points[5].x = points[0].x;
points[5].y = points[0].y;
}
}
else
{
PointDepth = (thumb->right - thumb->left) / 2;
if (infoPtr->dwStyle & TBS_TOP)
{
points[0].x = thumb->left + PointDepth;
points[0].y = thumb->top+1;
points[1].x = thumb->right-1;
points[1].y = thumb->top + PointDepth + 1;
points[2].x = thumb->right-1;
points[2].y = thumb->bottom-1;
points[3].x = thumb->left;
points[3].y = thumb->bottom-1;
points[4].x = thumb->left;
points[4].y = thumb->top + PointDepth + 1;
points[5].x = points[0].x;
points[5].y = points[0].y;
}
else
{
points[0].x = thumb->right-1;
points[0].y = thumb->top;
points[1].x = thumb->right-1;
points[1].y = thumb->bottom - PointDepth - 1;
points[2].x = thumb->left + PointDepth;
points[2].y = thumb->bottom-1;
points[3].x = thumb->left;
points[3].y = thumb->bottom - PointDepth - 1;
points[4].x = thumb->left;
points[4].y = thumb->top;
points[5].x = points[0].x;
points[5].y = points[0].y;
}
}
oldbr = SelectObject(hdc, hbrush);
SetPolyFillMode(hdc, WINDING);
Polygon(hdc, points, sizeof(points) / sizeof(points[0]));
SelectObject(hdc, oldbr);
return PointDepth;
}
static void
TRACKBAR_DrawThumb (TRACKBAR_INFO *infoPtr, HDC hdc)
{
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
int PointDepth;
HBRUSH brush;
if (theme)
{
int partId;
@ -645,113 +731,115 @@ TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc)
else
stateId = TUS_NORMAL;
DrawThemeBackground (theme, hdc, partId, stateId, &thumb, 0);
DrawThemeBackground (theme, hdc, partId, stateId, &infoPtr->rcThumb, NULL);
return;
}
fillClr = infoPtr->flags & TB_DRAG_MODE ? COLOR_BTNHILIGHT : COLOR_BTNFACE;
oldbr = SelectObject (hdc, GetSysColorBrush(fillClr));
SetPolyFillMode (hdc, WINDING);
if (infoPtr->dwStyle & WS_DISABLED || infoPtr->flags & TB_DRAG_MODE)
{
if (comctl32_color.clr3dHilight == comctl32_color.clrWindow)
brush = COMCTL32_hPattern55AABrush;
else
brush = GetSysColorBrush(COLOR_SCROLLBAR);
SetTextColor(hdc, comctl32_color.clr3dFace);
SetBkColor(hdc, comctl32_color.clr3dHilight);
}
else
brush = GetSysColorBrush(COLOR_BTNFACE);
PointDepth = TRACKBAR_FillThumb(infoPtr, hdc, brush);
if (infoPtr->dwStyle & TBS_BOTH)
{
points[0].x=thumb.right;
points[0].y=thumb.top;
points[1].x=thumb.right;
points[1].y=thumb.bottom;
points[2].x=thumb.left;
points[2].y=thumb.bottom;
points[3].x=thumb.left;
points[3].y=thumb.top;
points[4].x=points[0].x;
points[4].y=points[0].y;
PointCount = 5;
BlackUntil = 3;
DrawEdge(hdc, &infoPtr->rcThumb, EDGE_RAISED, BF_RECT | BF_SOFT);
return;
}
else
{
RECT thumb = infoPtr->rcThumb;
if (infoPtr->dwStyle & TBS_VERT)
{
PointDepth = (thumb.bottom - thumb.top) / 2;
if (infoPtr->dwStyle & TBS_LEFT)
{
points[0].x=thumb.right;
points[0].y=thumb.top;
points[1].x=thumb.right;
points[1].y=thumb.bottom;
points[2].x=thumb.left + PointDepth;
points[2].y=thumb.bottom;
points[3].x=thumb.left;
points[3].y=(thumb.bottom - thumb.top) / 2 + thumb.top + 1;
points[4].x=thumb.left + PointDepth;
points[4].y=thumb.top;
points[5].x=points[0].x;
points[5].y=points[0].y;
BlackUntil = 4;
/* rectangular part */
thumb.left += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_TOP | BF_RIGHT | BF_BOTTOM | BF_SOFT);
/* light edge */
thumb.left -= PointDepth;
thumb.right = thumb.left + PointDepth;
thumb.bottom = infoPtr->rcThumb.top + PointDepth + 1;
thumb.top = infoPtr->rcThumb.top;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDTOPRIGHT | BF_SOFT);
/* shadowed edge */
thumb.top += PointDepth;
thumb.bottom += PointDepth;
DrawEdge(hdc, &thumb, EDGE_SUNKEN, BF_DIAGONAL_ENDTOPLEFT | BF_SOFT);
return;
}
else
{
points[0].x=thumb.right;
points[0].y=(thumb.bottom - thumb.top) / 2 + thumb.top + 1;
points[1].x=thumb.right - PointDepth;
points[1].y=thumb.bottom;
points[2].x=thumb.left;
points[2].y=thumb.bottom;
points[3].x=thumb.left;
points[3].y=thumb.top;
points[4].x=thumb.right - PointDepth;
points[4].y=thumb.top;
points[5].x=points[0].x;
points[5].y=points[0].y;
/* rectangular part */
thumb.right -= PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_TOP | BF_LEFT | BF_BOTTOM | BF_SOFT);
/* light edge */
thumb.left = thumb.right;
thumb.right += PointDepth + 1;
thumb.bottom = infoPtr->rcThumb.top + PointDepth + 1;
thumb.top = infoPtr->rcThumb.top;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDTOPLEFT | BF_SOFT);
/* shadowed edge */
thumb.top += PointDepth;
thumb.bottom += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDBOTTOMLEFT | BF_SOFT);
}
}
else
{
PointDepth = (thumb.right - thumb.left) / 2;
if (infoPtr->dwStyle & TBS_TOP)
{
points[0].x=(thumb.right - thumb.left) / 2 + thumb.left + 1;
points[0].y=thumb.top;
points[1].x=thumb.right;
points[1].y=thumb.top + PointDepth;
points[2].x=thumb.right;
points[2].y=thumb.bottom;
points[3].x=thumb.left;
points[3].y=thumb.bottom;
points[4].x=thumb.left;
points[4].y=thumb.top + PointDepth;
points[5].x=points[0].x;
points[5].y=points[0].y;
BlackUntil = 4;
/* rectangular part */
thumb.top += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_LEFT | BF_BOTTOM | BF_RIGHT | BF_SOFT);
/* light edge */
thumb.left = infoPtr->rcThumb.left;
thumb.right = thumb.left + PointDepth;
thumb.bottom = infoPtr->rcThumb.top + PointDepth + 1;
thumb.top -= PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDTOPRIGHT | BF_SOFT);
/* shadowed edge */
thumb.left += PointDepth;
thumb.right += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDBOTTOMRIGHT | BF_SOFT);
}
else
{
points[0].x=thumb.right;
points[0].y=thumb.top;
points[1].x=thumb.right;
points[1].y=thumb.bottom - PointDepth;
points[2].x=(thumb.right - thumb.left) / 2 + thumb.left + 1;
points[2].y=thumb.bottom;
points[3].x=thumb.left;
points[3].y=thumb.bottom - PointDepth;
points[4].x=thumb.left;
points[4].y=thumb.top;
points[5].x=points[0].x;
points[5].y=points[0].y;
/* rectangular part */
thumb.bottom -= PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_LEFT | BF_TOP | BF_RIGHT | BF_SOFT);
/* light edge */
thumb.left = infoPtr->rcThumb.left;
thumb.right = thumb.left + PointDepth;
thumb.top = infoPtr->rcThumb.bottom - PointDepth - 1;
thumb.bottom += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDTOPLEFT | BF_SOFT);
/* shadowed edge */
thumb.left += PointDepth;
thumb.right += PointDepth;
DrawEdge(hdc, &thumb, EDGE_RAISED, BF_DIAGONAL_ENDBOTTOMLEFT | BF_SOFT);
}
}
}
/* Draw the thumb now */
Polygon (hdc, points, PointCount);
oldpen = SelectObject(hdc, GetStockObject(BLACK_PEN));
Polyline(hdc,points, BlackUntil);
SelectObject(hdc, GetStockObject(WHITE_PEN));
Polyline(hdc, &points[BlackUntil-1], PointCount+1-BlackUntil);
SelectObject(hdc, oldpen);
SelectObject(hdc, oldbr);
}
@ -1295,9 +1383,11 @@ static inline LRESULT
TRACKBAR_SetThumbLength (TRACKBAR_INFO *infoPtr, UINT iLength)
{
if (infoPtr->dwStyle & TBS_FIXEDLENGTH) {
/* We're not supposed to check if it's really changed or not,
just repaint in any case. */
infoPtr->uThumbLen = iLength;
infoPtr->flags |= TB_THUMBSIZECHANGED;
InvalidateRect (infoPtr->hwndSelf, &infoPtr->rcThumb, FALSE);
TRACKBAR_InvalidateAll(infoPtr);
}
return 0;
@ -1571,9 +1661,15 @@ TRACKBAR_SetFocus (TRACKBAR_INFO *infoPtr)
static LRESULT
TRACKBAR_Size (TRACKBAR_INFO *infoPtr)
{
TRACKBAR_CalcChannel (infoPtr);
TRACKBAR_UpdateThumb (infoPtr);
if (infoPtr->dwStyle & TBS_FIXEDLENGTH)
{
TRACKBAR_CalcChannel(infoPtr);
TRACKBAR_UpdateThumb(infoPtr);
}
else
TRACKBAR_InitializeThumb(infoPtr);
TRACKBAR_AlignBuddies (infoPtr);
TRACKBAR_InvalidateAll(infoPtr);
return 0;
}
@ -1747,6 +1843,19 @@ TRACKBAR_KeyUp (const TRACKBAR_INFO *infoPtr, INT nVirtKey)
}
static LRESULT
TRACKBAR_Enable (TRACKBAR_INFO *infoPtr, BOOL enable)
{
if (enable)
infoPtr->dwStyle &= ~WS_DISABLED;
else
infoPtr->dwStyle |= WS_DISABLED;
InvalidateRect(infoPtr->hwndSelf, &infoPtr->rcThumb, TRUE);
return 1;
}
static LRESULT WINAPI
TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@ -1874,7 +1983,8 @@ TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_DESTROY:
return TRACKBAR_Destroy (infoPtr);
/* case WM_ENABLE: */
case WM_ENABLE:
return TRACKBAR_Enable (infoPtr, (BOOL)wParam);
case WM_ERASEBKGND:
return 0;

View file

@ -2526,7 +2526,7 @@ TREEVIEW_DrawItem(const TREEVIEW_INFO *infoPtr, HDC hdc, TREEVIEW_ITEM *item)
* - Otherwise - use background color
*/
if ((item->state & TVIS_DROPHILITED) || ((item == infoPtr->focusedItem) && !(item->state & TVIS_SELECTED)) ||
((item->state & TVIS_SELECTED) && (!infoPtr->focusedItem) &&
((item->state & TVIS_SELECTED) && (!infoPtr->focusedItem || item == infoPtr->focusedItem) &&
(inFocus || (infoPtr->dwStyle & TVS_SHOWSELALWAYS))))
{
if ((item->state & TVIS_DROPHILITED) || inFocus)
@ -3301,6 +3301,8 @@ TREEVIEW_Collapse(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
TREEVIEW_RemoveAllChildren(infoPtr, item);
item->cChildren = old_cChildren;
}
if (!wasExpanded)
return FALSE;
if (item->firstChild)
{

View file

@ -59,7 +59,7 @@ reactos/dll/win32/browseui # Out of sync
reactos/dll/win32/cabinet # Synced to Wine-1.5.26
reactos/dll/win32/clusapi # Synced to Wine-1.7.1
reactos/dll/win32/comcat # Synced to Wine-1.7.1
reactos/dll/win32/comctl32 # Synced to Wine 1.5.26
reactos/dll/win32/comctl32 # Synced to Wine 1.7.1
reactos/dll/win32/comdlg32 # Synced to Wine 1.3.37
reactos/dll/win32/compstui # Synced to Wine-1.5.19
reactos/dll/win32/credui # Synced to Wine-1.5.4