mirror of
https://github.com/reactos/reactos.git
synced 2024-07-02 02:34:53 +00:00
[COMCTL32] Sync with Wine Staging 3.3. CORE-14434
This commit is contained in:
parent
aba6ce5b84
commit
b3fb8555bf
|
@ -13,6 +13,7 @@ spec2def(comctl32.dll comctl32.spec ADD_IMPORTLIB)
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
animate.c
|
animate.c
|
||||||
button.c
|
button.c
|
||||||
|
combo.c
|
||||||
comboex.c
|
comboex.c
|
||||||
comctl32undoc.c
|
comctl32undoc.c
|
||||||
commctrl.c
|
commctrl.c
|
||||||
|
@ -20,11 +21,13 @@ list(APPEND SOURCE
|
||||||
dpa.c
|
dpa.c
|
||||||
draglist.c
|
draglist.c
|
||||||
dsa.c
|
dsa.c
|
||||||
|
edit.c
|
||||||
flatsb.c
|
flatsb.c
|
||||||
header.c
|
header.c
|
||||||
hotkey.c
|
hotkey.c
|
||||||
imagelist.c
|
imagelist.c
|
||||||
ipaddress.c
|
ipaddress.c
|
||||||
|
listbox.c
|
||||||
listview.c
|
listview.c
|
||||||
monthcal.c
|
monthcal.c
|
||||||
nativefont.c
|
nativefont.c
|
||||||
|
@ -33,16 +36,12 @@ list(APPEND SOURCE
|
||||||
propsheet.c
|
propsheet.c
|
||||||
rebar.c
|
rebar.c
|
||||||
smoothscroll.c
|
smoothscroll.c
|
||||||
|
static.c
|
||||||
status.c
|
status.c
|
||||||
string.c
|
string.c
|
||||||
syslink.c
|
syslink.c
|
||||||
tab.c
|
tab.c
|
||||||
taskdialog.c
|
taskdialog.c
|
||||||
theme_button.c
|
|
||||||
theme_combo.c
|
|
||||||
theme_dialog.c
|
|
||||||
theme_edit.c
|
|
||||||
theme_listbox.c
|
|
||||||
theme_scrollbar.c
|
theme_scrollbar.c
|
||||||
theming.c
|
theming.c
|
||||||
toolbar.c
|
toolbar.c
|
||||||
|
@ -50,7 +49,7 @@ list(APPEND SOURCE
|
||||||
trackbar.c
|
trackbar.c
|
||||||
treeview.c
|
treeview.c
|
||||||
updown.c
|
updown.c
|
||||||
comctl32.h)
|
precomp.h)
|
||||||
|
|
||||||
add_library(comctl32 SHARED
|
add_library(comctl32 SHARED
|
||||||
${SOURCE}
|
${SOURCE}
|
||||||
|
@ -61,8 +60,8 @@ add_library(comctl32 SHARED
|
||||||
set_module_type(comctl32 win32dll UNICODE)
|
set_module_type(comctl32 win32dll UNICODE)
|
||||||
target_link_libraries(comctl32 uuid wine ${PSEH_LIB})
|
target_link_libraries(comctl32 uuid wine ${PSEH_LIB})
|
||||||
add_delay_importlibs(comctl32 winmm uxtheme)
|
add_delay_importlibs(comctl32 winmm uxtheme)
|
||||||
add_importlibs(comctl32 user32 gdi32 advapi32 msvcrt kernel32 ntdll)
|
add_importlibs(comctl32 user32 gdi32 advapi32 usp10 imm32 msvcrt kernel32 ntdll)
|
||||||
add_pch(comctl32 comctl32.h SOURCE)
|
add_pch(comctl32 precomp.h SOURCE)
|
||||||
add_cd_file(TARGET comctl32 DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET comctl32 DESTINATION reactos/system32 FOR all)
|
||||||
add_cd_file(TARGET comctl32 DESTINATION reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.2600.2982_none_deadbeef FOR all)
|
add_cd_file(TARGET comctl32 DESTINATION reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.2600.2982_none_deadbeef FOR all)
|
||||||
add_cd_file(TARGET comctl32 DESTINATION reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_none_deadbeef FOR all)
|
add_cd_file(TARGET comctl32 DESTINATION reactos/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_none_deadbeef FOR all)
|
||||||
|
|
|
@ -20,22 +20,23 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTES
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Mar. 15, 2005, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
* - check for the 'rec ' list in some AVI files
|
* - check for the 'rec ' list in some AVI files
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "vfw.h"
|
||||||
|
#include "mmsystem.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
#include <vfw.h>
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(animate);
|
WINE_DEFAULT_DEBUG_CHANNEL(animate);
|
||||||
|
|
||||||
|
@ -179,28 +180,31 @@ static BOOL ANIMATE_DoStop(ANIMATE_INFO *infoPtr)
|
||||||
|
|
||||||
static void ANIMATE_Free(ANIMATE_INFO *infoPtr)
|
static void ANIMATE_Free(ANIMATE_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
if (infoPtr->hMMio) {
|
if (infoPtr->hMMio)
|
||||||
|
{
|
||||||
ANIMATE_DoStop(infoPtr);
|
ANIMATE_DoStop(infoPtr);
|
||||||
mmioClose(infoPtr->hMMio, 0);
|
mmioClose(infoPtr->hMMio, 0);
|
||||||
if (infoPtr->hRes) {
|
if (infoPtr->hRes)
|
||||||
|
{
|
||||||
FreeResource(infoPtr->hRes);
|
FreeResource(infoPtr->hRes);
|
||||||
infoPtr->hRes = 0;
|
infoPtr->hRes = 0;
|
||||||
}
|
}
|
||||||
Free (infoPtr->lpIndex);
|
heap_free (infoPtr->lpIndex);
|
||||||
infoPtr->lpIndex = NULL;
|
infoPtr->lpIndex = NULL;
|
||||||
if (infoPtr->hic) {
|
if (infoPtr->hic)
|
||||||
|
{
|
||||||
fnIC.fnICClose(infoPtr->hic);
|
fnIC.fnICClose(infoPtr->hic);
|
||||||
infoPtr->hic = 0;
|
infoPtr->hic = 0;
|
||||||
}
|
}
|
||||||
Free (infoPtr->inbih);
|
heap_free (infoPtr->inbih);
|
||||||
infoPtr->inbih = NULL;
|
infoPtr->inbih = NULL;
|
||||||
Free (infoPtr->outbih);
|
heap_free (infoPtr->outbih);
|
||||||
infoPtr->outbih = NULL;
|
infoPtr->outbih = NULL;
|
||||||
Free (infoPtr->indata);
|
heap_free (infoPtr->indata);
|
||||||
infoPtr->indata = NULL;
|
infoPtr->indata = NULL;
|
||||||
Free (infoPtr->outdata);
|
heap_free (infoPtr->outdata);
|
||||||
infoPtr->outdata = NULL;
|
infoPtr->outdata = NULL;
|
||||||
if( infoPtr->hbmPrevFrame )
|
if (infoPtr->hbmPrevFrame)
|
||||||
{
|
{
|
||||||
DeleteObject(infoPtr->hbmPrevFrame);
|
DeleteObject(infoPtr->hbmPrevFrame);
|
||||||
infoPtr->hbmPrevFrame = 0;
|
infoPtr->hbmPrevFrame = 0;
|
||||||
|
@ -562,7 +566,7 @@ static BOOL ANIMATE_GetAviInfo(ANIMATE_INFO *infoPtr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
infoPtr->inbih = Alloc(mmckInfo.cksize);
|
infoPtr->inbih = heap_alloc_zero(mmckInfo.cksize);
|
||||||
if (!infoPtr->inbih) {
|
if (!infoPtr->inbih) {
|
||||||
WARN("Can't alloc input BIH\n");
|
WARN("Can't alloc input BIH\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -609,7 +613,7 @@ static BOOL ANIMATE_GetAviInfo(ANIMATE_INFO *infoPtr)
|
||||||
|
|
||||||
/* FIXME: should handle the 'rec ' LIST when present */
|
/* FIXME: should handle the 'rec ' LIST when present */
|
||||||
|
|
||||||
infoPtr->lpIndex = Alloc(infoPtr->mah.dwTotalFrames * sizeof(DWORD));
|
infoPtr->lpIndex = heap_alloc_zero(infoPtr->mah.dwTotalFrames * sizeof(DWORD));
|
||||||
if (!infoPtr->lpIndex)
|
if (!infoPtr->lpIndex)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -631,7 +635,7 @@ static BOOL ANIMATE_GetAviInfo(ANIMATE_INFO *infoPtr)
|
||||||
infoPtr->ash.dwSuggestedBufferSize = insize;
|
infoPtr->ash.dwSuggestedBufferSize = insize;
|
||||||
}
|
}
|
||||||
|
|
||||||
infoPtr->indata = Alloc(infoPtr->ash.dwSuggestedBufferSize);
|
infoPtr->indata = heap_alloc_zero(infoPtr->ash.dwSuggestedBufferSize);
|
||||||
if (!infoPtr->indata)
|
if (!infoPtr->indata)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -662,7 +666,7 @@ static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)
|
||||||
outSize = fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
|
outSize = fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,
|
||||||
(DWORD_PTR)infoPtr->inbih, 0L);
|
(DWORD_PTR)infoPtr->inbih, 0L);
|
||||||
|
|
||||||
infoPtr->outbih = Alloc(outSize);
|
infoPtr->outbih = heap_alloc_zero(outSize);
|
||||||
if (!infoPtr->outbih)
|
if (!infoPtr->outbih)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -673,7 +677,7 @@ static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
infoPtr->outdata = Alloc(infoPtr->outbih->biSizeImage);
|
infoPtr->outdata = heap_alloc_zero(infoPtr->outbih->biSizeImage);
|
||||||
if (!infoPtr->outdata)
|
if (!infoPtr->outdata)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -767,12 +771,12 @@ static BOOL ANIMATE_OpenA(ANIMATE_INFO *infoPtr, HINSTANCE hInstance, LPSTR lpsz
|
||||||
return ANIMATE_OpenW(infoPtr, hInstance, (LPWSTR)lpszName);
|
return ANIMATE_OpenW(infoPtr, hInstance, (LPWSTR)lpszName);
|
||||||
|
|
||||||
len = MultiByteToWideChar(CP_ACP, 0, lpszName, -1, NULL, 0);
|
len = MultiByteToWideChar(CP_ACP, 0, lpszName, -1, NULL, 0);
|
||||||
lpwszName = Alloc(len * sizeof(WCHAR));
|
lpwszName = heap_alloc(len * sizeof(WCHAR));
|
||||||
if (!lpwszName) return FALSE;
|
if (!lpwszName) return FALSE;
|
||||||
MultiByteToWideChar(CP_ACP, 0, lpszName, -1, lpwszName, len);
|
MultiByteToWideChar(CP_ACP, 0, lpszName, -1, lpwszName, len);
|
||||||
|
|
||||||
result = ANIMATE_OpenW(infoPtr, hInstance, lpwszName);
|
result = ANIMATE_OpenW(infoPtr, hInstance, lpwszName);
|
||||||
Free (lpwszName);
|
heap_free (lpwszName);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -805,7 +809,7 @@ static BOOL ANIMATE_Create(HWND hWnd, const CREATESTRUCTW *lpcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate memory for info structure */
|
/* allocate memory for info structure */
|
||||||
infoPtr = Alloc(sizeof(ANIMATE_INFO));
|
infoPtr = heap_alloc_zero(sizeof(*infoPtr));
|
||||||
if (!infoPtr) return FALSE;
|
if (!infoPtr) return FALSE;
|
||||||
|
|
||||||
/* store crossref hWnd <-> info structure */
|
/* store crossref hWnd <-> info structure */
|
||||||
|
@ -835,7 +839,7 @@ static LRESULT ANIMATE_Destroy(ANIMATE_INFO *infoPtr)
|
||||||
|
|
||||||
infoPtr->cs.DebugInfo->Spare[0] = 0;
|
infoPtr->cs.DebugInfo->Spare[0] = 0;
|
||||||
DeleteCriticalSection(&infoPtr->cs);
|
DeleteCriticalSection(&infoPtr->cs);
|
||||||
Free(infoPtr);
|
heap_free(infoPtr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
2160
dll/win32/comctl32/combo.c
Normal file
2160
dll/win32/comctl32/combo.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -18,19 +18,19 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(comboex);
|
WINE_DEFAULT_DEBUG_CHANNEL(comboex);
|
||||||
|
|
||||||
|
@ -1502,10 +1502,10 @@ static void COMBOEX_ResetContent (COMBOEX_INFO *infoPtr)
|
||||||
static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr)
|
static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
if (infoPtr->hwndCombo)
|
if (infoPtr->hwndCombo)
|
||||||
RemoveWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID);
|
SetWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID, 0);
|
||||||
|
|
||||||
if (infoPtr->hwndEdit)
|
if (infoPtr->hwndEdit)
|
||||||
RemoveWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
|
SetWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID, 0);
|
||||||
|
|
||||||
COMBOEX_FreeText (&infoPtr->edit);
|
COMBOEX_FreeText (&infoPtr->edit);
|
||||||
COMBOEX_ResetContent (infoPtr);
|
COMBOEX_ResetContent (infoPtr);
|
||||||
|
@ -1668,7 +1668,11 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
|
TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
|
||||||
hwnd, uMsg, wParam, lParam, infoPtr);
|
hwnd, uMsg, wParam, lParam, infoPtr);
|
||||||
|
|
||||||
if (!infoPtr) return 0;
|
if (uMsg == WM_NCDESTROY)
|
||||||
|
RemoveWindowSubclass(hwnd, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
|
||||||
|
|
||||||
|
if (!infoPtr)
|
||||||
|
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
|
@ -1823,11 +1827,14 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
|
TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
|
||||||
hwnd, uMsg, wParam, lParam, infoPtr);
|
hwnd, uMsg, wParam, lParam, infoPtr);
|
||||||
|
|
||||||
if (!infoPtr) return 0;
|
if (uMsg == WM_NCDESTROY)
|
||||||
|
RemoveWindowSubclass(hwnd, COMBOEX_ComboWndProc, COMBO_SUBCLASSID);
|
||||||
|
|
||||||
|
if (!infoPtr)
|
||||||
|
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
|
|
||||||
case WM_DRAWITEM:
|
case WM_DRAWITEM:
|
||||||
/*
|
/*
|
||||||
* The only way this message should come is from the
|
* The only way this message should come is from the
|
||||||
|
@ -1835,7 +1842,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
* that ComboEx knows this is listbox.
|
* that ComboEx knows this is listbox.
|
||||||
*/
|
*/
|
||||||
((DRAWITEMSTRUCT *)lParam)->itemState |= ODS_COMBOEXLBOX;
|
((DRAWITEMSTRUCT *)lParam)->itemState |= ODS_COMBOEXLBOX;
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
hDC = (HDC) wParam;
|
hDC = (HDC) wParam;
|
||||||
|
@ -1844,7 +1851,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
TRACE("erasing (%s)\n", wine_dbgstr_rect(&rect));
|
TRACE("erasing (%s)\n", wine_dbgstr_rect(&rect));
|
||||||
ExtTextOutW (hDC, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0);
|
ExtTextOutW (hDC, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0);
|
||||||
SetBkColor (hDC, obkc);
|
SetBkColor (hDC, obkc);
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
case WM_SETCURSOR:
|
case WM_SETCURSOR:
|
||||||
/*
|
/*
|
||||||
|
@ -1858,7 +1865,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
nmmse.pt.y = 0;
|
nmmse.pt.y = 0;
|
||||||
nmmse.dwHitInfo = lParam;
|
nmmse.dwHitInfo = lParam;
|
||||||
COMBOEX_Notify (infoPtr, NM_SETCURSOR, (NMHDR *)&nmmse);
|
COMBOEX_Notify (infoPtr, NM_SETCURSOR, (NMHDR *)&nmmse);
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
GetClientRect (hwnd, &rect);
|
GetClientRect (hwnd, &rect);
|
||||||
|
@ -1868,15 +1875,15 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
pt.x = (short)LOWORD(lParam);
|
pt.x = (short)LOWORD(lParam);
|
||||||
pt.y = (short)HIWORD(lParam);
|
pt.y = (short)HIWORD(lParam);
|
||||||
if (PtInRect(&rect, pt))
|
if (PtInRect(&rect, pt))
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
infoPtr->flags |= WCBE_MOUSECAPTURED;
|
infoPtr->flags |= WCBE_MOUSECAPTURED;
|
||||||
SetCapture(hwnd);
|
SetCapture(hwnd);
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
if (!(infoPtr->flags & WCBE_MOUSECAPTURED))
|
if (!(infoPtr->flags & WCBE_MOUSECAPTURED))
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
infoPtr->flags &= ~WCBE_MOUSECAPTURED;
|
infoPtr->flags &= ~WCBE_MOUSECAPTURED;
|
||||||
|
@ -1885,7 +1892,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
} else {
|
} else {
|
||||||
SendMessageW(hwnd, CB_SHOWDROPDOWN, TRUE, 0);
|
SendMessageW(hwnd, CB_SHOWDROPDOWN, TRUE, 0);
|
||||||
}
|
}
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
if ( (infoPtr->flags & WCBE_MOUSECAPTURED) &&
|
if ( (infoPtr->flags & WCBE_MOUSECAPTURED) &&
|
||||||
|
@ -1894,7 +1901,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
COMBOEX_NotifyDragBegin(infoPtr, edit_text);
|
COMBOEX_NotifyDragBegin(infoPtr, edit_text);
|
||||||
infoPtr->flags |= WCBE_MOUSEDRAGGED;
|
infoPtr->flags |= WCBE_MOUSEDRAGGED;
|
||||||
}
|
}
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
break;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
switch (HIWORD(wParam)) {
|
switch (HIWORD(wParam)) {
|
||||||
|
@ -1975,9 +1982,10 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
break;
|
break;
|
||||||
}/* fall through */
|
}/* fall through */
|
||||||
default:
|
default:
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,36 +24,135 @@
|
||||||
#ifndef __WINE_COMCTL32_H
|
#ifndef __WINE_COMCTL32_H
|
||||||
#define __WINE_COMCTL32_H
|
#define __WINE_COMCTL32_H
|
||||||
|
|
||||||
#include <wine/config.h>
|
#ifndef RC_INVOKED
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <assert.h>
|
#endif
|
||||||
|
|
||||||
#define _INC_WINDOWS
|
#include "windef.h"
|
||||||
#define COM_NO_WINDOWS_H
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
#define COBJMACROS
|
#include "winuser.h"
|
||||||
#define NONAMELESSUNION
|
#include "winnls.h"
|
||||||
#define NONAMELESSSTRUCT
|
#include "commctrl.h"
|
||||||
|
|
||||||
#include <windef.h>
|
|
||||||
#include <winbase.h>
|
|
||||||
#include <wingdi.h>
|
|
||||||
#include <winuser.h>
|
|
||||||
#include <winreg.h>
|
|
||||||
#include <objbase.h>
|
|
||||||
#include <uxtheme.h>
|
|
||||||
#include <vssym32.h>
|
|
||||||
|
|
||||||
#include <wine/debug.h>
|
|
||||||
#include <wine/list.h>
|
|
||||||
#include <wine/unicode.h>
|
|
||||||
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
extern HMODULE COMCTL32_hModule DECLSPEC_HIDDEN;
|
extern HMODULE COMCTL32_hModule DECLSPEC_HIDDEN;
|
||||||
extern HBRUSH COMCTL32_hPattern55AABrush DECLSPEC_HIDDEN;
|
extern HBRUSH COMCTL32_hPattern55AABrush DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
|
||||||
|
|
||||||
|
/* Property sheet / Wizard */
|
||||||
|
#define IDD_PROPSHEET 1006
|
||||||
|
#define IDD_WIZARD 1020
|
||||||
|
|
||||||
|
#define IDC_TABCONTROL 12320
|
||||||
|
#define IDC_APPLY_BUTTON 12321
|
||||||
|
#define IDC_BACK_BUTTON 12323
|
||||||
|
#define IDC_NEXT_BUTTON 12324
|
||||||
|
#define IDC_FINISH_BUTTON 12325
|
||||||
|
#define IDC_SUNKEN_LINE 12326
|
||||||
|
#define IDC_SUNKEN_LINEHEADER 12327
|
||||||
|
|
||||||
|
#define IDS_CLOSE 4160
|
||||||
|
|
||||||
|
/* Toolbar customization dialog */
|
||||||
|
#define IDD_TBCUSTOMIZE 200
|
||||||
|
|
||||||
|
#define IDC_AVAILBTN_LBOX 201
|
||||||
|
#define IDC_RESET_BTN 202
|
||||||
|
#define IDC_TOOLBARBTN_LBOX 203
|
||||||
|
#define IDC_REMOVE_BTN 204
|
||||||
|
#define IDC_HELP_BTN 205
|
||||||
|
#define IDC_MOVEUP_BTN 206
|
||||||
|
#define IDC_MOVEDN_BTN 207
|
||||||
|
|
||||||
|
#define IDS_SEPARATOR 1024
|
||||||
|
|
||||||
|
/* Toolbar imagelist bitmaps */
|
||||||
|
#define IDB_STD_SMALL 120
|
||||||
|
#define IDB_STD_LARGE 121
|
||||||
|
#define IDB_VIEW_SMALL 124
|
||||||
|
#define IDB_VIEW_LARGE 125
|
||||||
|
#define IDB_HIST_SMALL 130
|
||||||
|
#define IDB_HIST_LARGE 131
|
||||||
|
|
||||||
|
#define IDM_TODAY 4163
|
||||||
|
#define IDM_GOTODAY 4164
|
||||||
|
|
||||||
|
/* Treeview Checkboxes */
|
||||||
|
|
||||||
|
#define IDT_CHECK 401
|
||||||
|
|
||||||
|
|
||||||
|
/* Cursors */
|
||||||
|
#define IDC_MOVEBUTTON 102
|
||||||
|
#define IDC_COPY 104
|
||||||
|
#define IDC_DIVIDER 106
|
||||||
|
#define IDC_DIVIDEROPEN 107
|
||||||
|
|
||||||
|
|
||||||
|
/* DragList resources */
|
||||||
|
#define IDI_DRAGARROW 501
|
||||||
|
|
||||||
|
/* HOTKEY internal strings */
|
||||||
|
#define HKY_NONE 2048
|
||||||
|
|
||||||
|
/* Tooltip icons */
|
||||||
|
#define IDI_TT_INFO_SM 22
|
||||||
|
#define IDI_TT_WARN_SM 25
|
||||||
|
#define IDI_TT_ERROR_SM 28
|
||||||
|
|
||||||
|
/* Taskdialog strings */
|
||||||
|
#define IDS_BUTTON_YES 3000
|
||||||
|
#define IDS_BUTTON_NO 3001
|
||||||
|
#define IDS_BUTTON_RETRY 3002
|
||||||
|
#define IDS_BUTTON_OK 3003
|
||||||
|
#define IDS_BUTTON_CANCEL 3004
|
||||||
|
#define IDS_BUTTON_CLOSE 3005
|
||||||
|
|
||||||
|
#ifndef __REACTOS__
|
||||||
|
#define WM_SYSTIMER 0x0118
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum combobox_state_flags
|
||||||
|
{
|
||||||
|
CBF_DROPPED = 0x0001,
|
||||||
|
CBF_BUTTONDOWN = 0x0002,
|
||||||
|
CBF_NOROLLUP = 0x0004,
|
||||||
|
CBF_MEASUREITEM = 0x0008,
|
||||||
|
CBF_FOCUSED = 0x0010,
|
||||||
|
CBF_CAPTURE = 0x0020,
|
||||||
|
CBF_EDIT = 0x0040,
|
||||||
|
CBF_NORESIZE = 0x0080,
|
||||||
|
CBF_NOTIFY = 0x0100,
|
||||||
|
CBF_NOREDRAW = 0x0200,
|
||||||
|
CBF_SELCHANGE = 0x0400,
|
||||||
|
CBF_HOT = 0x0800,
|
||||||
|
CBF_NOEDITNOTIFY = 0x1000,
|
||||||
|
CBF_NOLBSELECT = 0x2000, /* do not change current selection */
|
||||||
|
CBF_BEENFOCUSED = 0x4000, /* has it ever had focus */
|
||||||
|
CBF_EUI = 0x8000,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HWND self;
|
||||||
|
HWND owner;
|
||||||
|
UINT dwStyle;
|
||||||
|
HWND hWndEdit;
|
||||||
|
HWND hWndLBox;
|
||||||
|
UINT wState;
|
||||||
|
HFONT hFont;
|
||||||
|
RECT textRect;
|
||||||
|
RECT buttonRect;
|
||||||
|
RECT droppedRect;
|
||||||
|
INT droppedIndex;
|
||||||
|
INT fixedOwnerDrawHeight;
|
||||||
|
INT droppedWidth; /* last two are not used unless set */
|
||||||
|
INT editHeight; /* explicitly */
|
||||||
|
} HEADCOMBO, *LPHEADCOMBO;
|
||||||
|
|
||||||
|
extern BOOL COMBO_FlipListbox(HEADCOMBO *lphc, BOOL ok, BOOL bRedrawButton) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
COLORREF clrBtnHighlight; /* COLOR_BTNHIGHLIGHT */
|
COLORREF clrBtnHighlight; /* COLOR_BTNHIGHLIGHT */
|
||||||
|
@ -77,25 +176,6 @@ typedef struct
|
||||||
|
|
||||||
extern COMCTL32_SysColor comctl32_color DECLSPEC_HIDDEN;
|
extern COMCTL32_SysColor comctl32_color DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#ifdef __REACTOS__
|
|
||||||
|
|
||||||
typedef struct _BUTTON_DATA {
|
|
||||||
LONG state;
|
|
||||||
HFONT font;
|
|
||||||
LONG_PTR image;
|
|
||||||
DWORD ui_state;
|
|
||||||
|
|
||||||
RECT rcTextMargin;
|
|
||||||
BUTTON_IMAGELIST imlData;
|
|
||||||
} BUTTON_DATA, *PBUTTON_DATA;
|
|
||||||
|
|
||||||
static inline PBUTTON_DATA _GetButtonData(HWND hwnd)
|
|
||||||
{
|
|
||||||
return (PBUTTON_DATA)GetWindowLongPtrW( hwnd, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __REACTOS__ */
|
|
||||||
|
|
||||||
/* Internal function */
|
/* Internal function */
|
||||||
HWND COMCTL32_CreateToolTip (HWND) DECLSPEC_HIDDEN;
|
HWND COMCTL32_CreateToolTip (HWND) DECLSPEC_HIDDEN;
|
||||||
VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN;
|
VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN;
|
||||||
|
@ -108,9 +188,7 @@ INT Str_GetPtrAtoW (LPCSTR lpSrc, LPWSTR lpDest, INT nMaxLen) DECLSPEC_HIDDEN;
|
||||||
BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) DECLSPEC_HIDDEN;
|
BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) DECLSPEC_HIDDEN;
|
||||||
BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) DECLSPEC_HIDDEN;
|
BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
|
||||||
#define COMCTL32_VERSION_MINOR 81
|
#define COMCTL32_VERSION_MINOR 81
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Our internal stack structure of the window procedures to subclass */
|
/* Our internal stack structure of the window procedures to subclass */
|
||||||
typedef struct _SUBCLASSPROCS {
|
typedef struct _SUBCLASSPROCS {
|
||||||
|
@ -141,12 +219,18 @@ INT WINAPI Str_GetPtrW (LPCWSTR, LPWSTR, INT);
|
||||||
LRESULT WINAPI SetPathWordBreakProc(HWND hwnd, BOOL bSet);
|
LRESULT WINAPI SetPathWordBreakProc(HWND hwnd, BOOL bSet);
|
||||||
BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2);
|
BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2);
|
||||||
|
|
||||||
|
HRGN set_control_clipping(HDC hdc, const RECT *rect) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern void ANIMATE_Register(void) DECLSPEC_HIDDEN;
|
extern void ANIMATE_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void ANIMATE_Unregister(void) DECLSPEC_HIDDEN;
|
extern void ANIMATE_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void BUTTON_Register(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void COMBO_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void COMBOEX_Register(void) DECLSPEC_HIDDEN;
|
extern void COMBOEX_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void COMBOEX_Unregister(void) DECLSPEC_HIDDEN;
|
extern void COMBOEX_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void COMBOLBOX_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void DATETIME_Register(void) DECLSPEC_HIDDEN;
|
extern void DATETIME_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void DATETIME_Unregister(void) DECLSPEC_HIDDEN;
|
extern void DATETIME_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void EDIT_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void FLATSB_Register(void) DECLSPEC_HIDDEN;
|
extern void FLATSB_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void FLATSB_Unregister(void) DECLSPEC_HIDDEN;
|
extern void FLATSB_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void HEADER_Register(void) DECLSPEC_HIDDEN;
|
extern void HEADER_Register(void) DECLSPEC_HIDDEN;
|
||||||
|
@ -155,6 +239,7 @@ extern void HOTKEY_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void HOTKEY_Unregister(void) DECLSPEC_HIDDEN;
|
extern void HOTKEY_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void IPADDRESS_Register(void) DECLSPEC_HIDDEN;
|
extern void IPADDRESS_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void IPADDRESS_Unregister(void) DECLSPEC_HIDDEN;
|
extern void IPADDRESS_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void LISTBOX_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void LISTVIEW_Register(void) DECLSPEC_HIDDEN;
|
extern void LISTVIEW_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void LISTVIEW_Unregister(void) DECLSPEC_HIDDEN;
|
extern void LISTVIEW_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void MONTHCAL_Register(void) DECLSPEC_HIDDEN;
|
extern void MONTHCAL_Register(void) DECLSPEC_HIDDEN;
|
||||||
|
@ -167,6 +252,7 @@ extern void PROGRESS_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void PROGRESS_Unregister(void) DECLSPEC_HIDDEN;
|
extern void PROGRESS_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void REBAR_Register(void) DECLSPEC_HIDDEN;
|
extern void REBAR_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void REBAR_Unregister(void) DECLSPEC_HIDDEN;
|
extern void REBAR_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
extern void STATIC_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void STATUS_Register(void) DECLSPEC_HIDDEN;
|
extern void STATUS_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void STATUS_Unregister(void) DECLSPEC_HIDDEN;
|
extern void STATUS_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void SYSLINK_Register(void) DECLSPEC_HIDDEN;
|
extern void SYSLINK_Register(void) DECLSPEC_HIDDEN;
|
||||||
|
@ -184,7 +270,6 @@ extern void TREEVIEW_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
extern void UPDOWN_Register(void) DECLSPEC_HIDDEN;
|
extern void UPDOWN_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
|
extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
extern void BUTTON_Register();
|
|
||||||
extern void BUTTON_Unregister();
|
extern void BUTTON_Unregister();
|
||||||
extern void TOOLBARv6_Register(void) DECLSPEC_HIDDEN;
|
extern void TOOLBARv6_Register(void) DECLSPEC_HIDDEN;
|
||||||
extern void TOOLBARv6_Unregister(void) DECLSPEC_HIDDEN;
|
extern void TOOLBARv6_Unregister(void) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -26,9 +26,32 @@
|
||||||
* COMCTL32.DLL (internally).
|
* COMCTL32.DLL (internally).
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "winreg.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "objbase.h"
|
||||||
|
#include "winerror.h"
|
||||||
|
|
||||||
|
#include "wine/unicode.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
static const WCHAR strMRUList[] = { 'M','R','U','L','i','s','t',0 };
|
static const WCHAR strMRUList[] = { 'M','R','U','L','i','s','t',0 };
|
||||||
|
|
|
@ -53,10 +53,22 @@
|
||||||
* -- ICC_WIN95_CLASSES
|
* -- ICC_WIN95_CLASSES
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "winerror.h"
|
||||||
|
#include "winreg.h"
|
||||||
#define NO_SHLWAPI_STREAM
|
#define NO_SHLWAPI_STREAM
|
||||||
#include <shlwapi.h>
|
#include "shlwapi.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
|
@ -178,7 +190,13 @@ static void RegisterControls(BOOL bV6)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BUTTON_Register();
|
BUTTON_Register ();
|
||||||
|
COMBO_Register ();
|
||||||
|
COMBOLBOX_Register ();
|
||||||
|
EDIT_Register ();
|
||||||
|
LISTBOX_Register ();
|
||||||
|
STATIC_Register ();
|
||||||
|
|
||||||
TOOLBARv6_Register();
|
TOOLBARv6_Register();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,6 +295,28 @@ BOOLEAN WINAPI RegisterClassNameW(LPCWSTR className)
|
||||||
|
|
||||||
#endif /* __REACTOS__ */
|
#endif /* __REACTOS__ */
|
||||||
|
|
||||||
|
#ifndef __REACTOS__
|
||||||
|
static void unregister_versioned_classes(void)
|
||||||
|
{
|
||||||
|
#define VERSION "6.0.2600.2982!"
|
||||||
|
static const char *classes[] =
|
||||||
|
{
|
||||||
|
VERSION WC_BUTTONA,
|
||||||
|
VERSION WC_COMBOBOXA,
|
||||||
|
VERSION "ComboLBox",
|
||||||
|
VERSION WC_EDITA,
|
||||||
|
VERSION WC_LISTBOXA,
|
||||||
|
VERSION WC_STATICA,
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(classes); i++)
|
||||||
|
UnregisterClassA(classes[i], NULL);
|
||||||
|
|
||||||
|
#undef VERSION
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DllMain [Internal]
|
* DllMain [Internal]
|
||||||
*
|
*
|
||||||
|
@ -337,6 +377,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
TREEVIEW_Register ();
|
TREEVIEW_Register ();
|
||||||
UPDOWN_Register ();
|
UPDOWN_Register ();
|
||||||
|
|
||||||
|
BUTTON_Register ();
|
||||||
|
COMBO_Register ();
|
||||||
|
COMBOLBOX_Register ();
|
||||||
|
EDIT_Register ();
|
||||||
|
LISTBOX_Register ();
|
||||||
|
STATIC_Register ();
|
||||||
|
|
||||||
/* subclass user32 controls */
|
/* subclass user32 controls */
|
||||||
THEMING_Initialize ();
|
THEMING_Initialize ();
|
||||||
#else
|
#else
|
||||||
|
@ -373,6 +420,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
TRACKBAR_Unregister ();
|
TRACKBAR_Unregister ();
|
||||||
TREEVIEW_Unregister ();
|
TREEVIEW_Unregister ();
|
||||||
UPDOWN_Unregister ();
|
UPDOWN_Unregister ();
|
||||||
|
|
||||||
|
unregister_versioned_classes ();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
UninitializeClasses();
|
UninitializeClasses();
|
||||||
#endif
|
#endif
|
||||||
|
@ -450,7 +500,7 @@ MenuHelp (UINT uMsg, WPARAM wParam, LPARAM lParam, HMENU hMainMenu,
|
||||||
if (uMenuID) {
|
if (uMenuID) {
|
||||||
WCHAR szText[256];
|
WCHAR szText[256];
|
||||||
|
|
||||||
if (!LoadStringW (hInst, uMenuID, szText, sizeof(szText)/sizeof(szText[0])))
|
if (!LoadStringW (hInst, uMenuID, szText, ARRAY_SIZE(szText)))
|
||||||
szText[0] = '\0';
|
szText[0] = '\0';
|
||||||
|
|
||||||
SendMessageW (hwndStatus, SB_SETTEXTW,
|
SendMessageW (hwndStatus, SB_SETTEXTW,
|
||||||
|
@ -1593,7 +1643,7 @@ void COMCTL32_DrawInsertMark(HDC hDC, const RECT *lpRect, COLORREF clrInsertMark
|
||||||
{lCentre + 1, l2 - 3},
|
{lCentre + 1, l2 - 3},
|
||||||
};
|
};
|
||||||
hOldPen = SelectObject(hDC, hPen);
|
hOldPen = SelectObject(hDC, hPen);
|
||||||
PolyPolyline(hDC, aptInsertMark, adwPolyPoints, sizeof(adwPolyPoints)/sizeof(adwPolyPoints[0]));
|
PolyPolyline(hDC, aptInsertMark, adwPolyPoints, ARRAY_SIZE(adwPolyPoints));
|
||||||
SelectObject(hDC, hOldPen);
|
SelectObject(hDC, hOldPen);
|
||||||
DeleteObject(hPen);
|
DeleteObject(hPen);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,15 +20,6 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Oct. 20, 2004, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
* -- DTS_APPCANPARSE
|
* -- DTS_APPCANPARSE
|
||||||
* -- DTS_SHORTDATECENTURYFORMAT
|
* -- DTS_SHORTDATECENTURYFORMAT
|
||||||
|
@ -39,9 +30,21 @@
|
||||||
* -- FORMATCALLBACK
|
* -- FORMATCALLBACK
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(datetime);
|
WINE_DEFAULT_DEBUG_CHANNEL(datetime);
|
||||||
|
|
||||||
|
@ -325,7 +328,7 @@ DATETIME_SetFormatW (DATETIME_INFO *infoPtr, LPCWSTR format)
|
||||||
format_item = LOCALE_STIMEFORMAT;
|
format_item = LOCALE_STIMEFORMAT;
|
||||||
else /* DTS_SHORTDATEFORMAT */
|
else /* DTS_SHORTDATEFORMAT */
|
||||||
format_item = LOCALE_SSHORTDATE;
|
format_item = LOCALE_SSHORTDATE;
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, format_item, format_buf, sizeof(format_buf)/sizeof(format_buf[0]));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, format_item, format_buf, ARRAY_SIZE(format_buf));
|
||||||
format = format_buf;
|
format = format_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,8 +449,7 @@ DATETIME_ReturnTxt (const DATETIME_INFO *infoPtr, int count, LPWSTR result, int
|
||||||
wsprintfW (result, fmt__2dW, date.wMonth);
|
wsprintfW (result, fmt__2dW, date.wMonth);
|
||||||
break;
|
break;
|
||||||
case THREECHARMONTH:
|
case THREECHARMONTH:
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+date.wMonth -1,
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+date.wMonth -1, buffer, ARRAY_SIZE(buffer));
|
||||||
buffer, sizeof(buffer)/sizeof(buffer[0]));
|
|
||||||
wsprintfW (result, fmt__3sW, buffer);
|
wsprintfW (result, fmt__3sW, buffer);
|
||||||
break;
|
break;
|
||||||
case FULLMONTH:
|
case FULLMONTH:
|
||||||
|
@ -739,14 +741,14 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)
|
||||||
INT oldBkMode = SetBkMode (hdc, TRANSPARENT);
|
INT oldBkMode = SetBkMode (hdc, TRANSPARENT);
|
||||||
WCHAR txt[80];
|
WCHAR txt[80];
|
||||||
|
|
||||||
DATETIME_ReturnTxt (infoPtr, 0, txt, sizeof(txt)/sizeof(txt[0]));
|
DATETIME_ReturnTxt (infoPtr, 0, txt, ARRAY_SIZE(txt));
|
||||||
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
|
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
|
||||||
rcDraw->bottom = size.cy + 2;
|
rcDraw->bottom = size.cy + 2;
|
||||||
|
|
||||||
prevright = infoPtr->checkbox.right = ((infoPtr->dwStyle & DTS_SHOWNONE) ? 18 : 2);
|
prevright = infoPtr->checkbox.right = ((infoPtr->dwStyle & DTS_SHOWNONE) ? 18 : 2);
|
||||||
|
|
||||||
for (i = 0; i < infoPtr->nrFields; i++) {
|
for (i = 0; i < infoPtr->nrFields; i++) {
|
||||||
DATETIME_ReturnTxt (infoPtr, i, txt, sizeof(txt)/sizeof(txt[0]));
|
DATETIME_ReturnTxt (infoPtr, i, txt, ARRAY_SIZE(txt));
|
||||||
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
|
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
|
||||||
DATETIME_ReturnFieldWidth (infoPtr, hdc, i, &fieldWidth);
|
DATETIME_ReturnFieldWidth (infoPtr, hdc, i, &fieldWidth);
|
||||||
field = &infoPtr->fieldRect[i];
|
field = &infoPtr->fieldRect[i];
|
||||||
|
@ -1527,7 +1529,7 @@ DATETIME_GetText (const DATETIME_INFO *infoPtr, INT count, LPWSTR dst)
|
||||||
dst[0] = 0;
|
dst[0] = 0;
|
||||||
for (i = 0; i < infoPtr->nrFields; i++)
|
for (i = 0; i < infoPtr->nrFields; i++)
|
||||||
{
|
{
|
||||||
DATETIME_ReturnTxt(infoPtr, i, buf, sizeof(buf)/sizeof(buf[0]));
|
DATETIME_ReturnTxt(infoPtr, i, buf, ARRAY_SIZE(buf));
|
||||||
if ((strlenW(dst) + strlenW(buf)) < count)
|
if ((strlenW(dst) + strlenW(buf)) < count)
|
||||||
strcatW(dst, buf);
|
strcatW(dst, buf);
|
||||||
else break;
|
else break;
|
||||||
|
|
|
@ -29,7 +29,19 @@
|
||||||
* http://members.ozemail.com.au/~geoffch/samples/win32/shell/comctl32
|
* http://members.ozemail.com.au/~geoffch/samples/win32/shell/comctl32
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "objbase.h"
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(dpa);
|
WINE_DEFAULT_DEBUG_CHANNEL(dpa);
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,16 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,15 @@
|
||||||
* http://members.ozemail.com.au/~geoffch/samples/win32/shell/comctl32
|
* http://members.ozemail.com.au/~geoffch/samples/win32/shell/comctl32
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(dsa);
|
WINE_DEFAULT_DEBUG_CHANNEL(dsa);
|
||||||
|
|
||||||
|
|
5041
dll/win32/comctl32/edit.c
Normal file
5041
dll/win32/comctl32/edit.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -29,7 +29,15 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winerror.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,22 @@
|
||||||
* - New Windows Vista features
|
* - New Windows Vista features
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(header);
|
WINE_DEFAULT_DEBUG_CHANNEL(header);
|
||||||
|
|
||||||
|
@ -127,7 +142,7 @@ static void HEADER_StoreHDItemInHeader(HEADER_ITEM *lpItem, UINT mask, const HDI
|
||||||
|
|
||||||
if (mask & HDI_TEXT)
|
if (mask & HDI_TEXT)
|
||||||
{
|
{
|
||||||
Free(lpItem->pszText);
|
heap_free(lpItem->pszText);
|
||||||
lpItem->pszText = NULL;
|
lpItem->pszText = NULL;
|
||||||
|
|
||||||
if (phdi->pszText != LPSTR_TEXTCALLBACKW) /* covers != TEXTCALLBACKA too */
|
if (phdi->pszText != LPSTR_TEXTCALLBACKW) /* covers != TEXTCALLBACKA too */
|
||||||
|
@ -324,7 +339,7 @@ static HRGN create_sort_arrow( INT x, INT y, INT h, BOOL is_up )
|
||||||
|
|
||||||
if (size > sizeof(buffer))
|
if (size > sizeof(buffer))
|
||||||
{
|
{
|
||||||
data = HeapAlloc( GetProcessHeap(), 0, size );
|
data = heap_alloc( size );
|
||||||
if (!data) return NULL;
|
if (!data) return NULL;
|
||||||
}
|
}
|
||||||
data->rdh.dwSize = sizeof(data->rdh);
|
data->rdh.dwSize = sizeof(data->rdh);
|
||||||
|
@ -350,7 +365,7 @@ static HRGN create_sort_arrow( INT x, INT y, INT h, BOOL is_up )
|
||||||
data->rdh.nCount++;
|
data->rdh.nCount++;
|
||||||
}
|
}
|
||||||
rgn = ExtCreateRegion( NULL, size, data );
|
rgn = ExtCreateRegion( NULL, size, data );
|
||||||
if (data != (RGNDATA *)buffer) HeapFree( GetProcessHeap(), 0, data );
|
if (data != (RGNDATA *)buffer) heap_free( data );
|
||||||
return rgn;
|
return rgn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -971,7 +986,7 @@ HEADER_PrepareCallbackItems(const HEADER_INFO *infoPtr, INT iItem, INT reqMask)
|
||||||
if (mask&HDI_TEXT && lpItem->pszText != NULL)
|
if (mask&HDI_TEXT && lpItem->pszText != NULL)
|
||||||
{
|
{
|
||||||
ERR("(): function called without a call to FreeCallbackItems\n");
|
ERR("(): function called without a call to FreeCallbackItems\n");
|
||||||
Free(lpItem->pszText);
|
heap_free(lpItem->pszText);
|
||||||
lpItem->pszText = NULL;
|
lpItem->pszText = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -982,13 +997,13 @@ HEADER_PrepareCallbackItems(const HEADER_INFO *infoPtr, INT iItem, INT reqMask)
|
||||||
{
|
{
|
||||||
dispInfo.hdr.code = HDN_GETDISPINFOW;
|
dispInfo.hdr.code = HDN_GETDISPINFOW;
|
||||||
if (mask & HDI_TEXT)
|
if (mask & HDI_TEXT)
|
||||||
pvBuffer = Alloc(MAX_HEADER_TEXT_LEN * sizeof(WCHAR));
|
pvBuffer = heap_alloc_zero(MAX_HEADER_TEXT_LEN * sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dispInfo.hdr.code = HDN_GETDISPINFOA;
|
dispInfo.hdr.code = HDN_GETDISPINFOA;
|
||||||
if (mask & HDI_TEXT)
|
if (mask & HDI_TEXT)
|
||||||
pvBuffer = Alloc(MAX_HEADER_TEXT_LEN * sizeof(CHAR));
|
pvBuffer = heap_alloc_zero(MAX_HEADER_TEXT_LEN * sizeof(CHAR));
|
||||||
}
|
}
|
||||||
dispInfo.pszText = pvBuffer;
|
dispInfo.pszText = pvBuffer;
|
||||||
dispInfo.cchTextMax = (pvBuffer!=NULL?MAX_HEADER_TEXT_LEN:0);
|
dispInfo.cchTextMax = (pvBuffer!=NULL?MAX_HEADER_TEXT_LEN:0);
|
||||||
|
@ -1019,7 +1034,7 @@ HEADER_PrepareCallbackItems(const HEADER_INFO *infoPtr, INT iItem, INT reqMask)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Str_SetPtrAtoW(&lpItem->pszText, (LPSTR)dispInfo.pszText);
|
Str_SetPtrAtoW(&lpItem->pszText, (LPSTR)dispInfo.pszText);
|
||||||
Free(pvBuffer);
|
heap_free(pvBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,7 +1060,7 @@ HEADER_FreeCallbackItems(HEADER_ITEM *lpItem)
|
||||||
{
|
{
|
||||||
if (lpItem->callbackMask&HDI_TEXT)
|
if (lpItem->callbackMask&HDI_TEXT)
|
||||||
{
|
{
|
||||||
Free(lpItem->pszText);
|
heap_free(lpItem->pszText);
|
||||||
lpItem->pszText = NULL;
|
lpItem->pszText = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,15 +1182,15 @@ HEADER_DeleteItem (HEADER_INFO *infoPtr, INT iItem)
|
||||||
TRACE("%d: order=%d, iOrder=%d, ->iOrder=%d\n", i, infoPtr->order[i], infoPtr->items[i].iOrder, infoPtr->items[infoPtr->order[i]].iOrder);
|
TRACE("%d: order=%d, iOrder=%d, ->iOrder=%d\n", i, infoPtr->order[i], infoPtr->items[i].iOrder, infoPtr->items[infoPtr->order[i]].iOrder);
|
||||||
|
|
||||||
iOrder = infoPtr->items[iItem].iOrder;
|
iOrder = infoPtr->items[iItem].iOrder;
|
||||||
Free(infoPtr->items[iItem].pszText);
|
heap_free(infoPtr->items[iItem].pszText);
|
||||||
|
|
||||||
infoPtr->uNumItem--;
|
infoPtr->uNumItem--;
|
||||||
memmove(&infoPtr->items[iItem], &infoPtr->items[iItem + 1],
|
memmove(&infoPtr->items[iItem], &infoPtr->items[iItem + 1],
|
||||||
(infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
|
(infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
|
||||||
memmove(&infoPtr->order[iOrder], &infoPtr->order[iOrder + 1],
|
memmove(&infoPtr->order[iOrder], &infoPtr->order[iOrder + 1],
|
||||||
(infoPtr->uNumItem - iOrder) * sizeof(INT));
|
(infoPtr->uNumItem - iOrder) * sizeof(INT));
|
||||||
infoPtr->items = ReAlloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
|
infoPtr->items = heap_realloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
|
||||||
infoPtr->order = ReAlloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
|
infoPtr->order = heap_realloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
|
||||||
|
|
||||||
/* Correct the orders */
|
/* Correct the orders */
|
||||||
for (i = 0; i < infoPtr->uNumItem; i++)
|
for (i = 0; i < infoPtr->uNumItem; i++)
|
||||||
|
@ -1405,8 +1420,8 @@ HEADER_InsertItemT (HEADER_INFO *infoPtr, INT nItem, const HDITEMW *phdi, BOOL b
|
||||||
iOrder = infoPtr->uNumItem;
|
iOrder = infoPtr->uNumItem;
|
||||||
|
|
||||||
infoPtr->uNumItem++;
|
infoPtr->uNumItem++;
|
||||||
infoPtr->items = ReAlloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
|
infoPtr->items = heap_realloc(infoPtr->items, sizeof(HEADER_ITEM) * infoPtr->uNumItem);
|
||||||
infoPtr->order = ReAlloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
|
infoPtr->order = heap_realloc(infoPtr->order, sizeof(INT) * infoPtr->uNumItem);
|
||||||
|
|
||||||
/* make space for the new item */
|
/* make space for the new item */
|
||||||
memmove(&infoPtr->items[nItem + 1], &infoPtr->items[nItem],
|
memmove(&infoPtr->items[nItem + 1], &infoPtr->items[nItem],
|
||||||
|
@ -1525,7 +1540,7 @@ HEADER_SetItemT (HEADER_INFO *infoPtr, INT nItem, const HDITEMW *phdi, BOOL bUni
|
||||||
HEADER_CopyHDItemForNotify(infoPtr, &hdNotify, phdi, bUnicode, &pvScratch);
|
HEADER_CopyHDItemForNotify(infoPtr, &hdNotify, phdi, bUnicode, &pvScratch);
|
||||||
if (HEADER_SendNotifyWithHDItemT(infoPtr, HDN_ITEMCHANGINGW, nItem, &hdNotify))
|
if (HEADER_SendNotifyWithHDItemT(infoPtr, HDN_ITEMCHANGINGW, nItem, &hdNotify))
|
||||||
{
|
{
|
||||||
Free(pvScratch);
|
heap_free(pvScratch);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1542,7 +1557,7 @@ HEADER_SetItemT (HEADER_INFO *infoPtr, INT nItem, const HDITEMW *phdi, BOOL bUni
|
||||||
|
|
||||||
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
|
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
|
||||||
|
|
||||||
Free(pvScratch);
|
heap_free(pvScratch);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1565,7 +1580,7 @@ HEADER_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
|
||||||
HFONT hOldFont;
|
HFONT hOldFont;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
|
||||||
infoPtr = Alloc (sizeof(HEADER_INFO));
|
infoPtr = heap_alloc_zero (sizeof(*infoPtr));
|
||||||
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
infoPtr->hwndSelf = hwnd;
|
infoPtr->hwndSelf = hwnd;
|
||||||
|
@ -1619,16 +1634,15 @@ HEADER_NCDestroy (HEADER_INFO *infoPtr)
|
||||||
|
|
||||||
if (infoPtr->items) {
|
if (infoPtr->items) {
|
||||||
lpItem = infoPtr->items;
|
lpItem = infoPtr->items;
|
||||||
for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
|
for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++)
|
||||||
Free(lpItem->pszText);
|
heap_free(lpItem->pszText);
|
||||||
}
|
heap_free(infoPtr->items);
|
||||||
Free (infoPtr->items);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Free(infoPtr->order);
|
heap_free(infoPtr->order);
|
||||||
|
|
||||||
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
||||||
Free (infoPtr);
|
heap_free(infoPtr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,17 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(hotkey);
|
WINE_DEFAULT_DEBUG_CHANNEL(hotkey);
|
||||||
|
|
||||||
|
@ -232,7 +242,7 @@ HOTKEY_Destroy (HOTKEY_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
/* free hotkey info data */
|
/* free hotkey info data */
|
||||||
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
||||||
Free (infoPtr);
|
heap_free (infoPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +411,7 @@ HOTKEY_NCCreate (HWND hwnd, const CREATESTRUCTW *lpcs)
|
||||||
dwExStyle | WS_EX_CLIENTEDGE);
|
dwExStyle | WS_EX_CLIENTEDGE);
|
||||||
|
|
||||||
/* allocate memory for info structure */
|
/* allocate memory for info structure */
|
||||||
infoPtr = Alloc (sizeof(HOTKEY_INFO));
|
infoPtr = heap_alloc_zero (sizeof(*infoPtr));
|
||||||
SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
/* initialize info structure */
|
/* initialize info structure */
|
||||||
|
|
|
@ -22,25 +22,30 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 12, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
* - Add support for ILD_PRESERVEALPHA, ILD_SCALE, ILD_DPISCALE
|
* - Add support for ILD_PRESERVEALPHA, ILD_SCALE, ILD_DPISCALE
|
||||||
* - Add support for ILS_GLOW, ILS_SHADOW
|
* - Add support for ILS_GLOW, ILS_SHADOW
|
||||||
* - Thread-safe locking
|
* - Thread-safe locking
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <commoncontrols.h>
|
#define COBJMACROS
|
||||||
#include <wine/exception.h>
|
|
||||||
|
#include "winerror.h"
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "objbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "commoncontrols.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/exception.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(imagelist);
|
WINE_DEFAULT_DEBUG_CHANNEL(imagelist);
|
||||||
|
|
||||||
|
@ -261,7 +266,7 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
|
||||||
SelectObject( hdc, hbmImage );
|
SelectObject( hdc, hbmImage );
|
||||||
mask_width = (bm.bmWidth + 31) / 32 * 4;
|
mask_width = (bm.bmWidth + 31) / 32 * 4;
|
||||||
|
|
||||||
if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
|
if (!(info = heap_alloc( FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
|
||||||
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
info->bmiHeader.biWidth = bm.bmWidth;
|
info->bmiHeader.biWidth = bm.bmWidth;
|
||||||
info->bmiHeader.biHeight = -height;
|
info->bmiHeader.biHeight = -height;
|
||||||
|
@ -273,17 +278,17 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
|
||||||
info->bmiHeader.biYPelsPerMeter = 0;
|
info->bmiHeader.biYPelsPerMeter = 0;
|
||||||
info->bmiHeader.biClrUsed = 0;
|
info->bmiHeader.biClrUsed = 0;
|
||||||
info->bmiHeader.biClrImportant = 0;
|
info->bmiHeader.biClrImportant = 0;
|
||||||
if (!(bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto done;
|
if (!(bits = heap_alloc( info->bmiHeader.biSizeImage ))) goto done;
|
||||||
if (!GetDIBits( hdc, hbmImage, 0, height, bits, info, DIB_RGB_COLORS )) goto done;
|
if (!GetDIBits( hdc, hbmImage, 0, height, bits, info, DIB_RGB_COLORS )) goto done;
|
||||||
|
|
||||||
if (hbmMask)
|
if (hbmMask)
|
||||||
{
|
{
|
||||||
if (!(mask_info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[2] ))))
|
if (!(mask_info = heap_alloc( FIELD_OFFSET( BITMAPINFO, bmiColors[2] ))))
|
||||||
goto done;
|
goto done;
|
||||||
mask_info->bmiHeader = info->bmiHeader;
|
mask_info->bmiHeader = info->bmiHeader;
|
||||||
mask_info->bmiHeader.biBitCount = 1;
|
mask_info->bmiHeader.biBitCount = 1;
|
||||||
mask_info->bmiHeader.biSizeImage = mask_width * height;
|
mask_info->bmiHeader.biSizeImage = mask_width * height;
|
||||||
if (!(mask_bits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mask_info->bmiHeader.biSizeImage )))
|
if (!(mask_bits = heap_alloc_zero( mask_info->bmiHeader.biSizeImage )))
|
||||||
goto done;
|
goto done;
|
||||||
if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS )) goto done;
|
if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS )) goto done;
|
||||||
}
|
}
|
||||||
|
@ -292,10 +297,10 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
HeapFree( GetProcessHeap(), 0, info );
|
heap_free( info );
|
||||||
HeapFree( GetProcessHeap(), 0, mask_info );
|
heap_free( mask_info );
|
||||||
HeapFree( GetProcessHeap(), 0, bits );
|
heap_free( bits );
|
||||||
HeapFree( GetProcessHeap(), 0, mask_bits );
|
heap_free( mask_bits );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,7 +383,7 @@ IMAGELIST_InternalExpandBitmaps(HIMAGELIST himl, INT nImageCount)
|
||||||
if (new_alpha) himl->has_alpha = new_alpha;
|
if (new_alpha) himl->has_alpha = new_alpha;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HeapFree( GetProcessHeap(), 0, himl->has_alpha );
|
heap_free( himl->has_alpha );
|
||||||
himl->has_alpha = NULL;
|
himl->has_alpha = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -849,7 +854,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
|
||||||
himl->hbmMask = 0;
|
himl->hbmMask = 0;
|
||||||
|
|
||||||
if (ilc == ILC_COLOR32)
|
if (ilc == ILC_COLOR32)
|
||||||
himl->has_alpha = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->cMaxImage );
|
himl->has_alpha = heap_alloc_zero( himl->cMaxImage );
|
||||||
else
|
else
|
||||||
himl->has_alpha = NULL;
|
himl->has_alpha = NULL;
|
||||||
|
|
||||||
|
@ -1260,7 +1265,7 @@ static BOOL alpha_blend_image( HIMAGELIST himl, HDC dest_dc, int dest_x, int des
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
if (!(hdc = CreateCompatibleDC( 0 ))) return FALSE;
|
if (!(hdc = CreateCompatibleDC( 0 ))) return FALSE;
|
||||||
if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
|
if (!(info = heap_alloc( FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
|
||||||
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
info->bmiHeader.biWidth = cx;
|
info->bmiHeader.biWidth = cx;
|
||||||
info->bmiHeader.biHeight = cy;
|
info->bmiHeader.biHeight = cy;
|
||||||
|
@ -1351,7 +1356,7 @@ done:
|
||||||
DeleteDC( hdc );
|
DeleteDC( hdc );
|
||||||
if (bmp) DeleteObject( bmp );
|
if (bmp) DeleteObject( bmp );
|
||||||
if (mask) DeleteObject( mask );
|
if (mask) DeleteObject( mask );
|
||||||
HeapFree( GetProcessHeap(), 0, info );
|
heap_free( info );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2066,11 +2071,11 @@ ImageList_LoadImageA (HINSTANCE hi, LPCSTR lpbmp, INT cx, INT cGrow,
|
||||||
uType, uFlags);
|
uType, uFlags);
|
||||||
|
|
||||||
len = MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, NULL, 0);
|
len = MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, NULL, 0);
|
||||||
lpbmpW = Alloc(len * sizeof(WCHAR));
|
lpbmpW = heap_alloc(len * sizeof(WCHAR));
|
||||||
MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, lpbmpW, len);
|
MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, lpbmpW, len);
|
||||||
|
|
||||||
himl = ImageList_LoadImageW(hi, lpbmpW, cx, cGrow, clrMask, uType, uFlags);
|
himl = ImageList_LoadImageW(hi, lpbmpW, cx, cGrow, clrMask, uType, uFlags);
|
||||||
Free (lpbmpW);
|
heap_free (lpbmpW);
|
||||||
return himl;
|
return himl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2311,12 +2316,12 @@ static void *read_bitmap(IStream *pstm, BITMAPINFO *bmi)
|
||||||
if (palspace && FAILED(IStream_Read(pstm, bmi->bmiColors, palspace, NULL)))
|
if (palspace && FAILED(IStream_Read(pstm, bmi->bmiColors, palspace, NULL)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
bits = Alloc(bmi->bmiHeader.biSizeImage);
|
bits = heap_alloc_zero(bmi->bmiHeader.biSizeImage);
|
||||||
if (!bits) return NULL;
|
if (!bits) return NULL;
|
||||||
|
|
||||||
if (FAILED(IStream_Read(pstm, bits, bmi->bmiHeader.biSizeImage, NULL)))
|
if (FAILED(IStream_Read(pstm, bits, bmi->bmiHeader.biSizeImage, NULL)))
|
||||||
{
|
{
|
||||||
Free(bits);
|
heap_free(bits);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return bits;
|
return bits;
|
||||||
|
@ -2428,8 +2433,8 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)
|
||||||
0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight,
|
0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight,
|
||||||
mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY);
|
mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY);
|
||||||
}
|
}
|
||||||
Free( image_bits );
|
heap_free( image_bits );
|
||||||
Free( mask_bits );
|
heap_free( mask_bits );
|
||||||
|
|
||||||
himl->cCurImage = ilHead.cCurImage;
|
himl->cCurImage = ilHead.cCurImage;
|
||||||
himl->cMaxImage = ilHead.cMaxImage;
|
himl->cMaxImage = ilHead.cMaxImage;
|
||||||
|
@ -2493,8 +2498,8 @@ ImageList_Remove (HIMAGELIST himl, INT i)
|
||||||
|
|
||||||
if (himl->has_alpha)
|
if (himl->has_alpha)
|
||||||
{
|
{
|
||||||
HeapFree( GetProcessHeap(), 0, himl->has_alpha );
|
heap_free( himl->has_alpha );
|
||||||
himl->has_alpha = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->cMaxImage );
|
himl->has_alpha = heap_alloc_zero( himl->cMaxImage );
|
||||||
}
|
}
|
||||||
|
|
||||||
hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
|
hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
|
||||||
|
@ -3041,7 +3046,7 @@ ImageList_SetImageCount (HIMAGELIST himl, UINT iImageCount)
|
||||||
if (new_alpha) himl->has_alpha = new_alpha;
|
if (new_alpha) himl->has_alpha = new_alpha;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HeapFree( GetProcessHeap(), 0, himl->has_alpha );
|
heap_free( himl->has_alpha );
|
||||||
himl->has_alpha = NULL;
|
himl->has_alpha = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3109,7 +3114,7 @@ static BOOL _write_bitmap(HBITMAP hBitmap, IStream *pstm)
|
||||||
offBits = totalSize;
|
offBits = totalSize;
|
||||||
totalSize += sizeImage;
|
totalSize += sizeImage;
|
||||||
|
|
||||||
data = Alloc(totalSize);
|
data = heap_alloc_zero(totalSize);
|
||||||
bmfh = (LPBITMAPFILEHEADER)data;
|
bmfh = (LPBITMAPFILEHEADER)data;
|
||||||
bmih = (LPBITMAPINFOHEADER)(data + sizeof(BITMAPFILEHEADER));
|
bmih = (LPBITMAPINFOHEADER)(data + sizeof(BITMAPFILEHEADER));
|
||||||
lpBits = data + offBits;
|
lpBits = data + offBits;
|
||||||
|
@ -3150,7 +3155,7 @@ static BOOL _write_bitmap(HBITMAP hBitmap, IStream *pstm)
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
Free(data);
|
heap_free(data);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -3387,8 +3392,8 @@ static ULONG WINAPI ImageListImpl_Release(IImageList2 *iface)
|
||||||
if (This->hbrBlend50) DeleteObject (This->hbrBlend50);
|
if (This->hbrBlend50) DeleteObject (This->hbrBlend50);
|
||||||
|
|
||||||
This->IImageList2_iface.lpVtbl = NULL;
|
This->IImageList2_iface.lpVtbl = NULL;
|
||||||
HeapFree(GetProcessHeap(), 0, This->has_alpha);
|
heap_free(This->has_alpha);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
heap_free(This);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
|
@ -3917,7 +3922,7 @@ static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID ii
|
||||||
|
|
||||||
if (pUnkOuter) return CLASS_E_NOAGGREGATION;
|
if (pUnkOuter) return CLASS_E_NOAGGREGATION;
|
||||||
|
|
||||||
This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct _IMAGELIST));
|
This = heap_alloc_zero(sizeof(struct _IMAGELIST));
|
||||||
if (!This) return E_OUTOFMEMORY;
|
if (!This) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
This->IImageList2_iface.lpVtbl = &ImageListImpl_Vtbl;
|
This->IImageList2_iface.lpVtbl = &ImageListImpl_Vtbl;
|
||||||
|
|
|
@ -20,19 +20,27 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vsstyle.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ipaddress);
|
WINE_DEFAULT_DEBUG_CHANNEL(ipaddress);
|
||||||
|
|
||||||
|
@ -211,7 +219,7 @@ static LRESULT IPADDRESS_Create (HWND hwnd, const CREATESTRUCTA *lpCreate)
|
||||||
SetWindowLongW (hwnd, GWL_STYLE,
|
SetWindowLongW (hwnd, GWL_STYLE,
|
||||||
GetWindowLongW(hwnd, GWL_STYLE) & ~WS_BORDER);
|
GetWindowLongW(hwnd, GWL_STYLE) & ~WS_BORDER);
|
||||||
|
|
||||||
infoPtr = Alloc (sizeof(IPADDRESS_INFO));
|
infoPtr = heap_alloc_zero (sizeof(*infoPtr));
|
||||||
if (!infoPtr) return -1;
|
if (!infoPtr) return -1;
|
||||||
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
|
@ -270,7 +278,7 @@ static LRESULT IPADDRESS_Destroy (IPADDRESS_INFO *infoPtr)
|
||||||
}
|
}
|
||||||
|
|
||||||
SetWindowLongPtrW (infoPtr->Self, 0, 0);
|
SetWindowLongPtrW (infoPtr->Self, 0, 0);
|
||||||
Free (infoPtr);
|
heap_free (infoPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3083
dll/win32/comctl32/listbox.c
Normal file
3083
dll/win32/comctl32/listbox.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -24,15 +24,6 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTES
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on May. 20, 2005, by James Hawkins.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
*
|
*
|
||||||
* Default Message Processing
|
* Default Message Processing
|
||||||
|
@ -133,10 +124,29 @@
|
||||||
* -- LVGroupComparE
|
* -- LVGroupComparE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winnt.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(listview);
|
WINE_DEFAULT_DEBUG_CHANNEL(listview);
|
||||||
|
|
||||||
typedef struct tagCOLUMN_INFO
|
typedef struct tagCOLUMN_INFO
|
||||||
|
@ -1055,7 +1065,7 @@ static void prepaint_setup (const LISTVIEW_INFO *infoPtr, HDC hdc, NMLVCUSTOMDRA
|
||||||
COLORREF backcolor, textcolor;
|
COLORREF backcolor, textcolor;
|
||||||
|
|
||||||
/* apparently, for selected items, we have to override the returned values */
|
/* apparently, for selected items, we have to override the returned values */
|
||||||
if (!SubItem)
|
if (!SubItem || (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
|
||||||
{
|
{
|
||||||
if (lpnmlvcd->nmcd.uItemState & CDIS_SELECTED)
|
if (lpnmlvcd->nmcd.uItemState & CDIS_SELECTED)
|
||||||
{
|
{
|
||||||
|
@ -4788,6 +4798,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, ITERAT
|
||||||
while (iterator_next(subitems))
|
while (iterator_next(subitems))
|
||||||
{
|
{
|
||||||
DWORD subitemstage = CDRF_DODEFAULT;
|
DWORD subitemstage = CDRF_DODEFAULT;
|
||||||
|
NMLVCUSTOMDRAW temp_nmlvcd;
|
||||||
|
|
||||||
/* We need to query for each subitem, item's data (subitem == 0) is already here at this point */
|
/* We need to query for each subitem, item's data (subitem == 0) is already here at this point */
|
||||||
if (subitems->nItem)
|
if (subitems->nItem)
|
||||||
|
@ -4814,19 +4825,16 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, ITERAT
|
||||||
|
|
||||||
if (cdsubitemmode & CDRF_NOTIFYSUBITEMDRAW)
|
if (cdsubitemmode & CDRF_NOTIFYSUBITEMDRAW)
|
||||||
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPREPAINT, &nmlvcd);
|
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPREPAINT, &nmlvcd);
|
||||||
else
|
|
||||||
{
|
|
||||||
nmlvcd.clrTextBk = infoPtr->clrTextBk;
|
|
||||||
nmlvcd.clrText = infoPtr->clrText;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (subitems->nItem == 0 || (cdmode & CDRF_NOTIFYITEMDRAW))
|
/*
|
||||||
prepaint_setup(infoPtr, hdc, &nmlvcd, FALSE);
|
* A selection should neither affect the colors in the post paint notification nor
|
||||||
else if (!(infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
|
* affect the colors of the next drawn subitem. Copy the structure to prevent this.
|
||||||
prepaint_setup(infoPtr, hdc, &nmlvcd, TRUE);
|
*/
|
||||||
|
temp_nmlvcd = nmlvcd;
|
||||||
|
prepaint_setup(infoPtr, hdc, &temp_nmlvcd, subitems->nItem);
|
||||||
|
|
||||||
if (!(subitemstage & CDRF_SKIPDEFAULT))
|
if (!(subitemstage & CDRF_SKIPDEFAULT))
|
||||||
LISTVIEW_DrawItemPart(infoPtr, &lvItem, &nmlvcd, &pos);
|
LISTVIEW_DrawItemPart(infoPtr, &lvItem, &temp_nmlvcd, &pos);
|
||||||
|
|
||||||
if (subitemstage & CDRF_NOTIFYPOSTPAINT)
|
if (subitemstage & CDRF_NOTIFYPOSTPAINT)
|
||||||
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPOSTPAINT, &nmlvcd);
|
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM | CDDS_ITEMPOSTPAINT, &nmlvcd);
|
||||||
|
@ -6688,6 +6696,9 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
|
||||||
/* make a local copy */
|
/* make a local copy */
|
||||||
isubitem = lpLVItem->iSubItem;
|
isubitem = lpLVItem->iSubItem;
|
||||||
|
|
||||||
|
if (isubitem && (lpLVItem->mask & LVIF_STATE))
|
||||||
|
lpLVItem->state = 0;
|
||||||
|
|
||||||
/* a quick optimization if all we're asked is the focus state
|
/* a quick optimization if all we're asked is the focus state
|
||||||
* these queries are worth optimising since they are common,
|
* these queries are worth optimising since they are common,
|
||||||
* and can be answered in constant time, without the heavy accesses */
|
* and can be answered in constant time, without the heavy accesses */
|
||||||
|
@ -6695,7 +6706,7 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
|
||||||
!(infoPtr->uCallbackMask & LVIS_FOCUSED) )
|
!(infoPtr->uCallbackMask & LVIS_FOCUSED) )
|
||||||
{
|
{
|
||||||
lpLVItem->state = 0;
|
lpLVItem->state = 0;
|
||||||
if (infoPtr->nFocusedItem == lpLVItem->iItem)
|
if (infoPtr->nFocusedItem == lpLVItem->iItem && isubitem == 0)
|
||||||
lpLVItem->state |= LVIS_FOCUSED;
|
lpLVItem->state |= LVIS_FOCUSED;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -11908,7 +11919,7 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
|
||||||
SIZE sz;
|
SIZE sz;
|
||||||
|
|
||||||
if (!infoPtr->hwndEdit || !hdc) return 0;
|
if (!infoPtr->hwndEdit || !hdc) return 0;
|
||||||
GetWindowTextW(infoPtr->hwndEdit, buffer, sizeof(buffer)/sizeof(buffer[0]));
|
GetWindowTextW(infoPtr->hwndEdit, buffer, ARRAY_SIZE(buffer));
|
||||||
GetWindowRect(infoPtr->hwndEdit, &rect);
|
GetWindowRect(infoPtr->hwndEdit, &rect);
|
||||||
|
|
||||||
/* Select font to get the right dimension of the string */
|
/* Select font to get the right dimension of the string */
|
||||||
|
|
|
@ -22,15 +22,6 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Oct. 20, 2004, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
* -- MCM_[GS]ETUNICODEFORMAT
|
* -- MCM_[GS]ETUNICODEFORMAT
|
||||||
* -- handle resources better (doesn't work now);
|
* -- handle resources better (doesn't work now);
|
||||||
|
@ -39,7 +30,24 @@
|
||||||
* -- search for FIXME
|
* -- search for FIXME
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(monthcal);
|
WINE_DEFAULT_DEBUG_CHANNEL(monthcal);
|
||||||
|
|
||||||
|
@ -60,8 +68,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(monthcal);
|
||||||
|
|
||||||
#define MC_CALENDAR_PADDING 6
|
#define MC_CALENDAR_PADDING 6
|
||||||
|
|
||||||
#define countof(arr) (sizeof(arr)/sizeof(arr[0]))
|
|
||||||
|
|
||||||
/* convert from days to 100 nanoseconds unit - used as FILETIME unit */
|
/* convert from days to 100 nanoseconds unit - used as FILETIME unit */
|
||||||
#define DAYSTO100NSECS(days) (((ULONGLONG)(days))*24*60*60*10000000)
|
#define DAYSTO100NSECS(days) (((ULONGLONG)(days))*24*60*60*10000000)
|
||||||
|
|
||||||
|
@ -881,18 +887,18 @@ static void MONTHCAL_PaintTitle(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRU
|
||||||
SelectObject(hdc, infoPtr->hBoldFont);
|
SelectObject(hdc, infoPtr->hBoldFont);
|
||||||
|
|
||||||
/* draw formatted date string */
|
/* draw formatted date string */
|
||||||
GetDateFormatW(LOCALE_USER_DEFAULT, DATE_YEARMONTH, st, NULL, strW, countof(strW));
|
GetDateFormatW(LOCALE_USER_DEFAULT, DATE_YEARMONTH, st, NULL, strW, ARRAY_SIZE(strW));
|
||||||
DrawTextW(hdc, strW, strlenW(strW), title, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
DrawTextW(hdc, strW, strlenW(strW), title, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
||||||
|
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SYEARMONTH, fmtW, countof(fmtW));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SYEARMONTH, fmtW, ARRAY_SIZE(fmtW));
|
||||||
wsprintfW(yearW, fmtyearW, st->wYear);
|
wsprintfW(yearW, fmtyearW, st->wYear);
|
||||||
|
|
||||||
/* month is trickier as it's possible to have different format pictures, we'll
|
/* month is trickier as it's possible to have different format pictures, we'll
|
||||||
test for M, MM, MMM, and MMMM */
|
test for M, MM, MMM, and MMMM */
|
||||||
if (strstrW(fmtW, mmmmW))
|
if (strstrW(fmtW, mmmmW))
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+st->wMonth-1, monthW, countof(monthW));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+st->wMonth-1, monthW, ARRAY_SIZE(monthW));
|
||||||
else if (strstrW(fmtW, mmmW))
|
else if (strstrW(fmtW, mmmW))
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1+st->wMonth-1, monthW, countof(monthW));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1+st->wMonth-1, monthW, ARRAY_SIZE(monthW));
|
||||||
else if (strstrW(fmtW, mmW))
|
else if (strstrW(fmtW, mmW))
|
||||||
wsprintfW(monthW, fmtmmW, st->wMonth);
|
wsprintfW(monthW, fmtmmW, st->wMonth);
|
||||||
else
|
else
|
||||||
|
@ -970,7 +976,7 @@ static void MONTHCAL_PaintWeeknumbers(const MONTHCAL_INFO *infoPtr, HDC hdc, con
|
||||||
LOCALE_IFIRSTWEEKOFYEAR == 1 (what countries?)
|
LOCALE_IFIRSTWEEKOFYEAR == 1 (what countries?)
|
||||||
The first week of the year must contain only days of the new year
|
The first week of the year must contain only days of the new year
|
||||||
*/
|
*/
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, buf, countof(buf));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, buf, ARRAY_SIZE(buf));
|
||||||
weeknum = atoiW(buf);
|
weeknum = atoiW(buf);
|
||||||
switch (weeknum)
|
switch (weeknum)
|
||||||
{
|
{
|
||||||
|
@ -1062,15 +1068,14 @@ static void MONTHCAL_PaintTodayTitle(const MONTHCAL_INFO *infoPtr, HDC hdc, cons
|
||||||
|
|
||||||
if(infoPtr->dwStyle & MCS_NOTODAY) return;
|
if(infoPtr->dwStyle & MCS_NOTODAY) return;
|
||||||
|
|
||||||
LoadStringW(COMCTL32_hModule, IDM_TODAY, buf_todayW, countof(buf_todayW));
|
LoadStringW(COMCTL32_hModule, IDM_TODAY, buf_todayW, ARRAY_SIZE(buf_todayW));
|
||||||
col = infoPtr->dwStyle & MCS_NOTODAYCIRCLE ? 0 : 1;
|
col = infoPtr->dwStyle & MCS_NOTODAYCIRCLE ? 0 : 1;
|
||||||
if (infoPtr->dwStyle & MCS_WEEKNUMBERS) col--;
|
if (infoPtr->dwStyle & MCS_WEEKNUMBERS) col--;
|
||||||
/* label is located below first calendar last row */
|
/* label is located below first calendar last row */
|
||||||
MONTHCAL_GetDayRectI(infoPtr, &text_rect, col, 6, infoPtr->dim.cx * infoPtr->dim.cy - infoPtr->dim.cx);
|
MONTHCAL_GetDayRectI(infoPtr, &text_rect, col, 6, infoPtr->dim.cx * infoPtr->dim.cy - infoPtr->dim.cx);
|
||||||
box_rect = text_rect;
|
box_rect = text_rect;
|
||||||
|
|
||||||
GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &infoPtr->todaysDate, NULL,
|
GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &infoPtr->todaysDate, NULL, buf_dateW, ARRAY_SIZE(buf_dateW));
|
||||||
buf_dateW, countof(buf_dateW));
|
|
||||||
old_font = SelectObject(hdc, infoPtr->hBoldFont);
|
old_font = SelectObject(hdc, infoPtr->hBoldFont);
|
||||||
SetTextColor(hdc, infoPtr->colors[MCSC_TEXT]);
|
SetTextColor(hdc, infoPtr->colors[MCSC_TEXT]);
|
||||||
|
|
||||||
|
@ -1202,7 +1207,7 @@ static void MONTHCAL_PaintCalendar(const MONTHCAL_INFO *infoPtr, HDC hdc, const
|
||||||
|
|
||||||
i = infoPtr->firstDay;
|
i = infoPtr->firstDay;
|
||||||
for(j = 0; j < 7; j++) {
|
for(j = 0; j < 7; j++) {
|
||||||
get_localized_dayname(infoPtr, (i + j + 6) % 7, buf, countof(buf));
|
get_localized_dayname(infoPtr, (i + j + 6) % 7, buf, ARRAY_SIZE(buf));
|
||||||
DrawTextW(hdc, buf, strlenW(buf), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
DrawTextW(hdc, buf, strlenW(buf), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
||||||
OffsetRect(&r, infoPtr->width_increment, 0);
|
OffsetRect(&r, infoPtr->width_increment, 0);
|
||||||
}
|
}
|
||||||
|
@ -1408,7 +1413,7 @@ MONTHCAL_SetFirstDayOfWeek(MONTHCAL_INFO *infoPtr, INT day)
|
||||||
{
|
{
|
||||||
WCHAR buf[80];
|
WCHAR buf[80];
|
||||||
|
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, buf, countof(buf));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, buf, ARRAY_SIZE(buf));
|
||||||
TRACE("%s %d\n", debugstr_w(buf), strlenW(buf));
|
TRACE("%s %d\n", debugstr_w(buf), strlenW(buf));
|
||||||
|
|
||||||
new_day = atoiW(buf);
|
new_day = atoiW(buf);
|
||||||
|
@ -1953,7 +1958,7 @@ static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
|
||||||
nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
|
nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
|
||||||
nmds.nmhdr.code = MCN_GETDAYSTATE;
|
nmds.nmhdr.code = MCN_GETDAYSTATE;
|
||||||
nmds.cDayState = MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0);
|
nmds.cDayState = MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0);
|
||||||
nmds.prgDayState = state = Alloc(nmds.cDayState * sizeof(MONTHDAYSTATE));
|
nmds.prgDayState = state = heap_alloc_zero(nmds.cDayState * sizeof(MONTHDAYSTATE));
|
||||||
|
|
||||||
MONTHCAL_GetMinDate(infoPtr, &nmds.stStart);
|
MONTHCAL_GetMinDate(infoPtr, &nmds.stStart);
|
||||||
nmds.stStart.wDay = 1;
|
nmds.stStart.wDay = 1;
|
||||||
|
@ -1962,7 +1967,7 @@ static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
|
||||||
memcpy(infoPtr->monthdayState, nmds.prgDayState,
|
memcpy(infoPtr->monthdayState, nmds.prgDayState,
|
||||||
MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
|
MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
|
||||||
|
|
||||||
Free(state);
|
heap_free(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no valid range check performed */
|
/* no valid range check performed */
|
||||||
|
@ -2038,7 +2043,7 @@ MONTHCAL_RButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
|
||||||
WCHAR buf[32];
|
WCHAR buf[32];
|
||||||
|
|
||||||
hMenu = CreatePopupMenu();
|
hMenu = CreatePopupMenu();
|
||||||
LoadStringW(COMCTL32_hModule, IDM_GOTODAY, buf, countof(buf));
|
LoadStringW(COMCTL32_hModule, IDM_GOTODAY, buf, ARRAY_SIZE(buf));
|
||||||
AppendMenuW(hMenu, MF_STRING|MF_ENABLED, 1, buf);
|
AppendMenuW(hMenu, MF_STRING|MF_ENABLED, 1, buf);
|
||||||
menupoint.x = (short)LOWORD(lParam);
|
menupoint.x = (short)LOWORD(lParam);
|
||||||
menupoint.y = (short)HIWORD(lParam);
|
menupoint.y = (short)HIWORD(lParam);
|
||||||
|
@ -2194,7 +2199,7 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
|
||||||
|
|
||||||
for (i = 0; i < 12; i++)
|
for (i = 0; i < 12; i++)
|
||||||
{
|
{
|
||||||
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+i, buf, countof(buf));
|
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+i, buf, ARRAY_SIZE(buf));
|
||||||
AppendMenuW(hMenu, MF_STRING|MF_ENABLED, i + 1, buf);
|
AppendMenuW(hMenu, MF_STRING|MF_ENABLED, i + 1, buf);
|
||||||
}
|
}
|
||||||
menupoint.x = ht.pt.x;
|
menupoint.x = ht.pt.x;
|
||||||
|
@ -2517,7 +2522,7 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
SIZE sz;
|
SIZE sz;
|
||||||
|
|
||||||
if (get_localized_dayname(infoPtr, i, buff, countof(buff)))
|
if (get_localized_dayname(infoPtr, i, buff, ARRAY_SIZE(buff)))
|
||||||
{
|
{
|
||||||
GetTextExtentPoint32W(hdc, buff, lstrlenW(buff), &sz);
|
GetTextExtentPoint32W(hdc, buff, lstrlenW(buff), &sz);
|
||||||
if (sz.cx > day_width) day_width = sz.cx;
|
if (sz.cx > day_width) day_width = sz.cx;
|
||||||
|
@ -2525,7 +2530,7 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
|
||||||
else /* locale independent fallback on failure */
|
else /* locale independent fallback on failure */
|
||||||
{
|
{
|
||||||
static const WCHAR sunW[] = { 'S','u','n' };
|
static const WCHAR sunW[] = { 'S','u','n' };
|
||||||
GetTextExtentPoint32W(hdc, sunW, countof(sunW), &sz);
|
GetTextExtentPoint32W(hdc, sunW, ARRAY_SIZE(sunW), &sz);
|
||||||
day_width = sz.cx;
|
day_width = sz.cx;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2602,9 +2607,9 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
infoPtr->dim.cx = x;
|
infoPtr->dim.cx = x;
|
||||||
infoPtr->dim.cy = y;
|
infoPtr->dim.cy = y;
|
||||||
infoPtr->calendars = ReAlloc(infoPtr->calendars, MONTHCAL_GetCalCount(infoPtr)*sizeof(CALENDAR_INFO));
|
infoPtr->calendars = heap_realloc(infoPtr->calendars, MONTHCAL_GetCalCount(infoPtr)*sizeof(CALENDAR_INFO));
|
||||||
|
|
||||||
infoPtr->monthdayState = ReAlloc(infoPtr->monthdayState,
|
infoPtr->monthdayState = heap_realloc(infoPtr->monthdayState,
|
||||||
MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
|
MONTHCAL_GetMonthRange(infoPtr, GMR_DAYSTATE, 0)*sizeof(MONTHDAYSTATE));
|
||||||
MONTHCAL_NotifyDayState(infoPtr);
|
MONTHCAL_NotifyDayState(infoPtr);
|
||||||
|
|
||||||
|
@ -2760,7 +2765,7 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
|
||||||
MONTHCAL_INFO *infoPtr;
|
MONTHCAL_INFO *infoPtr;
|
||||||
|
|
||||||
/* allocate memory for info structure */
|
/* allocate memory for info structure */
|
||||||
infoPtr = Alloc(sizeof(MONTHCAL_INFO));
|
infoPtr = heap_alloc_zero(sizeof(*infoPtr));
|
||||||
SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
if (infoPtr == NULL) {
|
if (infoPtr == NULL) {
|
||||||
|
@ -2772,9 +2777,9 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
|
||||||
infoPtr->hwndNotify = lpcs->hwndParent;
|
infoPtr->hwndNotify = lpcs->hwndParent;
|
||||||
infoPtr->dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
|
infoPtr->dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
|
||||||
infoPtr->dim.cx = infoPtr->dim.cy = 1;
|
infoPtr->dim.cx = infoPtr->dim.cy = 1;
|
||||||
infoPtr->calendars = Alloc(sizeof(CALENDAR_INFO));
|
infoPtr->calendars = heap_alloc_zero(sizeof(CALENDAR_INFO));
|
||||||
if (!infoPtr->calendars) goto fail;
|
if (!infoPtr->calendars) goto fail;
|
||||||
infoPtr->monthdayState = Alloc(3*sizeof(MONTHDAYSTATE));
|
infoPtr->monthdayState = heap_alloc_zero(3 * sizeof(MONTHDAYSTATE));
|
||||||
if (!infoPtr->monthdayState) goto fail;
|
if (!infoPtr->monthdayState) goto fail;
|
||||||
|
|
||||||
/* initialize info structure */
|
/* initialize info structure */
|
||||||
|
@ -2815,9 +2820,9 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
Free(infoPtr->monthdayState);
|
heap_free(infoPtr->monthdayState);
|
||||||
Free(infoPtr->calendars);
|
heap_free(infoPtr->calendars);
|
||||||
Free(infoPtr);
|
heap_free(infoPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2827,8 +2832,8 @@ MONTHCAL_Destroy(MONTHCAL_INFO *infoPtr)
|
||||||
INT i;
|
INT i;
|
||||||
|
|
||||||
/* free month calendar info data */
|
/* free month calendar info data */
|
||||||
Free(infoPtr->monthdayState);
|
heap_free(infoPtr->monthdayState);
|
||||||
Free(infoPtr->calendars);
|
heap_free(infoPtr->calendars);
|
||||||
SetWindowLongPtrW(infoPtr->hwndSelf, 0, 0);
|
SetWindowLongPtrW(infoPtr->hwndSelf, 0, 0);
|
||||||
|
|
||||||
CloseThemeData (GetWindowTheme (infoPtr->hwndSelf));
|
CloseThemeData (GetWindowTheme (infoPtr->hwndSelf));
|
||||||
|
@ -2836,7 +2841,7 @@ MONTHCAL_Destroy(MONTHCAL_INFO *infoPtr)
|
||||||
for (i = 0; i < BrushLast; i++) DeleteObject(infoPtr->brushes[i]);
|
for (i = 0; i < BrushLast; i++) DeleteObject(infoPtr->brushes[i]);
|
||||||
for (i = 0; i < PenLast; i++) DeleteObject(infoPtr->pens[i]);
|
for (i = 0; i < PenLast; i++) DeleteObject(infoPtr->pens[i]);
|
||||||
|
|
||||||
Free(infoPtr);
|
heap_free(infoPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,15 @@
|
||||||
* - All notifications.
|
* - All notifications.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(nativefont);
|
WINE_DEFAULT_DEBUG_CHANNEL(nativefont);
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,17 @@
|
||||||
* Robert Shearman <rob@codeweavers.com>
|
* Robert Shearman <rob@codeweavers.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(pager);
|
WINE_DEFAULT_DEBUG_CHANNEL(pager);
|
||||||
|
|
||||||
|
@ -547,7 +557,7 @@ PAGER_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
|
||||||
PAGER_INFO *infoPtr;
|
PAGER_INFO *infoPtr;
|
||||||
|
|
||||||
/* allocate memory for info structure */
|
/* allocate memory for info structure */
|
||||||
infoPtr = Alloc (sizeof(PAGER_INFO));
|
infoPtr = heap_alloc_zero (sizeof(*infoPtr));
|
||||||
if (!infoPtr) return -1;
|
if (!infoPtr) return -1;
|
||||||
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
|
@ -579,7 +589,7 @@ static LRESULT
|
||||||
PAGER_Destroy (PAGER_INFO *infoPtr)
|
PAGER_Destroy (PAGER_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
|
||||||
Free (infoPtr); /* free pager info data */
|
heap_free (infoPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
dll/win32/comctl32/precomp.h
Normal file
28
dll/win32/comctl32/precomp.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
#ifndef _WINE_COMCTL32_PRECOMP_H
|
||||||
|
#define _WINE_COMCTL32_PRECOMP_H
|
||||||
|
|
||||||
|
#include <wine/config.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#define _INC_WINDOWS
|
||||||
|
#define COM_NO_WINDOWS_H
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
#define NONAMELESSSTRUCT
|
||||||
|
|
||||||
|
#include "comctl32.h"
|
||||||
|
|
||||||
|
#include <winreg.h>
|
||||||
|
#include <objbase.h>
|
||||||
|
#include <uxtheme.h>
|
||||||
|
#include <vssym32.h>
|
||||||
|
|
||||||
|
#include <wine/debug.h>
|
||||||
|
#include <wine/heap.h>
|
||||||
|
#include <wine/list.h>
|
||||||
|
#include <wine/unicode.h>
|
||||||
|
|
||||||
|
#endif /* !_WINE_COMCTL32_PRECOMP_H */
|
|
@ -18,15 +18,6 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
*
|
*
|
||||||
* Styles:
|
* Styles:
|
||||||
|
@ -34,7 +25,19 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(progress);
|
WINE_DEFAULT_DEBUG_CHANNEL(progress);
|
||||||
|
|
||||||
|
@ -551,7 +554,7 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
|
||||||
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
|
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
|
||||||
/* allocate memory for info struct */
|
/* allocate memory for info struct */
|
||||||
infoPtr = Alloc (sizeof(PROGRESS_INFO));
|
infoPtr = heap_alloc_zero (sizeof(*infoPtr));
|
||||||
if (!infoPtr) return -1;
|
if (!infoPtr) return -1;
|
||||||
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
|
@ -573,7 +576,7 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
TRACE("Progress Ctrl destruction, hwnd=%p\n", hwnd);
|
TRACE("Progress Ctrl destruction, hwnd=%p\n", hwnd);
|
||||||
Free (infoPtr);
|
heap_free (infoPtr);
|
||||||
SetWindowLongPtrW(hwnd, 0, 0);
|
SetWindowLongPtrW(hwnd, 0, 0);
|
||||||
theme = GetWindowTheme (hwnd);
|
theme = GetWindowTheme (hwnd);
|
||||||
CloseThemeData (theme);
|
CloseThemeData (theme);
|
||||||
|
@ -652,8 +655,14 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
|
||||||
INT oldVal;
|
INT oldVal;
|
||||||
oldVal = infoPtr->CurVal;
|
oldVal = infoPtr->CurVal;
|
||||||
infoPtr->CurVal += infoPtr->Step;
|
infoPtr->CurVal += infoPtr->Step;
|
||||||
if(infoPtr->CurVal > infoPtr->MaxVal)
|
if (infoPtr->CurVal > infoPtr->MaxVal)
|
||||||
infoPtr->CurVal = infoPtr->MinVal;
|
{
|
||||||
|
infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % (infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MinVal;
|
||||||
|
}
|
||||||
|
if (infoPtr->CurVal < infoPtr->MinVal)
|
||||||
|
{
|
||||||
|
infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % (infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MaxVal;
|
||||||
|
}
|
||||||
if(oldVal != infoPtr->CurVal)
|
if(oldVal != infoPtr->CurVal)
|
||||||
{
|
{
|
||||||
TRACE("PBM_STEPIT: current pos changed from %d to %d\n", oldVal, infoPtr->CurVal);
|
TRACE("PBM_STEPIT: current pos changed from %d to %d\n", oldVal, infoPtr->CurVal);
|
||||||
|
|
|
@ -49,7 +49,23 @@
|
||||||
* o PSP_USEREFPARENT
|
* o PSP_USEREFPARENT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "prsht.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Data structures
|
* Data structures
|
||||||
|
@ -535,7 +551,7 @@ static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp,
|
||||||
|
|
||||||
if (IS_INTRESOURCE( lppsp->pszTitle ))
|
if (IS_INTRESOURCE( lppsp->pszTitle ))
|
||||||
{
|
{
|
||||||
if (LoadStringW( lppsp->hInstance, (DWORD_PTR)lppsp->pszTitle, szTitle, sizeof(szTitle)/sizeof(szTitle[0]) ))
|
if (LoadStringW( lppsp->hInstance, (DWORD_PTR)lppsp->pszTitle, szTitle, ARRAY_SIZE(szTitle)))
|
||||||
pTitle = szTitle;
|
pTitle = szTitle;
|
||||||
else if (*p)
|
else if (*p)
|
||||||
pTitle = p;
|
pTitle = p;
|
||||||
|
@ -2099,8 +2115,7 @@ static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
|
||||||
if(!IS_INTRESOURCE(lpszText))
|
if(!IS_INTRESOURCE(lpszText))
|
||||||
{
|
{
|
||||||
WCHAR szTitle[256];
|
WCHAR szTitle[256];
|
||||||
MultiByteToWideChar(CP_ACP, 0, lpszText, -1,
|
MultiByteToWideChar(CP_ACP, 0, lpszText, -1, szTitle, ARRAY_SIZE(szTitle));
|
||||||
szTitle, sizeof(szTitle)/sizeof(WCHAR));
|
|
||||||
PROPSHEET_SetTitleW(hwndDlg, dwStyle, szTitle);
|
PROPSHEET_SetTitleW(hwndDlg, dwStyle, szTitle);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2119,8 +2134,7 @@ static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
|
||||||
|
|
||||||
TRACE("%s (style %08x)\n", debugstr_w(lpszText), dwStyle);
|
TRACE("%s (style %08x)\n", debugstr_w(lpszText), dwStyle);
|
||||||
if (IS_INTRESOURCE(lpszText)) {
|
if (IS_INTRESOURCE(lpszText)) {
|
||||||
if (!LoadStringW(psInfo->ppshheader.hInstance,
|
if (!LoadStringW(psInfo->ppshheader.hInstance, LOWORD(lpszText), szTitle, ARRAY_SIZE(szTitle)))
|
||||||
LOWORD(lpszText), szTitle, sizeof(szTitle)/sizeof(szTitle[0])))
|
|
||||||
return;
|
return;
|
||||||
lpszText = szTitle;
|
lpszText = szTitle;
|
||||||
}
|
}
|
||||||
|
@ -3708,7 +3722,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
|
HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
|
||||||
|
|
||||||
EnableWindow(hwndCancel, FALSE);
|
EnableWindow(hwndCancel, FALSE);
|
||||||
if (LoadStringW(COMCTL32_hModule, IDS_CLOSE, buf, sizeof(buf)/sizeof(buf[0])))
|
if (LoadStringW(COMCTL32_hModule, IDS_CLOSE, buf, ARRAY_SIZE(buf)))
|
||||||
SetWindowTextW(hwndOK, buf);
|
SetWindowTextW(hwndOK, buf);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -76,7 +76,22 @@
|
||||||
* at least RB_INSERTBAND
|
* at least RB_INSERTBAND
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(rebar);
|
WINE_DEFAULT_DEBUG_CHANNEL(rebar);
|
||||||
|
|
||||||
|
@ -1039,7 +1054,7 @@ REBAR_MoveChildWindows (const REBAR_INFO *infoPtr, UINT start, UINT endplus)
|
||||||
lpBand->rcChild = rbcz.rcChild; /* *** ??? */
|
lpBand->rcChild = rbcz.rcChild; /* *** ??? */
|
||||||
}
|
}
|
||||||
|
|
||||||
GetClassNameW (lpBand->hwndChild, szClassName, sizeof(szClassName)/sizeof(szClassName[0]));
|
GetClassNameW (lpBand->hwndChild, szClassName, ARRAY_SIZE(szClassName));
|
||||||
if (!lstrcmpW (szClassName, strComboBox) ||
|
if (!lstrcmpW (szClassName, strComboBox) ||
|
||||||
!lstrcmpW (szClassName, WC_COMBOBOXEXW)) {
|
!lstrcmpW (szClassName, WC_COMBOBOXEXW)) {
|
||||||
INT nEditHeight, yPos;
|
INT nEditHeight, yPos;
|
||||||
|
|
|
@ -19,11 +19,8 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <windef.h>
|
#include "comctl32.h"
|
||||||
#include <winuser.h>
|
|
||||||
#include <commctrl.h>
|
|
||||||
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,14 @@
|
||||||
* - actually add smooth scrolling
|
* - actually add smooth scrolling
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winreg.h"
|
||||||
|
#include "winerror.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
|
|
793
dll/win32/comctl32/static.c
Normal file
793
dll/win32/comctl32/static.c
Normal file
|
@ -0,0 +1,793 @@
|
||||||
|
/*
|
||||||
|
* Static control
|
||||||
|
*
|
||||||
|
* Copyright David W. Metcalfe, 1993
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* - Windows XP introduced new behavior: The background of centered
|
||||||
|
* icons and bitmaps is painted differently. This is only done if
|
||||||
|
* a manifest is present.
|
||||||
|
* Because it has not yet been decided how to implement the two
|
||||||
|
* different modes in Wine, only the Windows XP mode is implemented.
|
||||||
|
* - Controls with SS_SIMPLE but without SS_NOPREFIX:
|
||||||
|
* The text should not be changed. Windows doesn't clear the
|
||||||
|
* client rectangle, so the new text must be larger than the old one.
|
||||||
|
* - The SS_RIGHTJUST style is currently not implemented by Windows
|
||||||
|
* (or it does something different than documented).
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* - Animated cursors
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
#include "comctl32.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(static);
|
||||||
|
|
||||||
|
static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
|
||||||
|
/* offsets for GetWindowLong for static private information */
|
||||||
|
#define HFONT_GWL_OFFSET 0
|
||||||
|
#define HICON_GWL_OFFSET (sizeof(HFONT))
|
||||||
|
#define STATIC_EXTRA_BYTES (HICON_GWL_OFFSET + sizeof(HICON))
|
||||||
|
|
||||||
|
typedef void (*pfPaint)( HWND hwnd, HDC hdc, DWORD style );
|
||||||
|
|
||||||
|
static const pfPaint staticPaintFunc[SS_TYPEMASK+1] =
|
||||||
|
{
|
||||||
|
STATIC_PaintTextfn, /* SS_LEFT */
|
||||||
|
STATIC_PaintTextfn, /* SS_CENTER */
|
||||||
|
STATIC_PaintTextfn, /* SS_RIGHT */
|
||||||
|
STATIC_PaintIconfn, /* SS_ICON */
|
||||||
|
STATIC_PaintRectfn, /* SS_BLACKRECT */
|
||||||
|
STATIC_PaintRectfn, /* SS_GRAYRECT */
|
||||||
|
STATIC_PaintRectfn, /* SS_WHITERECT */
|
||||||
|
STATIC_PaintRectfn, /* SS_BLACKFRAME */
|
||||||
|
STATIC_PaintRectfn, /* SS_GRAYFRAME */
|
||||||
|
STATIC_PaintRectfn, /* SS_WHITEFRAME */
|
||||||
|
NULL, /* SS_USERITEM */
|
||||||
|
STATIC_PaintTextfn, /* SS_SIMPLE */
|
||||||
|
STATIC_PaintTextfn, /* SS_LEFTNOWORDWRAP */
|
||||||
|
STATIC_PaintOwnerDrawfn, /* SS_OWNERDRAW */
|
||||||
|
STATIC_PaintBitmapfn, /* SS_BITMAP */
|
||||||
|
STATIC_PaintEnhMetafn, /* SS_ENHMETAFILE */
|
||||||
|
STATIC_PaintEtchedfn, /* SS_ETCHEDHORZ */
|
||||||
|
STATIC_PaintEtchedfn, /* SS_ETCHEDVERT */
|
||||||
|
STATIC_PaintEtchedfn, /* SS_ETCHEDFRAME */
|
||||||
|
};
|
||||||
|
|
||||||
|
static BOOL get_icon_size( HICON handle, SIZE *size )
|
||||||
|
{
|
||||||
|
ICONINFO info;
|
||||||
|
BITMAP bmp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!GetIconInfo(handle, &info))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
ret = GetObjectW(info.hbmColor, sizeof(bmp), &bmp);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
size->cx = bmp.bmWidth;
|
||||||
|
size->cy = bmp.bmHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteObject(info.hbmMask);
|
||||||
|
DeleteObject(info.hbmColor);
|
||||||
|
|
||||||
|
return !!ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_SetIcon
|
||||||
|
*
|
||||||
|
* Set the icon for an SS_ICON control.
|
||||||
|
*/
|
||||||
|
static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
|
||||||
|
{
|
||||||
|
HICON prevIcon;
|
||||||
|
SIZE size;
|
||||||
|
|
||||||
|
if ((style & SS_TYPEMASK) != SS_ICON) return 0;
|
||||||
|
if (hicon && !get_icon_size( hicon, &size ))
|
||||||
|
{
|
||||||
|
WARN("hicon != 0, but invalid\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
prevIcon = (HICON)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hicon );
|
||||||
|
if (hicon && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL))
|
||||||
|
{
|
||||||
|
/* Windows currently doesn't implement SS_RIGHTJUST */
|
||||||
|
/*
|
||||||
|
if ((style & SS_RIGHTJUST) != 0)
|
||||||
|
{
|
||||||
|
RECT wr;
|
||||||
|
GetWindowRect(hwnd, &wr);
|
||||||
|
SetWindowPos( hwnd, 0, wr.right - info->nWidth, wr.bottom - info->nHeight,
|
||||||
|
info->nWidth, info->nHeight, SWP_NOACTIVATE | SWP_NOZORDER );
|
||||||
|
}
|
||||||
|
else */
|
||||||
|
{
|
||||||
|
SetWindowPos( hwnd, 0, 0, 0, size.cx, size.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return prevIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_SetBitmap
|
||||||
|
*
|
||||||
|
* Set the bitmap for an SS_BITMAP control.
|
||||||
|
*/
|
||||||
|
static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style )
|
||||||
|
{
|
||||||
|
HBITMAP hOldBitmap;
|
||||||
|
|
||||||
|
if ((style & SS_TYPEMASK) != SS_BITMAP) return 0;
|
||||||
|
if (hBitmap && GetObjectType(hBitmap) != OBJ_BITMAP)
|
||||||
|
{
|
||||||
|
WARN("hBitmap != 0, but it's not a bitmap\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
hOldBitmap = (HBITMAP)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hBitmap );
|
||||||
|
if (hBitmap && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL))
|
||||||
|
{
|
||||||
|
BITMAP bm;
|
||||||
|
GetObjectW(hBitmap, sizeof(bm), &bm);
|
||||||
|
/* Windows currently doesn't implement SS_RIGHTJUST */
|
||||||
|
/*
|
||||||
|
if ((style & SS_RIGHTJUST) != 0)
|
||||||
|
{
|
||||||
|
RECT wr;
|
||||||
|
GetWindowRect(hwnd, &wr);
|
||||||
|
SetWindowPos( hwnd, 0, wr.right - bm.bmWidth, wr.bottom - bm.bmHeight,
|
||||||
|
bm.bmWidth, bm.bmHeight, SWP_NOACTIVATE | SWP_NOZORDER );
|
||||||
|
}
|
||||||
|
else */
|
||||||
|
{
|
||||||
|
SetWindowPos( hwnd, 0, 0, 0, bm.bmWidth, bm.bmHeight,
|
||||||
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hOldBitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_SetEnhMetaFile
|
||||||
|
*
|
||||||
|
* Set the enhanced metafile for an SS_ENHMETAFILE control.
|
||||||
|
*/
|
||||||
|
static HENHMETAFILE STATIC_SetEnhMetaFile( HWND hwnd, HENHMETAFILE hEnhMetaFile, DWORD style )
|
||||||
|
{
|
||||||
|
if ((style & SS_TYPEMASK) != SS_ENHMETAFILE) return 0;
|
||||||
|
if (hEnhMetaFile && GetObjectType(hEnhMetaFile) != OBJ_ENHMETAFILE)
|
||||||
|
{
|
||||||
|
WARN("hEnhMetaFile != 0, but it's not an enhanced metafile\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (HENHMETAFILE)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hEnhMetaFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_GetImage
|
||||||
|
*
|
||||||
|
* Gets the bitmap for an SS_BITMAP control, the icon/cursor for an
|
||||||
|
* SS_ICON control or the enhanced metafile for an SS_ENHMETAFILE control.
|
||||||
|
*/
|
||||||
|
static HANDLE STATIC_GetImage( HWND hwnd, WPARAM wParam, DWORD style )
|
||||||
|
{
|
||||||
|
switch (style & SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
case SS_ICON:
|
||||||
|
if ((wParam != IMAGE_ICON) &&
|
||||||
|
(wParam != IMAGE_CURSOR)) return NULL;
|
||||||
|
break;
|
||||||
|
case SS_BITMAP:
|
||||||
|
if (wParam != IMAGE_BITMAP) return NULL;
|
||||||
|
break;
|
||||||
|
case SS_ENHMETAFILE:
|
||||||
|
if (wParam != IMAGE_ENHMETAFILE) return NULL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return (HANDLE)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_LoadIconW
|
||||||
|
*
|
||||||
|
* Load the icon for an SS_ICON control.
|
||||||
|
*/
|
||||||
|
static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
|
||||||
|
{
|
||||||
|
HICON hicon = 0;
|
||||||
|
|
||||||
|
if (hInstance && ((ULONG_PTR)hInstance >> 16))
|
||||||
|
{
|
||||||
|
if ((style & SS_REALSIZEIMAGE) != 0)
|
||||||
|
hicon = LoadImageW(hInstance, name, IMAGE_ICON, 0, 0, LR_SHARED);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hicon = LoadIconW( hInstance, name );
|
||||||
|
if (!hicon) hicon = LoadCursorW( hInstance, name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!hicon) hicon = LoadIconW( 0, name );
|
||||||
|
/* Windows doesn't try to load a standard cursor,
|
||||||
|
probably because most IDs for standard cursors conflict
|
||||||
|
with the IDs for standard icons anyway */
|
||||||
|
return hicon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* STATIC_TryPaintFcn
|
||||||
|
*
|
||||||
|
* Try to immediately paint the control.
|
||||||
|
*/
|
||||||
|
static VOID STATIC_TryPaintFcn(HWND hwnd, LONG full_style)
|
||||||
|
{
|
||||||
|
LONG style = full_style & SS_TYPEMASK;
|
||||||
|
RECT rc;
|
||||||
|
|
||||||
|
GetClientRect( hwnd, &rc );
|
||||||
|
if (!IsRectEmpty(&rc) && IsWindowVisible(hwnd) && staticPaintFunc[style])
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
HRGN hrgn;
|
||||||
|
|
||||||
|
hdc = GetDC( hwnd );
|
||||||
|
hrgn = set_control_clipping( hdc, &rc );
|
||||||
|
(staticPaintFunc[style])( hwnd, hdc, full_style );
|
||||||
|
SelectClipRgn( hdc, hrgn );
|
||||||
|
if (hrgn) DeleteObject( hrgn );
|
||||||
|
ReleaseDC( hwnd, hdc );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static HBRUSH STATIC_SendWmCtlColorStatic(HWND hwnd, HDC hdc)
|
||||||
|
{
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HWND parent = GetParent(hwnd);
|
||||||
|
|
||||||
|
if (!parent) parent = hwnd;
|
||||||
|
hBrush = (HBRUSH) SendMessageW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd );
|
||||||
|
if (!hBrush) /* did the app forget to call DefWindowProc ? */
|
||||||
|
{
|
||||||
|
/* FIXME: DefWindowProc should return different colors if a
|
||||||
|
manifest is present */
|
||||||
|
hBrush = (HBRUSH)DefWindowProcW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd);
|
||||||
|
}
|
||||||
|
return hBrush;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* hasTextStyle
|
||||||
|
*
|
||||||
|
* Tests if the control displays text.
|
||||||
|
*/
|
||||||
|
static BOOL hasTextStyle( DWORD style )
|
||||||
|
{
|
||||||
|
switch (style & SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
case SS_SIMPLE:
|
||||||
|
case SS_LEFT:
|
||||||
|
case SS_LEFTNOWORDWRAP:
|
||||||
|
case SS_CENTER:
|
||||||
|
case SS_RIGHT:
|
||||||
|
case SS_OWNERDRAW:
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK STATIC_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
||||||
|
{
|
||||||
|
LRESULT lResult = 0;
|
||||||
|
LONG full_style = GetWindowLongW( hwnd, GWL_STYLE );
|
||||||
|
LONG style = full_style & SS_TYPEMASK;
|
||||||
|
|
||||||
|
if (!IsWindow( hwnd )) return 0;
|
||||||
|
|
||||||
|
switch (uMsg)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
if (style < 0L || style > SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
ERR("Unknown style 0x%02x\n", style );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
if (style == SS_ICON)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* FIXME
|
||||||
|
* DestroyIcon32( STATIC_SetIcon( wndPtr, 0 ) );
|
||||||
|
*
|
||||||
|
* We don't want to do this yet because DestroyIcon32 is broken. If the icon
|
||||||
|
* had already been loaded by the application the last thing we want to do is
|
||||||
|
* GlobalFree16 the handle.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
/* do all painting in WM_PAINT like Windows does */
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case WM_PRINTCLIENT:
|
||||||
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
RECT rect;
|
||||||
|
HDC hdc = wParam ? (HDC)wParam : BeginPaint(hwnd, &ps);
|
||||||
|
GetClientRect( hwnd, &rect );
|
||||||
|
if (staticPaintFunc[style])
|
||||||
|
{
|
||||||
|
HRGN hrgn = set_control_clipping( hdc, &rect );
|
||||||
|
(staticPaintFunc[style])( hwnd, hdc, full_style );
|
||||||
|
SelectClipRgn( hdc, hrgn );
|
||||||
|
if (hrgn) DeleteObject( hrgn );
|
||||||
|
}
|
||||||
|
if (!wParam) EndPaint(hwnd, &ps);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_ENABLE:
|
||||||
|
STATIC_TryPaintFcn( hwnd, full_style );
|
||||||
|
if (full_style & SS_NOTIFY)
|
||||||
|
{
|
||||||
|
if (wParam)
|
||||||
|
SendMessageW( GetParent(hwnd), WM_COMMAND,
|
||||||
|
MAKEWPARAM( GetWindowLongPtrW(hwnd,GWLP_ID), STN_ENABLE ), (LPARAM)hwnd);
|
||||||
|
else
|
||||||
|
SendMessageW( GetParent(hwnd), WM_COMMAND,
|
||||||
|
MAKEWPARAM( GetWindowLongPtrW(hwnd,GWLP_ID), STN_DISABLE ), (LPARAM)hwnd);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SYSCOLORCHANGE:
|
||||||
|
COMCTL32_RefreshSysColors();
|
||||||
|
STATIC_TryPaintFcn( hwnd, full_style );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_NCCREATE:
|
||||||
|
{
|
||||||
|
CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam;
|
||||||
|
|
||||||
|
if (full_style & SS_SUNKEN)
|
||||||
|
SetWindowLongW( hwnd, GWL_EXSTYLE,
|
||||||
|
GetWindowLongW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
|
||||||
|
|
||||||
|
switch (style)
|
||||||
|
{
|
||||||
|
case SS_ICON:
|
||||||
|
{
|
||||||
|
HICON hIcon;
|
||||||
|
|
||||||
|
hIcon = STATIC_LoadIconW(cs->hInstance, cs->lpszName, full_style);
|
||||||
|
STATIC_SetIcon(hwnd, hIcon, full_style);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SS_BITMAP:
|
||||||
|
if ((ULONG_PTR)cs->hInstance >> 16)
|
||||||
|
{
|
||||||
|
HBITMAP hBitmap;
|
||||||
|
hBitmap = LoadBitmapW(cs->hInstance, cs->lpszName);
|
||||||
|
STATIC_SetBitmap(hwnd, hBitmap, full_style);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* SS_ENHMETAFILE: Despite what MSDN says, Windows does not load
|
||||||
|
the enhanced metafile that was specified as the window text. */
|
||||||
|
}
|
||||||
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
|
case WM_SETTEXT:
|
||||||
|
if (hasTextStyle( full_style ))
|
||||||
|
{
|
||||||
|
lResult = DefWindowProcW( hwnd, uMsg, wParam, lParam );
|
||||||
|
STATIC_TryPaintFcn( hwnd, full_style );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SETFONT:
|
||||||
|
if (hasTextStyle( full_style ))
|
||||||
|
{
|
||||||
|
SetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET, wParam );
|
||||||
|
if (LOWORD(lParam))
|
||||||
|
RedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_GETFONT:
|
||||||
|
return GetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET );
|
||||||
|
|
||||||
|
case WM_NCHITTEST:
|
||||||
|
if (full_style & SS_NOTIFY)
|
||||||
|
return HTCLIENT;
|
||||||
|
else
|
||||||
|
return HTTRANSPARENT;
|
||||||
|
|
||||||
|
case WM_GETDLGCODE:
|
||||||
|
return DLGC_STATIC;
|
||||||
|
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
case WM_NCLBUTTONDOWN:
|
||||||
|
if (full_style & SS_NOTIFY)
|
||||||
|
SendMessageW( GetParent(hwnd), WM_COMMAND,
|
||||||
|
MAKEWPARAM( GetWindowLongPtrW(hwnd,GWLP_ID), STN_CLICKED ), (LPARAM)hwnd);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_LBUTTONDBLCLK:
|
||||||
|
case WM_NCLBUTTONDBLCLK:
|
||||||
|
if (full_style & SS_NOTIFY)
|
||||||
|
SendMessageW( GetParent(hwnd), WM_COMMAND,
|
||||||
|
MAKEWPARAM( GetWindowLongPtrW(hwnd,GWLP_ID), STN_DBLCLK ), (LPARAM)hwnd);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case STM_GETIMAGE:
|
||||||
|
return (LRESULT)STATIC_GetImage( hwnd, wParam, full_style );
|
||||||
|
|
||||||
|
case STM_GETICON:
|
||||||
|
return (LRESULT)STATIC_GetImage( hwnd, IMAGE_ICON, full_style );
|
||||||
|
|
||||||
|
case STM_SETIMAGE:
|
||||||
|
switch (wParam)
|
||||||
|
{
|
||||||
|
case IMAGE_BITMAP:
|
||||||
|
lResult = (LRESULT)STATIC_SetBitmap( hwnd, (HBITMAP)lParam, full_style );
|
||||||
|
break;
|
||||||
|
case IMAGE_ENHMETAFILE:
|
||||||
|
lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style );
|
||||||
|
break;
|
||||||
|
case IMAGE_ICON:
|
||||||
|
case IMAGE_CURSOR:
|
||||||
|
lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("STM_SETIMAGE: Unhandled type %lx\n", wParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
STATIC_TryPaintFcn( hwnd, full_style );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM_SETICON:
|
||||||
|
lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)wParam, full_style );
|
||||||
|
STATIC_TryPaintFcn( hwnd, full_style );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
return lResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
DRAWITEMSTRUCT dis;
|
||||||
|
HFONT font, oldFont = NULL;
|
||||||
|
UINT id = (UINT)GetWindowLongPtrW( hwnd, GWLP_ID );
|
||||||
|
|
||||||
|
dis.CtlType = ODT_STATIC;
|
||||||
|
dis.CtlID = id;
|
||||||
|
dis.itemID = 0;
|
||||||
|
dis.itemAction = ODA_DRAWENTIRE;
|
||||||
|
dis.itemState = IsWindowEnabled(hwnd) ? 0 : ODS_DISABLED;
|
||||||
|
dis.hwndItem = hwnd;
|
||||||
|
dis.hDC = hdc;
|
||||||
|
dis.itemData = 0;
|
||||||
|
GetClientRect( hwnd, &dis.rcItem );
|
||||||
|
|
||||||
|
font = (HFONT)GetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET );
|
||||||
|
if (font) oldFont = SelectObject( hdc, font );
|
||||||
|
SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd );
|
||||||
|
SendMessageW( GetParent(hwnd), WM_DRAWITEM, id, (LPARAM)&dis );
|
||||||
|
if (font) SelectObject( hdc, oldFont );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HFONT hFont, hOldFont = NULL;
|
||||||
|
UINT format;
|
||||||
|
INT len, buf_size;
|
||||||
|
WCHAR *text;
|
||||||
|
|
||||||
|
GetClientRect( hwnd, &rc);
|
||||||
|
|
||||||
|
switch (style & SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
case SS_LEFT:
|
||||||
|
format = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SS_CENTER:
|
||||||
|
format = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SS_RIGHT:
|
||||||
|
format = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SS_SIMPLE:
|
||||||
|
format = DT_LEFT | DT_SINGLELINE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SS_LEFTNOWORDWRAP:
|
||||||
|
format = DT_LEFT | DT_EXPANDTABS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_RIGHT)
|
||||||
|
format = DT_RIGHT | (format & ~(DT_LEFT | DT_CENTER));
|
||||||
|
|
||||||
|
if (style & SS_NOPREFIX)
|
||||||
|
format |= DT_NOPREFIX;
|
||||||
|
|
||||||
|
if ((style & SS_TYPEMASK) != SS_SIMPLE)
|
||||||
|
{
|
||||||
|
if (style & SS_CENTERIMAGE)
|
||||||
|
format |= DT_SINGLELINE | DT_VCENTER;
|
||||||
|
if (style & SS_EDITCONTROL)
|
||||||
|
format |= DT_EDITCONTROL;
|
||||||
|
if (style & SS_ENDELLIPSIS)
|
||||||
|
format |= DT_SINGLELINE | DT_END_ELLIPSIS;
|
||||||
|
if (style & SS_PATHELLIPSIS)
|
||||||
|
format |= DT_SINGLELINE | DT_PATH_ELLIPSIS;
|
||||||
|
if (style & SS_WORDELLIPSIS)
|
||||||
|
format |= DT_SINGLELINE | DT_WORD_ELLIPSIS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((hFont = (HFONT)GetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET )))
|
||||||
|
hOldFont = SelectObject( hdc, hFont );
|
||||||
|
|
||||||
|
/* SS_SIMPLE controls: WM_CTLCOLORSTATIC is sent, but the returned
|
||||||
|
brush is not used */
|
||||||
|
hBrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
|
||||||
|
|
||||||
|
if ((style & SS_TYPEMASK) != SS_SIMPLE)
|
||||||
|
{
|
||||||
|
FillRect( hdc, &rc, hBrush );
|
||||||
|
if (!IsWindowEnabled(hwnd)) SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
|
||||||
|
}
|
||||||
|
|
||||||
|
buf_size = 256;
|
||||||
|
if (!(text = HeapAlloc( GetProcessHeap(), 0, buf_size * sizeof(WCHAR) )))
|
||||||
|
goto no_TextOut;
|
||||||
|
|
||||||
|
while ((len = InternalGetWindowText( hwnd, text, buf_size )) == buf_size - 1)
|
||||||
|
{
|
||||||
|
buf_size *= 2;
|
||||||
|
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))
|
||||||
|
goto no_TextOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!len) goto no_TextOut;
|
||||||
|
|
||||||
|
if (((style & SS_TYPEMASK) == SS_SIMPLE) && (style & SS_NOPREFIX))
|
||||||
|
{
|
||||||
|
/* Windows uses the faster ExtTextOut() to draw the text and
|
||||||
|
to paint the whole client rectangle with the text background
|
||||||
|
color. Reference: "Static Controls" by Kyle Marsh, 1992 */
|
||||||
|
ExtTextOutW( hdc, rc.left, rc.top, ETO_CLIPPED | ETO_OPAQUE,
|
||||||
|
&rc, text, len, NULL );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DrawTextW( hdc, text, -1, &rc, format );
|
||||||
|
}
|
||||||
|
|
||||||
|
no_TextOut:
|
||||||
|
HeapFree( GetProcessHeap(), 0, text );
|
||||||
|
|
||||||
|
if (hFont)
|
||||||
|
SelectObject( hdc, hOldFont );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
|
||||||
|
GetClientRect( hwnd, &rc);
|
||||||
|
|
||||||
|
/* FIXME: send WM_CTLCOLORSTATIC */
|
||||||
|
switch (style & SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
case SS_BLACKRECT:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
|
||||||
|
FillRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
case SS_GRAYRECT:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dShadow);
|
||||||
|
FillRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
case SS_WHITERECT:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dHilight);
|
||||||
|
FillRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
case SS_BLACKFRAME:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
|
||||||
|
FrameRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
case SS_GRAYFRAME:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dShadow);
|
||||||
|
FrameRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
case SS_WHITEFRAME:
|
||||||
|
hBrush = CreateSolidBrush(comctl32_color.clr3dHilight);
|
||||||
|
FrameRect( hdc, &rc, hBrush );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DeleteObject( hBrush );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
RECT rc, iconRect;
|
||||||
|
HBRUSH hbrush;
|
||||||
|
HICON hIcon;
|
||||||
|
SIZE size;
|
||||||
|
|
||||||
|
GetClientRect( hwnd, &rc );
|
||||||
|
hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
|
||||||
|
hIcon = (HICON)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET );
|
||||||
|
if (!hIcon || !get_icon_size( hIcon, &size ))
|
||||||
|
{
|
||||||
|
FillRect(hdc, &rc, hbrush);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (style & SS_CENTERIMAGE)
|
||||||
|
{
|
||||||
|
iconRect.left = (rc.right - rc.left) / 2 - size.cx / 2;
|
||||||
|
iconRect.top = (rc.bottom - rc.top) / 2 - size.cy / 2;
|
||||||
|
iconRect.right = iconRect.left + size.cx;
|
||||||
|
iconRect.bottom = iconRect.top + size.cy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
iconRect = rc;
|
||||||
|
FillRect( hdc, &rc, hbrush );
|
||||||
|
DrawIconEx( hdc, iconRect.left, iconRect.top, hIcon, iconRect.right - iconRect.left,
|
||||||
|
iconRect.bottom - iconRect.top, 0, NULL, DI_NORMAL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
HDC hMemDC;
|
||||||
|
HBITMAP hBitmap, oldbitmap;
|
||||||
|
HBRUSH hbrush;
|
||||||
|
|
||||||
|
/* message is still sent, even if the returned brush is not used */
|
||||||
|
hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
|
||||||
|
|
||||||
|
if ((hBitmap = (HBITMAP)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET ))
|
||||||
|
&& (GetObjectType(hBitmap) == OBJ_BITMAP)
|
||||||
|
&& (hMemDC = CreateCompatibleDC( hdc )))
|
||||||
|
{
|
||||||
|
BITMAP bm;
|
||||||
|
RECT rcClient;
|
||||||
|
LOGBRUSH brush;
|
||||||
|
|
||||||
|
GetObjectW(hBitmap, sizeof(bm), &bm);
|
||||||
|
oldbitmap = SelectObject(hMemDC, hBitmap);
|
||||||
|
|
||||||
|
/* Set the background color for monochrome bitmaps
|
||||||
|
to the color of the background brush */
|
||||||
|
if (GetObjectW( hbrush, sizeof(brush), &brush ))
|
||||||
|
{
|
||||||
|
if (brush.lbStyle == BS_SOLID)
|
||||||
|
SetBkColor(hdc, brush.lbColor);
|
||||||
|
}
|
||||||
|
GetClientRect(hwnd, &rcClient);
|
||||||
|
if (style & SS_CENTERIMAGE)
|
||||||
|
{
|
||||||
|
FillRect( hdc, &rcClient, hbrush );
|
||||||
|
rcClient.left = (rcClient.right - rcClient.left)/2 - bm.bmWidth/2;
|
||||||
|
rcClient.top = (rcClient.bottom - rcClient.top)/2 - bm.bmHeight/2;
|
||||||
|
rcClient.right = rcClient.left + bm.bmWidth;
|
||||||
|
rcClient.bottom = rcClient.top + bm.bmHeight;
|
||||||
|
}
|
||||||
|
StretchBlt(hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,
|
||||||
|
rcClient.bottom - rcClient.top, hMemDC,
|
||||||
|
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
|
||||||
|
SelectObject(hMemDC, oldbitmap);
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
HENHMETAFILE hEnhMetaFile;
|
||||||
|
RECT rc;
|
||||||
|
HBRUSH hbrush;
|
||||||
|
|
||||||
|
GetClientRect(hwnd, &rc);
|
||||||
|
hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
|
||||||
|
FillRect(hdc, &rc, hbrush);
|
||||||
|
if ((hEnhMetaFile = (HENHMETAFILE)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET )))
|
||||||
|
{
|
||||||
|
/* The control's current font is not selected into the
|
||||||
|
device context! */
|
||||||
|
if (GetObjectType(hEnhMetaFile) == OBJ_ENHMETAFILE)
|
||||||
|
PlayEnhMetaFile(hdc, hEnhMetaFile, &rc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
|
||||||
|
/* FIXME: sometimes (not always) sends WM_CTLCOLORSTATIC */
|
||||||
|
GetClientRect( hwnd, &rc );
|
||||||
|
switch (style & SS_TYPEMASK)
|
||||||
|
{
|
||||||
|
case SS_ETCHEDHORZ:
|
||||||
|
DrawEdge(hdc, &rc, EDGE_ETCHED, BF_TOP | BF_BOTTOM);
|
||||||
|
break;
|
||||||
|
case SS_ETCHEDVERT:
|
||||||
|
DrawEdge(hdc, &rc, EDGE_ETCHED, BF_LEFT | BF_RIGHT);
|
||||||
|
break;
|
||||||
|
case SS_ETCHEDFRAME:
|
||||||
|
DrawEdge(hdc, &rc, EDGE_ETCHED, BF_RECT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void STATIC_Register(void)
|
||||||
|
{
|
||||||
|
WNDCLASSW wndClass;
|
||||||
|
|
||||||
|
memset(&wndClass, 0, sizeof(wndClass));
|
||||||
|
wndClass.style = CS_DBLCLKS | CS_PARENTDC | CS_GLOBALCLASS;
|
||||||
|
wndClass.lpfnWndProc = STATIC_WindowProc;
|
||||||
|
wndClass.cbClsExtra = 0;
|
||||||
|
wndClass.cbWndExtra = STATIC_EXTRA_BYTES;
|
||||||
|
wndClass.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW);
|
||||||
|
wndClass.hbrBackground = NULL;
|
||||||
|
wndClass.lpszClassName = WC_STATICW;
|
||||||
|
RegisterClassW(&wndClass);
|
||||||
|
}
|
|
@ -19,15 +19,6 @@
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
*
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 24, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
* TODO:
|
* TODO:
|
||||||
* -- CCS_BOTTOM (default)
|
* -- CCS_BOTTOM (default)
|
||||||
* -- CCS_LEFT
|
* -- CCS_LEFT
|
||||||
|
@ -40,7 +31,20 @@
|
||||||
* -- CCS_VERT (defaults to RIGHT)
|
* -- CCS_VERT (defaults to RIGHT)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(statusbar);
|
WINE_DEFAULT_DEBUG_CHANNEL(statusbar);
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,24 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h> /* atoi */
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -16,18 +16,20 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
|
||||||
* NOTES
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Apr. 4, 2005, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/list.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(syslink);
|
WINE_DEFAULT_DEBUG_CHANNEL(syslink);
|
||||||
|
|
||||||
|
@ -181,7 +183,7 @@ static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text)
|
||||||
{
|
{
|
||||||
if(*current == '<')
|
if(*current == '<')
|
||||||
{
|
{
|
||||||
if(!strncmpiW(current, SL_LINKOPEN, sizeof(SL_LINKOPEN)/sizeof(SL_LINKOPEN[0])) && (CurrentType == slText))
|
if(!strncmpiW(current, SL_LINKOPEN, ARRAY_SIZE(SL_LINKOPEN)) && (CurrentType == slText))
|
||||||
{
|
{
|
||||||
BOOL ValidParam = FALSE, ValidLink = FALSE;
|
BOOL ValidParam = FALSE, ValidLink = FALSE;
|
||||||
|
|
||||||
|
@ -209,14 +211,14 @@ static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text)
|
||||||
|
|
||||||
CheckParameter:
|
CheckParameter:
|
||||||
/* compare the current position with all known parameters */
|
/* compare the current position with all known parameters */
|
||||||
if(!strncmpiW(tmp, SL_HREF, sizeof(SL_HREF)/sizeof(SL_HREF[0])))
|
if(!strncmpiW(tmp, SL_HREF, ARRAY_SIZE(SL_HREF)))
|
||||||
{
|
{
|
||||||
taglen += 6;
|
taglen += 6;
|
||||||
ValidParam = TRUE;
|
ValidParam = TRUE;
|
||||||
CurrentParameter = &lpUrl;
|
CurrentParameter = &lpUrl;
|
||||||
CurrentParameterLen = &lenUrl;
|
CurrentParameterLen = &lenUrl;
|
||||||
}
|
}
|
||||||
else if(!strncmpiW(tmp, SL_ID, sizeof(SL_ID)/sizeof(SL_ID[0])))
|
else if(!strncmpiW(tmp, SL_ID, ARRAY_SIZE(SL_ID)))
|
||||||
{
|
{
|
||||||
taglen += 4;
|
taglen += 4;
|
||||||
ValidParam = TRUE;
|
ValidParam = TRUE;
|
||||||
|
@ -290,7 +292,7 @@ CheckParameter:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!strncmpiW(current, SL_LINKCLOSE, sizeof(SL_LINKCLOSE)/sizeof(SL_LINKCLOSE[0])) && (CurrentType == slLink) && firsttag)
|
else if(!strncmpiW(current, SL_LINKCLOSE, ARRAY_SIZE(SL_LINKCLOSE)) && (CurrentType == slLink) && firsttag)
|
||||||
{
|
{
|
||||||
/* there's a <a...> tag opened, first add the previous text, if present */
|
/* there's a <a...> tag opened, first add the previous text, if present */
|
||||||
if(textstart != NULL && textlen > 0 && firsttag > textstart)
|
if(textstart != NULL && textlen > 0 && firsttag > textstart)
|
||||||
|
|
|
@ -52,7 +52,21 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(tab);
|
WINE_DEFAULT_DEBUG_CHANNEL(tab);
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,24 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "winerror.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/list.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(taskdialog);
|
WINE_DEFAULT_DEBUG_CHANNEL(taskdialog);
|
||||||
|
|
||||||
#define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
|
#define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
|
||||||
|
@ -423,11 +439,11 @@ static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG *taskconfi
|
||||||
|
|
||||||
/* Window title */
|
/* Window title */
|
||||||
if (!taskconfig->pszWindowTitle)
|
if (!taskconfig->pszWindowTitle)
|
||||||
titleW = taskdialog_get_exe_name(taskconfig, pathW, sizeof(pathW)/sizeof(pathW[0]));
|
titleW = taskdialog_get_exe_name(taskconfig, pathW, ARRAY_SIZE(pathW));
|
||||||
else if (IS_INTRESOURCE(taskconfig->pszWindowTitle))
|
else if (IS_INTRESOURCE(taskconfig->pszWindowTitle))
|
||||||
{
|
{
|
||||||
if (!LoadStringW(taskconfig->hInstance, LOWORD(taskconfig->pszWindowTitle), (WCHAR *)&titleW, 0))
|
if (!LoadStringW(taskconfig->hInstance, LOWORD(taskconfig->pszWindowTitle), (WCHAR *)&titleW, 0))
|
||||||
titleW = taskdialog_get_exe_name(taskconfig, pathW, sizeof(pathW)/sizeof(pathW[0]));
|
titleW = taskdialog_get_exe_name(taskconfig, pathW, ARRAY_SIZE(pathW));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
titleW = taskconfig->pszWindowTitle;
|
titleW = taskconfig->pszWindowTitle;
|
||||||
|
|
|
@ -24,6 +24,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(theme_button);
|
||||||
|
|
||||||
#define BUTTON_TYPE 0x0f /* bit mask for the available button types */
|
#define BUTTON_TYPE 0x0f /* bit mask for the available button types */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
/* These are indices into a states array to determine the theme state for a given theme part. */
|
/* These are indices into a states array to determine the theme state for a given theme part. */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -489,3 +491,5 @@ BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag
|
||||||
paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, prfFlag);
|
paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, prfFlag);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -19,7 +19,18 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* The dialog subclass window proc.
|
* The dialog subclass window proc.
|
||||||
|
@ -103,8 +114,7 @@ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
|
||||||
WCHAR controlClass[32];
|
WCHAR controlClass[32];
|
||||||
RECT rc;
|
RECT rc;
|
||||||
|
|
||||||
GetClassNameW (controlWnd, controlClass,
|
GetClassNameW (controlWnd, controlClass, ARRAY_SIZE(controlClass));
|
||||||
sizeof(controlClass) / sizeof(controlClass[0]));
|
|
||||||
if (lstrcmpiW (controlClass, WC_STATICW) == 0)
|
if (lstrcmpiW (controlClass, WC_STATICW) == 0)
|
||||||
{
|
{
|
||||||
/* Static control - draw parent background and set text to
|
/* Static control - draw parent background and set text to
|
||||||
|
|
|
@ -19,9 +19,18 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(theme_scroll);
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
/* Minimum size of the thumb in pixels */
|
/* Minimum size of the thumb in pixels */
|
||||||
#define SCROLL_MIN_THUMB 6
|
#define SCROLL_MIN_THUMB 6
|
||||||
|
@ -42,6 +51,8 @@ enum SCROLL_HITTEST
|
||||||
static HWND tracking_win = 0;
|
static HWND tracking_win = 0;
|
||||||
static enum SCROLL_HITTEST tracking_hot_part = SCROLL_NOWHERE;
|
static enum SCROLL_HITTEST tracking_hot_part = SCROLL_NOWHERE;
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(theme_scroll);
|
||||||
|
|
||||||
static void calc_thumb_dimensions(unsigned int size, SCROLLINFO *si, unsigned int *thumbpos, unsigned int *thumbsize)
|
static void calc_thumb_dimensions(unsigned int size, SCROLLINFO *si, unsigned int *thumbpos, unsigned int *thumbsize)
|
||||||
{
|
{
|
||||||
if (size <= SCROLL_MIN_RECT)
|
if (size <= SCROLL_MIN_RECT)
|
||||||
|
|
|
@ -19,34 +19,31 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(theming);
|
WINE_DEFAULT_DEBUG_CHANNEL(theming);
|
||||||
|
|
||||||
typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM,
|
typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM,
|
||||||
ULONG_PTR);
|
ULONG_PTR);
|
||||||
|
|
||||||
#ifndef __REACTOS__ /* r73871 */
|
|
||||||
extern LRESULT CALLBACK THEMING_ButtonSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
|
||||||
#endif
|
|
||||||
extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
|
||||||
#ifndef __REACTOS__ /* r73803 */
|
#ifndef __REACTOS__ /* r73803 */
|
||||||
extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
ULONG_PTR) DECLSPEC_HIDDEN;
|
||||||
#endif
|
#endif
|
||||||
extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
|
||||||
extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
|
||||||
extern LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
extern LRESULT CALLBACK THEMING_ScrollbarSubclassProc (HWND, UINT, WPARAM, LPARAM,
|
||||||
ULONG_PTR) DECLSPEC_HIDDEN;
|
ULONG_PTR) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#ifndef __REACTOS__
|
#ifndef __REACTOS__
|
||||||
static const WCHAR dialogClass[] = {'#','3','2','7','7','0',0};
|
static const WCHAR dialogClass[] = {'#','3','2','7','7','0',0};
|
||||||
#endif
|
#endif
|
||||||
static const WCHAR comboLboxClass[] = {'C','o','m','b','o','L','b','o','x',0};
|
|
||||||
|
|
||||||
static const struct ThemingSubclass
|
static const struct ThemingSubclass
|
||||||
{
|
{
|
||||||
|
@ -56,16 +53,11 @@ static const struct ThemingSubclass
|
||||||
/* Note: list must be sorted by class name */
|
/* Note: list must be sorted by class name */
|
||||||
#ifndef __REACTOS__ /* r73803 & r73871 */
|
#ifndef __REACTOS__ /* r73803 & r73871 */
|
||||||
{dialogClass, THEMING_DialogSubclassProc},
|
{dialogClass, THEMING_DialogSubclassProc},
|
||||||
{WC_BUTTONW, THEMING_ButtonSubclassProc},
|
|
||||||
#endif
|
#endif
|
||||||
{WC_COMBOBOXW, THEMING_ComboSubclassProc},
|
|
||||||
{comboLboxClass, THEMING_ListBoxSubclassProc},
|
|
||||||
{WC_EDITW, THEMING_EditSubclassProc},
|
|
||||||
{WC_LISTBOXW, THEMING_ListBoxSubclassProc},
|
|
||||||
{WC_SCROLLBARW, THEMING_ScrollbarSubclassProc}
|
{WC_SCROLLBARW, THEMING_ScrollbarSubclassProc}
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUM_SUBCLASSES (sizeof(subclasses)/sizeof(subclasses[0]))
|
#define NUM_SUBCLASSES (ARRAY_SIZE(subclasses))
|
||||||
|
|
||||||
static WNDPROC originalProcs[NUM_SUBCLASSES];
|
static WNDPROC originalProcs[NUM_SUBCLASSES];
|
||||||
static ATOM atRefDataProp;
|
static ATOM atRefDataProp;
|
||||||
|
@ -93,26 +85,14 @@ static LRESULT CALLBACK subclass_proc ## N (HWND wnd, UINT msg, \
|
||||||
}
|
}
|
||||||
|
|
||||||
MAKE_SUBCLASS_PROC(0)
|
MAKE_SUBCLASS_PROC(0)
|
||||||
|
#ifndef __REACTOS__
|
||||||
MAKE_SUBCLASS_PROC(1)
|
MAKE_SUBCLASS_PROC(1)
|
||||||
MAKE_SUBCLASS_PROC(2)
|
|
||||||
MAKE_SUBCLASS_PROC(3)
|
|
||||||
MAKE_SUBCLASS_PROC(4)
|
|
||||||
#ifndef __REACTOS__ /* r73803 & r73871 */
|
|
||||||
MAKE_SUBCLASS_PROC(5)
|
|
||||||
MAKE_SUBCLASS_PROC(6)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
|
static const WNDPROC subclassProcs[NUM_SUBCLASSES] = {
|
||||||
subclass_proc0,
|
subclass_proc0,
|
||||||
|
#ifndef __REACTOS__
|
||||||
subclass_proc1,
|
subclass_proc1,
|
||||||
subclass_proc2,
|
|
||||||
subclass_proc3,
|
|
||||||
#ifdef __REACTOS__ /* r73871 */
|
|
||||||
subclass_proc4
|
|
||||||
#else
|
|
||||||
subclass_proc4,
|
|
||||||
subclass_proc5,
|
|
||||||
subclass_proc6
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,21 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winreg.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(toolbar);
|
WINE_DEFAULT_DEBUG_CHANNEL(toolbar);
|
||||||
|
|
||||||
|
@ -289,9 +303,9 @@ TOOLBAR_GetText(const TOOLBAR_INFO *infoPtr, const TBUTTON_INFO *btnPtr)
|
||||||
static void
|
static void
|
||||||
TOOLBAR_DumpTBButton(const TBBUTTON *tbb, BOOL fUnicode)
|
TOOLBAR_DumpTBButton(const TBBUTTON *tbb, BOOL fUnicode)
|
||||||
{
|
{
|
||||||
TRACE("TBBUTTON: id %d, bitmap=%d, state=%02x, style=%02x, data=%08lx, stringid=0x%08lx (%s)\n",
|
TRACE("TBBUTTON: id %d, bitmap=%d, state=%02x, style=%02x, data=%p, stringid=%p (%s)\n", tbb->idCommand,
|
||||||
tbb->idCommand,tbb->iBitmap, tbb->fsState, tbb->fsStyle, tbb->dwData, tbb->iString,
|
tbb->iBitmap, tbb->fsState, tbb->fsStyle, (void *)tbb->dwData, (void *)tbb->iString,
|
||||||
(fUnicode ? wine_dbgstr_w((LPWSTR)tbb->iString) : wine_dbgstr_a((LPSTR)tbb->iString)));
|
tbb->iString != -1 ? (fUnicode ? debugstr_w((LPWSTR)tbb->iString) : debugstr_a((LPSTR)tbb->iString)) : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -4416,7 +4430,7 @@ TOOLBAR_Restore(TOOLBAR_INFO *infoPtr, const TBSAVEPARAMSW *lpSave)
|
||||||
|
|
||||||
memset( &tb, 0, sizeof(tb) );
|
memset( &tb, 0, sizeof(tb) );
|
||||||
tb.iItem = i;
|
tb.iItem = i;
|
||||||
tb.cchText = sizeof(buf) / sizeof(buf[0]);
|
tb.cchText = ARRAY_SIZE(buf);
|
||||||
tb.pszText = buf;
|
tb.pszText = buf;
|
||||||
|
|
||||||
/* Use the same struct for both A and W versions since the layout is the same. */
|
/* Use the same struct for both A and W versions since the layout is the same. */
|
||||||
|
@ -6397,7 +6411,7 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
|
||||||
TRACE("TBN_GETINFOTIPW - got string %s\n", debugstr_w(tbgit.pszText));
|
TRACE("TBN_GETINFOTIPW - got string %s\n", debugstr_w(tbgit.pszText));
|
||||||
|
|
||||||
len = strlenW(tbgit.pszText);
|
len = strlenW(tbgit.pszText);
|
||||||
if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1)
|
if (len > ARRAY_SIZE(lpnmtdi->szText) - 1)
|
||||||
{
|
{
|
||||||
/* need to allocate temporary buffer in infoPtr as there
|
/* need to allocate temporary buffer in infoPtr as there
|
||||||
* isn't enough space in buffer passed to us by the
|
* isn't enough space in buffer passed to us by the
|
||||||
|
@ -6435,7 +6449,7 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
|
||||||
TRACE("TBN_GETINFOTIPA - got string %s\n", debugstr_a(tbgit.pszText));
|
TRACE("TBN_GETINFOTIPA - got string %s\n", debugstr_a(tbgit.pszText));
|
||||||
|
|
||||||
len = MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1, NULL, 0);
|
len = MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1, NULL, 0);
|
||||||
if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0]))
|
if (len > ARRAY_SIZE(lpnmtdi->szText))
|
||||||
{
|
{
|
||||||
/* need to allocate temporary buffer in infoPtr as there
|
/* need to allocate temporary buffer in infoPtr as there
|
||||||
* isn't enough space in buffer passed to us by the
|
* isn't enough space in buffer passed to us by the
|
||||||
|
@ -6450,8 +6464,7 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
|
||||||
}
|
}
|
||||||
else if (tbgit.pszText && tbgit.pszText[0])
|
else if (tbgit.pszText && tbgit.pszText[0])
|
||||||
{
|
{
|
||||||
MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1,
|
MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1, lpnmtdi->lpszText, ARRAY_SIZE(lpnmtdi->szText));
|
||||||
lpnmtdi->lpszText, sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0]));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6466,7 +6479,7 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
|
||||||
|
|
||||||
TRACE("using button hidden text %s\n", debugstr_w(pszText));
|
TRACE("using button hidden text %s\n", debugstr_w(pszText));
|
||||||
|
|
||||||
if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1)
|
if (len > ARRAY_SIZE(lpnmtdi->szText) - 1)
|
||||||
{
|
{
|
||||||
/* need to allocate temporary buffer in infoPtr as there
|
/* need to allocate temporary buffer in infoPtr as there
|
||||||
* isn't enough space in buffer passed to us by the
|
* isn't enough space in buffer passed to us by the
|
||||||
|
|
|
@ -89,9 +89,20 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
|
||||||
|
|
||||||
#include <wine/exception.h>
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(tooltips);
|
WINE_DEFAULT_DEBUG_CHANNEL(tooltips);
|
||||||
|
|
||||||
|
@ -613,18 +624,10 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
|
||||||
}
|
}
|
||||||
|
|
||||||
toolPtr = &infoPtr->tools[nTool];
|
toolPtr = &infoPtr->tools[nTool];
|
||||||
|
|
||||||
TRACE("Show tooltip %d\n", nTool);
|
|
||||||
|
|
||||||
hdr.hwndFrom = infoPtr->hwndSelf;
|
|
||||||
hdr.idFrom = toolPtr->uId;
|
|
||||||
hdr.code = TTN_SHOW;
|
|
||||||
SendMessageW (toolPtr->hwnd, WM_NOTIFY, toolPtr->uId, (LPARAM)&hdr);
|
|
||||||
|
|
||||||
TRACE("%s\n", debugstr_w(infoPtr->szTipText));
|
|
||||||
|
|
||||||
TOOLTIPS_CalcTipSize (infoPtr, &size);
|
TOOLTIPS_CalcTipSize (infoPtr, &size);
|
||||||
TRACE("size %d x %d\n", size.cx, size.cy);
|
|
||||||
|
TRACE("Show tooltip %d, %s, size %d x %d\n", nTool, debugstr_w(infoPtr->szTipText),
|
||||||
|
size.cx, size.cy);
|
||||||
|
|
||||||
if (track_activate && (toolPtr->uFlags & TTF_TRACK))
|
if (track_activate && (toolPtr->uFlags & TTF_TRACK))
|
||||||
{
|
{
|
||||||
|
@ -797,7 +800,7 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hrStem = CreatePolygonRgn(pts, sizeof(pts) / sizeof(pts[0]), ALTERNATE);
|
hrStem = CreatePolygonRgn(pts, ARRAY_SIZE(pts), ALTERNATE);
|
||||||
|
|
||||||
hRgn = CreateRoundRectRgn(0,
|
hRgn = CreateRoundRectRgn(0,
|
||||||
(infoPtr->bToolBelow ? BALLOON_STEMHEIGHT : 0),
|
(infoPtr->bToolBelow ? BALLOON_STEMHEIGHT : 0),
|
||||||
|
@ -813,9 +816,16 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
|
||||||
* it is no longer needed */
|
* it is no longer needed */
|
||||||
}
|
}
|
||||||
|
|
||||||
SetWindowPos (infoPtr->hwndSelf, HWND_TOPMOST, rect.left, rect.top,
|
SetWindowPos (infoPtr->hwndSelf, NULL, rect.left, rect.top,
|
||||||
rect.right - rect.left, rect.bottom - rect.top,
|
rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
SWP_SHOWWINDOW | SWP_NOACTIVATE);
|
|
||||||
|
hdr.hwndFrom = infoPtr->hwndSelf;
|
||||||
|
hdr.idFrom = toolPtr->uId;
|
||||||
|
hdr.code = TTN_SHOW;
|
||||||
|
SendMessageW (toolPtr->hwnd, WM_NOTIFY, toolPtr->uId, (LPARAM)&hdr);
|
||||||
|
|
||||||
|
SetWindowPos (infoPtr->hwndSelf, HWND_TOPMOST, 0, 0, 0, 0,
|
||||||
|
SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW | SWP_NOACTIVATE);
|
||||||
|
|
||||||
/* repaint the tooltip */
|
/* repaint the tooltip */
|
||||||
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
|
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
|
||||||
|
@ -1048,7 +1058,7 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
|
||||||
TRACE("add tool (%p) %p %ld%s\n", infoPtr->hwndSelf, ti->hwnd, ti->uId,
|
TRACE("add tool (%p) %p %ld%s\n", infoPtr->hwndSelf, ti->hwnd, ti->uId,
|
||||||
(ti->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
|
(ti->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
|
||||||
|
|
||||||
if (ti->cbSize >= TTTOOLINFOW_V2_SIZE && !ti->lpszText && isW)
|
if (ti->cbSize > TTTOOLINFOW_V3_SIZE && isW)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (infoPtr->uNumTools == 0) {
|
if (infoPtr->uNumTools == 0) {
|
||||||
|
|
|
@ -18,22 +18,26 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 12, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
#include "comctl32.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(trackbar);
|
WINE_DEFAULT_DEBUG_CHANNEL(trackbar);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -680,7 +684,7 @@ TRACKBAR_FillThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, HBRUSH hbrush)
|
||||||
|
|
||||||
oldbr = SelectObject(hdc, hbrush);
|
oldbr = SelectObject(hdc, hbrush);
|
||||||
SetPolyFillMode(hdc, WINDING);
|
SetPolyFillMode(hdc, WINDING);
|
||||||
Polygon(hdc, points, sizeof(points) / sizeof(points[0]));
|
Polygon(hdc, points, ARRAY_SIZE(points));
|
||||||
SelectObject(hdc, oldbr);
|
SelectObject(hdc, oldbr);
|
||||||
|
|
||||||
return PointDepth;
|
return PointDepth;
|
||||||
|
|
|
@ -40,9 +40,31 @@
|
||||||
* Scroll (instead of repaint) as much as possible.
|
* Scroll (instead of repaint) as much as possible.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "comctl32.h"
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
#include <wine/exception.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/exception.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(treeview);
|
WINE_DEFAULT_DEBUG_CHANNEL(treeview);
|
||||||
|
|
||||||
|
@ -531,7 +553,7 @@ TREEVIEW_TVItemFromItem(const TREEVIEW_INFO *infoPtr, UINT mask, TVITEMW *tvItem
|
||||||
if (!infoPtr->bNtfUnicode)
|
if (!infoPtr->bNtfUnicode)
|
||||||
{
|
{
|
||||||
tvItem->cchTextMax = WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, NULL, 0, NULL, NULL );
|
tvItem->cchTextMax = WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, NULL, 0, NULL, NULL );
|
||||||
tvItem->pszText = Alloc (tvItem->cchTextMax);
|
tvItem->pszText = heap_alloc (tvItem->cchTextMax);
|
||||||
WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, (LPSTR)tvItem->pszText, tvItem->cchTextMax, 0, 0 );
|
WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, (LPSTR)tvItem->pszText, tvItem->cchTextMax, 0, 0 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -572,8 +594,8 @@ TREEVIEW_SendTreeviewNotify(const TREEVIEW_INFO *infoPtr, UINT code, UINT action
|
||||||
ret = TREEVIEW_SendRealNotify(infoPtr, code, &nmhdr.hdr);
|
ret = TREEVIEW_SendRealNotify(infoPtr, code, &nmhdr.hdr);
|
||||||
if (!infoPtr->bNtfUnicode)
|
if (!infoPtr->bNtfUnicode)
|
||||||
{
|
{
|
||||||
Free(nmhdr.itemOld.pszText);
|
heap_free(nmhdr.itemOld.pszText);
|
||||||
Free(nmhdr.itemNew.pszText);
|
heap_free(nmhdr.itemNew.pszText);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -672,7 +694,7 @@ TREEVIEW_BeginLabelEditNotify(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *editI
|
||||||
ret = TREEVIEW_SendRealNotify(infoPtr, TVN_BEGINLABELEDITW, &tvdi.hdr);
|
ret = TREEVIEW_SendRealNotify(infoPtr, TVN_BEGINLABELEDITW, &tvdi.hdr);
|
||||||
|
|
||||||
if (!infoPtr->bNtfUnicode)
|
if (!infoPtr->bNtfUnicode)
|
||||||
Free(tvdi.item.pszText);
|
heap_free(tvdi.item.pszText);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -718,7 +740,7 @@ TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
(LPSTR)callback.item.pszText, -1,
|
(LPSTR)callback.item.pszText, -1,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
||||||
newText = ReAlloc(item->pszText, buflen);
|
newText = heap_realloc(item->pszText, buflen);
|
||||||
|
|
||||||
TRACE("returned str %s, len=%d, buflen=%d\n",
|
TRACE("returned str %s, len=%d, buflen=%d\n",
|
||||||
debugstr_a((LPSTR)callback.item.pszText), len, buflen);
|
debugstr_a((LPSTR)callback.item.pszText), len, buflen);
|
||||||
|
@ -731,12 +753,12 @@ TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
item->pszText, buflen/sizeof(WCHAR));
|
item->pszText, buflen/sizeof(WCHAR));
|
||||||
item->cchTextMax = buflen/sizeof(WCHAR);
|
item->cchTextMax = buflen/sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
/* If ReAlloc fails we have nothing to do, but keep original text */
|
/* If realloc fails we have nothing to do, but keep original text */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int len = max(lstrlenW(callback.item.pszText) + 1,
|
int len = max(lstrlenW(callback.item.pszText) + 1,
|
||||||
TEXT_CALLBACK_SIZE);
|
TEXT_CALLBACK_SIZE);
|
||||||
LPWSTR newText = ReAlloc(item->pszText, len);
|
LPWSTR newText = heap_realloc(item->pszText, len);
|
||||||
|
|
||||||
TRACE("returned wstr %s, len=%d\n",
|
TRACE("returned wstr %s, len=%d\n",
|
||||||
debugstr_w(callback.item.pszText), len);
|
debugstr_w(callback.item.pszText), len);
|
||||||
|
@ -747,7 +769,7 @@ TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
strcpyW(item->pszText, callback.item.pszText);
|
strcpyW(item->pszText, callback.item.pszText);
|
||||||
item->cchTextMax = len;
|
item->cchTextMax = len;
|
||||||
}
|
}
|
||||||
/* If ReAlloc fails we have nothing to do, but keep original text */
|
/* If realloc fails we have nothing to do, but keep original text */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mask & TVIF_TEXT) {
|
else if (mask & TVIF_TEXT) {
|
||||||
|
@ -759,7 +781,7 @@ TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
(LPSTR)callback.item.pszText, -1,
|
(LPSTR)callback.item.pszText, -1,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
||||||
newText = Alloc(buflen);
|
newText = heap_alloc(buflen);
|
||||||
|
|
||||||
TRACE("same buffer str %s, len=%d, buflen=%d\n",
|
TRACE("same buffer str %s, len=%d, buflen=%d\n",
|
||||||
debugstr_a((LPSTR)callback.item.pszText), len, buflen);
|
debugstr_a((LPSTR)callback.item.pszText), len, buflen);
|
||||||
|
@ -772,7 +794,7 @@ TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
(LPSTR)callback.item.pszText, -1,
|
(LPSTR)callback.item.pszText, -1,
|
||||||
item->pszText, buflen/sizeof(WCHAR));
|
item->pszText, buflen/sizeof(WCHAR));
|
||||||
item->cchTextMax = buflen/sizeof(WCHAR);
|
item->cchTextMax = buflen/sizeof(WCHAR);
|
||||||
Free(oldText);
|
heap_free(oldText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -980,7 +1002,7 @@ TREEVIEW_UpdateSubTree(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *root)
|
||||||
static TREEVIEW_ITEM *
|
static TREEVIEW_ITEM *
|
||||||
TREEVIEW_AllocateItem(const TREEVIEW_INFO *infoPtr)
|
TREEVIEW_AllocateItem(const TREEVIEW_INFO *infoPtr)
|
||||||
{
|
{
|
||||||
TREEVIEW_ITEM *newItem = Alloc(sizeof(TREEVIEW_ITEM));
|
TREEVIEW_ITEM *newItem = heap_alloc_zero(sizeof(*newItem));
|
||||||
|
|
||||||
if (!newItem)
|
if (!newItem)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -996,7 +1018,7 @@ TREEVIEW_AllocateItem(const TREEVIEW_INFO *infoPtr)
|
||||||
|
|
||||||
if (DPA_InsertPtr(infoPtr->items, INT_MAX, newItem) == -1)
|
if (DPA_InsertPtr(infoPtr->items, INT_MAX, newItem) == -1)
|
||||||
{
|
{
|
||||||
Free(newItem);
|
heap_free(newItem);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1021,7 +1043,7 @@ TREEVIEW_FreeItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item)
|
||||||
infoPtr->dropItem = NULL;
|
infoPtr->dropItem = NULL;
|
||||||
if (infoPtr->insertMarkItem == item)
|
if (infoPtr->insertMarkItem == item)
|
||||||
infoPtr->insertMarkItem = NULL;
|
infoPtr->insertMarkItem = NULL;
|
||||||
Free(item);
|
heap_free(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1112,7 +1134,7 @@ TREEVIEW_DoSetItemT(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
else
|
else
|
||||||
len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)tvItem->pszText, -1, NULL, 0);
|
len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)tvItem->pszText, -1, NULL, 0);
|
||||||
|
|
||||||
newText = ReAlloc(item->pszText, len * sizeof(WCHAR));
|
newText = heap_realloc(item->pszText, len * sizeof(WCHAR));
|
||||||
|
|
||||||
if (newText == NULL) return FALSE;
|
if (newText == NULL) return FALSE;
|
||||||
|
|
||||||
|
@ -1131,9 +1153,7 @@ TREEVIEW_DoSetItemT(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
callbackSet |= TVIF_TEXT;
|
callbackSet |= TVIF_TEXT;
|
||||||
|
item->pszText = heap_realloc(item->pszText, TEXT_CALLBACK_SIZE * sizeof(WCHAR));
|
||||||
item->pszText = ReAlloc(item->pszText,
|
|
||||||
TEXT_CALLBACK_SIZE * sizeof(WCHAR));
|
|
||||||
item->cchTextMax = TEXT_CALLBACK_SIZE;
|
item->cchTextMax = TEXT_CALLBACK_SIZE;
|
||||||
TRACE("setting callback, item %p\n", item);
|
TRACE("setting callback, item %p\n", item);
|
||||||
}
|
}
|
||||||
|
@ -1478,7 +1498,7 @@ TREEVIEW_RemoveItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item)
|
||||||
infoPtr->uNumItems--;
|
infoPtr->uNumItems--;
|
||||||
|
|
||||||
if (item->pszText != LPSTR_TEXTCALLBACKW)
|
if (item->pszText != LPSTR_TEXTCALLBACKW)
|
||||||
Free(item->pszText);
|
heap_free(item->pszText);
|
||||||
|
|
||||||
TREEVIEW_FreeItem(infoPtr, item);
|
TREEVIEW_FreeItem(infoPtr, item);
|
||||||
}
|
}
|
||||||
|
@ -3816,7 +3836,7 @@ TREEVIEW_Command(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
infoPtr->bLabelChanged = TRUE;
|
infoPtr->bLabelChanged = TRUE;
|
||||||
|
|
||||||
GetWindowTextW(infoPtr->hwndEdit, buffer, sizeof(buffer)/sizeof(buffer[0]));
|
GetWindowTextW(infoPtr->hwndEdit, buffer, ARRAY_SIZE(buffer));
|
||||||
|
|
||||||
/* Select font to get the right dimension of the string */
|
/* Select font to get the right dimension of the string */
|
||||||
hFont = (HFONT)SendMessageW(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
|
hFont = (HFONT)SendMessageW(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
|
||||||
|
@ -4017,18 +4037,18 @@ TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
|
||||||
if (!infoPtr->bNtfUnicode)
|
if (!infoPtr->bNtfUnicode)
|
||||||
{
|
{
|
||||||
DWORD len = MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, NULL, 0 );
|
DWORD len = MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, NULL, 0 );
|
||||||
newText = Alloc(len * sizeof(WCHAR));
|
newText = heap_alloc(len * sizeof(WCHAR));
|
||||||
MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, newText, len );
|
MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, newText, len );
|
||||||
iLength = len - 1;
|
iLength = len - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmpW(newText, editedItem->pszText) != 0)
|
if (strcmpW(newText, editedItem->pszText) != 0)
|
||||||
{
|
{
|
||||||
WCHAR *ptr = ReAlloc(editedItem->pszText, sizeof(WCHAR)*(iLength + 1));
|
WCHAR *ptr = heap_realloc(editedItem->pszText, sizeof(WCHAR)*(iLength + 1));
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
ERR("OutOfMemory, cannot allocate space for label\n");
|
ERR("OutOfMemory, cannot allocate space for label\n");
|
||||||
if(newText != tmpText) Free(newText);
|
if (newText != tmpText) heap_free(newText);
|
||||||
DestroyWindow(infoPtr->hwndEdit);
|
DestroyWindow(infoPtr->hwndEdit);
|
||||||
infoPtr->hwndEdit = 0;
|
infoPtr->hwndEdit = 0;
|
||||||
infoPtr->editItem = NULL;
|
infoPtr->editItem = NULL;
|
||||||
|
@ -4042,7 +4062,7 @@ TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
|
||||||
TREEVIEW_ComputeTextWidth(infoPtr, editedItem, 0);
|
TREEVIEW_ComputeTextWidth(infoPtr, editedItem, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(newText != tmpText) Free(newText);
|
if (newText != tmpText) heap_free(newText);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowWindow(infoPtr->hwndEdit, SW_HIDE);
|
ShowWindow(infoPtr->hwndEdit, SW_HIDE);
|
||||||
|
@ -4626,7 +4646,7 @@ static INT TREEVIEW_ProcessLetterKeys(TREEVIEW_INFO *infoPtr, WPARAM charCode, L
|
||||||
/* update the search parameters */
|
/* update the search parameters */
|
||||||
infoPtr->lastKeyPressTimestamp=timestamp;
|
infoPtr->lastKeyPressTimestamp=timestamp;
|
||||||
if (elapsed < KEY_DELAY) {
|
if (elapsed < KEY_DELAY) {
|
||||||
if (infoPtr->nSearchParamLength < sizeof(infoPtr->szSearchParam) / sizeof(WCHAR)) {
|
if (infoPtr->nSearchParamLength < ARRAY_SIZE(infoPtr->szSearchParam)) {
|
||||||
infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
|
infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
|
||||||
}
|
}
|
||||||
if (infoPtr->charCode != charCode) {
|
if (infoPtr->charCode != charCode) {
|
||||||
|
@ -5064,7 +5084,7 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
|
||||||
|
|
||||||
TRACE("wnd %p, style 0x%x\n", hwnd, GetWindowLongW(hwnd, GWL_STYLE));
|
TRACE("wnd %p, style 0x%x\n", hwnd, GetWindowLongW(hwnd, GWL_STYLE));
|
||||||
|
|
||||||
infoPtr = Alloc(sizeof(TREEVIEW_INFO));
|
infoPtr = heap_alloc_zero(sizeof(TREEVIEW_INFO));
|
||||||
|
|
||||||
if (infoPtr == NULL)
|
if (infoPtr == NULL)
|
||||||
{
|
{
|
||||||
|
@ -5174,8 +5194,6 @@ TREEVIEW_Destroy(TREEVIEW_INFO *infoPtr)
|
||||||
TREEVIEW_FreeItem(infoPtr, infoPtr->root);
|
TREEVIEW_FreeItem(infoPtr, infoPtr->root);
|
||||||
DPA_Destroy(infoPtr->items);
|
DPA_Destroy(infoPtr->items);
|
||||||
|
|
||||||
/* tool tip is automatically destroyed: we are its owner */
|
|
||||||
|
|
||||||
/* Restore original wndproc */
|
/* Restore original wndproc */
|
||||||
if (infoPtr->hwndEdit)
|
if (infoPtr->hwndEdit)
|
||||||
SetWindowLongPtrW(infoPtr->hwndEdit, GWLP_WNDPROC,
|
SetWindowLongPtrW(infoPtr->hwndEdit, GWLP_WNDPROC,
|
||||||
|
@ -5190,7 +5208,8 @@ TREEVIEW_Destroy(TREEVIEW_INFO *infoPtr)
|
||||||
DeleteObject(infoPtr->hBoldFont);
|
DeleteObject(infoPtr->hBoldFont);
|
||||||
DeleteObject(infoPtr->hUnderlineFont);
|
DeleteObject(infoPtr->hUnderlineFont);
|
||||||
DeleteObject(infoPtr->hBoldUnderlineFont);
|
DeleteObject(infoPtr->hBoldUnderlineFont);
|
||||||
Free(infoPtr);
|
DestroyWindow(infoPtr->hwndToolTip);
|
||||||
|
heap_free(infoPtr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,19 +16,25 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*
|
|
||||||
* NOTE
|
|
||||||
*
|
|
||||||
* This code was audited for completeness against the documented features
|
|
||||||
* of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun.
|
|
||||||
*
|
|
||||||
* Unless otherwise noted, we believe this code to be complete, as per
|
|
||||||
* the specification mentioned above.
|
|
||||||
* If you discover missing features, or bugs, please note them below.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "comctl32.h"
|
#include "comctl32.h"
|
||||||
|
#include "uxtheme.h"
|
||||||
|
#include "vssym32.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(updown);
|
WINE_DEFAULT_DEBUG_CHANNEL(updown);
|
||||||
|
|
||||||
|
@ -83,7 +89,6 @@ typedef struct
|
||||||
#define TIMER_AUTOPRESS 3
|
#define TIMER_AUTOPRESS 3
|
||||||
|
|
||||||
#define UPDOWN_GetInfoPtr(hwnd) ((UPDOWN_INFO *)GetWindowLongPtrW (hwnd,0))
|
#define UPDOWN_GetInfoPtr(hwnd) ((UPDOWN_INFO *)GetWindowLongPtrW (hwnd,0))
|
||||||
#define COUNT_OF(a) (sizeof(a)/sizeof(a[0]))
|
|
||||||
|
|
||||||
/* id used for SetWindowSubclass */
|
/* id used for SetWindowSubclass */
|
||||||
#define BUDDY_SUBCLASSID 1
|
#define BUDDY_SUBCLASSID 1
|
||||||
|
@ -269,7 +274,7 @@ static BOOL UPDOWN_GetBuddyInt (UPDOWN_INFO *infoPtr)
|
||||||
/* we have a regular window, so will get the text */
|
/* we have a regular window, so will get the text */
|
||||||
/* note that a zero-length string is a legitimate value for 'txt',
|
/* note that a zero-length string is a legitimate value for 'txt',
|
||||||
* and ought to result in a successful conversion to '0'. */
|
* and ought to result in a successful conversion to '0'. */
|
||||||
if (GetWindowTextW(infoPtr->Buddy, txt, COUNT_OF(txt)) < 0)
|
if (GetWindowTextW(infoPtr->Buddy, txt, ARRAY_SIZE(txt)) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sep = UPDOWN_GetThousandSep();
|
sep = UPDOWN_GetThousandSep();
|
||||||
|
@ -322,7 +327,7 @@ static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr)
|
||||||
|
|
||||||
/* Do thousands separation if necessary */
|
/* Do thousands separation if necessary */
|
||||||
if ((infoPtr->Base == 10) && !(infoPtr->dwStyle & UDS_NOTHOUSANDS) && (len > 3)) {
|
if ((infoPtr->Base == 10) && !(infoPtr->dwStyle & UDS_NOTHOUSANDS) && (len > 3)) {
|
||||||
WCHAR tmp[COUNT_OF(txt)], *src = tmp, *dst = txt;
|
WCHAR tmp[ARRAY_SIZE(txt)], *src = tmp, *dst = txt;
|
||||||
WCHAR sep = UPDOWN_GetThousandSep();
|
WCHAR sep = UPDOWN_GetThousandSep();
|
||||||
int start = len % 3;
|
int start = len % 3;
|
||||||
|
|
||||||
|
@ -338,7 +343,7 @@ static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if nothing changed exit earlier */
|
/* if nothing changed exit earlier */
|
||||||
GetWindowTextW(infoPtr->Buddy, txt_old, sizeof(txt_old)/sizeof(WCHAR));
|
GetWindowTextW(infoPtr->Buddy, txt_old, ARRAY_SIZE(txt_old));
|
||||||
if (lstrcmpiW(txt_old, txt) == 0) return FALSE;
|
if (lstrcmpiW(txt_old, txt) == 0) return FALSE;
|
||||||
|
|
||||||
return SetWindowTextW(infoPtr->Buddy, txt);
|
return SetWindowTextW(infoPtr->Buddy, txt);
|
||||||
|
@ -577,14 +582,22 @@ UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
{
|
{
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
|
if (infoPtr)
|
||||||
|
{
|
||||||
UPDOWN_KeyPressed(infoPtr, (int)wParam);
|
UPDOWN_KeyPressed(infoPtr, (int)wParam);
|
||||||
if ((wParam == VK_UP) || (wParam == VK_DOWN)) return 0;
|
if (wParam == VK_UP || wParam == VK_DOWN)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
|
if (infoPtr)
|
||||||
UPDOWN_MouseWheel(infoPtr, (int)wParam);
|
UPDOWN_MouseWheel(infoPtr, (int)wParam);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
RemoveWindowSubclass(hwnd, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -592,6 +605,11 @@ UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||||
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void UPDOWN_ResetSubclass (UPDOWN_INFO *infoPtr)
|
||||||
|
{
|
||||||
|
SetWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* UPDOWN_SetBuddy
|
* UPDOWN_SetBuddy
|
||||||
*
|
*
|
||||||
|
@ -613,9 +631,8 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
|
||||||
|
|
||||||
old_buddy = infoPtr->Buddy;
|
old_buddy = infoPtr->Buddy;
|
||||||
|
|
||||||
/* there is already a buddy assigned */
|
UPDOWN_ResetSubclass (infoPtr);
|
||||||
if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc,
|
|
||||||
BUDDY_SUBCLASSID);
|
|
||||||
if (!IsWindow(bud)) bud = NULL;
|
if (!IsWindow(bud)) bud = NULL;
|
||||||
|
|
||||||
/* Store buddy window handle */
|
/* Store buddy window handle */
|
||||||
|
@ -624,7 +641,7 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
|
||||||
if(bud) {
|
if(bud) {
|
||||||
/* Store buddy window class type */
|
/* Store buddy window class type */
|
||||||
infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN;
|
infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN;
|
||||||
if (GetClassNameW(bud, buddyClass, COUNT_OF(buddyClass))) {
|
if (GetClassNameW(bud, buddyClass, ARRAY_SIZE(buddyClass))) {
|
||||||
if (lstrcmpiW(buddyClass, WC_EDITW) == 0)
|
if (lstrcmpiW(buddyClass, WC_EDITW) == 0)
|
||||||
infoPtr->BuddyType = BUDDY_TYPE_EDIT;
|
infoPtr->BuddyType = BUDDY_TYPE_EDIT;
|
||||||
else if (lstrcmpiW(buddyClass, WC_LISTBOXW) == 0)
|
else if (lstrcmpiW(buddyClass, WC_LISTBOXW) == 0)
|
||||||
|
@ -893,7 +910,7 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
|
||||||
{
|
{
|
||||||
CREATESTRUCTW *pcs = (CREATESTRUCTW*)lParam;
|
CREATESTRUCTW *pcs = (CREATESTRUCTW*)lParam;
|
||||||
|
|
||||||
infoPtr = Alloc (sizeof(UPDOWN_INFO));
|
infoPtr = heap_alloc_zero(sizeof(*infoPtr));
|
||||||
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
|
||||||
|
|
||||||
/* initialize the info struct */
|
/* initialize the info struct */
|
||||||
|
@ -926,12 +943,9 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
Free (infoPtr->AccelVect);
|
heap_free (infoPtr->AccelVect);
|
||||||
|
UPDOWN_ResetSubclass (infoPtr);
|
||||||
if (infoPtr->Buddy)
|
heap_free (infoPtr);
|
||||||
RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc,
|
|
||||||
BUDDY_SUBCLASSID);
|
|
||||||
Free (infoPtr);
|
|
||||||
SetWindowLongPtrW (hwnd, 0, 0);
|
SetWindowLongPtrW (hwnd, 0, 0);
|
||||||
theme = GetWindowTheme (hwnd);
|
theme = GetWindowTheme (hwnd);
|
||||||
CloseThemeData (theme);
|
CloseThemeData (theme);
|
||||||
|
@ -1056,13 +1070,13 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
|
||||||
TRACE("UDM_SETACCEL\n");
|
TRACE("UDM_SETACCEL\n");
|
||||||
|
|
||||||
if(infoPtr->AccelVect) {
|
if(infoPtr->AccelVect) {
|
||||||
Free (infoPtr->AccelVect);
|
heap_free (infoPtr->AccelVect);
|
||||||
infoPtr->AccelCount = 0;
|
infoPtr->AccelCount = 0;
|
||||||
infoPtr->AccelVect = 0;
|
infoPtr->AccelVect = 0;
|
||||||
}
|
}
|
||||||
if(wParam==0) return TRUE;
|
if(wParam==0) return TRUE;
|
||||||
infoPtr->AccelVect = Alloc (wParam*sizeof(UDACCEL));
|
infoPtr->AccelVect = heap_alloc(wParam*sizeof(UDACCEL));
|
||||||
if(infoPtr->AccelVect == 0) return FALSE;
|
if(!infoPtr->AccelVect) return FALSE;
|
||||||
memcpy(infoPtr->AccelVect, (void*)lParam, wParam*sizeof(UDACCEL));
|
memcpy(infoPtr->AccelVect, (void*)lParam, wParam*sizeof(UDACCEL));
|
||||||
infoPtr->AccelCount = wParam;
|
infoPtr->AccelCount = wParam;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<windowClass versioned="no">NativeFontCtl</windowClass>
|
<windowClass versioned="no">NativeFontCtl</windowClass>
|
||||||
<windowClass versioned="no">ReBarWindow32</windowClass>
|
<windowClass versioned="no">ReBarWindow32</windowClass>
|
||||||
<windowClass versioned="no">ScrollBar</windowClass>
|
<windowClass versioned="no">ScrollBar</windowClass>
|
||||||
|
<windowClass versioned="no">Static</windowClass>
|
||||||
<windowClass versioned="no">SysAnimate32</windowClass>
|
<windowClass versioned="no">SysAnimate32</windowClass>
|
||||||
<windowClass versioned="no">SysDateTimePick32</windowClass>
|
<windowClass versioned="no">SysDateTimePick32</windowClass>
|
||||||
<windowClass versioned="no">SysHeader32</windowClass>
|
<windowClass versioned="no">SysHeader32</windowClass>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<windowClass>NativeFontCtl</windowClass>
|
<windowClass>NativeFontCtl</windowClass>
|
||||||
<windowClass>ReBarWindow32</windowClass>
|
<windowClass>ReBarWindow32</windowClass>
|
||||||
<windowClass>ScrollBar</windowClass>
|
<windowClass>ScrollBar</windowClass>
|
||||||
|
<windowClass>Static</windowClass>
|
||||||
<windowClass>SysAnimate32</windowClass>
|
<windowClass>SysAnimate32</windowClass>
|
||||||
<windowClass>SysDateTimePick32</windowClass>
|
<windowClass>SysDateTimePick32</windowClass>
|
||||||
<windowClass>SysHeader32</windowClass>
|
<windowClass>SysHeader32</windowClass>
|
||||||
|
|
Loading…
Reference in a new issue