#define SB_SETBORDERS (WM_USER+5)
#define FLATSB_CLASSA "flatsb_class32"
+#if defined(__GNUC__)
+# define FLATSB_CLASSW (const WCHAR []){ 'f','l','a','t','s','b','_', \
+ 'c','l','a','s','s','3','2',0 }
+#elif defined(_MSC_VER)
+# define FLATSB_CLASSW L"flatsb_class32"
+#else
+static const WCHAR FLATSB_CLASSW[] = { 'f','l','a','t','s','b','_',
+ 'c','l','a','s','s','3','2',0 };
+#endif
+
#define DRAGLISTMSGSTRINGA "commctrl_DragListMsg"
#if defined(__GNUC__)
# define DRAGLISTMSGSTRINGW (const WCHAR []){ 'c','o','m','m','c','t','r','l', \
* Animation control\r
*\r
* Copyright 1998, 1999 Eric Kohl\r
- * 1999 Eric Pouech\r
+ * Copyright 1999 Eric Pouech\r
+ * Copyright 2005 Dimitrie O. Paun\r
*\r
* This library is free software; you can redistribute it and/or\r
* modify it under the terms of the GNU Lesser General Public\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
* NOTES\r
- * I will only improve this control once in a while.\r
- * Eric <ekohl@abo.rhein-zeitung.de>\r
*\r
+ * This code was audited for completeness against the documented features\r
+ * of Comctl32.dll version 6.0 on Mar. 15, 2005, by Dimitrie O. Paun.\r
+ * \r
+ * Unless otherwise noted, we believe this code to be complete, as per\r
+ * the specification mentioned above.\r
+ * If you discover missing features, or bugs, please note them below.\r
+ * \r
* TODO:\r
* - check for the 'rec ' list in some AVI files\r
- * - concurrent access to infoPtr\r
*/\r
\r
#define COM_NO_WINDOWS_H\r
HMMIO hMMio; /* handle to mmio stream */\r
HWND hwndSelf;\r
HWND hwndNotify;\r
+ DWORD dwStyle;\r
/* information on the loaded AVI file */\r
MainAVIHeader mah;\r
AVIStreamHeader ash;\r
HBITMAP hbmPrevFrame;\r
} ANIMATE_INFO;\r
\r
-#define ANIMATE_GetInfoPtr(hWnd) ((ANIMATE_INFO *)GetWindowLongPtrW(hWnd, 0))\r
#define ANIMATE_COLOR_NONE 0xffffffff\r
\r
-static void ANIMATE_Notify(ANIMATE_INFO* infoPtr, UINT notif)\r
+static void ANIMATE_Notify(ANIMATE_INFO *infoPtr, UINT notif)\r
{\r
- SendMessageA(infoPtr->hwndNotify, WM_COMMAND,\r
+ SendMessageW(infoPtr->hwndNotify, WM_COMMAND,\r
MAKEWPARAM(GetDlgCtrlID(infoPtr->hwndSelf), notif),\r
(LPARAM)infoPtr->hwndSelf);\r
}\r
\r
-static BOOL ANIMATE_LoadResA(ANIMATE_INFO *infoPtr, HINSTANCE hInst, LPSTR lpName)\r
+static BOOL ANIMATE_LoadResW(ANIMATE_INFO *infoPtr, HINSTANCE hInst, LPWSTR lpName)\r
{\r
+ static const WCHAR aviW[] = { 'A', 'V', 'I', 0 };\r
HRSRC hrsrc;\r
MMIOINFO mminfo;\r
LPVOID lpAvi;\r
\r
- hrsrc = FindResourceA(hInst, lpName, "AVI");\r
+ hrsrc = FindResourceW(hInst, lpName, aviW);\r
if (!hrsrc)\r
return FALSE;\r
\r
mminfo.fccIOProc = FOURCC_MEM;\r
mminfo.pchBuffer = (LPSTR)lpAvi;\r
mminfo.cchBuffer = SizeofResource(hInst, hrsrc);\r
- infoPtr->hMMio = mmioOpenA(NULL, &mminfo, MMIO_READ);\r
- if (!infoPtr->hMMio) {\r
+ infoPtr->hMMio = mmioOpenW(NULL, &mminfo, MMIO_READ);\r
+ if (!infoPtr->hMMio) \r
+ {\r
FreeResource(infoPtr->hRes);\r
return FALSE;\r
}\r
}\r
\r
\r
-static BOOL ANIMATE_LoadFileA(ANIMATE_INFO *infoPtr, LPSTR lpName)\r
+static BOOL ANIMATE_LoadFileW(ANIMATE_INFO *infoPtr, LPWSTR lpName)\r
{\r
- infoPtr->hMMio = mmioOpenA((LPSTR)lpName, NULL,\r
- MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);\r
+ infoPtr->hMMio = mmioOpenW(lpName, 0, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);\r
\r
- if (!infoPtr->hMMio)\r
- return FALSE;\r
-\r
- return TRUE;\r
+ return (BOOL)infoPtr->hMMio;\r
}\r
\r
\r
-static LRESULT ANIMATE_DoStop(ANIMATE_INFO *infoPtr)\r
+static BOOL ANIMATE_DoStop(ANIMATE_INFO *infoPtr)\r
{\r
EnterCriticalSection(&infoPtr->cs);\r
\r
FreeResource(infoPtr->hRes);\r
infoPtr->hRes = 0;\r
}\r
- HeapFree(GetProcessHeap(), 0, infoPtr->lpIndex);\r
+ Free (infoPtr->lpIndex);\r
infoPtr->lpIndex = NULL;\r
if (infoPtr->hic) {\r
fnIC.fnICClose(infoPtr->hic);\r
infoPtr->hic = 0;\r
}\r
- HeapFree(GetProcessHeap(), 0, infoPtr->inbih);\r
+ Free (infoPtr->inbih);\r
infoPtr->inbih = NULL;\r
- HeapFree(GetProcessHeap(), 0, infoPtr->outbih);\r
+ Free (infoPtr->outbih);\r
infoPtr->outbih = NULL;\r
- HeapFree(GetProcessHeap(), 0, infoPtr->indata);\r
+ Free (infoPtr->indata);\r
infoPtr->indata = NULL;\r
- HeapFree(GetProcessHeap(), 0, infoPtr->outdata);\r
+ Free (infoPtr->outdata);\r
infoPtr->outdata = NULL;\r
if( infoPtr->hbmPrevFrame )\r
{\r
DeleteObject(infoPtr->hbmPrevFrame);\r
infoPtr->hbmPrevFrame = 0;\r
}\r
- infoPtr->indata = infoPtr->outdata = NULL;\r
- infoPtr->hwndSelf = 0;\r
- infoPtr->hMMio = 0;\r
\r
memset(&infoPtr->mah, 0, sizeof(infoPtr->mah));\r
memset(&infoPtr->ash, 0, sizeof(infoPtr->ash));\r
infoPtr->transparentColor = ANIMATE_COLOR_NONE;\r
}\r
\r
-static void ANIMATE_TransparentBlt(ANIMATE_INFO* infoPtr, HDC hdcDest, HDC hdcSource)\r
+static void ANIMATE_TransparentBlt(ANIMATE_INFO *infoPtr, HDC hdcDest, HDC hdcSource)\r
{\r
HDC hdcMask;\r
HBITMAP hbmMask;\r
DeleteDC(hdcMask);\r
}\r
\r
-static LRESULT ANIMATE_PaintFrame(ANIMATE_INFO* infoPtr, HDC hDC)\r
+static BOOL ANIMATE_PaintFrame(ANIMATE_INFO* infoPtr, HDC hDC)\r
{\r
void* pBitmapData = NULL;\r
LPBITMAPINFO pBitmapInfo = NULL;\r
\r
nWidth = infoPtr->outbih->biWidth;\r
nHeight = infoPtr->outbih->biHeight;\r
- } else\r
+ } \r
+ else\r
{\r
pBitmapData = infoPtr->indata;\r
pBitmapInfo = (LPBITMAPINFO)infoPtr->inbih;\r
infoPtr->transparentColor = GetPixel(hdcMem,0,0);\r
}\r
\r
- if(GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_TRANSPARENT)\r
+ if(infoPtr->dwStyle & ACS_TRANSPARENT)\r
{\r
HDC hdcFinal = CreateCompatibleDC(hDC);\r
HBITMAP hbmFinal = CreateCompatibleBitmap(hDC,nWidth, nHeight);\r
DeleteDC(hdcFinal);\r
DeleteObject(infoPtr->hbmPrevFrame);\r
infoPtr->hbmPrevFrame = hbmFinal;\r
- }\r
+ }\r
\r
- if (GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_CENTER)\r
+ if (infoPtr->dwStyle & ACS_CENTER)\r
{\r
- RECT rect;\r
+ RECT rect;\r
\r
- GetWindowRect(infoPtr->hwndSelf, &rect);\r
- nOffsetX = ((rect.right - rect.left) - nWidth)/2;\r
- nOffsetY = ((rect.bottom - rect.top) - nHeight)/2;\r
+ GetWindowRect(infoPtr->hwndSelf, &rect);\r
+ nOffsetX = ((rect.right - rect.left) - nWidth)/2;\r
+ nOffsetY = ((rect.bottom - rect.top) - nHeight)/2;\r
}\r
BitBlt(hDC, nOffsetX, nOffsetY, nWidth, nHeight, hdcMem, 0, 0, SRCCOPY);\r
\r
return TRUE;\r
}\r
\r
-static LRESULT ANIMATE_DrawFrame(ANIMATE_INFO* infoPtr)\r
+static BOOL ANIMATE_DrawFrame(ANIMATE_INFO *infoPtr)\r
{\r
HDC hDC;\r
\r
TRACE("Drawing frame %d (loop %d)\n", infoPtr->currFrame, infoPtr->nLoop);\r
\r
- EnterCriticalSection(&infoPtr->cs);\r
-\r
mmioSeek(infoPtr->hMMio, infoPtr->lpIndex[infoPtr->currFrame], SEEK_SET);\r
mmioRead(infoPtr->hMMio, infoPtr->indata, infoPtr->ash.dwSuggestedBufferSize);\r
\r
if (infoPtr->hic &&\r
fnIC.fnICDecompress(infoPtr->hic, 0, infoPtr->inbih, infoPtr->indata,\r
infoPtr->outbih, infoPtr->outdata) != ICERR_OK) {\r
- LeaveCriticalSection(&infoPtr->cs);\r
WARN("Decompression error\n");\r
return FALSE;\r
}\r
}\r
}\r
}\r
- LeaveCriticalSection(&infoPtr->cs);\r
\r
return TRUE;\r
}\r
\r
+static LRESULT ANIMATE_Timer(ANIMATE_INFO *infoPtr)\r
+{\r
+ /* FIXME: we should pass the hDC instead of 0 to WM_CTLCOLORSTATIC */\r
+ if (infoPtr->dwStyle & ACS_TRANSPARENT)\r
+ infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,\r
+ WM_CTLCOLORSTATIC,\r
+ 0, (LPARAM)infoPtr->hwndSelf);\r
+ EnterCriticalSection(&infoPtr->cs);\r
+ ANIMATE_DrawFrame(infoPtr);\r
+ LeaveCriticalSection(&infoPtr->cs);\r
+\r
+ return 0;\r
+}\r
+\r
static DWORD CALLBACK ANIMATE_AnimationThread(LPVOID ptr_)\r
{\r
- ANIMATE_INFO* infoPtr = (ANIMATE_INFO*)ptr_;\r
+ ANIMATE_INFO *infoPtr = (ANIMATE_INFO *)ptr_;\r
HANDLE event;\r
DWORD timeout;\r
\r
return TRUE;\r
}\r
\r
-static LRESULT ANIMATE_Play(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+static LRESULT ANIMATE_Play(ANIMATE_INFO *infoPtr, UINT cRepeat, WORD wFrom, WORD wTo)\r
{\r
- ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
-\r
/* nothing opened */\r
if (!infoPtr->hMMio)\r
return FALSE;\r
return TRUE;\r
}\r
\r
- infoPtr->nFromFrame = (INT)LOWORD(lParam);\r
- infoPtr->nToFrame = (INT)HIWORD(lParam);\r
- infoPtr->nLoop = (INT)wParam;\r
+ infoPtr->nFromFrame = wFrom;\r
+ infoPtr->nToFrame = wTo;\r
+ infoPtr->nLoop = cRepeat;\r
\r
if (infoPtr->nToFrame == 0xFFFF)\r
infoPtr->nToFrame = infoPtr->mah.dwTotalFrames - 1;\r
\r
infoPtr->currFrame = infoPtr->nFromFrame;\r
\r
- if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_TIMER) {\r
+ if (infoPtr->dwStyle & ACS_TIMER) \r
+ {\r
TRACE("Using a timer\n");\r
/* create a timer to display AVI */\r
- infoPtr->uTimer = SetTimer(hWnd, 1, infoPtr->mah.dwMicroSecPerFrame / 1000, NULL);\r
- } else {\r
- if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)\r
- {\r
- infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,\r
- WM_CTLCOLORSTATIC, 0, (LPARAM)hWnd);\r
- }\r
+ infoPtr->uTimer = SetTimer(infoPtr->hwndSelf, 1, \r
+ infoPtr->mah.dwMicroSecPerFrame / 1000, NULL);\r
+ } \r
+ else \r
+ {\r
+ if(infoPtr->dwStyle & ACS_TRANSPARENT)\r
+ infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,\r
+ WM_CTLCOLORSTATIC, 0,\r
+ (LPARAM)infoPtr->hwndSelf);\r
\r
TRACE("Using an animation thread\n");\r
infoPtr->hStopEvent = CreateEventW( NULL, TRUE, FALSE, NULL );\r
- infoPtr->hThread = CreateThread(0,0,ANIMATE_AnimationThread,(LPVOID)infoPtr, 0, &infoPtr->threadId);\r
- if(!infoPtr->hThread)\r
- {\r
- ERR("Could not create animation thread!\n");\r
- return FALSE;\r
- }\r
+ infoPtr->hThread = CreateThread(0, 0, ANIMATE_AnimationThread,\r
+ (LPVOID)infoPtr, 0, &infoPtr->threadId);\r
+ if(!infoPtr->hThread) return FALSE;\r
\r
}\r
\r
return FALSE;\r
}\r
\r
- infoPtr->inbih = HeapAlloc(GetProcessHeap(), 0, mmckInfo.cksize);\r
+ infoPtr->inbih = Alloc(mmckInfo.cksize);\r
if (!infoPtr->inbih) {\r
WARN("Can't alloc input BIH\n");\r
return FALSE;\r
\r
/* FIXME: should handle the 'rec ' LIST when present */\r
\r
- infoPtr->lpIndex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,\r
- infoPtr->mah.dwTotalFrames * sizeof(DWORD));\r
- if (!infoPtr->lpIndex) {\r
- WARN("Can't alloc index array\n");\r
+ infoPtr->lpIndex = Alloc(infoPtr->mah.dwTotalFrames * sizeof(DWORD));\r
+ if (!infoPtr->lpIndex) \r
return FALSE;\r
- }\r
\r
numFrame = insize = 0;\r
while (mmioDescend(infoPtr->hMMio, &mmckInfo, &mmckList, 0) == 0 &&\r
infoPtr->ash.dwSuggestedBufferSize = insize;\r
}\r
\r
- infoPtr->indata = HeapAlloc(GetProcessHeap(), 0, infoPtr->ash.dwSuggestedBufferSize);\r
- if (!infoPtr->indata) {\r
- WARN("Can't alloc input buffer\n");\r
+ infoPtr->indata = Alloc(infoPtr->ash.dwSuggestedBufferSize);\r
+ if (!infoPtr->indata) \r
return FALSE;\r
- }\r
\r
return TRUE;\r
}\r
\r
\r
-static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)\r
+static BOOL ANIMATE_GetAviCodec(ANIMATE_INFO *infoPtr)\r
{\r
DWORD outSize;\r
\r
outSize = fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,\r
(DWORD)infoPtr->inbih, 0L);\r
\r
- infoPtr->outbih = HeapAlloc(GetProcessHeap(), 0, outSize);\r
- if (!infoPtr->outbih) {\r
- WARN("Can't alloc output BIH\n");\r
+ infoPtr->outbih = Alloc(outSize);\r
+ if (!infoPtr->outbih)\r
return FALSE;\r
- }\r
\r
if (fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_GET_FORMAT,\r
- (DWORD)infoPtr->inbih, (DWORD)infoPtr->outbih) != outSize) {\r
+ (DWORD)infoPtr->inbih, (DWORD)infoPtr->outbih) != outSize) \r
+ {\r
WARN("Can't get output BIH\n");\r
return FALSE;\r
}\r
\r
- infoPtr->outdata = HeapAlloc(GetProcessHeap(), 0, infoPtr->outbih->biSizeImage);\r
- if (!infoPtr->outdata) {\r
- WARN("Can't alloc output buffer\n");\r
+ infoPtr->outdata = Alloc(infoPtr->outbih->biSizeImage);\r
+ if (!infoPtr->outdata) \r
return FALSE;\r
- }\r
\r
if (fnIC.fnICSendMessage(infoPtr->hic, ICM_DECOMPRESS_BEGIN,\r
(DWORD)infoPtr->inbih, (DWORD)infoPtr->outbih) != ICERR_OK) {\r
return TRUE;\r
}\r
\r
-static LRESULT ANIMATE_OpenA(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
-{\r
- ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
- HINSTANCE hInstance = (HINSTANCE)wParam;\r
\r
+static BOOL ANIMATE_OpenW(ANIMATE_INFO *infoPtr, HINSTANCE hInstance, LPWSTR lpszName)\r
+{\r
ANIMATE_Free(infoPtr);\r
- infoPtr->hwndSelf = hWnd;\r
\r
- if (!lParam) {\r
+ if (!lpszName) \r
+ {\r
TRACE("Closing avi!\n");\r
/* installer of thebat! v1.62 requires FALSE here */\r
return (infoPtr->hMMio != 0);\r
}\r
\r
if (!hInstance)\r
- hInstance = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE);\r
+ hInstance = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);\r
\r
- if (HIWORD(lParam)) {\r
- TRACE("(\"%s\");\n", (LPSTR)lParam);\r
+ if (HIWORD(lpszName)) \r
+ {\r
+ TRACE("(\"%s\");\n", debugstr_w(lpszName));\r
\r
- if (!ANIMATE_LoadResA(infoPtr, hInstance, (LPSTR)lParam)) {\r
+ if (!ANIMATE_LoadResW(infoPtr, hInstance, lpszName)) \r
+ {\r
TRACE("No AVI resource found!\n");\r
- if (!ANIMATE_LoadFileA(infoPtr, (LPSTR)lParam)) {\r
+ if (!ANIMATE_LoadFileW(infoPtr, lpszName)) \r
+ {\r
WARN("No AVI file found!\n");\r
return FALSE;\r
}\r
}\r
- } else {\r
- TRACE("(%u);\n", (WORD)LOWORD(lParam));\r
+ } \r
+ else \r
+ {\r
+ TRACE("(%u);\n", (WORD)(DWORD)lpszName);\r
\r
- if (!ANIMATE_LoadResA(infoPtr, hInstance,\r
- MAKEINTRESOURCEA((INT)lParam))) {\r
+ if (!ANIMATE_LoadResW(infoPtr, hInstance, MAKEINTRESOURCEW((INT)lpszName))) \r
+ {\r
WARN("No AVI resource found!\n");\r
return FALSE;\r
}\r
}\r
\r
- if (!ANIMATE_GetAviInfo(infoPtr)) {\r
+ if (!ANIMATE_GetAviInfo(infoPtr)) \r
+ {\r
WARN("Can't get AVI information\n");\r
ANIMATE_Free(infoPtr);\r
return FALSE;\r
}\r
\r
- if (!ANIMATE_GetAviCodec(infoPtr)) {\r
+ if (!ANIMATE_GetAviCodec(infoPtr)) \r
+ {\r
WARN("Can't get AVI Codec\n");\r
ANIMATE_Free(infoPtr);\r
return FALSE;\r
}\r
\r
- if (!GetWindowLongA(hWnd, GWL_STYLE) & ACS_CENTER) {\r
- SetWindowPos(hWnd, 0, 0, 0, infoPtr->mah.dwWidth, infoPtr->mah.dwHeight,\r
+ if (!(infoPtr->dwStyle & ACS_CENTER))\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, infoPtr->mah.dwWidth, infoPtr->mah.dwHeight,\r
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);\r
- }\r
\r
- if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_AUTOPLAY) {\r
- return ANIMATE_Play(hWnd, -1, (LPARAM)MAKELONG(0, infoPtr->mah.dwTotalFrames-1));\r
- }\r
+ if (infoPtr->dwStyle & ACS_AUTOPLAY) \r
+ return ANIMATE_Play(infoPtr, -1, 0, infoPtr->mah.dwTotalFrames - 1);\r
\r
return TRUE;\r
}\r
\r
\r
-/* << ANIMATE_Open32W >> */\r
-\r
-static LRESULT ANIMATE_Stop(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+static BOOL ANIMATE_OpenA(ANIMATE_INFO *infoPtr, HINSTANCE hInstance, LPSTR lpszName)\r
{\r
- ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
+ LPWSTR lpwszName;\r
+ LRESULT result;\r
+ INT len;\r
+\r
+ if (!HIWORD(lpszName))\r
+ return ANIMATE_OpenW(infoPtr, hInstance, (LPWSTR)lpszName);\r
+\r
+ len = MultiByteToWideChar(CP_ACP, 0, lpszName, -1, NULL, 0);\r
+ lpwszName = Alloc(len * sizeof(WCHAR));\r
+ if (!lpwszName) return FALSE;\r
+ MultiByteToWideChar(CP_ACP, 0, lpszName, -1, lpwszName, len);\r
\r
+ result = ANIMATE_OpenW(infoPtr, hInstance, lpwszName);\r
+ Free (lpwszName);\r
+ return result;\r
+}\r
+\r
+\r
+static BOOL ANIMATE_Stop(ANIMATE_INFO *infoPtr)\r
+{\r
/* nothing opened */\r
if (!infoPtr->hMMio)\r
return FALSE;\r
}\r
\r
\r
-static LRESULT ANIMATE_Create(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+static BOOL ANIMATE_Create(HWND hWnd, LPCREATESTRUCTW lpcs)\r
{\r
- ANIMATE_INFO* infoPtr;\r
+ static const WCHAR msvfw32W[] = { 'm', 's', 'v', 'f', 'w', '3', '2', '.', 'd', 'l', 'l', 0 };\r
+ ANIMATE_INFO *infoPtr;\r
\r
- if (!fnIC.hModule) /* FIXME: not thread safe */\r
+ if (!fnIC.hModule)\r
{\r
- /* since there's a circular dep between msvfw32 and comctl32, we could either:\r
- * - fix the build chain to allow this circular dep\r
- * - handle it by hand\r
- * AJ wants the latter :-(\r
- */\r
- fnIC.hModule = LoadLibraryA("msvfw32.dll");\r
+ fnIC.hModule = LoadLibraryW(msvfw32W);\r
if (!fnIC.hModule) return FALSE;\r
\r
fnIC.fnICOpen = (void*)GetProcAddress(fnIC.hModule, "ICOpen");\r
\r
/* allocate memory for info structure */\r
infoPtr = (ANIMATE_INFO *)Alloc(sizeof(ANIMATE_INFO));\r
- if (!infoPtr) {\r
- ERR("could not allocate info memory!\n");\r
- return 0;\r
- }\r
+ if (!infoPtr) return FALSE;\r
\r
/* store crossref hWnd <-> info structure */\r
SetWindowLongPtrW(hWnd, 0, (DWORD_PTR)infoPtr);\r
infoPtr->hwndSelf = hWnd;\r
- infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;\r
+ infoPtr->hwndNotify = lpcs->hwndParent;\r
infoPtr->transparentColor = ANIMATE_COLOR_NONE;\r
infoPtr->hbmPrevFrame = 0;\r
+ infoPtr->dwStyle = lpcs->style;\r
\r
- TRACE("Animate style=0x%08lx, parent=%p\n", GetWindowLongA(hWnd, GWL_STYLE), infoPtr->hwndNotify);\r
+ TRACE("Animate style=0x%08lx, parent=%p\n", infoPtr->dwStyle, infoPtr->hwndNotify);\r
\r
InitializeCriticalSection(&infoPtr->cs);\r
\r
}\r
\r
\r
-static LRESULT ANIMATE_Destroy(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+static LRESULT ANIMATE_Destroy(ANIMATE_INFO *infoPtr)\r
{\r
- ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
-\r
-\r
/* free avi data */\r
ANIMATE_Free(infoPtr);\r
\r
/* free animate info data */\r
+ SetWindowLongPtrW(infoPtr->hwndSelf, 0, 0);\r
+\r
+ DeleteCriticalSection(&infoPtr->cs);\r
Free(infoPtr);\r
- SetWindowLongPtrW(hWnd, 0, 0);\r
\r
return 0;\r
}\r
\r
\r
-static LRESULT ANIMATE_EraseBackground(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+static BOOL ANIMATE_EraseBackground(ANIMATE_INFO *infoPtr, HDC hdc)\r
{\r
- ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
RECT rect;\r
HBRUSH hBrush = 0;\r
\r
- if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)\r
+ if(infoPtr->dwStyle & ACS_TRANSPARENT)\r
{\r
- hBrush = (HBRUSH)SendMessageA(infoPtr->hwndNotify,WM_CTLCOLORSTATIC,\r
- wParam, (LPARAM)hWnd);\r
+ hBrush = (HBRUSH)SendMessageW(infoPtr->hwndNotify, WM_CTLCOLORSTATIC,\r
+ (WPARAM)hdc, (LPARAM)infoPtr->hwndSelf);\r
}\r
\r
- GetClientRect(hWnd, &rect);\r
- FillRect((HDC)wParam, &rect, hBrush ? hBrush : GetCurrentObject((HDC)wParam, OBJ_BRUSH));\r
+ GetClientRect(infoPtr->hwndSelf, &rect);\r
+ FillRect(hdc, &rect, hBrush ? hBrush : GetCurrentObject(hdc, OBJ_BRUSH));\r
\r
return TRUE;\r
}\r
\r
-static LRESULT WINAPI ANIMATE_Size(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+\r
+static LRESULT ANIMATE_StyleChanged(ANIMATE_INFO *infoPtr, WPARAM wStyleType, LPSTYLESTRUCT lpss)\r
{\r
- if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_CENTER) {\r
- InvalidateRect(hWnd, NULL, TRUE);\r
- }\r
- return TRUE;\r
+ TRACE("(styletype=%x, styleOld=0x%08lx, styleNew=0x%08lx)\n",\r
+ wStyleType, lpss->styleOld, lpss->styleNew);\r
+\r
+ if (wStyleType != GWL_STYLE) return 0;\r
+ \r
+ infoPtr->dwStyle = lpss->styleNew;\r
+\r
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);\r
+ return 0;\r
}\r
\r
+\r
static LRESULT WINAPI ANIMATE_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
{\r
+ ANIMATE_INFO *infoPtr = (ANIMATE_INFO *)GetWindowLongPtrW(hWnd, 0);\r
+\r
TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", hWnd, uMsg, wParam, lParam);\r
- if (!ANIMATE_GetInfoPtr(hWnd) && (uMsg != WM_NCCREATE))\r
- return DefWindowProcA(hWnd, uMsg, wParam, lParam);\r
+ if (!infoPtr && (uMsg != WM_NCCREATE))\r
+ return DefWindowProcW(hWnd, uMsg, wParam, lParam);\r
switch (uMsg)\r
{\r
case ACM_OPENA:\r
- return ANIMATE_OpenA(hWnd, wParam, lParam);\r
+ return ANIMATE_OpenA(infoPtr, (HINSTANCE)wParam, (LPSTR)lParam);\r
\r
case ACM_OPENW:\r
- FIXME("ACM_OPENW: stub!\n");\r
- /* return ANIMATE_Open32W(hWnd, wParam, lParam); */\r
- return 0;\r
+ return ANIMATE_OpenW(infoPtr, (HINSTANCE)wParam, (LPWSTR)lParam);\r
\r
case ACM_PLAY:\r
- return ANIMATE_Play(hWnd, wParam, lParam);\r
+ return ANIMATE_Play(infoPtr, (INT)wParam, LOWORD(lParam), HIWORD(lParam));\r
\r
case ACM_STOP:\r
- return ANIMATE_Stop(hWnd, wParam, lParam);\r
+ return ANIMATE_Stop(infoPtr);\r
+\r
+ case WM_CLOSE:\r
+ ANIMATE_Free(infoPtr);\r
+ return 0;\r
\r
case WM_NCCREATE:\r
- return ANIMATE_Create(hWnd, wParam, lParam);\r
+ return ANIMATE_Create(hWnd, (LPCREATESTRUCTW)lParam);\r
\r
case WM_NCHITTEST:\r
return HTTRANSPARENT;\r
\r
case WM_DESTROY:\r
- return ANIMATE_Destroy(hWnd, wParam, lParam);\r
+ return ANIMATE_Destroy(infoPtr);\r
\r
case WM_ERASEBKGND:\r
- return ANIMATE_EraseBackground(hWnd, wParam, lParam);\r
+ return ANIMATE_EraseBackground(infoPtr, (HDC)wParam);\r
\r
- /* case WM_STYLECHANGED: FIXME shall we do something ?? */\r
+ case WM_STYLECHANGED:\r
+ return ANIMATE_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);\r
\r
case WM_TIMER:\r
- if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)\r
- {\r
- ANIMATE_INFO* infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
- infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,\r
- WM_CTLCOLORSTATIC,\r
- wParam, (LPARAM)hWnd);\r
- }\r
- return ANIMATE_DrawFrame(ANIMATE_GetInfoPtr(hWnd));\r
+ return ANIMATE_Timer(infoPtr);\r
\r
case WM_PAINT:\r
{\r
- ANIMATE_INFO* infoPtr = ANIMATE_GetInfoPtr(hWnd);\r
-\r
/* the animation isn't playing, or has not decompressed\r
* (and displayed) the first frame yet, don't paint\r
*/\r
!infoPtr->hbmPrevFrame)\r
{\r
/* default paint handling */\r
- return DefWindowProcA(hWnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW(hWnd, uMsg, wParam, lParam);\r
}\r
\r
- if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)\r
- infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,\r
- WM_CTLCOLORSTATIC,\r
- wParam, (LPARAM)hWnd);\r
+ if (infoPtr->dwStyle & ACS_TRANSPARENT)\r
+ infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify,\r
+ WM_CTLCOLORSTATIC,\r
+ wParam, (LPARAM)infoPtr->hwndSelf);\r
\r
if (wParam)\r
{\r
}\r
else\r
{\r
- PAINTSTRUCT ps;\r
- HDC hDC = BeginPaint(hWnd, &ps);\r
+ PAINTSTRUCT ps;\r
+ HDC hDC = BeginPaint(infoPtr->hwndSelf, &ps);\r
\r
EnterCriticalSection(&infoPtr->cs);\r
ANIMATE_PaintFrame(infoPtr, hDC);\r
LeaveCriticalSection(&infoPtr->cs);\r
\r
- EndPaint(hWnd, &ps);\r
- }\r
+ EndPaint(infoPtr->hwndSelf, &ps);\r
+ }\r
}\r
- break;\r
+ break;\r
\r
case WM_SIZE:\r
- return ANIMATE_Size(hWnd, wParam, lParam);\r
+ if (infoPtr->dwStyle & ACS_CENTER) \r
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);\r
+ return DefWindowProcW(hWnd, uMsg, wParam, lParam);\r
\r
default:\r
if ((uMsg >= WM_USER) && (uMsg < WM_APP))\r
ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam);\r
\r
- return DefWindowProcA(hWnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW(hWnd, uMsg, wParam, lParam);\r
}\r
return 0;\r
}\r
\r
void ANIMATE_Register(void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
- ZeroMemory(&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory(&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;\r
wndClass.lpfnWndProc = ANIMATE_WindowProc;\r
wndClass.cbClsExtra = 0;\r
wndClass.cbWndExtra = sizeof(ANIMATE_INFO *);\r
- wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);\r
+ wndClass.hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);\r
wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);\r
- wndClass.lpszClassName = ANIMATE_CLASSA;\r
+ wndClass.lpszClassName = ANIMATE_CLASSW;\r
\r
- RegisterClassA(&wndClass);\r
+ RegisterClassW(&wndClass);\r
}\r
\r
\r
void ANIMATE_Unregister(void)\r
{\r
- UnregisterClassA(ANIMATE_CLASSA, NULL);\r
+ UnregisterClassW(ANIMATE_CLASSW, NULL);\r
}\r
/* Offset between image and text */\r
#define CBE_SEP 4\r
\r
-#define COMBOEX_SUBCLASS_PROP "CCComboEx32SubclassInfo"\r
+static const WCHAR COMBOEX_SUBCLASS_PROP[] = {\r
+ 'C','C','C','o','m','b','o','E','x','3','2',\r
+ 'S','u','b','c','l','a','s','s','I','n','f','o',0\r
+};\r
+\r
#define COMBOEX_GetInfoPtr(hwnd) ((COMBOEX_INFO *)GetWindowLongPtrW (hwnd, 0))\r
\r
\r
\r
static void COMBOEX_GetComboFontSize (COMBOEX_INFO *infoPtr, SIZE *size)\r
{\r
+ static const WCHAR strA[] = { 'A', 0 };\r
HFONT nfont, ofont;\r
HDC mydc;\r
\r
mydc = GetDC (0); /* why the entire screen???? */\r
nfont = (HFONT)SendMessageW (infoPtr->hwndCombo, WM_GETFONT, 0, 0);\r
ofont = (HFONT) SelectObject (mydc, nfont);\r
- GetTextExtentPointA (mydc, "A", 1, size);\r
+ GetTextExtentPointW (mydc, strA, 1, size);\r
SelectObject (mydc, ofont);\r
ReleaseDC (0, mydc);\r
TRACE("selected font hwnd=%p, height=%ld\n", nfont, size->cy);\r
/* Native version of ComboEx creates the ComboBox with DROPDOWNLIST */\r
/* specified. It then creates it's own version of the EDIT control */\r
/* and makes the ComboBox the parent. This is because a normal */\r
- /* DROPDOWNLIST does not have a EDIT control, but we need one. */\r
+ /* DROPDOWNLIST does not have an EDIT control, but we need one. */\r
/* We also need to place the edit control at the proper location */\r
/* (allow space for the icons). */\r
\r
* Setup a property to hold the pointer to the COMBOBOXEX\r
* data structure.\r
*/\r
- SetPropA(infoPtr->hwndCombo, COMBOEX_SUBCLASS_PROP, hwnd);\r
+ SetPropW(infoPtr->hwndCombo, COMBOEX_SUBCLASS_PROP, hwnd);\r
infoPtr->prevComboWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hwndCombo,\r
GWLP_WNDPROC, (DWORD_PTR)COMBOEX_ComboWndProc);\r
infoPtr->font = (HFONT)SendMessageW (infoPtr->hwndCombo, WM_GETFONT, 0, 0);\r
* Setup a property to hold the pointer to the COMBOBOXEX\r
* data structure.\r
*/\r
- SetPropA(infoPtr->hwndEdit, COMBOEX_SUBCLASS_PROP, hwnd);\r
+ SetPropW(infoPtr->hwndEdit, COMBOEX_SUBCLASS_PROP, hwnd);\r
infoPtr->prevEditWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hwndEdit,\r
GWLP_WNDPROC, (DWORD_PTR)COMBOEX_EditWndProc);\r
infoPtr->font = (HFONT)SendMessageW(infoPtr->hwndCombo, WM_GETFONT, 0, 0);\r
\r
static LRESULT COMBOEX_MeasureItem (COMBOEX_INFO *infoPtr, MEASUREITEMSTRUCT *mis)\r
{\r
+ static const WCHAR strW[] = { 'W', 0 };\r
SIZE mysize;\r
HDC hdc;\r
\r
hdc = GetDC (0);\r
- GetTextExtentPointA (hdc, "W", 1, &mysize);\r
+ GetTextExtentPointW (hdc, strW, 1, &mysize);\r
ReleaseDC (0, hdc);\r
mis->itemHeight = mysize.cy + CBE_EXTRA;\r
\r
static LRESULT WINAPI\r
COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
{\r
- HWND hwndComboex = (HWND)GetPropA(hwnd, COMBOEX_SUBCLASS_PROP);\r
+ HWND hwndComboex = (HWND)GetPropW(hwnd, COMBOEX_SUBCLASS_PROP);\r
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwndComboex);\r
NMCBEENDEDITW cbeend;\r
WCHAR edit_text[260];\r
case VK_ESCAPE:\r
/* native version seems to do following for COMBOEX */\r
/*\r
- * GetWindowTextA(Edit,&?, 0x104) x\r
+ * GetWindowTextW(Edit,&?, 0x104) x\r
* CB_GETCURSEL to Combo rets -1 x\r
* WM_NOTIFY to COMBOEX parent (rebar) x\r
* (CBEN_ENDEDIT{A|W}\r
case VK_RETURN:\r
/* native version seems to do following for COMBOEX */\r
/*\r
- * GetWindowTextA(Edit,&?, 0x104) x\r
+ * GetWindowTextW(Edit,&?, 0x104) x\r
* CB_GETCURSEL to Combo rets -1 x\r
* CB_GETCOUNT to Combo rets 0\r
* if >0 loop\r
static LRESULT WINAPI\r
COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
{\r
- HWND hwndComboex = (HWND)GetPropA(hwnd, COMBOEX_SUBCLASS_PROP);\r
+ HWND hwndComboex = (HWND)GetPropW(hwnd, COMBOEX_SUBCLASS_PROP);\r
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwndComboex);\r
NMCBEENDEDITW cbeend;\r
NMMOUSE nmmse;\r
* Native does:\r
*\r
* GetFocus() retns AA\r
- * GetWindowTextA(Edit)\r
+ * GetWindowTextW(Edit)\r
* CB_GETCURSEL(Combo) (got -1)\r
* WM_NOTIFY(CBEN_ENDEDITA) with CBENF_KILLFOCUS\r
* CB_GETCURSEL(Combo) (got -1)\r
INT selected = SendMessageW (infoPtr->hwndCombo,\r
CB_GETCURSEL, 0, 0);\r
\r
- /* lstrlenA( lastworkingURL ) */\r
+ /* lstrlenW( lastworkingURL ) */\r
\r
GetWindowTextW (infoPtr->hwndEdit, edit_text, 260);\r
if (selected == -1) {\r
\r
typedef HRESULT (CALLBACK *DPALOADPROC)(LPLOADDATA,IStream*,LPARAM);\r
\r
+static const WCHAR strMRUList[] = { 'M','R','U','L','i','s','t',0 };\r
+\r
/**************************************************************************\r
* DPA_LoadStream [COMCTL32.9]\r
*\r
BOOL isUnicode; /* is compare fn Unicode */\r
DWORD wineFlags; /* internal flags */\r
DWORD cursize; /* current size of realMRU */\r
- LPSTR realMRU; /* pointer to string of index names */\r
+ LPWSTR realMRU; /* pointer to string of index names */\r
LPWINEMRUITEM *array; /* array of pointers to data */\r
/* in 'a' to 'z' order */\r
} WINEMRULIST, *LPWINEMRULIST;\r
}\r
if (mp->wineFlags & WMRUF_CHANGED) {\r
mp->wineFlags &= ~WMRUF_CHANGED;\r
- err = RegSetValueExA(newkey, "MRUList", 0, REG_SZ,\r
- mp->realMRU, strlen(mp->realMRU) + 1);\r
+ err = RegSetValueExW(newkey, strMRUList, 0, REG_SZ, (LPBYTE)mp->realMRU,\r
+ (strlenW(mp->realMRU) + 1)*sizeof(WCHAR));\r
if (err) {\r
ERR("error saving MRUList, err=%d\n", err);\r
}\r
- TRACE("saving MRUList=/%s/\n", mp->realMRU);\r
+ TRACE("saving MRUList=/%s/\n", debugstr_w(mp->realMRU));\r
}\r
realname[1] = 0;\r
for(i=0; i<mp->cursize; i++) {\r
\r
if ((replace = FindMRUData (hList, lpData, cbData, NULL)) >= 0) {\r
/* Item exists, just move it to the front */\r
- LPSTR pos = strchr(mp->realMRU, replace + 'a');\r
+ LPWSTR pos = strchrW(mp->realMRU, replace + 'a');\r
while (pos > mp->realMRU)\r
{\r
pos[0] = pos[-1];\r
/* get space to save indices that will turn into names\r
* but in order of most to least recently used\r
*/\r
- mp->realMRU = Alloc(mp->extview.nMaxItems + 2);\r
+ mp->realMRU = Alloc((mp->extview.nMaxItems + 2) * sizeof(WCHAR));\r
\r
/* get space to save pointers to actual data in order of\r
* 'a' to 'z' (0 to n).\r
/* get values from key 'MRUList' */\r
if (newkey) {\r
datasize = mp->extview.nMaxItems + 1;\r
- if((err=RegQueryValueExA( newkey, "MRUList", 0, &type, mp->realMRU,\r
- &datasize))) {\r
+ if((err=RegQueryValueExW( newkey, strMRUList, 0, &type,\r
+ (LPBYTE)mp->realMRU, &datasize))) {\r
/* not present - set size to 1 (will become 0 later) */\r
datasize = 1;\r
*mp->realMRU = 0;\r
}\r
\r
- TRACE("MRU list = %s, datasize = %ld\n", mp->realMRU, datasize);\r
+ TRACE("MRU list = %s, datasize = %ld\n", debugstr_w(mp->realMRU), datasize);\r
\r
mp->cursize = datasize - 1;\r
/* datasize now has number of items in the MRUList */\r
\r
if (!hdpaNew) {\r
/* create a new DPA */\r
- hdpaTemp = (HDPA)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
+ hdpaTemp = HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
sizeof(*hdpaTemp));\r
hdpaTemp->hHeap = hdpa->hHeap;\r
hdpaTemp->nGrow = hdpa->nGrow;\r
nNewItems = hdpaTemp->nGrow *\r
((INT)((hdpa->nItemCount - 1) / hdpaTemp->nGrow) + 1);\r
nSize = nNewItems * sizeof(LPVOID);\r
- hdpaTemp->ptrs =\r
- (LPVOID*)HeapAlloc (hdpaTemp->hHeap, HEAP_ZERO_MEMORY, nSize);\r
+ hdpaTemp->ptrs = HeapAlloc (hdpaTemp->hHeap, HEAP_ZERO_MEMORY, nSize);\r
hdpaTemp->nMaxCount = nNewItems;\r
\r
/* clone the pointer array */\r
INT nSize = nNewItems * sizeof(LPVOID);\r
\r
if (hdpa->ptrs)\r
- lpTemp = (LPVOID*)HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, hdpa->ptrs, nSize);\r
+ lpTemp = HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, hdpa->ptrs, nSize);\r
else\r
- lpTemp = (LPVOID*)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, nSize);\r
+ lpTemp = HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, nSize);\r
\r
if (!lpTemp)\r
return FALSE;\r
if ((hdpa->nMaxCount - hdpa->nItemCount) >= hdpa->nGrow) {\r
INT nNewItems = max(hdpa->nGrow * 2, hdpa->nItemCount);\r
nSize = nNewItems * sizeof(LPVOID);\r
- lpDest = (LPVOID)HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
+ lpDest = HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
hdpa->ptrs, nSize);\r
if (!lpDest)\r
return NULL;\r
\r
hdpa->nItemCount = 0;\r
hdpa->nMaxCount = hdpa->nGrow * 2;\r
- hdpa->ptrs = (LPVOID*)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
+ hdpa->ptrs = HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,\r
hdpa->nMaxCount * sizeof(LPVOID));\r
\r
return TRUE;\r
TRACE("(%d %p)\n", nGrow, hHeap);\r
\r
if (hHeap)\r
- hdpa = (HDPA)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(*hdpa));\r
+ hdpa = HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(*hdpa));\r
else\r
hdpa = Alloc (sizeof(*hdpa));\r
\r
lpNmh->code = uCode;\r
}\r
\r
- return SendMessageA (lpNotify->hwndTo, WM_NOTIFY, idFrom, (LPARAM)lpNmh);\r
+ return SendMessageW (lpNotify->hwndTo, WM_NOTIFY, idFrom, (LPARAM)lpNmh);\r
}\r
\r
\r
-/*\r
- * Copyright 2005 Andreas Bjerkeholt\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Lesser General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2.1 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * Lesser General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Lesser General Public\r
- * License along with this library; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
- */\r
-\r
-LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH\r
-\r
-IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140\r
-STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE\r
-CAPTION "Egenskaper för "\r
-FONT 8, "MS Shell Dlg"\r
-BEGIN\r
- DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP\r
- PUSHBUTTON "Avbryt", IDCANCEL,58,122,50,14\r
- PUSHBUTTON "&Verkställ", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED\r
- PUSHBUTTON "Hjälp", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP\r
- CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114\r
-END\r
-\r
-\r
-IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159\r
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE\r
-CAPTION "Guide"\r
-FONT 8, "MS Shell Dlg"\r
-BEGIN\r
- DEFPUSHBUTTON "Slutför", IDC_FINISH_BUTTON,121,138,50,14\r
- DEFPUSHBUTTON "&Nästa >", IDC_NEXT_BUTTON,121,138,50,14\r
- PUSHBUTTON "< &Föregående", IDC_BACK_BUTTON,71,138,50,14\r
- PUSHBUTTON "Avbryt", IDCANCEL,178,138,50,14\r
- PUSHBUTTON "Hjälp", IDHELP,235,138,50,14,WS_GROUP\r
- LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN\r
- CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5\r
- LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE\r
-END\r
-\r
-\r
-IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125\r
-STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Anpassa verktygsfältet"\r
-FONT 8, "MS Shell Dlg"\r
-BEGIN\r
- DEFPUSHBUTTON "&Stäng", IDCANCEL,308,6,44,14\r
- PUSHBUTTON "&Återställ", IDC_RESET_BTN,308,23,44,14\r
- PUSHBUTTON "&Hjälp", IDC_HELP_BTN,308,40,44,14\r
- PUSHBUTTON "Flytta &upp", IDC_MOVEUP_BTN,308,74,44,14\r
- PUSHBUTTON "Flytta &ned", IDC_MOVEDN_BTN,308,91,44,14\r
- LTEXT "T&illgängliga knappar:", -1,4,5,84,10\r
- LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP\r
- PUSHBUTTON "&Lägg till ->", IDOK, 131, 42, 44, 14\r
- PUSHBUTTON "<- &Ta bort", IDC_REMOVE_BTN,131,62,44,14\r
- LTEXT "Knappar i v&erktygsfältet:", -1,182,5,85,10\r
- LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP\r
-END\r
-\r
-STRINGTABLE DISCARDABLE\r
-{\r
- IDS_CLOSE "Stäng"\r
-}\r
-\r
-STRINGTABLE DISCARDABLE\r
-{\r
- IDM_TODAY "Idag:"\r
- IDM_GOTODAY "Gå till idag"\r
-}\r
-\r
-STRINGTABLE DISCARDABLE\r
-{\r
- IDS_SEPARATOR "Separator"\r
-}\r
-\r
-STRINGTABLE DISCARDABLE\r
-{\r
- HKY_NONE "Ingen"\r
-}\r
+/*
+ * Copyright 2005 Andreas Bjerkeholt
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
+
+IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
+STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+CAPTION "Egenskaper för "
+FONT 8, "MS Shell Dlg"
+BEGIN
+ DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
+ PUSHBUTTON "Avbryt", IDCANCEL,58,122,50,14
+ PUSHBUTTON "&Verkställ", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
+ PUSHBUTTON "Hjälp", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
+ CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
+END
+
+
+IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
+CAPTION "Guide"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ DEFPUSHBUTTON "Slutför", IDC_FINISH_BUTTON,121,138,50,14
+ DEFPUSHBUTTON "&Nästa >", IDC_NEXT_BUTTON,121,138,50,14
+ PUSHBUTTON "< &Föregående", IDC_BACK_BUTTON,71,138,50,14
+ PUSHBUTTON "Avbryt", IDCANCEL,178,138,50,14
+ PUSHBUTTON "Hjälp", IDHELP,235,138,50,14,WS_GROUP
+ LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
+ CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
+ LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
+END
+
+
+IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Anpassa verktygsfältet"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ DEFPUSHBUTTON "&Stäng", IDCANCEL,308,6,44,14
+ PUSHBUTTON "&Återställ", IDC_RESET_BTN,308,23,44,14
+ PUSHBUTTON "&Hjälp", IDC_HELP_BTN,308,40,44,14
+ PUSHBUTTON "Flytta &upp", IDC_MOVEUP_BTN,308,74,44,14
+ PUSHBUTTON "Flytta &ned", IDC_MOVEDN_BTN,308,91,44,14
+ LTEXT "T&illgängliga knappar:", -1,4,5,84,10
+ LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+ PUSHBUTTON "&Lägg till ->", IDOK, 131, 42, 44, 14
+ PUSHBUTTON "<- &Ta bort", IDC_REMOVE_BTN,131,62,44,14
+ LTEXT "Knappar i v&erktygsfältet:", -1,182,5,85,10
+ LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CLOSE "Stäng"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDM_TODAY "Idag:"
+ IDM_GOTODAY "Gå till idag"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_SEPARATOR "Separator"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ HKY_NONE "Ingen"
+}
\r
LRESULT WINAPI COMCTL32_SubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
\r
-LPSTR COMCTL32_aSubclass = NULL;\r
+LPWSTR COMCTL32_wSubclass = NULL;\r
HMODULE COMCTL32_hModule = 0;\r
LANGID COMCTL32_uiLang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);\r
HBRUSH COMCTL32_hPattern55AABrush = NULL;\r
0x5555, 0xaaaa, 0x5555, 0xaaaa\r
};\r
\r
+static const WCHAR strCC32SubclassInfo[] = {\r
+ 'C','C','3','2','S','u','b','c','l','a','s','s','I','n','f','o',0\r
+};\r
\r
/***********************************************************************\r
* DllMain [Internal]\r
COMCTL32_hModule = (HMODULE)hinstDLL;\r
\r
/* add global subclassing atom (used by 'tooltip' and 'updown') */\r
- COMCTL32_aSubclass = (LPSTR)(DWORD)GlobalAddAtomA ("CC32SubclassInfo");\r
- TRACE("Subclassing atom added: %p\n", COMCTL32_aSubclass);\r
+ COMCTL32_wSubclass = (LPWSTR)(DWORD)GlobalAddAtomW (strCC32SubclassInfo);\r
+ TRACE("Subclassing atom added: %p\n", COMCTL32_wSubclass);\r
\r
/* create local pattern brush */\r
COMCTL32_hPattern55AABitmap = CreateBitmap (8, 8, 1, 1, wPattern55AA);\r
COMCTL32_hPattern55AABitmap = NULL;\r
\r
/* delete global subclassing atom */\r
- GlobalDeleteAtom (LOWORD(COMCTL32_aSubclass));\r
- TRACE("Subclassing atom deleted: %p\n", COMCTL32_aSubclass);\r
- COMCTL32_aSubclass = NULL;\r
+ GlobalDeleteAtom (LOWORD(COMCTL32_wSubclass));\r
+ TRACE("Subclassing atom deleted: %p\n", COMCTL32_wSubclass);\r
+ COMCTL32_wSubclass = NULL;\r
break;\r
}\r
\r
if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {\r
/* menu was closed */\r
TRACE("menu was closed!\n");\r
- SendMessageA (hwndStatus, SB_SIMPLE, FALSE, 0);\r
+ SendMessageW (hwndStatus, SB_SIMPLE, FALSE, 0);\r
}\r
else {\r
/* menu item was selected */\r
TRACE("uMenuID = %u\n", uMenuID);\r
\r
if (uMenuID) {\r
- CHAR szText[256];\r
+ WCHAR szText[256];\r
\r
- if (!LoadStringA (hInst, uMenuID, szText, 256))\r
+ if (!LoadStringW (hInst, uMenuID, szText, sizeof(szText)/sizeof(szText[0])))\r
szText[0] = '\0';\r
\r
- SendMessageA (hwndStatus, SB_SETTEXTA,\r
+ SendMessageW (hwndStatus, SB_SETTEXTW,\r
255 | SBT_NOBORDERS, (LPARAM)szText);\r
- SendMessageA (hwndStatus, SB_SIMPLE, TRUE, 0);\r
+ SendMessageW (hwndStatus, SB_SIMPLE, TRUE, 0);\r
}\r
}\r
break;\r
return;\r
lpRun++;\r
hwndCtrl = GetDlgItem (hwnd, *lpRun);\r
- if (GetWindowLongA (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {\r
+ if (GetWindowLongW (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {\r
TRACE("control id 0x%x\n", *lpRun);\r
GetWindowRect (hwndCtrl, &rcCtrl);\r
MapWindowPoints (NULL, hwnd, (LPPOINT)&rcCtrl, 2);\r
\r
if ( text ) {\r
if ( (len = MultiByteToWideChar( CP_ACP, 0, text, -1, NULL, 0 )) ) {\r
- if ( (textW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )) )\r
+ if ( (textW = Alloc( len * sizeof(WCHAR) )) )\r
MultiByteToWideChar( CP_ACP, 0, text, -1, textW, len );\r
}\r
}\r
DrawStatusTextW( hdc, lprc, textW, style );\r
- HeapFree( GetProcessHeap(), 0, textW );\r
+ Free( textW );\r
}\r
\r
\r
HWND buddy, INT maxVal, INT minVal, INT curVal)\r
{\r
HWND hUD =\r
- CreateWindowA (UPDOWN_CLASSA, 0, style, x, y, cx, cy,\r
+ CreateWindowW (UPDOWN_CLASSW, 0, style, x, y, cx, cy,\r
parent, (HMENU)id, inst, 0);\r
if (hUD) {\r
- SendMessageA (hUD, UDM_SETBUDDY, (WPARAM)buddy, 0);\r
- SendMessageA (hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));\r
- SendMessageA (hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));\r
+ SendMessageW (hUD, UDM_SETBUDDY, (WPARAM)buddy, 0);\r
+ SendMessageW (hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));\r
+ SendMessageW (hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));\r
}\r
\r
return hUD;\r
HWND hwndTB;\r
\r
hwndTB =\r
- CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, style|WS_CHILD, 0,0,100,30,\r
+ CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, style|WS_CHILD, 0,0,100,30,\r
hwnd, (HMENU)wID, COMCTL32_hModule, NULL);\r
if(hwndTB) {\r
TBADDBITMAP tbab;\r
\r
- SendMessageA (hwndTB, TB_BUTTONSTRUCTSIZE,\r
- (WPARAM)uStructSize, 0);\r
+ SendMessageW (hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)uStructSize, 0);\r
\r
/* set bitmap and button size */\r
/*If CreateToolbarEx receives 0, windows sets default values*/\r
dxBitmap = 16;\r
if (dyBitmap <= 0)\r
dyBitmap = 15;\r
- SendMessageA (hwndTB, TB_SETBITMAPSIZE, 0,\r
- MAKELPARAM((WORD)dxBitmap, (WORD)dyBitmap));\r
+ SendMessageW (hwndTB, TB_SETBITMAPSIZE, 0,\r
+ MAKELPARAM((WORD)dxBitmap, (WORD)dyBitmap));\r
\r
if (dxButton <= 0)\r
dxButton = 24;\r
if (dyButton <= 0)\r
dyButton = 22;\r
- SendMessageA (hwndTB, TB_SETBUTTONSIZE, 0,\r
- MAKELPARAM((WORD)dxButton, (WORD)dyButton));\r
+ SendMessageW (hwndTB, TB_SETBUTTONSIZE, 0,\r
+ MAKELPARAM((WORD)dxButton, (WORD)dyButton));\r
\r
\r
/* add bitmaps */\r
if (nBitmaps > 0)\r
{\r
- tbab.hInst = hBMInst;\r
- tbab.nID = wBMID;\r
+ tbab.hInst = hBMInst;\r
+ tbab.nID = wBMID;\r
\r
- SendMessageA (hwndTB, TB_ADDBITMAP,\r
- (WPARAM)nBitmaps, (LPARAM)&tbab);\r
+ SendMessageW (hwndTB, TB_ADDBITMAP, (WPARAM)nBitmaps, (LPARAM)&tbab);\r
}\r
/* add buttons */\r
if(iNumButtons > 0)\r
- SendMessageA (hwndTB, TB_ADDBUTTONSA,\r
+ SendMessageW (hwndTB, TB_ADDBUTTONSW,\r
(WPARAM)iNumButtons, (LPARAM)lpButtons);\r
}\r
\r
sysColorMap = (LPCOLORMAP)internalColorMap;\r
}\r
\r
- hRsrc = FindResourceA (hInstance, (LPSTR)idBitmap, (LPSTR)RT_BITMAP);\r
+ hRsrc = FindResourceW (hInstance, (LPWSTR)idBitmap, (LPWSTR)RT_BITMAP);\r
if (hRsrc == 0)\r
return 0;\r
hglb = LoadResource (hInstance, hRsrc);\r
* from there. */\r
\r
/* See if we have been called for this window */\r
- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass);\r
+ stack = (LPSUBCLASS_INFO)GetPropW (hWnd, COMCTL32_wSubclass);\r
if (!stack) {\r
/* allocate stack */\r
- stack = (LPSUBCLASS_INFO)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY,\r
- sizeof(SUBCLASS_INFO));\r
+ stack = Alloc (sizeof(SUBCLASS_INFO));\r
if (!stack) {\r
ERR ("Failed to allocate our Subclassing stack\n");\r
return FALSE;\r
}\r
- SetPropA (hWnd, COMCTL32_aSubclass, (HANDLE)stack);\r
+ SetPropW (hWnd, COMCTL32_wSubclass, (HANDLE)stack);\r
\r
/* set window procedure to our own and save the current one */\r
if (IsWindowUnicode (hWnd))\r
}\r
}\r
\r
- proc = HeapAlloc(GetProcessHeap(), 0, sizeof(SUBCLASSPROCS));\r
+ proc = Alloc(sizeof(SUBCLASSPROCS));\r
if (!proc) {\r
ERR ("Failed to allocate subclass entry in stack\n");\r
if (IsWindowUnicode (hWnd))\r
SetWindowLongPtrW (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
else\r
SetWindowLongPtrA (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
- HeapFree (GetProcessHeap (), 0, stack);\r
- RemovePropA( hWnd, COMCTL32_aSubclass );\r
+ Free (stack);\r
+ RemovePropW( hWnd, COMCTL32_wSubclass );\r
return FALSE;\r
}\r
\r
TRACE ("(%p, %p, %x, %p)\n", hWnd, pfnSubclass, uID, pdwRef);\r
\r
/* See if we have been called for this window */\r
- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass);\r
+ stack = (LPSUBCLASS_INFO)GetPropW (hWnd, COMCTL32_wSubclass);\r
if (!stack)\r
return FALSE;\r
\r
TRACE ("(%p, %p, %x)\n", hWnd, pfnSubclass, uID);\r
\r
/* Find the Subclass to remove */\r
- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass);\r
+ stack = (LPSUBCLASS_INFO)GetPropW (hWnd, COMCTL32_wSubclass);\r
if (!stack)\r
return FALSE;\r
\r
if (stack->stackpos == proc)\r
stack->stackpos = stack->stackpos->next;\r
\r
- HeapFree (GetProcessHeap (), 0, proc);\r
+ Free (proc);\r
ret = TRUE;\r
break;\r
}\r
SetWindowLongPtrW (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
else\r
SetWindowLongPtrA (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
- HeapFree (GetProcessHeap (), 0, stack);\r
- RemovePropA( hWnd, COMCTL32_aSubclass );\r
+ Free (stack);\r
+ RemovePropW( hWnd, COMCTL32_wSubclass );\r
}\r
\r
return ret;\r
\r
TRACE ("(%p, 0x%08x, 0x%08x, 0x%08lx)\n", hWnd, uMsg, wParam, lParam);\r
\r
- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass);\r
+ stack = (LPSUBCLASS_INFO)GetPropW (hWnd, COMCTL32_wSubclass);\r
if (!stack) {\r
ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd);\r
return 0;\r
SetWindowLongPtrW (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
else\r
SetWindowLongPtrA (hWnd, GWLP_WNDPROC, (DWORD_PTR)stack->origproc);\r
- HeapFree (GetProcessHeap (), 0, stack);\r
- RemovePropA( hWnd, COMCTL32_aSubclass );\r
+ Free (stack);\r
+ RemovePropW( hWnd, COMCTL32_wSubclass );\r
}\r
return ret;\r
}\r
TRACE ("(%p, 0x%08x, 0x%08x, 0x%08lx)\n", hWnd, uMsg, wParam, lParam);\r
\r
/* retrieve our little stack from the Properties */\r
- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass);\r
+ stack = (LPSUBCLASS_INFO)GetPropW (hWnd, COMCTL32_wSubclass);\r
if (!stack) {\r
ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd);\r
return 0;\r
{\r
HWND hwndToolTip;\r
\r
- hwndToolTip = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, 0,\r
+ hwndToolTip = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL, 0,\r
CW_USEDEFAULT, CW_USEDEFAULT,\r
CW_USEDEFAULT, CW_USEDEFAULT, hwndOwner,\r
0, 0, 0);\r
nmttc.hdr.code = NM_TOOLTIPSCREATED;\r
nmttc.hwndToolTips = hwndToolTip;\r
\r
- SendMessageA(GetParent(hwndTrueOwner), WM_NOTIFY,\r
+ SendMessageW(GetParent(hwndTrueOwner), WM_NOTIFY,\r
(WPARAM)GetWindowLongPtrW(hwndTrueOwner, GWLP_ID),\r
- (LPARAM)&nmttc);\r
+ (LPARAM)&nmttc);\r
}\r
\r
return hwndToolTip;\r
int *buflen;\r
WCHAR textbuf[256];\r
POINT monthcal_pos;\r
+ int pendingUpdown;\r
} DATETIME_INFO, *LPDATETIME_INFO;\r
\r
/* in monthcal.c */\r
\r
if (infoPtr->dwStyle & DTS_LONGDATEFORMAT)\r
format_item = LOCALE_SLONGDATE;\r
- else if (infoPtr->dwStyle & DTS_TIMEFORMAT)\r
+ else if ((infoPtr->dwStyle & DTS_TIMEFORMAT) == DTS_TIMEFORMAT)\r
format_item = LOCALE_STIMEFORMAT;\r
else /* DTS_SHORTDATEFORMAT */\r
format_item = LOCALE_SSHORTDATE;\r
}\r
\r
DATETIME_UseFormat (infoPtr, lpszFormat);\r
+ InvalidateRect (infoPtr->hwndSelf, NULL, TRUE);\r
\r
return infoPtr->nrFields;\r
}\r
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDAYNAME1+(date.wDayOfWeek+6)%7, result, resultSize);\r
break;\r
case ONEDIGIT12HOUR:\r
- wsprintfW (result, fmt_dW, date.wHour - (date.wHour > 12 ? 12 : 0));\r
+ if (date.wHour == 0) {\r
+ result[0] = '1';\r
+ result[1] = '2';\r
+ result[2] = 0;\r
+ }\r
+ else\r
+ wsprintfW (result, fmt_dW, date.wHour - (date.wHour > 12 ? 12 : 0));\r
break;\r
case TWODIGIT12HOUR:\r
- wsprintfW (result, fmt__2dW, date.wHour - (date.wHour > 12 ? 12 : 0));\r
+ if (date.wHour == 0) {\r
+ result[0] = '1';\r
+ result[1] = '2';\r
+ result[2] = 0;\r
+ }\r
+ else\r
+ wsprintfW (result, fmt__2dW, date.wHour - (date.wHour > 12 ? 12 : 0));\r
break;\r
case ONEDIGIT24HOUR:\r
wsprintfW (result, fmt_dW, date.wHour);\r
TRACE ("arg%d=%x->[%s]\n", count, infoPtr->fieldspec[count], debugstr_w(result));\r
}\r
\r
+/* Offsets of days in the week to the weekday of january 1 in a leap year. */\r
+static const int DayOfWeekTable[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};\r
+\r
+/* returns the day in the week(0 == sunday, 6 == saturday) */\r
+/* day(1 == 1st, 2 == 2nd... etc), year is the year value */\r
+static int DATETIME_CalculateDayOfWeek(DWORD day, DWORD month, DWORD year)\r
+{\r
+ year-=(month < 3);\r
+ \r
+ return((year + year/4 - year/100 + year/400 +\r
+ DayOfWeekTable[month-1] + day ) % 7);\r
+}\r
+\r
static int wrap(int val, int delta, int minVal, int maxVal)\r
{\r
val += delta;\r
case TWODIGITYEAR:\r
case FULLYEAR:\r
date->wYear = wrap(date->wYear, delta, 1752, 9999);\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);\r
break;\r
case ONEDIGITMONTH:\r
case TWODIGITMONTH:\r
case THREECHARMONTH:\r
case FULLMONTH:\r
date->wMonth = wrap(date->wMonth, delta, 1, 12);\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);\r
delta = 0;\r
/* fall through */\r
case ONEDIGITDAY:\r
case THREECHARDAY:\r
case FULLDAY:\r
date->wDay = wrap(date->wDay, delta, 1, MONTHCAL_MonthLength(date->wMonth, date->wYear));\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);\r
break;\r
case ONELETTERAMPM:\r
case TWOLETTERAMPM:\r
}\r
\r
\r
+static void\r
+DATETIME_ReturnFieldWidth (DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *fieldWidthPtr)\r
+{\r
+ /* fields are a fixed width, determined by the largest possible string */\r
+ /* presumably, these widths should be language dependent */\r
+ static const WCHAR fld_d1W[] = { '2', 0 };\r
+ static const WCHAR fld_d2W[] = { '2', '2', 0 };\r
+ static const WCHAR fld_d4W[] = { '2', '2', '2', '2', 0 };\r
+ static const WCHAR fld_am1[] = { 'A', 0 };\r
+ static const WCHAR fld_am2[] = { 'A', 'M', 0 };\r
+ static const WCHAR fld_day[] = { 'W', 'e', 'd', 'n', 'e', 's', 'd', 'a', 'y', 0 };\r
+ static const WCHAR fld_day3[] = { 'W', 'e', 'd', 0 };\r
+ static const WCHAR fld_mon[] = { 'S', 'e', 'p', 't', 'e', 'm', 'b', 'e', 'r', 0 };\r
+ static const WCHAR fld_mon3[] = { 'D', 'e', 'c', 0 };\r
+ int spec;\r
+ WCHAR buffer[80], *bufptr;\r
+ SIZE size;\r
+\r
+ TRACE ("%d,%d\n", infoPtr->nrFields, count);\r
+ if (count>infoPtr->nrFields || count < 0) {\r
+ WARN ("buffer overrun, have %d want %d\n", infoPtr->nrFields, count);\r
+ return;\r
+ }\r
+\r
+ if (!infoPtr->fieldspec) return;\r
+\r
+ spec = infoPtr->fieldspec[count];\r
+ if (spec & DT_STRING) {\r
+ int txtlen = infoPtr->buflen[count];\r
+\r
+ if (txtlen > 79)\r
+ txtlen = 79;\r
+ memcpy (buffer, infoPtr->textbuf + (spec &~ DT_STRING), txtlen * sizeof(WCHAR));\r
+ buffer[txtlen] = 0;\r
+ bufptr = buffer;\r
+ }\r
+ else {\r
+ switch (spec) {\r
+ case ONEDIGITDAY:\r
+ case ONEDIGIT12HOUR:\r
+ case ONEDIGIT24HOUR:\r
+ case ONEDIGITSECOND:\r
+ case ONEDIGITMINUTE:\r
+ case ONEDIGITMONTH:\r
+ case ONEDIGITYEAR:\r
+ /* these seem to use a two byte field */\r
+ case TWODIGITDAY:\r
+ case TWODIGIT12HOUR:\r
+ case TWODIGIT24HOUR:\r
+ case TWODIGITSECOND:\r
+ case TWODIGITMINUTE:\r
+ case TWODIGITMONTH:\r
+ case TWODIGITYEAR:\r
+ bufptr = (WCHAR *)fld_d2W;\r
+ break;\r
+ case INVALIDFULLYEAR:\r
+ case FULLYEAR:\r
+ bufptr = (WCHAR *)fld_d4W;\r
+ break;\r
+ case THREECHARDAY:\r
+ bufptr = (WCHAR *)fld_day3;\r
+ break;\r
+ case FULLDAY:\r
+ bufptr = (WCHAR *)fld_day;\r
+ break;\r
+ case THREECHARMONTH:\r
+ bufptr = (WCHAR *)fld_mon3;\r
+ break;\r
+ case FULLMONTH:\r
+ bufptr = (WCHAR *)fld_mon;\r
+ break;\r
+ case ONELETTERAMPM:\r
+ bufptr = (WCHAR *)fld_am1;\r
+ break;\r
+ case TWOLETTERAMPM:\r
+ bufptr = (WCHAR *)fld_am2;\r
+ break;\r
+ default:\r
+ bufptr = (WCHAR *)fld_d1W;\r
+ break;\r
+ }\r
+ }\r
+ GetTextExtentPoint32W (hdc, bufptr, strlenW(bufptr), &size);\r
+ *fieldWidthPtr = size.cx;\r
+}\r
+\r
static void \r
DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)\r
{\r
RECT *checkbox = &infoPtr->checkbox;\r
SIZE size;\r
COLORREF oldTextColor;\r
+ SHORT fieldWidth;\r
\r
/* draw control edge */\r
TRACE("\n");\r
for (i = 0; i < infoPtr->nrFields; i++) {\r
DATETIME_ReturnTxt (infoPtr, i, txt, sizeof(txt)/sizeof(txt[0]));\r
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);\r
+ DATETIME_ReturnFieldWidth (infoPtr, hdc, i, &fieldWidth);\r
field = &infoPtr->fieldRect[i];\r
field->left = prevright;\r
- field->right = prevright+size.cx;\r
+ field->right = prevright + fieldWidth;\r
field->top = rcDraw->top;\r
field->bottom = rcDraw->bottom;\r
prevright = field->right;\r
ShowWindow(infoPtr->hMonthCal, SW_HIDE);\r
infoPtr->dateValid = TRUE;\r
SendMessageW (infoPtr->hMonthCal, MCM_GETCURSEL, 0, (LPARAM)&infoPtr->date);\r
- TRACE("got from calendar %04d/%02d/%02d\n", \r
- infoPtr->date.wYear, infoPtr->date.wMonth, infoPtr->date.wDay);\r
+ TRACE("got from calendar %04d/%02d/%02d day of week %d\n", \r
+ infoPtr->date.wYear, infoPtr->date.wMonth, infoPtr->date.wDay, infoPtr->date.wDayOfWeek);\r
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);\r
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);\r
DATETIME_SendDateTimeChangeNotify (infoPtr);\r
}\r
+ if ((lpnmh->hwndFrom == infoPtr->hUpdown) && (lpnmh->code == UDN_DELTAPOS)) {\r
+ LPNMUPDOWN lpnmud = (LPNMUPDOWN)lpnmh;\r
+ TRACE("Delta pos %d\n", lpnmud->iDelta);\r
+ infoPtr->pendingUpdown = lpnmud->iDelta;\r
+ }\r
return 0;\r
}\r
\r
FIXME ("Callbacks not implemented yet\n");\r
}\r
\r
+ if (vkCode >= '0' && vkCode <= '9') {\r
+ /* this is a somewhat simplified version of what Windows does */\r
+ SYSTEMTIME *date = &infoPtr->date;\r
+ switch (infoPtr->fieldspec[fieldNum]) {\r
+ case ONEDIGITYEAR:\r
+ case TWODIGITYEAR:\r
+ date->wYear = date->wYear - (date->wYear%100) +\r
+ (date->wYear%10)*10 + (vkCode-'0');\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(\r
+ date->wDay,date->wMonth,date->wYear);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case INVALIDFULLYEAR:\r
+ case FULLYEAR:\r
+ date->wYear = (date->wYear%1000)*10 + (vkCode-'0');\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(\r
+ date->wDay,date->wMonth,date->wYear);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGITMONTH:\r
+ case TWODIGITMONTH:\r
+ if ((date->wMonth%10) > 1 || (vkCode-'0') > 2)\r
+ date->wMonth = vkCode-'0';\r
+ else\r
+ date->wMonth = (date->wMonth%10)*10+vkCode-'0';\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(\r
+ date->wDay,date->wMonth,date->wYear);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGITDAY:\r
+ case TWODIGITDAY:\r
+ /* probably better checking here would help */\r
+ if ((date->wDay%10) >= 3 && (vkCode-'0') > 1)\r
+ date->wDay = vkCode-'0';\r
+ else\r
+ date->wDay = (date->wDay%10)*10+vkCode-'0';\r
+ date->wDayOfWeek = DATETIME_CalculateDayOfWeek(\r
+ date->wDay,date->wMonth,date->wYear);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGIT12HOUR:\r
+ case TWODIGIT12HOUR:\r
+ if ((date->wHour%10) > 1 || (vkCode-'0') > 2)\r
+ date->wHour = vkCode-'0';\r
+ else\r
+ date->wHour = (date->wHour%10)*10+vkCode-'0';\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGIT24HOUR:\r
+ case TWODIGIT24HOUR:\r
+ if ((date->wHour%10) > 2)\r
+ date->wHour = vkCode-'0';\r
+ else if ((date->wHour%10) == 2 && (vkCode-'0') > 3)\r
+ date->wHour = vkCode-'0';\r
+ else\r
+ date->wHour = (date->wHour%10)*10+vkCode-'0';\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGITMINUTE:\r
+ case TWODIGITMINUTE:\r
+ if ((date->wMinute%10) > 5)\r
+ date->wMinute = vkCode-'0';\r
+ else\r
+ date->wMinute = (date->wMinute%10)*10+vkCode-'0';\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ case ONEDIGITSECOND:\r
+ case TWODIGITSECOND:\r
+ if ((date->wSecond%10) > 5)\r
+ date->wSecond = vkCode-'0';\r
+ else\r
+ date->wSecond = (date->wSecond%10)*10+vkCode-'0';\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ break;\r
+ }\r
+ }\r
+ \r
switch (vkCode) {\r
case VK_ADD:\r
case VK_UP:\r
break;\r
}\r
\r
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);\r
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+static LRESULT\r
+DATETIME_VScroll (DATETIME_INFO *infoPtr, WORD wScroll)\r
+{\r
+ int fieldNum = infoPtr->select & DTHT_DATEFIELD;\r
+\r
+ if ((SHORT)LOWORD(wScroll) != SB_THUMBPOSITION) return 0;\r
+ if (!(infoPtr->haveFocus)) return 0;\r
+ if ((fieldNum==0) && (infoPtr->select)) return 0;\r
+\r
+ if (infoPtr->pendingUpdown >= 0) {\r
+ DATETIME_IncreaseField (infoPtr, fieldNum, 1);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ }\r
+ else {\r
+ DATETIME_IncreaseField (infoPtr, fieldNum, -1);\r
+ DATETIME_SendDateTimeChangeNotify (infoPtr);\r
+ }\r
+\r
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);\r
\r
return 0;\r
}\r
TRACE("Height=%ld, Width=%ld\n", infoPtr->rcClient.bottom, infoPtr->rcClient.right);\r
\r
infoPtr->rcDraw = infoPtr->rcClient;\r
-\r
- /* set the size of the button that drops the calendar down */\r
- /* FIXME: account for style that allows button on left side */\r
- infoPtr->calbutton.top = infoPtr->rcDraw.top;\r
- infoPtr->calbutton.bottom= infoPtr->rcDraw.bottom;\r
- infoPtr->calbutton.left = infoPtr->rcDraw.right-15;\r
- infoPtr->calbutton.right = infoPtr->rcDraw.right;\r
+ \r
+ if (infoPtr->dwStyle & DTS_UPDOWN) {\r
+ SetWindowPos(infoPtr->hUpdown, NULL,\r
+ infoPtr->rcClient.right-14, 0,\r
+ 15, infoPtr->rcClient.bottom - infoPtr->rcClient.top,\r
+ SWP_NOACTIVATE | SWP_NOZORDER);\r
+ }\r
+ else {\r
+ /* set the size of the button that drops the calendar down */\r
+ /* FIXME: account for style that allows button on left side */\r
+ infoPtr->calbutton.top = infoPtr->rcDraw.top;\r
+ infoPtr->calbutton.bottom= infoPtr->rcDraw.bottom;\r
+ infoPtr->calbutton.left = infoPtr->rcDraw.right-15;\r
+ infoPtr->calbutton.right = infoPtr->rcDraw.right;\r
+ }\r
\r
/* set enable/disable button size for show none style being enabled */\r
/* FIXME: these dimensions are completely incorrect */\r
0, 0, 0, 0, infoPtr->hwndSelf, 0, 0, 0);\r
\r
/* initialize info structure */\r
- GetSystemTime (&infoPtr->date);\r
+ GetLocalTime (&infoPtr->date);\r
infoPtr->dateValid = TRUE;\r
infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);\r
\r
case WM_LBUTTONUP:\r
return DATETIME_LButtonUp (infoPtr, (WORD)wParam);\r
\r
+ case WM_VSCROLL:\r
+ return DATETIME_VScroll (infoPtr, (WORD)wParam);\r
+\r
case WM_CREATE:\r
return DATETIME_Create (hwnd, (LPCREATESTRUCTW)lParam);\r
\r
FlatSB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
{\r
if (!FlatSB_GetInfoPtr(hwnd) && (uMsg != WM_CREATE))\r
- return DefWindowProcA( hwnd, uMsg, wParam, lParam );\r
+ return DefWindowProcW( hwnd, uMsg, wParam, lParam );\r
\r
switch (uMsg)\r
{\r
if ((uMsg >= WM_USER) && (uMsg < WM_APP))\r
ERR("unknown msg %04x wp=%08x lp=%08lx\n",\r
uMsg, wParam, lParam);\r
- return DefWindowProcA (hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW (hwnd, uMsg, wParam, lParam);\r
}\r
}\r
\r
VOID\r
FLATSB_Register (void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
- ZeroMemory (&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory (&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS;\r
wndClass.lpfnWndProc = FlatSB_WindowProc;\r
wndClass.cbClsExtra = 0;\r
wndClass.cbWndExtra = sizeof(FLATSB_INFO *);\r
- wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROW);\r
+ wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);\r
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
- wndClass.lpszClassName = FLATSB_CLASSA;\r
+ wndClass.lpszClassName = FLATSB_CLASSW;\r
\r
- RegisterClassA (&wndClass);\r
+ RegisterClassW (&wndClass);\r
}\r
\r
\r
VOID\r
FLATSB_Unregister (void)\r
{\r
- UnregisterClassA (FLATSB_CLASSA, NULL);\r
+ UnregisterClassW (FLATSB_CLASSW, NULL);\r
}\r
INT iHotItem; /* index of hot item (cursor is over this item) */\r
INT iMargin; /* width of the margin that surrounds a bitmap */\r
\r
- HIMAGELIST himl; /* handle to a image list (may be 0) */\r
+ HIMAGELIST himl; /* handle to an image list (may be 0) */\r
HEADER_ITEM *items; /* pointer to array of HEADER_ITEM's */\r
BOOL bRectsValid; /* validity flag for bounding rectangles */\r
} HEADER_INFO;\r
if (r.right - r.left == 0)\r
return phdi->rect.right;\r
\r
- if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) {\r
+ if (GetWindowLongW (hwnd, GWL_STYLE) & HDS_BUTTONS) {\r
if (phdi->bDown) {\r
DrawEdge (hdc, &r, BDR_RAISEDOUTER,\r
BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);\r
dis.rcItem = r;\r
dis.itemData = phdi->lParam;\r
oldBkMode = SetBkMode(hdc, TRANSPARENT);\r
- SendMessageA (infoPtr->hwndNotify, WM_DRAWITEM,\r
+ SendMessageW (infoPtr->hwndNotify, WM_DRAWITEM,\r
(WPARAM)dis.CtlID, (LPARAM)&dis);\r
if (oldBkMode != TRANSPARENT)\r
SetBkMode(hdc, oldBkMode);\r
HDC hdcBitmap;\r
INT yD, yS, cx, cy, rx, ry;\r
\r
- GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);\r
+ GetObjectW (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);\r
\r
ry = r.bottom - r.top;\r
rx = r.right - r.left;\r
INT xD, yD, yS, cx, cy, rx, ry, tx;\r
RECT textRect;\r
\r
- GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);\r
+ GetObjectW (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);\r
\r
textRect = r;\r
if (phdi->fmt & HDF_STRING) {\r
\r
if ((x <= rect.right) && (infoPtr->uNumItem > 0)) {\r
rect.left = x;\r
- if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS)\r
+ if (GetWindowLongW (hwnd, GWL_STYLE) & HDS_BUTTONS)\r
DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);\r
else\r
DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);\r
nmhdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);\r
nmhdr.code = code;\r
\r
- return (BOOL)SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,\r
+ return (BOOL)SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);\r
}\r
\r
nmitem.iOrder = infoPtr->items[iItem].iOrder;\r
nmitem.iImage = infoPtr->items[iItem].iImage;\r
\r
- return (BOOL)SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,\r
+ return (BOOL)SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);\r
}\r
\r
lpLayout->pwpos->x = lpLayout->prc->left;\r
lpLayout->pwpos->y = lpLayout->prc->top;\r
lpLayout->pwpos->cx = lpLayout->prc->right - lpLayout->prc->left;\r
- if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_HIDDEN)\r
+ if (GetWindowLongW (hwnd, GWL_STYLE) & HDS_HIDDEN)\r
lpLayout->pwpos->cy = 0;\r
else {\r
lpLayout->pwpos->cy = infoPtr->nHeight;\r
HEADER_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
HEADER_INFO *infoPtr;\r
- TEXTMETRICA tm;\r
+ TEXTMETRICW tm;\r
HFONT hOldFont;\r
HDC hdc;\r
\r
infoPtr = (HEADER_INFO *)Alloc (sizeof(HEADER_INFO));\r
- SetWindowLongPtrA (hwnd, 0, (DWORD_PTR)infoPtr);\r
+ SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);\r
\r
infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;\r
infoPtr->uNumItem = 0;\r
infoPtr->hFont = 0;\r
infoPtr->items = 0;\r
infoPtr->bRectsValid = FALSE;\r
- infoPtr->hcurArrow = LoadCursorA (0, (LPSTR)IDC_ARROW);\r
- infoPtr->hcurDivider = LoadCursorA (COMCTL32_hModule, MAKEINTRESOURCEA(IDC_DIVIDER));\r
- infoPtr->hcurDivopen = LoadCursorA (COMCTL32_hModule, MAKEINTRESOURCEA(IDC_DIVIDEROPEN));\r
+ infoPtr->hcurArrow = LoadCursorW (0, (LPWSTR)IDC_ARROW);\r
+ infoPtr->hcurDivider = LoadCursorW (COMCTL32_hModule, MAKEINTRESOURCEW(IDC_DIVIDER));\r
+ infoPtr->hcurDivopen = LoadCursorW (COMCTL32_hModule, MAKEINTRESOURCEW(IDC_DIVIDEROPEN));\r
infoPtr->bPressed = FALSE;\r
infoPtr->bTracking = FALSE;\r
infoPtr->iMoveItem = 0;\r
infoPtr->bUnicode = IsWindowUnicode (hwnd);\r
infoPtr->iMargin = 3*GetSystemMetrics(SM_CXEDGE);\r
infoPtr->nNotifyFormat =\r
- SendMessageA (infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);\r
+ SendMessageW (infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);\r
\r
hdc = GetDC (0);\r
hOldFont = SelectObject (hdc, GetStockObject (SYSTEM_FONT));\r
- GetTextMetricsA (hdc, &tm);\r
+ GetTextMetricsW (hdc, &tm);\r
infoPtr->nHeight = tm.tmHeight + VERT_BORDER;\r
SelectObject (hdc, hOldFont);\r
ReleaseDC (0, hdc);\r
if (infoPtr->himl)\r
ImageList_Destroy (infoPtr->himl);\r
\r
+ SetWindowLongPtrW (hwnd, 0, 0);\r
Free (infoPtr);\r
- SetWindowLongPtrA (hwnd, 0, 0);\r
return 0;\r
}\r
\r
pt.y = (INT)HIWORD(lParam);\r
HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);\r
\r
- if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER))\r
+ if ((GetWindowLongW (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER))\r
HEADER_SendHeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem,0);\r
else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))\r
HEADER_SendHeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem,0);\r
HEADER_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
+ DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
POINT pt;\r
UINT flags;\r
INT nItem;\r
{\r
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);\r
/*\r
- *DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
+ *DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
*/\r
POINT pt;\r
UINT flags;\r
\r
case NF_REQUERY:\r
infoPtr->nNotifyFormat =\r
- SendMessageA ((HWND)wParam, WM_NOTIFYFORMAT,\r
+ SendMessageW ((HWND)wParam, WM_NOTIFYFORMAT,\r
(WPARAM)hwnd, (LPARAM)NF_QUERY);\r
return infoPtr->nNotifyFormat;\r
}\r
HEADER_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
+ DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
POINT pt;\r
UINT flags;\r
INT nItem, nWidth;\r
ClientToScreen(hwnd, &pt);\r
\r
/* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */\r
- SendMessageA( hwnd, WM_CONTEXTMENU, (WPARAM) hwnd, MAKELPARAM(pt.x, pt.y));\r
+ SendMessageW( hwnd, WM_CONTEXTMENU, (WPARAM) hwnd, MAKELPARAM(pt.x, pt.y));\r
\r
return bRet;\r
}\r
HEADER_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);\r
- TEXTMETRICA tm;\r
+ TEXTMETRICW tm;\r
HFONT hFont, hOldFont;\r
HDC hdc;\r
\r
\r
hdc = GetDC (0);\r
hOldFont = SelectObject (hdc, hFont);\r
- GetTextMetricsA (hdc, &tm);\r
+ GetTextMetricsW (hdc, &tm);\r
infoPtr->nHeight = tm.tmHeight + VERT_BORDER;\r
SelectObject (hdc, hOldFont);\r
ReleaseDC (0, hdc);\r
{\r
TRACE("hwnd=%p msg=%x wparam=%x lParam=%lx\n", hwnd, msg, wParam, lParam);\r
if (!HEADER_GetInfoPtr (hwnd) && (msg != WM_CREATE))\r
- return DefWindowProcA (hwnd, msg, wParam, lParam);\r
+ return DefWindowProcW (hwnd, msg, wParam, lParam);\r
switch (msg) {\r
/* case HDM_CLEARFILTER: */\r
\r
VOID\r
HEADER_Register (void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
- ZeroMemory (&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory (&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;\r
wndClass.lpfnWndProc = HEADER_WindowProc;\r
wndClass.cbClsExtra = 0;\r
wndClass.cbWndExtra = sizeof(HEADER_INFO *);\r
- wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROW);\r
- wndClass.lpszClassName = WC_HEADERA;\r
+ wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);\r
+ wndClass.lpszClassName = WC_HEADERW;\r
\r
- RegisterClassA (&wndClass);\r
+ RegisterClassW (&wndClass);\r
}\r
\r
\r
VOID\r
HEADER_Unregister (void)\r
{\r
- UnregisterClassA (WC_HEADERA, NULL);\r
+ UnregisterClassW (WC_HEADERW, NULL);\r
}\r
TRACE("%p %d %d\n", himl, i, fStyle);\r
if (!is_valid(himl) || (i < 0) || (i >= himl->cCurImage)) return NULL;\r
\r
- hdcDst = CreateCompatibleDC(0);\r
-\r
ii.fIcon = TRUE;\r
ii.xHotspot = 0;\r
ii.yHotspot = 0;\r
\r
+ /* create colour bitmap */\r
+ hdcDst = GetDC(0);\r
+ ii.hbmColor = CreateCompatibleBitmap(hdcDst, himl->cx, himl->cy);\r
+ ReleaseDC(0, hdcDst);\r
+\r
+ hdcDst = CreateCompatibleDC(0);\r
+\r
/* draw mask*/\r
- ii.hbmMask = CreateCompatibleBitmap (hdcDst, himl->cx, himl->cy);\r
+ ii.hbmMask = CreateBitmap (himl->cx, himl->cy, 1, 1, NULL);\r
hOldDstBitmap = SelectObject (hdcDst, ii.hbmMask);\r
if (himl->hbmMask) {\r
BitBlt (hdcDst, 0, 0, himl->cx, himl->cy,\r
PatBlt (hdcDst, 0, 0, himl->cx, himl->cy, BLACKNESS);\r
\r
/* draw image*/\r
- ii.hbmColor = CreateCompatibleBitmap (himl->hdcImage, himl->cx, himl->cy);\r
SelectObject (hdcDst, ii.hbmColor);\r
BitBlt (hdcDst, 0, 0, himl->cx, himl->cy,\r
himl->hdcImage, i * himl->cx, 0, SRCCOPY);\r
uType, uFlags);\r
\r
len = MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, NULL, 0);\r
- lpbmpW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));\r
+ lpbmpW = Alloc(len * sizeof(WCHAR));\r
MultiByteToWideChar(CP_ACP, 0, lpbmp, -1, lpbmpW, len);\r
\r
himl = ImageList_LoadImageW(hi, lpbmpW, cx, cGrow, clrMask, uType, uFlags);\r
- HeapFree(GetProcessHeap(), 0, lpbmpW);\r
+ Free (lpbmpW);\r
return himl;\r
}\r
\r
BYTE temp;\r
\r
colors = 1 << himl->uBitsPixel;\r
- bmi = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFOHEADER) +\r
+ bmi = Alloc(sizeof(BITMAPINFOHEADER) +\r
sizeof(PALETTEENTRY) * colors);\r
\r
pal = (LPPALETTEENTRY)bmi->bmiColors;\r
}\r
else\r
{\r
- bmi = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFOHEADER));\r
+ bmi = Alloc(sizeof(BITMAPINFOHEADER));\r
}\r
\r
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
\r
hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, 0, 0);\r
\r
- HeapFree(GetProcessHeap(), 0, bmi);\r
+ Free (bmi);\r
}\r
else /*if (ilc == ILC_COLORDDB)*/\r
{\r
*\r
* Bugs\r
* -- Expand large item in ICON mode when the cursor is flying over the icon or text.\r
- * -- Support CustonDraw options for _WIN32_IE >= 0x560 (see NMLVCUSTOMDRAW docs.\r
- * -- in LISTVIEW_AddGroupSelection, we would send LVN_ODSTATECHANGED \r
+ * -- Support CustomDraw options for _WIN32_IE >= 0x560 (see NMLVCUSTOMDRAW docs).\r
* -- LVA_SNAPTOGRID not implemented\r
* -- LISTVIEW_ApproximateViewRect partially implemented\r
* -- LISTVIEW_[GS]etColumnOrderArray stubs\r
* -- LVN_HOTTRACK\r
* -- LVN_MARQUEEBEGIN\r
* -- LVN_ODFINDITEM\r
- * -- LVN_ODSTATECHANGED\r
* -- LVN_SETDISPINFO\r
* -- NM_HOVER\r
*\r
if (!isW && is_textT(text, isW))\r
{\r
INT len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)text, -1, NULL, 0);\r
- wstr = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));\r
+ wstr = Alloc(len * sizeof(WCHAR));\r
if (wstr) MultiByteToWideChar(CP_ACP, 0, (LPCSTR)text, -1, wstr, len);\r
}\r
TRACE(" wstr=%s\n", text == LPSTR_TEXTCALLBACKW ? "(callback)" : debugstr_w(wstr));\r
\r
static inline void textfreeT(LPWSTR wstr, BOOL isW)\r
{\r
- if (!isW && is_textT(wstr, isW)) HeapFree(GetProcessHeap(), 0, wstr);\r
+ if (!isW && is_textT(wstr, isW)) Free (wstr);\r
}\r
\r
/*\r
} else return "(null)";\r
}\r
\r
-static const char * debugscrollinfo(const SCROLLINFO *pScrollInfo)\r
+static const char* debugscrollinfo(const SCROLLINFO *pScrollInfo)\r
{\r
char* buf = debug_getbuf(), *text = buf;\r
int len, size = DEBUG_BUFFER_SIZE;\r
*pdi->item.pszText = 0; /* make sure we don't process garbage */\r
}\r
\r
- pszTempBuf = HeapAlloc(GetProcessHeap(), 0,\r
- (convertToUnicode ? sizeof(WCHAR) : sizeof(CHAR)) * cchTempBufMax);\r
+ pszTempBuf = Alloc( (convertToUnicode ? sizeof(WCHAR) : sizeof(CHAR)) * cchTempBufMax);\r
if (!pszTempBuf) return FALSE;\r
\r
if (convertToUnicode)\r
savPszText, savCchTextMax);\r
pdi->item.pszText = savPszText; /* restores our buffer */\r
pdi->item.cchTextMax = savCchTextMax;\r
- HeapFree(GetProcessHeap(), 0, pszTempBuf);\r
+ Free (pszTempBuf);\r
}\r
return bResult;\r
}\r
* five versa, should leave the iterator at the same item:\r
* prev * n, next * n = next * n, prev * n\r
*\r
- * The iterator has a notion of a out-of-order, special item,\r
+ * The iterator has a notion of an out-of-order, special item,\r
* which sits at the start of the list. This is used in\r
* LVS_ICON, and LVS_SMALLICON mode to handle the focused item,\r
* which needs to be first, as it may overlap other items.\r
{\r
INT nFirst = min(infoPtr->nSelectionMark, nItem);\r
INT nLast = max(infoPtr->nSelectionMark, nItem);\r
- INT i;\r
+ NMLVODSTATECHANGE nmlv;\r
LVITEMW item;\r
+ BOOL bOldChange;\r
+ INT i;\r
+\r
+ /* Temporarily disable change notification\r
+ * If the control is LVS_OWNERDATA, we need to send\r
+ * only one LVN_ODSTATECHANGED notification.\r
+ * See MSDN documentation for LVN_ITEMCHANGED.\r
+ */\r
+ bOldChange = infoPtr->bDoChangeNotify;\r
+ if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE;\r
\r
if (nFirst == -1) nFirst = nItem;\r
\r
item.state = LVIS_SELECTED;\r
item.stateMask = LVIS_SELECTED;\r
\r
- /* FIXME: this is not correct LVS_OWNERDATA\r
- * setting the item states individually will generate\r
- * a LVN_ITEMCHANGED notification for each one. Instead,\r
- * we have to send a LVN_ODSTATECHANGED notification.\r
- * See MSDN documentation for LVN_ITEMCHANGED.\r
- */\r
for (i = nFirst; i <= nLast; i++)\r
LISTVIEW_SetItemState(infoPtr,i,&item);\r
+\r
+ ZeroMemory(&nmlv, sizeof(nmlv));\r
+ nmlv.iFrom = nFirst;\r
+ nmlv.iTo = nLast;\r
+ nmlv.uNewState = 0;\r
+ nmlv.uOldState = item.state;\r
+\r
+ notify_hdr(infoPtr, LVN_ODSTATECHANGED, (LPNMHDR)&nmlv);\r
+ infoPtr->bDoChangeNotify = bOldChange;\r
}\r
\r
\r
bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);\r
\r
/*\r
- *update selection mark\r
+ * Update selection mark\r
*\r
* Investigation on windows 2k showed that selection mark was updated\r
* whenever a new selection was made, but if the selected item was\r
\r
TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW);\r
\r
- style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|WS_BORDER;\r
+ style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER;\r
hdc = GetDC(infoPtr->hwndSelf);\r
\r
/* Select the font to get appropriate metric dimensions */\r
* TODO:\r
* -- MCM_[GS]ETUNICODEFORMAT\r
* -- MONTHCAL_GetMonthRange\r
- * -- Unicodification\r
* -- handle resources better (doesn't work now); \r
* -- take care of internationalization.\r
* -- keyboard handling.\r
* -- GetRange: At the moment, we copy ranges anyway, regardless of\r
- * infoPtr->rangeValid; a invalid range is simply filled \r
+ * infoPtr->rangeValid; an invalid range is simply filled \r
* with zeros in SetRange. Is this the right behavior?\r
* -- search for FIXME\r
*/\r
#include "winnls.h"\r
#include "commctrl.h"\r
#include "comctl32.h"\r
+#include "wine/unicode.h"\r
#include "wine/debug.h"\r
\r
WINE_DEFAULT_DEBUG_CHANNEL(monthcal);\r
#define MC_NEXTMONTHTIMER 1 /* Timer ID's */\r
#define MC_PREVMONTHTIMER 2\r
\r
+#define countof(arr) (sizeof(arr)/sizeof(arr[0]))\r
+\r
typedef struct\r
{\r
HWND hwndSelf;\r
} MONTHCAL_INFO, *LPMONTHCAL_INFO;\r
\r
\r
-/* Offsets of days in the week to the weekday of january 1. */\r
+/* Offsets of days in the week to the weekday of january 1 in a leap year */\r
static const int DayOfWeekTable[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};\r
\r
\r
Need to find out if we're on a DST place & adjust the clock accordingly.\r
Above function assumes we have a valid data.\r
Valid for year>1752; 1 <= d <= 31, 1 <= m <= 12.\r
- 0 = Monday.\r
+ 0 = Sunday.\r
*/\r
\r
-/* returns the day in the week(0 == monday, 6 == sunday) */\r
+/* returns the day in the week(0 == sunday, 6 == saturday) */\r
/* day(1 == 1st, 2 == 2nd... etc), year is the year value */\r
static int MONTHCAL_CalculateDayOfWeek(DWORD day, DWORD month, DWORD year)\r
{\r
year-=(month < 3);\r
\r
return((year + year/4 - year/100 + year/400 +\r
- DayOfWeekTable[month-1] + day - 1 ) % 7);\r
+ DayOfWeekTable[month-1] + day ) % 7);\r
}\r
\r
/* From a given point, calculate the row (weekpos), column(daypos)\r
static void MONTHCAL_DrawDay(MONTHCAL_INFO *infoPtr, HDC hdc, int day, int month,\r
int x, int y, int bold)\r
{\r
- char buf[10];\r
+ static const WCHAR fmtW[] = { '%','d',0 };\r
+ WCHAR buf[10];\r
RECT r;\r
static int haveBoldFont, haveSelectedDay = FALSE;\r
HBRUSH hbr;\r
COLORREF oldCol = 0;\r
COLORREF oldBk = 0;\r
\r
- sprintf(buf, "%d", day);\r
+ wsprintfW(buf, fmtW, day);\r
\r
/* No need to check styles: when selection is not valid, it is set to zero.\r
* 1<day<31, so evertyhing's OK.\r
}\r
\r
SetBkMode(hdc,TRANSPARENT);\r
- DrawTextA(hdc, buf, -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
+ DrawTextW(hdc, buf, -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
\r
/* draw a rectangle around the currently selected days text */\r
if((day==infoPtr->curSelDay) && (month==infoPtr->currentMonth))\r
\r
static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, PAINTSTRUCT* ps)\r
{\r
+ static const WCHAR todayW[] = { 'T','o','d','a','y',':',0 };\r
+ static const WCHAR fmt1W[] = { '%','s',' ','%','l','d',0 };\r
+ static const WCHAR fmt2W[] = { '%','s',' ','%','s',0 };\r
+ static const WCHAR fmt3W[] = { '%','d',0 };\r
RECT *title=&infoPtr->title;\r
RECT *prev=&infoPtr->titlebtnprev;\r
RECT *next=&infoPtr->titlebtnnext;\r
SIZE size;\r
HBRUSH hbr;\r
HFONT currentFont;\r
- char buf[20];\r
- char buf1[20];\r
- char buf2[32];\r
+ WCHAR buf[20];\r
+ WCHAR buf1[20];\r
+ WCHAR buf2[32];\r
COLORREF oldTextColor, oldBkColor;\r
DWORD dwStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);\r
RECT rcTemp;\r
titlemonth->left = title->left;\r
titlemonth->right = title->right;\r
\r
- GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+infoPtr->currentMonth -1,\r
- buf1,sizeof(buf1));\r
- sprintf(buf, "%s %ld", buf1, infoPtr->currentYear);\r
+ GetLocaleInfoW( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+infoPtr->currentMonth -1,\r
+ buf1,countof(buf1));\r
+ wsprintfW(buf, fmt1W, buf1, infoPtr->currentYear);\r
\r
if(IntersectRect(&rcTemp, &(ps->rcPaint), titlemonth))\r
{\r
- DrawTextA(hdc, buf, strlen(buf), titlemonth,\r
+ DrawTextW(hdc, buf, strlenW(buf), titlemonth,\r
DT_CENTER | DT_VCENTER | DT_SINGLELINE);\r
}\r
\r
* MCM_HitTestInfo wants month & year rects, so prepare these now.\r
*(no, we can't draw them separately; the whole text is centered)\r
*/\r
- GetTextExtentPoint32A(hdc, buf, strlen(buf), &size);\r
+ GetTextExtentPoint32W(hdc, buf, strlenW(buf), &size);\r
titlemonth->left = title->right / 2 - size.cx / 2;\r
titleyear->right = title->right / 2 + size.cx / 2;\r
- GetTextExtentPoint32A(hdc, buf1, strlen(buf1), &size);\r
+ GetTextExtentPoint32W(hdc, buf1, strlenW(buf1), &size);\r
titlemonth->right = titlemonth->left + size.cx;\r
titleyear->left = titlemonth->right;\r
\r
i = infoPtr->firstDay;\r
\r
for(j=0; j<7; j++) {\r
- GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SABBREVDAYNAME1 + (i +j)%7,\r
- buf,sizeof(buf));\r
- DrawTextA(hdc, buf, strlen(buf), days,\r
- DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
+ GetLocaleInfoW( LOCALE_USER_DEFAULT,LOCALE_SABBREVDAYNAME1 + (i+j+6)%7, buf, countof(buf));\r
+ DrawTextW(hdc, buf, strlenW(buf), days, DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
days->left+=infoPtr->width_increment;\r
days->right+=infoPtr->width_increment;\r
}\r
infoPtr->currentMonth);\r
offset+=textWidth;\r
}\r
- if (!LoadStringA(COMCTL32_hModule,IDM_TODAY,buf1,sizeof(buf1)))\r
+ if (!LoadStringW(COMCTL32_hModule,IDM_TODAY,buf1,countof(buf1)))\r
{\r
WARN("Can't load resource\n");\r
- strcpy(buf1,"Today:");\r
+ strcpyW(buf1, todayW);\r
}\r
MONTHCAL_CalcDayRect(infoPtr, &rtoday, 1, 6);\r
MONTHCAL_CopyTime(&infoPtr->todaysDate,&localtime);\r
- GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&localtime,NULL,buf2,sizeof(buf2));\r
- sprintf(buf, "%s %s", buf1,buf2);\r
+ GetDateFormatW(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&localtime,NULL,buf2,countof(buf2));\r
+ wsprintfW(buf, fmt2W, buf1, buf2);\r
SelectObject(hdc, infoPtr->hBoldFont);\r
\r
if(IntersectRect(&rcTemp, &(ps->rcPaint), &rtoday))\r
{\r
- DrawTextA(hdc, buf, -1, &rtoday, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE);\r
- DrawTextA(hdc, buf, -1, &rtoday, DT_LEFT | DT_VCENTER | DT_SINGLELINE);\r
+ DrawTextW(hdc, buf, -1, &rtoday, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE);\r
+ DrawTextW(hdc, buf, -1, &rtoday, DT_LEFT | DT_VCENTER | DT_SINGLELINE);\r
}\r
SelectObject(hdc, infoPtr->hFont);\r
}\r
LOCALE_IFIRSTWEEKOFYEAR == 1 (what contries?)\r
The first week of the year must contain only days of the new year\r
*/\r
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR,\r
- buf, sizeof(buf));\r
- sscanf(buf, "%d", &weeknum);\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, buf, countof(buf));\r
+ weeknum = atoiW(buf);\r
switch (weeknum)\r
{\r
case 1: mindays = 6;\r
for(i=0; i<6; i++) {\r
if((i==0)&&(weeknum>50))\r
{\r
- sprintf(buf, "%d", weeknum);\r
+ wsprintfW(buf, fmt3W, weeknum);\r
weeknum=0;\r
}\r
else if((i==5)&&(weeknum>47))\r
{\r
- sprintf(buf, "%d", 1);\r
+ wsprintfW(buf, fmt3W, 1);\r
}\r
else\r
- sprintf(buf, "%d", weeknum + i);\r
- DrawTextA(hdc, buf, -1, days, DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
+ wsprintfW(buf, fmt3W, weeknum + i);\r
+ DrawTextW(hdc, buf, -1, days, DT_CENTER | DT_VCENTER | DT_SINGLELINE );\r
days->top+=infoPtr->height_increment;\r
days->bottom+=infoPtr->height_increment;\r
}\r
\r
\r
/* sets the first day of the week that will appear in the control */\r
-/* 0 == Monday, 6 == Sunday */\r
+/* 0 == Sunday, 6 == Saturday */\r
/* FIXME: this needs to be implemented properly in MONTHCAL_Refresh() */\r
/* FIXME: we need more error checking here */\r
static LRESULT\r
MONTHCAL_SetFirstDayOfWeek(MONTHCAL_INFO *infoPtr, LPARAM lParam)\r
{\r
int prev = infoPtr->firstDay;\r
- char buf[40];\r
- int day;\r
+ WCHAR buf[40];\r
\r
TRACE("day %ld\n", lParam);\r
\r
}\r
else\r
{\r
- GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK,\r
- buf, sizeof(buf));\r
- TRACE("%s %d\n", buf, strlen(buf));\r
- if(sscanf(buf, "%d", &day) == 1)\r
- infoPtr->firstDay = day;\r
- else\r
- infoPtr->firstDay = 0;\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, buf, countof(buf));\r
+ TRACE("%s %d\n", debugstr_w(buf), strlenW(buf));\r
+ infoPtr->firstDay = (atoiW(buf)+1)%7;\r
}\r
return prev;\r
}\r
y = lpht->pt.y;\r
retval = MCHT_NOWHERE;\r
\r
+ ZeroMemory(&lpht->st, sizeof(lpht->st));\r
\r
/* Comment in for debugging...\r
TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y,\r
retval = MCHT_CALENDARDATE;\r
lpht->st.wMonth = infoPtr->currentMonth;\r
lpht->st.wDay = day;\r
+ lpht->st.wDayOfWeek = MONTHCAL_CalculateDayOfWeek(day,lpht->st.wMonth,lpht->st.wYear);\r
}\r
goto done;\r
}\r
nmds.cDayState = infoPtr->monthRange;\r
nmds.prgDayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));\r
\r
- SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,\r
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmds.nmhdr.idFrom, (LPARAM)&nmds);\r
for(i=0; i<infoPtr->monthRange; i++)\r
infoPtr->monthdayState[i] = nmds.prgDayState[i];\r
nmds.prgDayState = Alloc\r
(infoPtr->monthRange * sizeof(MONTHDAYSTATE));\r
\r
- SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,\r
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmds.nmhdr.idFrom, (LPARAM)&nmds);\r
for(i=0; i<infoPtr->monthRange; i++)\r
infoPtr->monthdayState[i] = nmds.prgDayState[i];\r
static LRESULT\r
MONTHCAL_RButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)\r
{\r
+ static const WCHAR todayW[] = { 'G','o',' ','t','o',' ','T','o','d','a','y',':',0 };\r
HMENU hMenu;\r
POINT menupoint;\r
- char buf[32];\r
+ WCHAR buf[32];\r
\r
hMenu = CreatePopupMenu();\r
- if (!LoadStringA(COMCTL32_hModule,IDM_GOTODAY,buf,sizeof(buf)))\r
+ if (!LoadStringW(COMCTL32_hModule,IDM_GOTODAY,buf,countof(buf)))\r
{\r
WARN("Can't load resource\n");\r
- strcpy(buf,"Go to Today:");\r
+ strcpyW(buf, todayW);\r
}\r
- AppendMenuA(hMenu, MF_STRING|MF_ENABLED,1, buf);\r
+ AppendMenuW(hMenu, MF_STRING|MF_ENABLED,1, buf);\r
menupoint.x=(INT)LOWORD(lParam);\r
menupoint.y=(INT)HIWORD(lParam);\r
ClientToScreen(infoPtr->hwndSelf, &menupoint);\r
static LRESULT\r
MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)\r
{\r
+ static const WCHAR EditW[] = { 'E','D','I','T',0 };\r
MCHITTESTINFO ht;\r
DWORD hit;\r
HMENU hMenu;\r
RECT rcDay; /* used in determining area to invalidate */\r
- char buf[32];\r
+ WCHAR buf[32];\r
int i;\r
POINT menupoint;\r
\r
\r
if (infoPtr->hWndYearUpDown)\r
{\r
- infoPtr->currentYear=SendMessageA( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)0);\r
+ infoPtr->currentYear=SendMessageW( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)0);\r
if(!DestroyWindow(infoPtr->hWndYearUpDown))\r
{\r
FIXME("Can't destroy Updown Control\n");\r
\r
for (i=0; i<12;i++)\r
{\r
- GetLocaleInfoA( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+i,\r
- buf,sizeof(buf));\r
- AppendMenuA(hMenu, MF_STRING|MF_ENABLED,i+1, buf);\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+i, buf,countof(buf));\r
+ AppendMenuW(hMenu, MF_STRING|MF_ENABLED,i+1, buf);\r
}\r
menupoint.x=infoPtr->titlemonth.right;\r
menupoint.y=infoPtr->titlemonth.bottom;\r
}\r
}\r
if(hit == MCHT_TITLEYEAR) {\r
- infoPtr->hWndYearEdit=CreateWindowExA(0,\r
- "EDIT",\r
+ infoPtr->hWndYearEdit=CreateWindowExW(0,\r
+ EditW,\r
0,\r
WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT,\r
infoPtr->titleyear.left+3,infoPtr->titlebtnnext.top,\r
NULL,\r
NULL,\r
NULL);\r
- infoPtr->hWndYearUpDown=CreateWindowExA(0,\r
- UPDOWN_CLASSA,\r
+ infoPtr->hWndYearUpDown=CreateWindowExW(0,\r
+ UPDOWN_CLASSW,\r
0,\r
WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS,\r
infoPtr->titleyear.right+6,infoPtr->titlebtnnext.top,\r
NULL,\r
NULL,\r
NULL);\r
- SendMessageA( infoPtr->hWndYearUpDown, UDM_SETRANGE, (WPARAM) 0, MAKELONG (9999, 1753));\r
- SendMessageA( infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM) infoPtr->hWndYearEdit, (LPARAM)0 );\r
- SendMessageA( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)infoPtr->currentYear );\r
+ SendMessageW( infoPtr->hWndYearUpDown, UDM_SETRANGE, (WPARAM) 0, MAKELONG (9999, 1753));\r
+ SendMessageW( infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM) infoPtr->hWndYearEdit, (LPARAM)0 );\r
+ SendMessageW( infoPtr->hWndYearUpDown, UDM_SETPOS, (WPARAM) 0,(LPARAM)infoPtr->currentYear );\r
return TRUE;\r
\r
}\r
MONTHCAL_CopyTime(&infoPtr->minSel,&nmsc.stSelStart);\r
MONTHCAL_CopyTime(&infoPtr->maxSel,&nmsc.stSelEnd);\r
\r
- SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,\r
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmsc.nmhdr.idFrom,(LPARAM)&nmsc);\r
\r
\r
nmhdr.code = NM_RELEASEDCAPTURE;\r
TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify);\r
\r
- SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,\r
- (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);\r
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);\r
/* redraw if necessary */\r
if(redraw)\r
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);\r
MONTHCAL_CopyTime(&infoPtr->minSel, &nmsc.stSelStart);\r
MONTHCAL_CopyTime(&infoPtr->maxSel, &nmsc.stSelEnd);\r
\r
- SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,\r
- (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc);\r
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc);\r
\r
}\r
return 0;\r
/* sets the size information */\r
static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)\r
{\r
+ static const WCHAR SunW[] = { 'S','u','n',0 };\r
+ static const WCHAR O0W[] = { '0','0',0 };\r
HDC hdc = GetDC(infoPtr->hwndSelf);\r
RECT *title=&infoPtr->title;\r
RECT *prev=&infoPtr->titlebtnprev;\r
RECT *days=&infoPtr->days;\r
RECT *todayrect=&infoPtr->todayrect;\r
SIZE size;\r
- TEXTMETRICA tm;\r
+ TEXTMETRICW tm;\r
DWORD dwStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);\r
HFONT currentFont;\r
int xdiv, left_offset;\r
currentFont = SelectObject(hdc, infoPtr->hFont);\r
\r
/* get the height and width of each day's text */\r
- GetTextMetricsA(hdc, &tm);\r
+ GetTextMetricsW(hdc, &tm);\r
infoPtr->textHeight = tm.tmHeight + tm.tmExternalLeading + tm.tmInternalLeading;\r
- GetTextExtentPoint32A(hdc, "Sun", 3, &size);\r
+ GetTextExtentPoint32W(hdc, SunW, 3, &size);\r
infoPtr->textWidth = size.cx + 2;\r
\r
/* recalculate the height and width increments and offsets */\r
- GetTextExtentPoint32A(hdc, "00", 2, &size);\r
+ GetTextExtentPoint32W(hdc, O0W, 2, &size);\r
\r
xdiv = (dwStyle & MCS_WEEKNUMBERS) ? 8 : 7;\r
\r
\r
infoPtr = MONTHCAL_GetInfoPtr(hwnd);\r
if (!infoPtr && (uMsg != WM_CREATE))\r
- return DefWindowProcA(hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);\r
switch(uMsg)\r
{\r
case MCM_GETCURSEL:\r
default:\r
if ((uMsg >= WM_USER) && (uMsg < WM_APP))\r
ERR( "unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam);\r
- return DefWindowProcA(hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);\r
}\r
}\r
\r
void\r
MONTHCAL_Register(void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
- ZeroMemory(&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory(&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS;\r
wndClass.lpfnWndProc = MONTHCAL_WindowProc;\r
wndClass.cbClsExtra = 0;\r
wndClass.cbWndExtra = sizeof(MONTHCAL_INFO *);\r
- wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);\r
+ wndClass.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW);\r
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
- wndClass.lpszClassName = MONTHCAL_CLASSA;\r
+ wndClass.lpszClassName = MONTHCAL_CLASSW;\r
\r
- RegisterClassA(&wndClass);\r
+ RegisterClassW(&wndClass);\r
}\r
\r
\r
void\r
MONTHCAL_Unregister(void)\r
{\r
- UnregisterClassA(MONTHCAL_CLASSA, NULL);\r
+ UnregisterClassW(MONTHCAL_CLASSW, NULL);\r
}\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
* NOTES\r
- * Tested primarily with the controlspy Pager application.\r
- * Susan Farley (susan@codeweavers.com)\r
*\r
* This code was audited for completeness against the documented features\r
* of Comctl32.dll version 6.0 on Sep. 18, 2004, by Robert Shearman.\r
* PGS_DRAGNDROP\r
* Notifications:\r
* PGN_HOTITEMCHANGE\r
+ *\r
+ * TESTING:\r
+ * Tested primarily with the controlspy Pager application.\r
+ * Susan Farley (susan@codeweavers.com)\r
+ *\r
+ * IMPLEMENTATION NOTES:\r
+ * This control uses WM_NCPAINT instead of WM_PAINT to paint itself\r
+ * as we need to scroll a child window. In order to do this we move \r
+ * the child window in the control's client area, using the clipping\r
+ * region that is automatically set around the client area. As the \r
+ * entire client area now consists of the child window, we must \r
+ * allocate space (WM_NCCALCSIZE) for the buttons and draw them as \r
+ * a non-client area (WM_NCPAINT).\r
+ * Robert Shearman <rob@codeweavers.com>\r
*/\r
\r
#include <stdarg.h>\r
#include "wingdi.h"\r
#include "winuser.h"\r
#include "winnls.h"\r
+#include "windowsx.h"\r
#include "commctrl.h"\r
#include "comctl32.h"\r
#include "wine/debug.h"\r
\r
typedef struct\r
{\r
+ HWND hwndSelf; /* handle of the control wnd */\r
HWND hwndChild; /* handle of the contained wnd */\r
HWND hwndNotify; /* handle of the parent wnd */\r
- BOOL bNoResize; /* set when created with CCS_NORESIZE */\r
+ DWORD dwStyle; /* styles for this control */\r
COLORREF clrBk; /* background color */\r
INT nBorder; /* border size for the control */\r
INT nButtonSize;/* size of the pager btns */\r
INT direction; /* direction of the scroll, (e.g. PGF_SCROLLUP) */\r
} PAGER_INFO;\r
\r
-#define PAGER_GetInfoPtr(hwnd) ((PAGER_INFO *)GetWindowLongPtrW(hwnd, 0))\r
-#define PAGER_IsHorizontal(hwnd) ((GetWindowLongA (hwnd, GWL_STYLE) & PGS_HORZ))\r
-\r
#define MIN_ARROW_WIDTH 8\r
#define MIN_ARROW_HEIGHT 5\r
\r
#define REPEAT_DELAY 50\r
\r
static void\r
-PAGER_GetButtonRects(HWND hwnd, PAGER_INFO* infoPtr, RECT* prcTopLeft, RECT* prcBottomRight, BOOL bClientCoords)\r
+PAGER_GetButtonRects(PAGER_INFO* infoPtr, RECT* prcTopLeft, RECT* prcBottomRight, BOOL bClientCoords)\r
{\r
RECT rcWindow;\r
- GetWindowRect (hwnd, &rcWindow);\r
+ GetWindowRect (infoPtr->hwndSelf, &rcWindow);\r
\r
if (bClientCoords)\r
{\r
POINT pt = {rcWindow.left, rcWindow.top};\r
- ScreenToClient(hwnd, &pt);\r
+ ScreenToClient(infoPtr->hwndSelf, &pt);\r
OffsetRect(&rcWindow, -(rcWindow.left-pt.x), -(rcWindow.top-pt.y));\r
}\r
else\r
OffsetRect(&rcWindow, -rcWindow.left, -rcWindow.top);\r
\r
*prcTopLeft = *prcBottomRight = rcWindow;\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
prcTopLeft->right = prcTopLeft->left + infoPtr->nButtonSize;\r
prcBottomRight->left = prcBottomRight->right - infoPtr->nButtonSize;\r
/* << PAGER_GetDropTarget >> */\r
\r
static inline LRESULT\r
-PAGER_ForwardMouse (HWND hwnd, WPARAM wParam)\r
+PAGER_ForwardMouse (PAGER_INFO* infoPtr, BOOL bFwd)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p]\n", hwnd);\r
+ TRACE("[%p]\n", infoPtr->hwndSelf);\r
\r
- infoPtr->bForward = (BOOL)wParam;\r
+ infoPtr->bForward = bFwd;\r
\r
return 0;\r
}\r
\r
static inline LRESULT\r
-PAGER_GetButtonState (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_GetButtonState (PAGER_INFO* infoPtr, INT btn)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
LRESULT btnState = PGF_INVISIBLE;\r
- INT btn = (INT)lParam;\r
- TRACE("[%p]\n", hwnd);\r
+ TRACE("[%p]\n", infoPtr->hwndSelf);\r
\r
if (btn == PGB_TOPORLEFT)\r
btnState = infoPtr->TLbtnState;\r
}\r
\r
\r
-static inline LRESULT\r
-PAGER_GetPos(HWND hwnd)\r
+static inline INT\r
+PAGER_GetPos(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p] returns %d\n", hwnd, infoPtr->nPos);\r
- return (LRESULT)infoPtr->nPos;\r
+ TRACE("[%p] returns %d\n", infoPtr->hwndSelf, infoPtr->nPos);\r
+ return infoPtr->nPos;\r
}\r
\r
-static inline LRESULT\r
-PAGER_GetButtonSize(HWND hwnd)\r
+static inline INT\r
+PAGER_GetButtonSize(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p] returns %d\n", hwnd, infoPtr->nButtonSize);\r
- return (LRESULT)infoPtr->nButtonSize;\r
+ TRACE("[%p] returns %d\n", infoPtr->hwndSelf, infoPtr->nButtonSize);\r
+ return infoPtr->nButtonSize;\r
}\r
\r
-static inline LRESULT\r
-PAGER_GetBorder(HWND hwnd)\r
+static inline INT\r
+PAGER_GetBorder(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p] returns %d\n", hwnd, infoPtr->nBorder);\r
- return (LRESULT)infoPtr->nBorder;\r
+ TRACE("[%p] returns %d\n", infoPtr->hwndSelf, infoPtr->nBorder);\r
+ return infoPtr->nBorder;\r
}\r
\r
-static inline LRESULT\r
-PAGER_GetBkColor(HWND hwnd)\r
+static inline COLORREF\r
+PAGER_GetBkColor(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p] returns %06lx\n", hwnd, infoPtr->clrBk);\r
- return (LRESULT)infoPtr->clrBk;\r
+ TRACE("[%p] returns %06lx\n", infoPtr->hwndSelf, infoPtr->clrBk);\r
+ return infoPtr->clrBk;\r
}\r
\r
static void\r
-PAGER_CalcSize (HWND hwnd, INT* size, BOOL getWidth)\r
+PAGER_CalcSize (PAGER_INFO *infoPtr, INT* size, BOOL getWidth)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
NMPGCALCSIZE nmpgcs;\r
ZeroMemory (&nmpgcs, sizeof (NMPGCALCSIZE));\r
- nmpgcs.hdr.hwndFrom = hwnd;\r
- nmpgcs.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);\r
+ nmpgcs.hdr.hwndFrom = infoPtr->hwndSelf;\r
+ nmpgcs.hdr.idFrom = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID);\r
nmpgcs.hdr.code = PGN_CALCSIZE;\r
nmpgcs.dwFlag = getWidth ? PGF_CALCWIDTH : PGF_CALCHEIGHT;\r
nmpgcs.iWidth = getWidth ? *size : 0;\r
\r
*size = getWidth ? nmpgcs.iWidth : nmpgcs.iHeight;\r
\r
- TRACE("[%p] PGN_CALCSIZE returns %s=%d\n", hwnd,\r
+ TRACE("[%p] PGN_CALCSIZE returns %s=%d\n", infoPtr->hwndSelf,\r
getWidth ? "width" : "height", *size);\r
}\r
\r
static void\r
-PAGER_PositionChildWnd(HWND hwnd, PAGER_INFO* infoPtr)\r
+PAGER_PositionChildWnd(PAGER_INFO* infoPtr)\r
{\r
if (infoPtr->hwndChild)\r
{\r
if (infoPtr->TLbtnState == PGF_GRAYED)\r
nPos += infoPtr->nButtonSize;\r
\r
- GetClientRect(hwnd, &rcClient);\r
+ GetClientRect(infoPtr->hwndSelf, &rcClient);\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
int wndSize = max(0, rcClient.right - rcClient.left);\r
if (infoPtr->nWidth < wndSize)\r
infoPtr->nWidth = wndSize;\r
\r
- TRACE("[%p] SWP %dx%d at (%d,%d)\n", hwnd,\r
+ TRACE("[%p] SWP %dx%d at (%d,%d)\n", infoPtr->hwndSelf,\r
infoPtr->nWidth, infoPtr->nHeight,\r
-nPos, 0);\r
SetWindowPos(infoPtr->hwndChild, 0,\r
if (infoPtr->nHeight < wndSize)\r
infoPtr->nHeight = wndSize;\r
\r
- TRACE("[%p] SWP %dx%d at (%d,%d)\n", hwnd,\r
+ TRACE("[%p] SWP %dx%d at (%d,%d)\n", infoPtr->hwndSelf,\r
infoPtr->nWidth, infoPtr->nHeight,\r
0, -nPos);\r
SetWindowPos(infoPtr->hwndChild, 0,\r
}\r
\r
static INT\r
-PAGER_GetScrollRange(HWND hwnd, PAGER_INFO* infoPtr)\r
+PAGER_GetScrollRange(PAGER_INFO* infoPtr)\r
{\r
INT scrollRange = 0;\r
\r
{\r
INT wndSize, childSize;\r
RECT wndRect;\r
- GetWindowRect(hwnd, &wndRect);\r
+ GetWindowRect(infoPtr->hwndSelf, &wndRect);\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
wndSize = wndRect.right - wndRect.left;\r
- PAGER_CalcSize(hwnd, &infoPtr->nWidth, TRUE);\r
+ PAGER_CalcSize(infoPtr, &infoPtr->nWidth, TRUE);\r
childSize = infoPtr->nWidth;\r
}\r
else\r
{\r
wndSize = wndRect.bottom - wndRect.top;\r
- PAGER_CalcSize(hwnd, &infoPtr->nHeight, FALSE);\r
+ PAGER_CalcSize(infoPtr, &infoPtr->nHeight, FALSE);\r
childSize = infoPtr->nHeight;\r
}\r
\r
scrollRange = childSize - wndSize + infoPtr->nButtonSize;\r
}\r
\r
- TRACE("[%p] returns %d\n", hwnd, scrollRange);\r
+ TRACE("[%p] returns %d\n", infoPtr->hwndSelf, scrollRange);\r
return scrollRange;\r
}\r
\r
static void\r
-PAGER_UpdateBtns(HWND hwnd, PAGER_INFO *infoPtr,\r
- INT scrollRange, BOOL hideGrayBtns)\r
+PAGER_UpdateBtns(PAGER_INFO *infoPtr, INT scrollRange, BOOL hideGrayBtns)\r
{\r
BOOL resizeClient;\r
BOOL repaintBtns;\r
RECT rcTopLeft, rcBottomRight;\r
\r
/* get button rects */\r
- PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, FALSE);\r
+ PAGER_GetButtonRects(infoPtr, &rcTopLeft, &rcBottomRight, FALSE);\r
\r
GetCursorPos(&pt);\r
\r
((oldBRbtnState == PGF_INVISIBLE) != (infoPtr->BRbtnState == PGF_INVISIBLE));\r
/* initiate NCCalcSize to resize client wnd if necessary */\r
if (resizeClient)\r
- SetWindowPos(hwnd, 0,0,0,0,0,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
\r
repaintBtns = (oldTLbtnState != infoPtr->TLbtnState) || \r
(oldBRbtnState != infoPtr->BRbtnState);\r
if (repaintBtns)\r
- SendMessageW(hwnd, WM_NCPAINT, 0, 0);\r
+ SendMessageW(infoPtr->hwndSelf, WM_NCPAINT, 0, 0);\r
}\r
\r
static LRESULT\r
-PAGER_SetPos(HWND hwnd, INT newPos, BOOL fromBtnPress)\r
+PAGER_SetPos(PAGER_INFO* infoPtr, INT newPos, BOOL fromBtnPress)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- INT scrollRange = PAGER_GetScrollRange(hwnd, infoPtr);\r
+ INT scrollRange = PAGER_GetScrollRange(infoPtr);\r
INT oldPos = infoPtr->nPos;\r
\r
if ((scrollRange <= 0) || (newPos < 0))\r
else\r
infoPtr->nPos = newPos;\r
\r
- TRACE("[%p] pos=%d, oldpos=%d\n", hwnd, infoPtr->nPos, oldPos);\r
+ TRACE("[%p] pos=%d, oldpos=%d\n", infoPtr->hwndSelf, infoPtr->nPos, oldPos);\r
\r
if (infoPtr->nPos != oldPos)\r
{\r
/* gray and restore btns, and if from WM_SETPOS, hide the gray btns */\r
- PAGER_UpdateBtns(hwnd, infoPtr, scrollRange, !fromBtnPress);\r
- PAGER_PositionChildWnd(hwnd, infoPtr);\r
+ PAGER_UpdateBtns(infoPtr, scrollRange, !fromBtnPress);\r
+ PAGER_PositionChildWnd(infoPtr);\r
}\r
\r
return 0;\r
}\r
\r
static LRESULT\r
-PAGER_HandleWindowPosChanging(HWND hwnd, WPARAM wParam, WINDOWPOS *winpos)\r
+PAGER_WindowPosChanging(PAGER_INFO* infoPtr, WINDOWPOS *winpos)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
-\r
- if (infoPtr->bNoResize && !(winpos->flags & SWP_NOSIZE))\r
+ if ((infoPtr->dwStyle & CCS_NORESIZE) && !(winpos->flags & SWP_NOSIZE))\r
{\r
/* don't let the app resize the nonscrollable dimension of a control\r
* that was created with CCS_NORESIZE style\r
/* except if the current dimension is 0 and app is setting for\r
* first time, then save amount as dimension. - GA 8/01 */\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
if (!infoPtr->nHeight && winpos->cy)\r
infoPtr->nHeight = winpos->cy;\r
else\r
return 0;\r
}\r
\r
- DefWindowProcW (hwnd, WM_WINDOWPOSCHANGING, wParam, (LPARAM)winpos);\r
-\r
- return 1;\r
+ return DefWindowProcW (infoPtr->hwndSelf, WM_WINDOWPOSCHANGING, 0, (LPARAM)winpos);\r
}\r
\r
static INT\r
-PAGER_SetFixedWidth(HWND hwnd, PAGER_INFO* infoPtr)\r
+PAGER_SetFixedWidth(PAGER_INFO* infoPtr)\r
{\r
/* Must set the non-scrollable dimension to be less than the full height/width\r
* so that NCCalcSize is called. The Msoft docs mention 3/4 factor for button\r
\r
RECT wndRect;\r
INT delta, h;\r
- GetWindowRect(hwnd, &wndRect);\r
+ GetWindowRect(infoPtr->hwndSelf, &wndRect);\r
\r
/* see what the app says for btn width */\r
- PAGER_CalcSize(hwnd, &infoPtr->nWidth, TRUE);\r
+ PAGER_CalcSize(infoPtr, &infoPtr->nWidth, TRUE);\r
\r
- if (infoPtr->bNoResize)\r
+ if (infoPtr->dwStyle & CCS_NORESIZE)\r
{\r
delta = wndRect.right - wndRect.left - infoPtr->nWidth;\r
if (delta > infoPtr->nButtonSize)\r
h = wndRect.bottom - wndRect.top + infoPtr->nButtonSize;\r
\r
TRACE("[%p] infoPtr->nWidth set to %d\n",\r
- hwnd, infoPtr->nWidth);\r
+ infoPtr->hwndSelf, infoPtr->nWidth);\r
\r
return h;\r
}\r
\r
static INT\r
-PAGER_SetFixedHeight(HWND hwnd, PAGER_INFO* infoPtr)\r
+PAGER_SetFixedHeight(PAGER_INFO* infoPtr)\r
{\r
/* Must set the non-scrollable dimension to be less than the full height/width\r
* so that NCCalcSize is called. The Msoft docs mention 3/4 factor for button\r
\r
RECT wndRect;\r
INT delta, w;\r
- GetWindowRect(hwnd, &wndRect);\r
+ GetWindowRect(infoPtr->hwndSelf, &wndRect);\r
\r
/* see what the app says for btn height */\r
- PAGER_CalcSize(hwnd, &infoPtr->nHeight, FALSE);\r
+ PAGER_CalcSize(infoPtr, &infoPtr->nHeight, FALSE);\r
\r
- if (infoPtr->bNoResize)\r
+ if (infoPtr->dwStyle & CCS_NORESIZE)\r
{\r
delta = wndRect.bottom - wndRect.top - infoPtr->nHeight;\r
if (delta > infoPtr->nButtonSize)\r
w = wndRect.right - wndRect.left + infoPtr->nButtonSize;\r
\r
TRACE("[%p] infoPtr->nHeight set to %d\n",\r
- hwnd, infoPtr->nHeight);\r
+ infoPtr->hwndSelf, infoPtr->nHeight);\r
\r
return w;\r
}\r
******************************************************************/\r
\r
static LRESULT\r
-PAGER_RecalcSize(HWND hwnd)\r
+PAGER_RecalcSize(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
-\r
- TRACE("[%p]\n", hwnd);\r
+ TRACE("[%p]\n", infoPtr->hwndSelf);\r
\r
if (infoPtr->hwndChild)\r
{\r
- INT scrollRange = PAGER_GetScrollRange(hwnd, infoPtr);\r
+ INT scrollRange = PAGER_GetScrollRange(infoPtr);\r
\r
if (scrollRange <= 0)\r
{\r
infoPtr->nPos = -1;\r
- PAGER_SetPos(hwnd, 0, FALSE);\r
+ PAGER_SetPos(infoPtr, 0, FALSE);\r
}\r
else\r
- PAGER_PositionChildWnd(hwnd, infoPtr);\r
+ PAGER_PositionChildWnd(infoPtr);\r
}\r
\r
return 1;\r
}\r
\r
\r
-static LRESULT\r
-PAGER_SetBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+static COLORREF\r
+PAGER_SetBkColor (PAGER_INFO* infoPtr, COLORREF clrBk)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
COLORREF clrTemp = infoPtr->clrBk;\r
\r
- infoPtr->clrBk = (COLORREF)lParam;\r
- TRACE("[%p] %06lx\n", hwnd, infoPtr->clrBk);\r
+ infoPtr->clrBk = clrBk;\r
+ TRACE("[%p] %06lx\n", infoPtr->hwndSelf, infoPtr->clrBk);\r
\r
/* the native control seems to do things this way */\r
- SetWindowPos(hwnd, 0,0,0,0,0,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
\r
- RedrawWindow(hwnd, 0, 0, RDW_ERASE | RDW_INVALIDATE);\r
+ RedrawWindow(infoPtr->hwndSelf, 0, 0, RDW_ERASE | RDW_INVALIDATE);\r
\r
- return (LRESULT)clrTemp;\r
+ return clrTemp;\r
}\r
\r
\r
-static LRESULT\r
-PAGER_SetBorder (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+static INT\r
+PAGER_SetBorder (PAGER_INFO* infoPtr, INT iBorder)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
INT nTemp = infoPtr->nBorder;\r
\r
- infoPtr->nBorder = (INT)lParam;\r
- TRACE("[%p] %d\n", hwnd, infoPtr->nBorder);\r
+ infoPtr->nBorder = iBorder;\r
+ TRACE("[%p] %d\n", infoPtr->hwndSelf, infoPtr->nBorder);\r
\r
- PAGER_RecalcSize(hwnd);\r
+ PAGER_RecalcSize(infoPtr);\r
\r
- return (LRESULT)nTemp;\r
+ return nTemp;\r
}\r
\r
\r
-static LRESULT\r
-PAGER_SetButtonSize (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+static INT\r
+PAGER_SetButtonSize (PAGER_INFO* infoPtr, INT iButtonSize)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
INT nTemp = infoPtr->nButtonSize;\r
\r
- infoPtr->nButtonSize = (INT)lParam;\r
- TRACE("[%p] %d\n", hwnd, infoPtr->nButtonSize);\r
+ infoPtr->nButtonSize = iButtonSize;\r
+ TRACE("[%p] %d\n", infoPtr->hwndSelf, infoPtr->nButtonSize);\r
\r
- PAGER_RecalcSize(hwnd);\r
+ PAGER_RecalcSize(infoPtr);\r
\r
- return (LRESULT)nTemp;\r
+ return nTemp;\r
}\r
\r
\r
static LRESULT\r
-PAGER_SetChild (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
INT hw;\r
\r
- infoPtr->hwndChild = IsWindow ((HWND)lParam) ? (HWND)lParam : 0;\r
+ infoPtr->hwndChild = IsWindow (hwndChild) ? hwndChild : 0;\r
\r
if (infoPtr->hwndChild)\r
{\r
- TRACE("[%p] hwndChild=%p\n", hwnd, infoPtr->hwndChild);\r
+ TRACE("[%p] hwndChild=%p\n", infoPtr->hwndSelf, infoPtr->hwndChild);\r
\r
- if (PAGER_IsHorizontal(hwnd)) {\r
- hw = PAGER_SetFixedHeight(hwnd, infoPtr);\r
+ if (infoPtr->dwStyle & PGS_HORZ) {\r
+ hw = PAGER_SetFixedHeight(infoPtr);\r
/* adjust non-scrollable dimension to fit the child */\r
- SetWindowPos(hwnd, 0, 0,0, hw, infoPtr->nHeight,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, hw, infoPtr->nHeight,\r
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |\r
SWP_NOSIZE | SWP_NOACTIVATE);\r
}\r
else {\r
- hw = PAGER_SetFixedWidth(hwnd, infoPtr);\r
+ hw = PAGER_SetFixedWidth(infoPtr);\r
/* adjust non-scrollable dimension to fit the child */\r
- SetWindowPos(hwnd, 0, 0,0, infoPtr->nWidth, hw,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, infoPtr->nWidth, hw,\r
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |\r
SWP_NOSIZE | SWP_NOACTIVATE);\r
}\r
SWP_SHOWWINDOW | SWP_NOSIZE); /* native is 0 */\r
\r
infoPtr->nPos = -1;\r
- PAGER_SetPos(hwnd, 0, FALSE);\r
+ PAGER_SetPos(infoPtr, 0, FALSE);\r
}\r
\r
return 0;\r
}\r
\r
static void\r
-PAGER_Scroll(HWND hwnd, INT dir)\r
+PAGER_Scroll(PAGER_INFO* infoPtr, INT dir)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
NMPGSCROLL nmpgScroll;\r
RECT rcWnd;\r
\r
if (infoPtr->hwndChild)\r
{\r
ZeroMemory (&nmpgScroll, sizeof (NMPGSCROLL));\r
- nmpgScroll.hdr.hwndFrom = hwnd;\r
- nmpgScroll.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);\r
+ nmpgScroll.hdr.hwndFrom = infoPtr->hwndSelf;\r
+ nmpgScroll.hdr.idFrom = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID);\r
nmpgScroll.hdr.code = PGN_SCROLL;\r
\r
- GetWindowRect(hwnd, &rcWnd);\r
- GetClientRect(hwnd, &nmpgScroll.rcParent);\r
+ GetWindowRect(infoPtr->hwndSelf, &rcWnd);\r
+ GetClientRect(infoPtr->hwndSelf, &nmpgScroll.rcParent);\r
nmpgScroll.iXpos = nmpgScroll.iYpos = 0;\r
nmpgScroll.iDir = dir;\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
nmpgScroll.iScroll = rcWnd.right - rcWnd.left;\r
nmpgScroll.iXpos = infoPtr->nPos;\r
SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmpgScroll.hdr.idFrom, (LPARAM)&nmpgScroll);\r
\r
- TRACE("[%p] PGN_SCROLL returns iScroll=%d\n", hwnd, nmpgScroll.iScroll);\r
+ TRACE("[%p] PGN_SCROLL returns iScroll=%d\n", infoPtr->hwndSelf, nmpgScroll.iScroll);\r
\r
if (nmpgScroll.iScroll > 0)\r
{\r
infoPtr->direction = dir;\r
\r
if (dir == PGF_SCROLLLEFT || dir == PGF_SCROLLUP)\r
- PAGER_SetPos(hwnd, infoPtr->nPos - nmpgScroll.iScroll, TRUE);\r
+ PAGER_SetPos(infoPtr, infoPtr->nPos - nmpgScroll.iScroll, TRUE);\r
else\r
- PAGER_SetPos(hwnd, infoPtr->nPos + nmpgScroll.iScroll, TRUE);\r
+ PAGER_SetPos(infoPtr, infoPtr->nPos + nmpgScroll.iScroll, TRUE);\r
}\r
else\r
infoPtr->direction = -1;\r
}\r
\r
static LRESULT\r
-PAGER_FmtLines(HWND hwnd)\r
+PAGER_FmtLines(PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
-\r
/* initiate NCCalcSize to resize client wnd and get size */\r
- SetWindowPos(hwnd, 0, 0,0,0,0,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
\r
0,0,infoPtr->nWidth,infoPtr->nHeight,\r
0);\r
\r
- return DefWindowProcW (hwnd, EM_FMTLINES, 0, 0);\r
+ return DefWindowProcW (infoPtr->hwndSelf, EM_FMTLINES, 0, 0);\r
}\r
\r
static LRESULT\r
-PAGER_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_Create (HWND hwnd, LPCREATESTRUCTW lpcs)\r
{\r
PAGER_INFO *infoPtr;\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
\r
/* allocate memory for info structure */\r
infoPtr = (PAGER_INFO *)Alloc (sizeof(PAGER_INFO));\r
+ if (!infoPtr) return -1;\r
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);\r
\r
/* set default settings */\r
+ infoPtr->hwndSelf = hwnd;\r
infoPtr->hwndChild = NULL;\r
- infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;\r
- infoPtr->bNoResize = dwStyle & CCS_NORESIZE;\r
+ infoPtr->hwndNotify = lpcs->hwndParent;\r
+ infoPtr->dwStyle = lpcs->style;\r
infoPtr->clrBk = GetSysColor(COLOR_BTNFACE);\r
infoPtr->nBorder = 0;\r
infoPtr->nButtonSize = 12;\r
infoPtr->BRbtnState = PGF_INVISIBLE;\r
infoPtr->direction = -1;\r
\r
- if (dwStyle & PGS_DRAGNDROP)\r
- FIXME("[%p] Drag and Drop style is not implemented yet.\n", hwnd);\r
+ if (infoPtr->dwStyle & PGS_DRAGNDROP)\r
+ FIXME("[%p] Drag and Drop style is not implemented yet.\n", infoPtr->hwndSelf);\r
\r
return 0;\r
}\r
\r
\r
static LRESULT\r
-PAGER_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_Destroy (PAGER_INFO *infoPtr)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- /* free pager info data */\r
- Free (infoPtr);\r
- SetWindowLongPtrW (hwnd, 0, 0);\r
+ SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);\r
+ Free (infoPtr); /* free pager info data */\r
return 0;\r
}\r
\r
static LRESULT\r
-PAGER_NCCalcSize(HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- LPRECT lpRect = (LPRECT)lParam;\r
RECT rcChild, rcWindow;\r
INT scrollRange;\r
\r
/*\r
- * lParam points to a RECT struct. On entry, the struct\r
+ * lpRect points to a RECT struct. On entry, the struct\r
* contains the proposed wnd rectangle for the window.\r
* On exit, the struct should contain the screen\r
* coordinates of the corresponding window's client area.\r
*/\r
\r
- DefWindowProcW (hwnd, WM_NCCALCSIZE, wParam, lParam);\r
+ DefWindowProcW (infoPtr->hwndSelf, WM_NCCALCSIZE, wParam, (LPARAM)lpRect);\r
\r
TRACE("orig rect=%s\n", wine_dbgstr_rect(lpRect));\r
\r
GetWindowRect (infoPtr->hwndChild, &rcChild);\r
- MapWindowPoints (0, hwnd, (LPPOINT)&rcChild, 2); /* FIXME: RECT != 2 POINTS */\r
- GetWindowRect (hwnd, &rcWindow);\r
+ MapWindowPoints (0, infoPtr->hwndSelf, (LPPOINT)&rcChild, 2); /* FIXME: RECT != 2 POINTS */\r
+ GetWindowRect (infoPtr->hwndSelf, &rcWindow);\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
infoPtr->nWidth = lpRect->right - lpRect->left;\r
- PAGER_CalcSize (hwnd, &infoPtr->nWidth, TRUE);\r
+ PAGER_CalcSize (infoPtr, &infoPtr->nWidth, TRUE);\r
\r
scrollRange = infoPtr->nWidth - (rcWindow.right - rcWindow.left);\r
\r
else\r
{\r
infoPtr->nHeight = lpRect->bottom - lpRect->top;\r
- PAGER_CalcSize (hwnd, &infoPtr->nHeight, FALSE);\r
+ PAGER_CalcSize (infoPtr, &infoPtr->nHeight, FALSE);\r
\r
scrollRange = infoPtr->nHeight - (rcWindow.bottom - rcWindow.top);\r
\r
wine_dbgstr_rect(&rcWindow));\r
\r
TRACE("[%p] client rect set to %ldx%ld at (%ld,%ld) BtnState[%d,%d]\n",\r
- hwnd, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top,\r
+ infoPtr->hwndSelf, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top,\r
lpRect->left, lpRect->top,\r
infoPtr->TLbtnState, infoPtr->BRbtnState);\r
\r
}\r
\r
static LRESULT\r
-PAGER_NCPaint (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_NCPaint (PAGER_INFO* infoPtr, HRGN hRgn)\r
{\r
- PAGER_INFO* infoPtr = PAGER_GetInfoPtr(hwnd);\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
RECT rcBottomRight, rcTopLeft;\r
HDC hdc;\r
- BOOL bHorizontal = PAGER_IsHorizontal(hwnd);\r
\r
- if (dwStyle & WS_MINIMIZE)\r
+ if (infoPtr->dwStyle & WS_MINIMIZE)\r
return 0;\r
\r
- DefWindowProcW (hwnd, WM_NCPAINT, wParam, lParam);\r
+ DefWindowProcW (infoPtr->hwndSelf, WM_NCPAINT, (WPARAM)hRgn, 0);\r
\r
- if (!(hdc = GetDCEx (hwnd, 0, DCX_USESTYLE | DCX_WINDOW)))\r
+ if (!(hdc = GetDCEx (infoPtr->hwndSelf, 0, DCX_USESTYLE | DCX_WINDOW)))\r
return 0;\r
\r
- PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, FALSE);\r
+ PAGER_GetButtonRects(infoPtr, &rcTopLeft, &rcBottomRight, FALSE);\r
\r
PAGER_DrawButton(hdc, infoPtr->clrBk, rcTopLeft,\r
- bHorizontal, TRUE, infoPtr->TLbtnState);\r
+ infoPtr->dwStyle & PGS_HORZ, TRUE, infoPtr->TLbtnState);\r
PAGER_DrawButton(hdc, infoPtr->clrBk, rcBottomRight,\r
- bHorizontal, FALSE, infoPtr->BRbtnState);\r
+ infoPtr->dwStyle & PGS_HORZ, FALSE, infoPtr->BRbtnState);\r
\r
- ReleaseDC( hwnd, hdc );\r
+ ReleaseDC( infoPtr->hwndSelf, hdc );\r
return 0;\r
}\r
\r
static INT\r
-PAGER_HitTest (HWND hwnd, const POINT * pt)\r
+PAGER_HitTest (PAGER_INFO* infoPtr, const POINT * pt)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
RECT clientRect, rcTopLeft, rcBottomRight;\r
POINT ptWindow;\r
\r
- GetClientRect (hwnd, &clientRect);\r
+ GetClientRect (infoPtr->hwndSelf, &clientRect);\r
\r
if (PtInRect(&clientRect, *pt))\r
{\r
}\r
\r
ptWindow = *pt;\r
- PAGER_GetButtonRects(hwnd, infoPtr, &rcTopLeft, &rcBottomRight, TRUE);\r
+ PAGER_GetButtonRects(infoPtr, &rcTopLeft, &rcBottomRight, TRUE);\r
\r
if ((infoPtr->TLbtnState != PGF_INVISIBLE) && PtInRect(&rcTopLeft, ptWindow))\r
{\r
}\r
\r
static LRESULT\r
-PAGER_NCHitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_NCHitTest (PAGER_INFO* infoPtr, INT x, INT y)\r
{\r
POINT pt;\r
INT nHit;\r
\r
- pt.x = (short)LOWORD(lParam);\r
- pt.y = (short)HIWORD(lParam);\r
+ pt.x = x;\r
+ pt.y = y;\r
\r
- ScreenToClient (hwnd, &pt);\r
- nHit = PAGER_HitTest(hwnd, &pt);\r
- if (nHit < 0)\r
- return HTTRANSPARENT;\r
- return HTCLIENT;\r
+ ScreenToClient (infoPtr->hwndSelf, &pt);\r
+ nHit = PAGER_HitTest(infoPtr, &pt);\r
+\r
+ return (nHit < 0) ? HTTRANSPARENT : HTCLIENT;\r
}\r
\r
static LRESULT\r
-PAGER_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_MouseMove (PAGER_INFO* infoPtr, INT keys, INT x, INT y)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
POINT clpt, pt;\r
RECT wnrect, *btnrect = NULL;\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
BOOL topLeft = FALSE;\r
INT btnstate = 0;\r
INT hit;\r
HDC hdc;\r
\r
- pt.x = (short)LOWORD(lParam);\r
- pt.y = (short)HIWORD(lParam);\r
+ pt.x = x;\r
+ pt.y = y;\r
\r
- TRACE("[%p] to (%ld,%ld)\n", hwnd, pt.x, pt.y);\r
- ClientToScreen(hwnd, &pt);\r
- GetWindowRect(hwnd, &wnrect);\r
+ TRACE("[%p] to (%d,%d)\n", infoPtr->hwndSelf, x, y);\r
+ ClientToScreen(infoPtr->hwndSelf, &pt);\r
+ GetWindowRect(infoPtr->hwndSelf, &wnrect);\r
if (PtInRect(&wnrect, pt)) {\r
RECT TLbtnrect, BRbtnrect;\r
- PAGER_GetButtonRects(hwnd, infoPtr, &TLbtnrect, &BRbtnrect, FALSE);\r
+ PAGER_GetButtonRects(infoPtr, &TLbtnrect, &BRbtnrect, FALSE);\r
\r
clpt = pt;\r
- MapWindowPoints(0, hwnd, &clpt, 1);\r
- hit = PAGER_HitTest(hwnd, &clpt);\r
+ MapWindowPoints(0, infoPtr->hwndSelf, &clpt, 1);\r
+ hit = PAGER_HitTest(infoPtr, &clpt);\r
if ((hit == PGB_TOPORLEFT) && (infoPtr->TLbtnState == PGF_NORMAL))\r
{\r
topLeft = TRUE;\r
if (btnrect)\r
{\r
TRACE("[%p] draw btn (%ld,%ld)-(%ld,%ld), Capture %s, style %08lx\n",\r
- hwnd, btnrect->left, btnrect->top,\r
+ infoPtr->hwndSelf, btnrect->left, btnrect->top,\r
btnrect->right, btnrect->bottom,\r
(infoPtr->bCapture) ? "TRUE" : "FALSE",\r
- dwStyle);\r
+ infoPtr->dwStyle);\r
if (!infoPtr->bCapture)\r
{\r
- TRACE("[%p] SetCapture\n", hwnd);\r
- SetCapture(hwnd);\r
+ TRACE("[%p] SetCapture\n", infoPtr->hwndSelf);\r
+ SetCapture(infoPtr->hwndSelf);\r
infoPtr->bCapture = TRUE;\r
}\r
- if (dwStyle & PGS_AUTOSCROLL)\r
- SetTimer(hwnd, TIMERID1, 0x3e, 0);\r
- hdc = GetWindowDC(hwnd);\r
+ if (infoPtr->dwStyle & PGS_AUTOSCROLL)\r
+ SetTimer(infoPtr->hwndSelf, TIMERID1, 0x3e, 0);\r
+ hdc = GetWindowDC(infoPtr->hwndSelf);\r
/* OffsetRect(wnrect, 0 | 1, 0 | 1) */\r
PAGER_DrawButton(hdc, infoPtr->clrBk, *btnrect,\r
- PAGER_IsHorizontal(hwnd), topLeft, btnstate);\r
- ReleaseDC(hwnd, hdc);\r
+ infoPtr->dwStyle & PGS_HORZ, topLeft, btnstate);\r
+ ReleaseDC(infoPtr->hwndSelf, hdc);\r
return 0;\r
}\r
}\r
\r
/* If we think we are captured, then do release */\r
- if (infoPtr->bCapture && (WindowFromPoint(pt) != hwnd))\r
+ if (infoPtr->bCapture && (WindowFromPoint(pt) != infoPtr->hwndSelf))\r
{\r
NMHDR nmhdr;\r
\r
infoPtr->bCapture = FALSE;\r
\r
- if (GetCapture() == hwnd)\r
+ if (GetCapture() == infoPtr->hwndSelf)\r
{\r
ReleaseCapture();\r
\r
if (infoPtr->TLbtnState == PGF_GRAYED)\r
{\r
infoPtr->TLbtnState = PGF_INVISIBLE;\r
- SetWindowPos(hwnd, 0,0,0,0,0,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
}\r
{\r
infoPtr->TLbtnState = PGF_NORMAL;\r
/* FIXME: just invalidate button rect */\r
- RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);\r
+ RedrawWindow(infoPtr->hwndSelf, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);\r
}\r
\r
if (infoPtr->BRbtnState == PGF_GRAYED)\r
{\r
infoPtr->BRbtnState = PGF_INVISIBLE;\r
- SetWindowPos(hwnd, 0,0,0,0,0,\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
}\r
{\r
infoPtr->BRbtnState = PGF_NORMAL;\r
/* FIXME: just invalidate button rect */\r
- RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);\r
+ RedrawWindow(infoPtr->hwndSelf, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);\r
}\r
\r
/* Notify parent of released mouse capture */\r
memset(&nmhdr, 0, sizeof(NMHDR));\r
- nmhdr.hwndFrom = hwnd;\r
- nmhdr.idFrom = GetWindowLongPtrW(hwnd, GWLP_ID);\r
+ nmhdr.hwndFrom = infoPtr->hwndSelf;\r
+ nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);\r
nmhdr.code = NM_RELEASEDCAPTURE;\r
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,\r
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);\r
}\r
- if (IsWindow(hwnd))\r
- KillTimer(hwnd, TIMERID1);\r
+ if (IsWindow(infoPtr->hwndSelf))\r
+ KillTimer(infoPtr->hwndSelf, TIMERID1);\r
}\r
return 0;\r
}\r
\r
static LRESULT\r
-PAGER_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_LButtonDown (PAGER_INFO* infoPtr, INT keys, INT x, INT y)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
BOOL repaintBtns = FALSE;\r
POINT pt;\r
INT hit;\r
\r
- pt.x = (short)LOWORD(lParam);\r
- pt.y = (short)HIWORD(lParam);\r
+ pt.x = x;\r
+ pt.y = y;\r
\r
- TRACE("[%p] at (%d,%d)\n", hwnd, (short)LOWORD(lParam), (short)HIWORD(lParam));\r
+ TRACE("[%p] at (%d,%d)\n", infoPtr->hwndSelf, x, y);\r
\r
- hit = PAGER_HitTest(hwnd, &pt);\r
+ hit = PAGER_HitTest(infoPtr, &pt);\r
\r
/* put btn in DEPRESSED state */\r
if (hit == PGB_TOPORLEFT)\r
{\r
repaintBtns = infoPtr->TLbtnState != PGF_DEPRESSED;\r
infoPtr->TLbtnState = PGF_DEPRESSED;\r
- SetTimer(hwnd, TIMERID1, INITIAL_DELAY, 0);\r
+ SetTimer(infoPtr->hwndSelf, TIMERID1, INITIAL_DELAY, 0);\r
}\r
else if (hit == PGB_BOTTOMORRIGHT)\r
{\r
repaintBtns = infoPtr->BRbtnState != PGF_DEPRESSED;\r
infoPtr->BRbtnState = PGF_DEPRESSED;\r
- SetTimer(hwnd, TIMERID1, INITIAL_DELAY, 0);\r
+ SetTimer(infoPtr->hwndSelf, TIMERID1, INITIAL_DELAY, 0);\r
}\r
\r
if (repaintBtns)\r
- SendMessageW(hwnd, WM_NCPAINT, 0, 0);\r
+ SendMessageW(infoPtr->hwndSelf, WM_NCPAINT, 0, 0);\r
\r
switch(hit)\r
{\r
case PGB_TOPORLEFT:\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
- TRACE("[%p] PGF_SCROLLLEFT\n", hwnd);\r
- PAGER_Scroll(hwnd, PGF_SCROLLLEFT);\r
+ TRACE("[%p] PGF_SCROLLLEFT\n", infoPtr->hwndSelf);\r
+ PAGER_Scroll(infoPtr, PGF_SCROLLLEFT);\r
}\r
else\r
{\r
- TRACE("[%p] PGF_SCROLLUP\n", hwnd);\r
- PAGER_Scroll(hwnd, PGF_SCROLLUP);\r
+ TRACE("[%p] PGF_SCROLLUP\n", infoPtr->hwndSelf);\r
+ PAGER_Scroll(infoPtr, PGF_SCROLLUP);\r
}\r
break;\r
case PGB_BOTTOMORRIGHT:\r
- if (PAGER_IsHorizontal(hwnd))\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
{\r
- TRACE("[%p] PGF_SCROLLRIGHT\n", hwnd);\r
- PAGER_Scroll(hwnd, PGF_SCROLLRIGHT);\r
+ TRACE("[%p] PGF_SCROLLRIGHT\n", infoPtr->hwndSelf);\r
+ PAGER_Scroll(infoPtr, PGF_SCROLLRIGHT);\r
}\r
else\r
{\r
- TRACE("[%p] PGF_SCROLLDOWN\n", hwnd);\r
- PAGER_Scroll(hwnd, PGF_SCROLLDOWN);\r
+ TRACE("[%p] PGF_SCROLLDOWN\n", infoPtr->hwndSelf);\r
+ PAGER_Scroll(infoPtr, PGF_SCROLLDOWN);\r
}\r
break;\r
default:\r
break;\r
}\r
\r
- return TRUE;\r
+ return 0;\r
}\r
\r
static LRESULT\r
-PAGER_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_LButtonUp (PAGER_INFO* infoPtr, INT keys, INT x, INT y)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p]\n", hwnd);\r
+ TRACE("[%p]\n", infoPtr->hwndSelf);\r
\r
- KillTimer (hwnd, TIMERID1);\r
- KillTimer (hwnd, TIMERID2);\r
+ KillTimer (infoPtr->hwndSelf, TIMERID1);\r
+ KillTimer (infoPtr->hwndSelf, TIMERID2);\r
\r
/* make PRESSED btns NORMAL but don't hide gray btns */\r
if (infoPtr->TLbtnState & (PGF_HOT | PGF_DEPRESSED))\r
}\r
\r
static LRESULT\r
-PAGER_Timer (HWND hwnd, WPARAM wParam)\r
+PAGER_Timer (PAGER_INFO* infoPtr, INT nTimerId)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
INT dir;\r
\r
/* if initial timer, kill it and start the repeat timer */\r
- if (wParam == TIMERID1) {\r
+ if (nTimerId == TIMERID1) {\r
if (infoPtr->TLbtnState == PGF_HOT)\r
- dir = PAGER_IsHorizontal(hwnd) ?\r
+ dir = (infoPtr->dwStyle & PGS_HORZ) ?\r
PGF_SCROLLLEFT : PGF_SCROLLUP;\r
else\r
- dir = PAGER_IsHorizontal(hwnd) ?\r
+ dir = (infoPtr->dwStyle & PGS_HORZ) ?\r
PGF_SCROLLRIGHT : PGF_SCROLLDOWN;\r
- TRACE("[%p] TIMERID1: style=%08lx, dir=%d\n", hwnd, dwStyle, dir);\r
- KillTimer(hwnd, TIMERID1);\r
- SetTimer(hwnd, TIMERID1, REPEAT_DELAY, 0);\r
- if (dwStyle & PGS_AUTOSCROLL) {\r
- PAGER_Scroll(hwnd, dir);\r
- SetWindowPos(hwnd, 0,0,0,0,0,\r
+ TRACE("[%p] TIMERID1: style=%08lx, dir=%d\n", \r
+ infoPtr->hwndSelf, infoPtr->dwStyle, dir);\r
+ KillTimer(infoPtr->hwndSelf, TIMERID1);\r
+ SetTimer(infoPtr->hwndSelf, TIMERID1, REPEAT_DELAY, 0);\r
+ if (infoPtr->dwStyle & PGS_AUTOSCROLL) {\r
+ PAGER_Scroll(infoPtr, dir);\r
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0,\r
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |\r
SWP_NOZORDER | SWP_NOACTIVATE);\r
}\r
\r
}\r
\r
- TRACE("[%p] TIMERID2: dir=%d\n", hwnd, infoPtr->direction);\r
- KillTimer(hwnd, TIMERID2);\r
+ TRACE("[%p] TIMERID2: dir=%d\n", infoPtr->hwndSelf, infoPtr->direction);\r
+ KillTimer(infoPtr->hwndSelf, TIMERID2);\r
if (infoPtr->direction > 0) {\r
- PAGER_Scroll(hwnd, infoPtr->direction);\r
- SetTimer(hwnd, TIMERID2, REPEAT_DELAY, 0);\r
+ PAGER_Scroll(infoPtr, infoPtr->direction);\r
+ SetTimer(infoPtr->hwndSelf, TIMERID2, REPEAT_DELAY, 0);\r
}\r
return 0;\r
}\r
\r
static LRESULT\r
-PAGER_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_EraseBackground (PAGER_INFO* infoPtr, HDC hdc)\r
{\r
POINT pt, ptorig;\r
- HDC hdc = (HDC)wParam;\r
HWND parent;\r
\r
pt.x = 0;\r
pt.y = 0;\r
- parent = GetParent(hwnd);\r
- MapWindowPoints(hwnd, parent, &pt, 1);\r
+ parent = GetParent(infoPtr->hwndSelf);\r
+ MapWindowPoints(infoPtr->hwndSelf, parent, &pt, 1);\r
OffsetWindowOrgEx (hdc, pt.x, pt.y, &ptorig);\r
- SendMessageW (parent, WM_ERASEBKGND, wParam, lParam);\r
+ SendMessageW (parent, WM_ERASEBKGND, (WPARAM)hdc, 0);\r
SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);\r
\r
- return TRUE;\r
+ return 0;\r
}\r
\r
\r
static LRESULT\r
-PAGER_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
+PAGER_Size (PAGER_INFO* infoPtr, INT type, INT x, INT y)\r
{\r
/* note that WM_SIZE is sent whenever NCCalcSize resizes the client wnd */\r
\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
- TRACE("[%p] %dx%d\n", hwnd, (short)LOWORD(lParam), (short)HIWORD(lParam));\r
+ TRACE("[%p] %d,%d\n", infoPtr->hwndSelf, x, y);\r
\r
- if (PAGER_IsHorizontal(hwnd))\r
- infoPtr->nHeight = (short)HIWORD(lParam);\r
+ if (infoPtr->dwStyle & PGS_HORZ)\r
+ infoPtr->nHeight = x;\r
else\r
- infoPtr->nWidth = (short)LOWORD(lParam);\r
+ infoPtr->nWidth = y;\r
\r
- return PAGER_RecalcSize(hwnd);\r
+ return PAGER_RecalcSize(infoPtr);\r
}\r
\r
\r
+static LRESULT \r
+PAGER_StyleChanged(PAGER_INFO *infoPtr, WPARAM wStyleType, LPSTYLESTRUCT lpss)\r
+{\r
+ DWORD oldStyle = infoPtr->dwStyle;\r
+\r
+ TRACE("(styletype=%x, styleOld=0x%08lx, styleNew=0x%08lx)\n",\r
+ wStyleType, lpss->styleOld, lpss->styleNew);\r
+\r
+ if (wStyleType != GWL_STYLE) return 0;\r
+ \r
+ infoPtr->dwStyle = lpss->styleNew;\r
+\r
+ if ((oldStyle ^ lpss->styleNew) & (PGS_HORZ | PGS_VERT))\r
+ {\r
+ PAGER_RecalcSize(infoPtr);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
static LRESULT WINAPI\r
PAGER_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
{\r
- PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);\r
+ PAGER_INFO *infoPtr = (PAGER_INFO *)GetWindowLongPtrW(hwnd, 0);\r
\r
if (!infoPtr && (uMsg != WM_CREATE))\r
return DefWindowProcW (hwnd, uMsg, wParam, lParam);\r
switch (uMsg)\r
{\r
case EM_FMTLINES:\r
- return PAGER_FmtLines(hwnd);\r
+ return PAGER_FmtLines(infoPtr);\r
\r
case PGM_FORWARDMOUSE:\r
- return PAGER_ForwardMouse (hwnd, wParam);\r
+ return PAGER_ForwardMouse (infoPtr, (BOOL)wParam);\r
\r
case PGM_GETBKCOLOR:\r
- return PAGER_GetBkColor(hwnd);\r
+ return PAGER_GetBkColor(infoPtr);\r
\r
case PGM_GETBORDER:\r
- return PAGER_GetBorder(hwnd);\r
+ return PAGER_GetBorder(infoPtr);\r
\r
case PGM_GETBUTTONSIZE:\r
- return PAGER_GetButtonSize(hwnd);\r
+ return PAGER_GetButtonSize(infoPtr);\r
\r
case PGM_GETPOS:\r
- return PAGER_GetPos(hwnd);\r
+ return PAGER_GetPos(infoPtr);\r
\r
case PGM_GETBUTTONSTATE:\r
- return PAGER_GetButtonState (hwnd, wParam, lParam);\r
+ return PAGER_GetButtonState (infoPtr, (INT)lParam);\r
\r
/* case PGM_GETDROPTARGET: */\r
\r
case PGM_RECALCSIZE:\r
- return PAGER_RecalcSize(hwnd);\r
+ return PAGER_RecalcSize(infoPtr);\r
\r
case PGM_SETBKCOLOR:\r
- return PAGER_SetBkColor (hwnd, wParam, lParam);\r
+ return PAGER_SetBkColor (infoPtr, (COLORREF)lParam);\r
\r
case PGM_SETBORDER:\r
- return PAGER_SetBorder (hwnd, wParam, lParam);\r
+ return PAGER_SetBorder (infoPtr, (INT)lParam);\r
\r
case PGM_SETBUTTONSIZE:\r
- return PAGER_SetButtonSize (hwnd, wParam, lParam);\r
+ return PAGER_SetButtonSize (infoPtr, (INT)lParam);\r
\r
case PGM_SETCHILD:\r
- return PAGER_SetChild (hwnd, wParam, lParam);\r
+ return PAGER_SetChild (infoPtr, (HWND)lParam);\r
\r
case PGM_SETPOS:\r
- return PAGER_SetPos(hwnd, (INT)lParam, FALSE);\r
+ return PAGER_SetPos(infoPtr, (INT)lParam, FALSE);\r
\r
case WM_CREATE:\r
- return PAGER_Create (hwnd, wParam, lParam);\r
+ return PAGER_Create (hwnd, (LPCREATESTRUCTW)lParam);\r
\r
case WM_DESTROY:\r
- return PAGER_Destroy (hwnd, wParam, lParam);\r
+ return PAGER_Destroy (infoPtr);\r
\r
case WM_SIZE:\r
- return PAGER_Size (hwnd, wParam, lParam);\r
+ return PAGER_Size (infoPtr, (INT)wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
\r
case WM_NCPAINT:\r
- return PAGER_NCPaint (hwnd, wParam, lParam);\r
+ return PAGER_NCPaint (infoPtr, (HRGN)wParam);\r
\r
case WM_WINDOWPOSCHANGING:\r
- return PAGER_HandleWindowPosChanging (hwnd, wParam, (WINDOWPOS*)lParam);\r
+ return PAGER_WindowPosChanging (infoPtr, (WINDOWPOS*)lParam);\r
+\r
+ case WM_STYLECHANGED:\r
+ return PAGER_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);\r
\r
case WM_NCCALCSIZE:\r
- return PAGER_NCCalcSize (hwnd, wParam, lParam);\r
+ return PAGER_NCCalcSize (infoPtr, wParam, (LPRECT)lParam);\r
\r
case WM_NCHITTEST:\r
- return PAGER_NCHitTest (hwnd, wParam, lParam);\r
+ return PAGER_NCHitTest (infoPtr, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
\r
case WM_MOUSEMOVE:\r
if (infoPtr->bForward && infoPtr->hwndChild)\r
PostMessageW(infoPtr->hwndChild, WM_MOUSEMOVE, wParam, lParam);\r
- return PAGER_MouseMove (hwnd, wParam, lParam);\r
+ return PAGER_MouseMove (infoPtr, (INT)wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
\r
case WM_LBUTTONDOWN:\r
- return PAGER_LButtonDown (hwnd, wParam, lParam);\r
+ return PAGER_LButtonDown (infoPtr, (INT)wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
\r
case WM_LBUTTONUP:\r
- return PAGER_LButtonUp (hwnd, wParam, lParam);\r
+ return PAGER_LButtonUp (infoPtr, (INT)wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
\r
case WM_ERASEBKGND:\r
- return PAGER_EraseBackground (hwnd, wParam, lParam);\r
+ return PAGER_EraseBackground (infoPtr, (HDC)wParam);\r
\r
case WM_TIMER:\r
- return PAGER_Timer (hwnd, wParam);\r
+ return PAGER_Timer (infoPtr, (INT)wParam);\r
\r
case WM_NOTIFY:\r
case WM_COMMAND:\r
\r
TRACE("<%s>\n", frstr);\r
len = MultiByteToWideChar(CP_ACP, 0, frstr, -1, 0, 0);\r
- *tostr = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));\r
+ *tostr = Alloc(len * sizeof(WCHAR));\r
MultiByteToWideChar(CP_ACP, 0, frstr, -1, (LPWSTR)*tostr, len);\r
}\r
\r
if (HIWORD(lppsh->pszCaption))\r
{\r
int len = MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, NULL, 0);\r
- psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR) );\r
+ psInfo->ppshheader.pszCaption = Alloc( len*sizeof (WCHAR) );\r
MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, (LPWSTR) psInfo->ppshheader.pszCaption, len);\r
}\r
}\r
if (HIWORD(lppsh->pszCaption))\r
{\r
int len = strlenW(lppsh->pszCaption);\r
- psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(WCHAR) );\r
+ psInfo->ppshheader.pszCaption = Alloc( (len+1)*sizeof(WCHAR) );\r
strcpyW( (WCHAR *)psInfo->ppshheader.pszCaption, lppsh->pszCaption );\r
}\r
}\r
SetWindowPos(hwndButton, 0, x, y, 0, 0,\r
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);\r
\r
- SendMessageA(hwndParent, DM_SETDEFID, IDOK, 0);\r
+ SendMessageW(hwndParent, DM_SETDEFID, IDOK, 0);\r
\r
\r
/*\r
\r
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;\r
\r
- msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
+ msgResult = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
if (msgResult == -1)\r
return FALSE;\r
else if (msgResult == 0)\r
\r
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;\r
\r
- if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) != FALSE)\r
+ if (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) != FALSE)\r
return FALSE;\r
\r
/*\r
hwndPage = psInfo->proppage[i].hwndPage;\r
if (hwndPage)\r
{\r
- switch (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))\r
+ switch (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))\r
{\r
case PSNRET_INVALID:\r
PROPSHEET_ShowPage(hwndDlg, i, psInfo);\r
psn.hdr.code = PSN_SETACTIVE;\r
psn.lParam = 0;\r
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;\r
- SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
+ SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
}\r
\r
return TRUE;\r
psn.hdr.idFrom = 0;\r
psn.lParam = 0;\r
\r
- if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))\r
+ if (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))\r
return;\r
\r
psn.hdr.code = PSN_RESET;\r
hwndPage = psInfo->proppage[i].hwndPage;\r
\r
if (hwndPage)\r
- SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
+ SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
}\r
\r
if (psInfo->isModeless)\r
psn.hdr.idFrom = 0;\r
psn.lParam = 0;\r
\r
- SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
+ SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
}\r
\r
/******************************************************************************\r
psn.hdr.idFrom = 0;\r
psn.lParam = 0;\r
\r
- res = !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
+ res = !SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);\r
\r
end:\r
TRACE("<-- %d\n", res);\r
EnableWindow(hwndButton, TRUE);\r
\r
/* Make it default pushbutton */\r
- SendMessageA(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);\r
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);\r
\r
/* Hide Back button */\r
hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);\r
int i = 0;\r
HWND hwndPage;\r
LRESULT msgResult = 0;\r
- PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,\r
- PropSheetInfoStr);\r
+ PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);\r
\r
while ((i < psInfo->nPages) && (msgResult == 0))\r
{\r
hwndPage = psInfo->proppage[i].hwndPage;\r
- msgResult = SendMessageA(hwndPage, PSM_QUERYSIBLINGS, wParam, lParam);\r
+ msgResult = SendMessageW(hwndPage, PSM_QUERYSIBLINGS, wParam, lParam);\r
i++;\r
}\r
\r
PROPSHEETPAGEW* psp = (PROPSHEETPAGEW*)psInfo->proppage[index].hpage;\r
\r
if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[index].pszText)\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[index].pszText);\r
+ Free ((LPVOID)psInfo->proppage[index].pszText);\r
\r
DestroyPropertySheetPage(psInfo->proppage[index].hpage);\r
}\r
EnableWindow(hwndNext, TRUE);\r
\r
/* Set the Next button as the default pushbutton */\r
- SendMessageA(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);\r
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);\r
}\r
\r
if ((dwFlags & PSWIZB_FINISH) || (dwFlags & PSWIZB_DISABLEDFINISH))\r
EnableWindow(hwndFinish, TRUE);\r
\r
/* Set the Finish button as the default pushbutton */\r
- SendMessageA(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);\r
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);\r
}\r
}\r
\r
TRACE("\n");\r
if (!psInfo) return;\r
if (HIWORD(psInfo->ppshheader.pszCaption))\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->ppshheader.pszCaption);\r
+ Free ((LPVOID)psInfo->ppshheader.pszCaption);\r
\r
for (i = 0; i < psInfo->nPages; i++)\r
{\r
if(psp)\r
{\r
if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[i].pszText)\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[i].pszText);\r
+ Free ((LPVOID)psInfo->proppage[i].pszText);\r
\r
DestroyPropertySheetPage(psInfo->proppage[i].hpage);\r
}\r
{\r
int len = strlen(lpPropSheetPage->u.pszTemplate);\r
\r
- ppsp->u.pszTemplate = HeapAlloc( GetProcessHeap(),0,len+1 );\r
+ ppsp->u.pszTemplate = Alloc( len+1 );\r
strcpy( (LPSTR)ppsp->u.pszTemplate, lpPropSheetPage->u.pszTemplate );\r
}\r
if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) )\r
{\r
int len = strlenW(lpPropSheetPage->u.pszTemplate);\r
\r
- ppsp->u.pszTemplate = HeapAlloc( GetProcessHeap(),0,(len+1)*sizeof (WCHAR) );\r
+ ppsp->u.pszTemplate = Alloc( (len+1)*sizeof (WCHAR) );\r
strcpyW( (WCHAR *)ppsp->u.pszTemplate, lpPropSheetPage->u.pszTemplate );\r
}\r
if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) )\r
{\r
int len = strlenW(lpPropSheetPage->u2.pszIcon);\r
- ppsp->u2.pszIcon = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );\r
+ ppsp->u2.pszIcon = Alloc( (len+1)*sizeof (WCHAR) );\r
strcpyW( (WCHAR *)ppsp->u2.pszIcon, lpPropSheetPage->u2.pszIcon );\r
}\r
\r
if ((ppsp->dwFlags & PSP_USETITLE) && HIWORD( ppsp->pszTitle ))\r
{\r
int len = strlenW(lpPropSheetPage->pszTitle);\r
- ppsp->pszTitle = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );\r
+ ppsp->pszTitle = Alloc( (len+1)*sizeof (WCHAR) );\r
strcpyW( (WCHAR *)ppsp->pszTitle, lpPropSheetPage->pszTitle );\r
}\r
else if ( !(ppsp->dwFlags & PSP_USETITLE) )\r
return FALSE;\r
\r
if ( !(psp->dwFlags & PSP_DLGINDIRECT) && HIWORD( psp->u.pszTemplate ) )\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u.pszTemplate);\r
+ Free ((LPVOID)psp->u.pszTemplate);\r
\r
if ( (psp->dwFlags & PSP_USEICONID) && HIWORD( psp->u2.pszIcon ) )\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u2.pszIcon);\r
+ Free ((LPVOID)psp->u2.pszIcon);\r
\r
if ((psp->dwFlags & PSP_USETITLE) && HIWORD( psp->pszTitle ))\r
- HeapFree(GetProcessHeap(), 0, (LPVOID)psp->pszTitle);\r
+ Free ((LPVOID)psp->pszTitle);\r
\r
Free(hPropPage);\r
\r
if (lpMsg->message == WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0x8000))\r
{\r
int new_page = 0;\r
- INT dlgCode = SendMessageA(lpMsg->hwnd, WM_GETDLGCODE, 0, (LPARAM)lpMsg);\r
+ INT dlgCode = SendMessageW(lpMsg->hwnd, WM_GETDLGCODE, 0, (LPARAM)lpMsg);\r
\r
if (!(dlgCode & DLGC_WANTMESSAGE))\r
{\r
}\r
}\r
\r
- return IsDialogMessageA(hwnd, lpMsg);\r
+ return IsDialogMessageW(hwnd, lpMsg);\r
}\r
\r
/******************************************************************************\r
/******************************************************************************\r
* PROPSHEET_Paint\r
*/\r
-static LRESULT PROPSHEET_Paint(HWND hwnd)\r
+static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam)\r
{\r
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd, PropSheetInfoStr);\r
PAINTSTRUCT ps;\r
WCHAR szBuffer[256];\r
int nLength;\r
\r
- hdc = BeginPaint(hwnd, &ps);\r
+ hdc = hdcParam ? hdcParam : BeginPaint(hwnd, &ps);\r
if (!hdc) return 1;\r
\r
hdcSrc = CreateCompatibleDC(0);\r
MapWindowPoints(hwndLineHeader, hwnd, (LPPOINT) &r, 2);\r
SetRect(&rzone, 0, 0, r.right + 1, r.top - 1);\r
\r
- GetObjectA(psInfo->ppshheader.u5.hbmHeader, sizeof(BITMAP), (LPVOID)&bm); \r
+ GetObjectW(psInfo->ppshheader.u5.hbmHeader, sizeof(BITMAP), (LPVOID)&bm); \r
\r
if (psInfo->ppshheader.dwFlags & PSH_WIZARD97_OLD)\r
{\r
hbr = GetSysColorBrush(COLOR_WINDOW);\r
FillRect(hdc, &rzone, hbr);\r
\r
- GetObjectA(psInfo->ppshheader.u4.hbmWatermark, sizeof(BITMAP), (LPVOID)&bm);\r
+ GetObjectW(psInfo->ppshheader.u4.hbmWatermark, sizeof(BITMAP), (LPVOID)&bm);\r
hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u4.hbmWatermark);\r
\r
BitBlt(hdc, 0, offsety, min(bm.bmWidth, r.right),\r
\r
DeleteDC(hdcSrc);\r
\r
- EndPaint(hwnd, &ps);\r
+ if (!hdcParam) EndPaint(hwnd, &ps);\r
\r
return 0;\r
}\r
HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);\r
LPCPROPSHEETPAGEW ppshpage;\r
int idx;\r
- LOGFONTA logFont;\r
+ LOGFONTW logFont;\r
\r
/* Using PropSheetInfoStr to store extra data doesn't match the native\r
* common control: native uses TCM_[GS]ETITEM\r
PROPSHEET_SetWizButtons(hwnd, PSWIZB_BACK|PSWIZB_NEXT);\r
\r
/* Set up fonts */\r
- SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);\r
- psInfo->hFont = CreateFontIndirectA (&logFont);\r
+ SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);\r
+ psInfo->hFont = CreateFontIndirectW (&logFont);\r
logFont.lfWeight = FW_BOLD;\r
- psInfo->hFontBold = CreateFontIndirectA (&logFont);\r
+ psInfo->hFontBold = CreateFontIndirectW (&logFont);\r
\r
/*\r
* Small icon in the title bar.\r
}\r
\r
case WM_PAINT:\r
- PROPSHEET_Paint(hwnd);\r
+ PROPSHEET_Paint(hwnd, (HDC)wParam);\r
return TRUE;\r
\r
case WM_DESTROY:\r
* License along with this library; if not, write to the Free Software\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
+ * NOTES\r
*\r
* This code was audited for completeness against the documented features\r
* of Comctl32.dll version 6.0 on Oct. 19, 2004, by Robert Shearman.\r
static VOID\r
REBAR_MoveChildWindows (REBAR_INFO *infoPtr, UINT start, UINT endplus)\r
{\r
+ const static WCHAR strComboBox[] = { 'C','o','m','b','o','B','o','x',0 };\r
REBAR_BAND *lpBand;\r
- CHAR szClassName[40];\r
+ WCHAR szClassName[40];\r
UINT i;\r
NMREBARCHILDSIZE rbcz;\r
NMHDR heightchange;\r
* set flag outside of loop\r
*/\r
\r
- GetClassNameA (lpBand->hwndChild, szClassName, 40);\r
- if (!lstrcmpA (szClassName, "ComboBox") ||\r
- !lstrcmpA (szClassName, WC_COMBOBOXEXA)) {\r
+ GetClassNameW (lpBand->hwndChild, szClassName, sizeof(szClassName)/sizeof(szClassName[0]));\r
+ if (!lstrcmpW (szClassName, strComboBox) ||\r
+ !lstrcmpW (szClassName, WC_COMBOBOXEXW)) {\r
INT nEditHeight, yPos;\r
RECT rc;\r
\r
lpBand->rcBand.right,lpBand->rcBand.bottom,\r
clip->left, clip->top,\r
clip->right, clip->bottom);\r
- ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, 0);\r
+ ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, 0);\r
if (lpBand->clrBack != CLR_NONE)\r
SetBkColor (hdc, old);\r
}\r
if (imindBand == -1) imindBand = i;\r
/* minimum size of each band is size of header plus */\r
/* size of minimum child plus offset of child from header plus */\r
- /* a one to separate each band. */\r
+ /* one to separate each band. */\r
if (i < ihitBand)\r
LHeaderSum += (band->lcx + SEP_WIDTH);\r
else\r
static LRESULT\r
REBAR_Create (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)\r
{\r
- LPCREATESTRUCTA cs = (LPCREATESTRUCTA) lParam;\r
+ LPCREATESTRUCTW cs = (LPCREATESTRUCTW) lParam;\r
RECT wnrc1, clrc1;\r
\r
if (TRACE_ON(rebar)) {\r
static LRESULT\r
REBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
- LPCREATESTRUCTA cs = (LPCREATESTRUCTA) lParam;\r
+ LPCREATESTRUCTW cs = (LPCREATESTRUCTW) lParam;\r
REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);\r
RECT wnrc1, clrc1;\r
- NONCLIENTMETRICSA ncm;\r
+ NONCLIENTMETRICSW ncm;\r
HFONT tfont;\r
INT i;\r
\r
infoPtr->iGrabbedBand = -1;\r
infoPtr->hwndSelf = hwnd;\r
infoPtr->DoRedraw = TRUE;\r
- infoPtr->hcurArrow = LoadCursorA (0, (LPSTR)IDC_ARROW);\r
- infoPtr->hcurHorz = LoadCursorA (0, (LPSTR)IDC_SIZEWE);\r
- infoPtr->hcurVert = LoadCursorA (0, (LPSTR)IDC_SIZENS);\r
- infoPtr->hcurDrag = LoadCursorA (0, (LPSTR)IDC_SIZE);\r
+ infoPtr->hcurArrow = LoadCursorW (0, (LPWSTR)IDC_ARROW);\r
+ infoPtr->hcurHorz = LoadCursorW (0, (LPWSTR)IDC_SIZEWE);\r
+ infoPtr->hcurVert = LoadCursorW (0, (LPWSTR)IDC_SIZENS);\r
+ infoPtr->hcurDrag = LoadCursorW (0, (LPWSTR)IDC_SIZE);\r
infoPtr->bUnicode = IsWindowUnicode (hwnd);\r
infoPtr->fStatus = CREATE_RUNNING;\r
infoPtr->hFont = GetStockObject (SYSTEM_FONT);\r
\r
/* issue WM_NOTIFYFORMAT to get unicode status of parent */\r
- i = SendMessageA(REBAR_GetNotifyParent (infoPtr),\r
+ i = SendMessageW(REBAR_GetNotifyParent (infoPtr),\r
WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);\r
if ((i < NFR_ANSI) || (i > NFR_UNICODE)) {\r
- ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n",\r
- i);\r
+ ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n", i);\r
i = NFR_ANSI;\r
}\r
infoPtr->NtfUnicode = (i == NFR_UNICODE) ? 1 : 0;\r
\r
/* add necessary styles to the requested styles */\r
infoPtr->dwStyle = cs->style | WS_VISIBLE | CCS_TOP;\r
- SetWindowLongA (hwnd, GWL_STYLE, infoPtr->dwStyle);\r
+ SetWindowLongW (hwnd, GWL_STYLE, infoPtr->dwStyle);\r
\r
/* get font handle for Caption Font */\r
- ncm.cbSize = sizeof(NONCLIENTMETRICSA);\r
- SystemParametersInfoA (SPI_GETNONCLIENTMETRICS,\r
- ncm.cbSize, &ncm, 0);\r
+ ncm.cbSize = sizeof(ncm);\r
+ SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);\r
/* if the font is bold, set to normal */\r
if (ncm.lfCaptionFont.lfWeight > FW_NORMAL) {\r
ncm.lfCaptionFont.lfWeight = FW_NORMAL;\r
}\r
- tfont = CreateFontIndirectA (&ncm.lfCaptionFont);\r
+ tfont = CreateFontIndirectW (&ncm.lfCaptionFont);\r
if (tfont) {\r
infoPtr->hFont = infoPtr->hDefaultFont = tfont;\r
}\r
INT i;\r
\r
if (lParam == NF_REQUERY) {\r
- i = SendMessageA(REBAR_GetNotifyParent (infoPtr),\r
+ i = SendMessageW(REBAR_GetNotifyParent (infoPtr),\r
WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);\r
if ((i < NFR_ANSI) || (i > NFR_UNICODE)) {\r
- ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n",\r
- i);\r
+ ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n", i);\r
i = NFR_ANSI;\r
}\r
infoPtr->NtfUnicode = (i == NFR_UNICODE) ? 1 : 0;\r
/* Save the new origin of this window - used by _ForceResize */\r
infoPtr->origin.x = lpwp->x;\r
infoPtr->origin.y = lpwp->y;\r
- ret = DefWindowProcA(infoPtr->hwndSelf, WM_WINDOWPOSCHANGED,\r
+ ret = DefWindowProcW(infoPtr->hwndSelf, WM_WINDOWPOSCHANGED,\r
wParam, lParam);\r
GetWindowRect(infoPtr->hwndSelf, &rc);\r
TRACE("hwnd %p new pos (%ld,%ld)-(%ld,%ld)\n",\r
TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n",\r
hwnd, uMsg, wParam, lParam);\r
if (!infoPtr && (uMsg != WM_NCCREATE))\r
- return DefWindowProcA (hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW (hwnd, uMsg, wParam, lParam);\r
switch (uMsg)\r
{\r
/* case RB_BEGINDRAG: */\r
if ((uMsg >= WM_USER) && (uMsg < WM_APP))\r
ERR("unknown msg %04x wp=%08x lp=%08lx\n",\r
uMsg, wParam, lParam);\r
- return DefWindowProcA (hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW (hwnd, uMsg, wParam, lParam);\r
}\r
}\r
\r
VOID\r
REBAR_Register (void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
- ZeroMemory (&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory (&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;\r
wndClass.lpfnWndProc = REBAR_WindowProc;\r
wndClass.cbClsExtra = 0;\r
#if GLATESTING\r
wndClass.hbrBackground = CreateSolidBrush(RGB(0,128,0));\r
#endif\r
- wndClass.lpszClassName = REBARCLASSNAMEA;\r
+ wndClass.lpszClassName = REBARCLASSNAMEW;\r
\r
- RegisterClassA (&wndClass);\r
+ RegisterClassW (&wndClass);\r
\r
mindragx = GetSystemMetrics (SM_CXDRAG);\r
mindragy = GetSystemMetrics (SM_CYDRAG);\r
VOID\r
REBAR_Unregister (void)\r
{\r
- UnregisterClassA (REBARCLASSNAMEA, NULL);\r
+ UnregisterClassW (REBARCLASSNAMEW, NULL);\r
}\r
* License along with this library; if not, write to the Free Software\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
+ * NOTES\r
+ *\r
+ * This code was audited for completeness against the documented features\r
+ * of Comctl32.dll version 6.0 on Apr. 4, 2005, by Dimitrie O. Paun.\r
+ * \r
+ * Unless otherwise noted, we believe this code to be complete, as per\r
+ * the specification mentioned above.\r
+ * If you discover missing features, or bugs, please note them below.\r
+ * \r
* TODO:\r
* - Fix SHIFT+TAB and TAB issue (wrong link is selected when control gets the focus)\r
* - Better string parsing\r
* - Improve word wrapping\r
- * - Control styles?!\r
*\r
*/\r
\r
#include "winuser.h"\r
#include "winnls.h"\r
#include "commctrl.h"\r
+#include "comctl32.h"\r
#include "wine/unicode.h"\r
#include "wine/debug.h"\r
\r
\r
INT WINAPI StrCmpNIW(LPCWSTR,LPCWSTR,INT);\r
\r
-#define SYSLINK_Alloc(size) HeapAlloc(GetProcessHeap(), 0, (size))\r
-#define SYSLINK_Free(ptr) HeapFree(GetProcessHeap(), 0, (ptr))\r
-#define SYSLINK_ReAlloc(ptr, size) HeapReAlloc(GetProcessHeap(), 0, ptr, (size))\r
-\r
typedef struct\r
{\r
int nChars;\r
typedef struct\r
{\r
HWND Self; /* The window handle for this control */\r
+ HWND Notify; /* The parent handle to receive notifications */\r
+ DWORD Style; /* Styles for this control */\r
PDOC_ITEM Items; /* Address to the first document item */\r
BOOL HasFocus; /* Whether the control has the input focus */\r
int MouseDownID; /* ID of the link that the mouse button first selected */\r
{\r
if(DocItem->Type == slLink)\r
{\r
- SYSLINK_Free(DocItem->u.Link.szID);\r
- SYSLINK_Free(DocItem->u.Link.szUrl);\r
+ Free(DocItem->u.Link.szID);\r
+ Free(DocItem->u.Link.szUrl);\r
}\r
\r
if(DocItem->Type == slLink && DocItem->u.Link.hRgn != NULL)\r
/* we don't free Text because it's just a pointer to a character in the\r
entire window text string */\r
\r
- SYSLINK_Free(DocItem);\r
+ Free(DocItem);\r
}\r
\r
/***********************************************************************\r
* SYSLINK_AppendDocItem\r
* Create and append a new document item.\r
*/\r
-static PDOC_ITEM SYSLINK_AppendDocItem (SYSLINK_INFO *infoPtr, LPWSTR Text, UINT textlen,\r
+static PDOC_ITEM SYSLINK_AppendDocItem (SYSLINK_INFO *infoPtr, LPCWSTR Text, UINT textlen,\r
SL_ITEM_TYPE type, PDOC_ITEM LastItem)\r
{\r
PDOC_ITEM Item;\r
- Item = SYSLINK_Alloc(sizeof(DOC_ITEM) + ((textlen + 1) * sizeof(WCHAR)));\r
+ Item = Alloc(sizeof(DOC_ITEM) + ((textlen + 1) * sizeof(WCHAR)));\r
if(Item == NULL)\r
{\r
ERR("Failed to alloc DOC_ITEM structure!\n");\r
* Parses the window text string and creates a document. Returns the\r
* number of document items created.\r
*/\r
-static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPWSTR Text)\r
+static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text)\r
{\r
- WCHAR *current, *textstart, *linktext, *firsttag;\r
- int taglen = 0, textlen, linklen, docitems = 0;\r
+ LPCWSTR current, textstart = NULL, linktext = NULL, firsttag = NULL;\r
+ int taglen = 0, textlen = 0, linklen = 0, docitems = 0;\r
PDOC_ITEM Last = NULL;\r
SL_ITEM_TYPE CurrentType = slText;\r
- DWORD Style;\r
- LPWSTR lpID, lpUrl;\r
+ LPCWSTR lpID, lpUrl;\r
UINT lenId, lenUrl;\r
\r
- Style = GetWindowLongW(infoPtr->Self, GWL_STYLE);\r
-\r
- firsttag = NULL;\r
- textstart = NULL;\r
- linktext = NULL;\r
- textlen = 0;\r
- linklen = 0;\r
- \r
- for(current = (WCHAR*)Text; *current != 0;)\r
+ for(current = Text; *current != 0;)\r
{\r
if(*current == '<')\r
{\r
case ' ':\r
{\r
/* we expect parameters, parse them */\r
- LPWSTR *CurrentParameter = NULL;\r
+ LPCWSTR *CurrentParameter = NULL, tmp;\r
UINT *CurrentParameterLen = NULL;\r
- WCHAR *tmp;\r
\r
taglen = 3;\r
tmp = current + taglen;\r
{\r
int nc;\r
\r
- if(!(Style & WS_DISABLED))\r
+ if(!(infoPtr->Style & WS_DISABLED))\r
{\r
Last->u.Link.state |= LIS_ENABLED;\r
}\r
{\r
nc = min(lenId, strlenW(lpID));\r
nc = min(nc, MAX_LINKID_TEXT);\r
- Last->u.Link.szID = SYSLINK_Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
+ Last->u.Link.szID = Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
if(Last->u.Link.szID != NULL)\r
{\r
lstrcpynW(Last->u.Link.szID, lpID, nc + 1);\r
{\r
nc = min(lenUrl, strlenW(lpUrl));\r
nc = min(nc, L_MAX_URL_LENGTH);\r
- Last->u.Link.szUrl = SYSLINK_Alloc((L_MAX_URL_LENGTH + 1) * sizeof(WCHAR));\r
+ Last->u.Link.szUrl = Alloc((L_MAX_URL_LENGTH + 1) * sizeof(WCHAR));\r
if(Last->u.Link.szUrl != NULL)\r
{\r
lstrcpynW(Last->u.Link.szUrl, lpUrl, nc + 1);\r
{\r
int nc;\r
\r
- if(!(Style & WS_DISABLED))\r
+ if(!(infoPtr->Style & WS_DISABLED))\r
{\r
Last->u.Link.state |= LIS_ENABLED;\r
}\r
{\r
nc = min(lenId, strlenW(lpID));\r
nc = min(nc, MAX_LINKID_TEXT);\r
- Last->u.Link.szID = SYSLINK_Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
+ Last->u.Link.szID = Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
if(Last->u.Link.szID != NULL)\r
{\r
lstrcpynW(Last->u.Link.szID, lpID, nc + 1);\r
{\r
nc = min(lenUrl, strlenW(lpUrl));\r
nc = min(nc, L_MAX_URL_LENGTH);\r
- Last->u.Link.szUrl = SYSLINK_Alloc((L_MAX_URL_LENGTH + 1) * sizeof(WCHAR));\r
+ Last->u.Link.szUrl = Alloc((L_MAX_URL_LENGTH + 1) * sizeof(WCHAR));\r
if(Last->u.Link.szUrl != NULL)\r
{\r
lstrcpynW(Last->u.Link.szUrl, lpUrl, nc + 1);\r
\r
if(linktext != NULL && linklen > 0)\r
{\r
- /* we got a unclosed link, just display the text */\r
+ /* we got an unclosed link, just display the text */\r
Last = SYSLINK_AppendDocItem(infoPtr, linktext, linklen, slText, Last);\r
if(Last == NULL)\r
{\r
\r
if(bl != NULL)\r
{\r
- bl = SYSLINK_ReAlloc(bl, ++nBlocks * sizeof(DOC_TEXTBLOCK));\r
+ bl = ReAlloc(bl, ++nBlocks * sizeof(DOC_TEXTBLOCK));\r
}\r
else\r
{\r
- bl = SYSLINK_Alloc(++nBlocks * sizeof(DOC_TEXTBLOCK));\r
+ bl = Alloc(++nBlocks * sizeof(DOC_TEXTBLOCK));\r
}\r
\r
if(bl != NULL)\r
* SYSLINK_Paint\r
* Handles the WM_PAINT message.\r
*/\r
-static LRESULT SYSLINK_Paint (SYSLINK_INFO *infoPtr)\r
+static LRESULT SYSLINK_Paint (SYSLINK_INFO *infoPtr, HDC hdcParam)\r
{\r
HDC hdc;\r
PAINTSTRUCT ps;\r
- hdc = BeginPaint (infoPtr->Self, &ps);\r
+\r
+ hdc = hdcParam ? hdcParam : BeginPaint (infoPtr->Self, &ps);\r
SYSLINK_Draw (infoPtr, hdc);\r
- EndPaint (infoPtr->Self, &ps);\r
+ if (!hdcParam) EndPaint (infoPtr->Self, &ps);\r
return 0;\r
}\r
\r
* SYSLINK_SetText\r
* Set new text for the SysLink control.\r
*/\r
-static LRESULT SYSLINK_SetText (SYSLINK_INFO *infoPtr, LPWSTR Text)\r
+static LRESULT SYSLINK_SetText (SYSLINK_INFO *infoPtr, LPCWSTR Text)\r
{\r
int textlen;\r
\r
{\r
if(!di->u.Link.szID)\r
{\r
- di->u.Link.szID = SYSLINK_Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
+ di->u.Link.szID = Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
if(!Item->szID)\r
{\r
ERR("Unable to allocate memory for link id\n");\r
{\r
if(!di->u.Link.szUrl)\r
{\r
- di->u.Link.szUrl = SYSLINK_Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
+ di->u.Link.szUrl = Alloc((MAX_LINKID_TEXT + 1) * sizeof(WCHAR));\r
if(!Item->szUrl)\r
{\r
ERR("Unable to allocate memory for link url\n");\r
nml.item.szUrl[0] = 0;\r
}\r
\r
- return SendMessageW(GetParent(infoPtr->Self), WM_NOTIFY, (WPARAM)nml.hdr.idFrom, (LPARAM)&nml);\r
+ return SendMessageW(infoPtr->Notify, WM_NOTIFY, (WPARAM)nml.hdr.idFrom, (LPARAM)&nml);\r
}\r
\r
/***********************************************************************\r
\r
switch(message) {\r
case WM_PAINT:\r
- return SYSLINK_Paint (infoPtr);\r
+ return SYSLINK_Paint (infoPtr, (HDC)wParam);\r
\r
case WM_SETCURSOR:\r
{\r
case WM_KILLFOCUS:\r
return SYSLINK_KillFocus(infoPtr, (HWND)wParam);\r
\r
+ case WM_ENABLE:\r
+ infoPtr->Style &= ~WS_DISABLED;\r
+ infoPtr->Style |= (wParam ? 0 : WS_DISABLED);\r
+ InvalidateRect (infoPtr->Self, NULL, FALSE);\r
+ return 0;\r
+\r
+ case WM_STYLECHANGED:\r
+ if (wParam == GWL_STYLE)\r
+ {\r
+ infoPtr->Style = ((LPSTYLESTRUCT)lParam)->styleNew;\r
+\r
+ InvalidateRect(infoPtr->Self, NULL, TRUE);\r
+ }\r
+ return 0;\r
+\r
case WM_CREATE:\r
/* allocate memory for info struct */\r
- infoPtr = (SYSLINK_INFO *)SYSLINK_Alloc (sizeof(SYSLINK_INFO));\r
+ infoPtr = Alloc (sizeof(SYSLINK_INFO));\r
if (!infoPtr) return -1;\r
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);\r
\r
/* initialize the info struct */\r
infoPtr->Self = hwnd;\r
+ infoPtr->Notify = ((LPCREATESTRUCTW)lParam)->hwndParent;\r
+ infoPtr->Style = ((LPCREATESTRUCTW)lParam)->style;\r
infoPtr->Font = 0;\r
infoPtr->LinkFont = 0;\r
infoPtr->Items = NULL;\r
infoPtr->LinkColor = GetSysColor(COLOR_HIGHLIGHT);\r
infoPtr->VisitedColor = GetSysColor(COLOR_HIGHLIGHT);\r
TRACE("SysLink Ctrl creation, hwnd=%p\n", hwnd);\r
- lParam = (LPARAM)(((LPCREATESTRUCTW)lParam)->lpszName);\r
- SYSLINK_SetText(infoPtr, (LPWSTR)lParam);\r
+ SYSLINK_SetText(infoPtr, ((LPCREATESTRUCTW)lParam)->lpszName);\r
return 0;\r
\r
case WM_DESTROY:\r
SYSLINK_ClearDoc(infoPtr);\r
if(infoPtr->Font != 0) DeleteObject(infoPtr->Font);\r
if(infoPtr->LinkFont != 0) DeleteObject(infoPtr->LinkFont);\r
- SYSLINK_Free (infoPtr);\r
SetWindowLongPtrW(hwnd, 0, 0);\r
+ Free (infoPtr);\r
return 0;\r
\r
default:\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
* TODO:\r
- * Unicode support (under construction)\r
*\r
* Styles:\r
* TCIF_RTLREADING\r
USHORT uVItemPadding_s; /* Set amount of vertical padding, in pixels */\r
HFONT hFont; /* handle to the current font */\r
HCURSOR hcurArrow; /* handle to the current cursor */\r
- HIMAGELIST himl; /* handle to a image list (may be 0) */\r
+ HIMAGELIST himl; /* handle to an image list (may be 0) */\r
HWND hwndToolTip; /* handle to tab's tooltip */\r
INT leftmostVisible; /* Used for scrolling, this member contains\r
* the index of the first visible item */\r
(WPARAM) nmhdr.idFrom, (LPARAM) &nmhdr);\r
}\r
\r
-static VOID\r
+static void\r
TAB_RelayEvent (HWND hwndTip, HWND hwndMsg, UINT uMsg,\r
WPARAM wParam, LPARAM lParam)\r
{\r
}\r
\r
static void\r
-TAB_DumpItemExternalA(TCITEMA *pti, UINT iItem)\r
-{\r
- if (TRACE_ON(tab)) {\r
- TRACE("external tab %d, mask=0x%08x, dwState=0x%08x, dwStateMask=0x%08x, cchTextMax=0x%08x\n",\r
- iItem, pti->mask, pti->dwState, pti->dwStateMask, pti->cchTextMax);\r
- TRACE("external tab %d, iImage=%d, lParam=0x%08lx, pszTextA=%s\n",\r
- iItem, pti->iImage, pti->lParam, debugstr_a(pti->pszText));\r
- }\r
-}\r
-\r
-\r
-static void\r
-TAB_DumpItemExternalW(TCITEMW *pti, UINT iItem)\r
+TAB_DumpItemExternalT(TCITEMW *pti, UINT iItem, BOOL isW)\r
{\r
if (TRACE_ON(tab)) {\r
TRACE("external tab %d, mask=0x%08x, dwState=0x%08lx, dwStateMask=0x%08lx, cchTextMax=0x%08x\n",\r
iItem, pti->mask, pti->dwState, pti->dwStateMask, pti->cchTextMax);\r
TRACE("external tab %d, iImage=%d, lParam=0x%08lx, pszTextW=%s\n",\r
- iItem, pti->iImage, pti->lParam, debugstr_w(pti->pszText));\r
+ iItem, pti->iImage, pti->lParam, isW ? debugstr_w(pti->pszText) : debugstr_a((LPSTR)pti->pszText));\r
}\r
}\r
\r
{\r
if (iItem < 0 || iItem >= infoPtr->uNumItem) return 0;\r
\r
- if (GetWindowLongA(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS) {\r
+ if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS) {\r
FIXME("Should set input focus\n");\r
} else {\r
int oldFocus = infoPtr->uFocus;\r
RECT* selectedRect)\r
{\r
RECT tmpItemRect,clientRect;\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
\r
/* Perform a sanity check and a trivial visibility check. */\r
if ( (infoPtr->uNumItem <= 0) ||\r
}\r
}\r
\r
- return TRUE;\r
+ /* Check for visibility */\r
+ if (lStyle & TCS_VERTICAL)\r
+ return (itemRect->top < clientRect.bottom) && (itemRect->bottom > clientRect.top);\r
+ else\r
+ return (itemRect->left < clientRect.right) && (itemRect->right > clientRect.left);\r
}\r
\r
static inline BOOL\r
* This method is called whenever the focus goes in or out of this control\r
* it is used to update the visual state of the control.\r
*/\r
-static VOID TAB_FocusChanging(const TAB_INFO *infoPtr)\r
+static void TAB_FocusChanging(const TAB_INFO *infoPtr)\r
{\r
RECT selectedRect;\r
BOOL isVisible;\r
TAB_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwnd,\r
WM_LBUTTONDOWN, wParam, lParam);\r
\r
- if (GetWindowLongA(infoPtr->hwnd, GWL_STYLE) & TCS_FOCUSONBUTTONDOWN ) {\r
+ if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_FOCUSONBUTTONDOWN ) {\r
SetFocus (infoPtr->hwnd);\r
}\r
\r
* we can check if the mouse has left our window. If so, we un-highlight\r
* the hot-tracked tab.\r
*/\r
-static VOID CALLBACK\r
+static void CALLBACK\r
TAB_HotTrackTimerProc\r
(\r
HWND hwnd, /* handle of window for timer messages */\r
if (out_redrawEnter != NULL)\r
*out_redrawEnter = -1;\r
\r
- if (GetWindowLongA(infoPtr->hwnd, GWL_STYLE) & TCS_HOTTRACK)\r
+ if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_HOTTRACK)\r
{\r
POINT pt;\r
UINT flags;\r
WPARAM fLarger,\r
LPRECT prc)\r
{\r
- DWORD lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
LONG *iRightBottom, *iLeftTop;\r
\r
TRACE ("hwnd=%p fLarger=%d (%ld,%ld)-(%ld,%ld)\n", infoPtr->hwnd, fLarger, prc->left, prc->top, prc->right, prc->bottom);\r
TAB_INFO* infoPtr,\r
const RECT* clientRect)\r
{\r
+ static const WCHAR msctls_updown32W[] = { 'm','s','c','t','l','s','_','u','p','d','o','w','n','3','2',0 };\r
+ static const WCHAR emptyW[] = { 0 };\r
INT maxRange = 0;\r
- DWORD lStyle = GetWindowLongA(hwnd, GWL_STYLE);\r
+ DWORD lStyle = GetWindowLongW(hwnd, GWL_STYLE);\r
\r
if (infoPtr->needsScrolling)\r
{\r
*/\r
if (infoPtr->hwndUpDown==0)\r
{\r
- infoPtr->hwndUpDown = CreateWindowA("msctls_updown32",\r
- "",\r
+ infoPtr->hwndUpDown = CreateWindowW(msctls_updown32W, emptyW,\r
WS_VISIBLE | WS_CHILD | UDS_HORZ,\r
controlPos.left, controlPos.top,\r
controlPos.right - controlPos.left,\r
controlPos.bottom - controlPos.top,\r
- hwnd,\r
- NULL,\r
- NULL,\r
- NULL);\r
+ hwnd, NULL, NULL, NULL);\r
}\r
else\r
{\r
*/\r
static void TAB_SetItemBounds (TAB_INFO *infoPtr)\r
{\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
- TEXTMETRICA fontMetrics;\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
+ TEXTMETRICW fontMetrics;\r
UINT curItem;\r
INT curItemLeftPos;\r
INT curItemRowCount;\r
int icon_height = 0;\r
\r
/* Use the current font to determine the height of a tab. */\r
- GetTextMetricsA(hdc, &fontMetrics);\r
+ GetTextMetricsW(hdc, &fontMetrics);\r
\r
/* Get the icon height */\r
if (infoPtr->himl)\r
RECT* drawRect\r
)\r
{\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
HBRUSH hbr = CreateSolidBrush (comctl32_color.clrBtnFace);\r
BOOL deleteBrush = TRUE;\r
RECT rTemp = *drawRect;\r
RECT* drawRect\r
)\r
{\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
\r
RECT localRect;\r
\r
/* Draw the text */\r
if(lStyle & TCS_VERTICAL) /* if we are vertical rotate the text and each character */\r
{\r
- LOGFONTA logfont;\r
+ static const WCHAR ArialW[] = { 'A','r','i','a','l',0 };\r
+ LOGFONTW logfont;\r
HFONT hFont = 0;\r
INT nEscapement = 900;\r
INT nOrientation = 900;\r
\r
/* to get a font with the escapement and orientation we are looking for, we need to */\r
/* call CreateFontIndirectA, which requires us to set the values of the logfont we pass in */\r
- if (!GetObjectA((infoPtr->hFont) ?\r
+ if (!GetObjectW((infoPtr->hFont) ?\r
infoPtr->hFont : GetStockObject(SYSTEM_FONT),\r
- sizeof(LOGFONTA),&logfont))\r
+ sizeof(LOGFONTW),&logfont))\r
{\r
INT iPointSize = 9;\r
\r
- lstrcpyA(logfont.lfFaceName, "Arial");\r
+ lstrcpyW(logfont.lfFaceName, ArialW);\r
logfont.lfHeight = -MulDiv(iPointSize, GetDeviceCaps(hdc, LOGPIXELSY),\r
72);\r
logfont.lfWeight = FW_NORMAL;\r
\r
logfont.lfEscapement = nEscapement;\r
logfont.lfOrientation = nOrientation;\r
- hFont = CreateFontIndirectA(&logfont);\r
+ hFont = CreateFontIndirectW(&logfont);\r
SelectObject(hdc, hFont);\r
\r
if (item->pszText)\r
HDC hdc,\r
INT iItem)\r
{\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
RECT itemRect;\r
RECT selectedRect;\r
BOOL isVisible;\r
\r
/* Clear interior */\r
SetBkColor(hdc, bkgnd);\r
- ExtTextOutA(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
\r
/* Draw rectangular edge around tab */\r
DrawEdge(hdc, &r, EDGE_RAISED, BF_SOFT|BF_RIGHT|BF_TOP|BF_BOTTOM);\r
r1.top = r.top;\r
r1.right = r.right;\r
r1.bottom = r1.top + ROUND_CORNER_SIZE;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.right--;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDTOPLEFT);\r
\r
r1.bottom = r.bottom;\r
r1.right = r.right;\r
r1.top = r1.bottom - ROUND_CORNER_SIZE;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.right--;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDBOTTOMLEFT);\r
\r
\r
/* Clear interior */\r
SetBkColor(hdc, bkgnd);\r
- ExtTextOutA(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
\r
/* Draw rectangular edge around tab */\r
DrawEdge(hdc, &r, EDGE_RAISED, BF_SOFT|BF_LEFT|BF_TOP|BF_BOTTOM);\r
r1.top = r.top;\r
r1.right = r1.left + ROUND_CORNER_SIZE + 1;\r
r1.bottom = r1.top + ROUND_CORNER_SIZE;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.left++;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDTOPRIGHT);\r
\r
r1.bottom = r.bottom;\r
r1.right = r1.left + ROUND_CORNER_SIZE + 1;\r
r1.top = r1.bottom - ROUND_CORNER_SIZE;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.left++;\r
DrawEdge(hdc, &r1, EDGE_SUNKEN, BF_DIAGONAL_ENDTOPLEFT);\r
}\r
\r
/* Clear interior */\r
SetBkColor(hdc, bkgnd);\r
- ExtTextOutA(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
\r
/* Draw rectangular edge around tab */\r
DrawEdge(hdc, &r, EDGE_RAISED, BF_SOFT|BF_LEFT|BF_BOTTOM|BF_RIGHT);\r
r1.bottom = r.bottom;\r
r1.right = r.right;\r
r1.top = r1.bottom - ROUND_CORNER_SIZE - 1;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.bottom--;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDBOTTOMLEFT);\r
\r
r1.bottom = r.bottom;\r
r1.right = r1.left + ROUND_CORNER_SIZE;\r
r1.top = r1.bottom - ROUND_CORNER_SIZE - 1;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.bottom--;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDTOPLEFT);\r
\r
\r
/* Clear interior */\r
SetBkColor(hdc, bkgnd);\r
- ExtTextOutA(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &fillRect, NULL, 0, 0);\r
\r
/* Draw rectangular edge around tab */\r
DrawEdge(hdc, &r, EDGE_RAISED, BF_SOFT|BF_LEFT|BF_TOP|BF_RIGHT);\r
r1.top = r.top;\r
r1.right = r.right;\r
r1.bottom = r1.top + ROUND_CORNER_SIZE + 1;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.top++;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDBOTTOMRIGHT);\r
\r
r1.top = r.top;\r
r1.right = r1.left + ROUND_CORNER_SIZE;\r
r1.bottom = r1.top + ROUND_CORNER_SIZE + 1;\r
- ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, 2, &r1, NULL, 0, 0);\r
r1.top++;\r
DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDTOPRIGHT);\r
}\r
static void TAB_DrawBorder (TAB_INFO *infoPtr, HDC hdc)\r
{\r
RECT rect;\r
- DWORD lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
\r
GetClientRect (infoPtr->hwnd, &rect);\r
\r
\r
hOldFont = SelectObject (hdc, infoPtr->hFont);\r
\r
- if (GetWindowLongA(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS)\r
+ if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS)\r
{\r
for (i = 0; i < infoPtr->uNumItem; i++)\r
TAB_DrawItem (infoPtr, hdc, i);\r
TAB_INFO* infoPtr)\r
{\r
INT iSelected = infoPtr->iSelected;\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
INT iOrigLeftmostVisible = infoPtr->leftmostVisible;\r
\r
/* set the items row to the bottommost row or topmost row depending on\r
static void TAB_InvalidateTabArea(TAB_INFO* infoPtr)\r
{\r
RECT clientRect, rInvalidate, rAdjClient;\r
- DWORD lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
INT lastRow = infoPtr->uNumRows - 1;\r
RECT rect;\r
\r
}\r
\r
static LRESULT\r
-TAB_InsertItemAW (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)\r
+TAB_InsertItemT (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)\r
{\r
TAB_ITEM *item;\r
- TCITEMA *pti;\r
+ TCITEMW *pti;\r
INT iItem;\r
RECT rect;\r
\r
TRACE("Rect: %p T %li, L %li, B %li, R %li\n", infoPtr->hwnd,\r
rect.top, rect.left, rect.bottom, rect.right);\r
\r
- pti = (TCITEMA *)lParam;\r
+ pti = (TCITEMW *)lParam;\r
iItem = (INT)wParam;\r
\r
if (iItem < 0) return -1;\r
if (iItem > infoPtr->uNumItem)\r
iItem = infoPtr->uNumItem;\r
\r
- if (bUnicode)\r
- TAB_DumpItemExternalW((TCITEMW*)pti, iItem);\r
- else\r
- TAB_DumpItemExternalA(pti, iItem);\r
+ TAB_DumpItemExternalT(pti, iItem, bUnicode);\r
\r
\r
if (infoPtr->uNumItem == 0) {\r
if (pti->mask & TCIF_TEXT)\r
{\r
if (bUnicode)\r
- Str_SetPtrW (&item->pszText, (WCHAR*)pti->pszText);\r
+ Str_SetPtrW (&item->pszText, pti->pszText);\r
else\r
- Str_SetPtrAtoW (&item->pszText, pti->pszText);\r
+ Str_SetPtrAtoW (&item->pszText, (LPSTR)pti->pszText);\r
}\r
\r
if (pti->mask & TCIF_IMAGE)\r
static LRESULT\r
TAB_SetItemSize (TAB_INFO *infoPtr, LPARAM lParam)\r
{\r
- LONG lStyle = GetWindowLongA(infoPtr->hwnd, GWL_STYLE);\r
+ LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);\r
LONG lResult = 0;\r
BOOL bNeedPaint = FALSE;\r
\r
}\r
\r
static LRESULT\r
-TAB_SetItemAW (TAB_INFO *infoPtr, INT iItem, LPTCITEMA tabItem, BOOL bUnicode)\r
+TAB_SetItemT (TAB_INFO *infoPtr, INT iItem, LPTCITEMW tabItem, BOOL bUnicode)\r
{\r
TAB_ITEM *wineItem;\r
\r
if (iItem < 0 || iItem >= infoPtr->uNumItem)\r
return FALSE;\r
\r
- if (bUnicode)\r
- TAB_DumpItemExternalW((TCITEMW *)tabItem, iItem);\r
- else\r
- TAB_DumpItemExternalA(tabItem, iItem);\r
+ TAB_DumpItemExternalT(tabItem, iItem, bUnicode);\r
\r
wineItem = TAB_GetItem(infoPtr, iItem);\r
\r
wineItem->pszText = NULL;\r
}\r
if (bUnicode)\r
- Str_SetPtrW(&wineItem->pszText, (WCHAR*)tabItem->pszText);\r
+ Str_SetPtrW(&wineItem->pszText, tabItem->pszText);\r
else\r
- Str_SetPtrAtoW(&wineItem->pszText, tabItem->pszText);\r
+ Str_SetPtrAtoW(&wineItem->pszText, (LPSTR)tabItem->pszText);\r
}\r
\r
/* Update and repaint tabs */\r
\r
\r
static LRESULT\r
-TAB_GetItemAW (TAB_INFO *infoPtr, INT iItem, LPTCITEMA tabItem, BOOL bUnicode)\r
+TAB_GetItemT (TAB_INFO *infoPtr, INT iItem, LPTCITEMW tabItem, BOOL bUnicode)\r
{\r
TAB_ITEM *wineItem;\r
\r
if (tabItem->mask & TCIF_TEXT)\r
{\r
if (bUnicode)\r
- Str_GetPtrW (wineItem->pszText, (WCHAR*)tabItem->pszText, tabItem->cchTextMax);\r
+ Str_GetPtrW (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);\r
else\r
- Str_GetPtrWtoA (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);\r
+ Str_GetPtrWtoA (wineItem->pszText, (LPSTR)tabItem->pszText, tabItem->cchTextMax);\r
}\r
\r
- if (bUnicode)\r
- TAB_DumpItemExternalW((TCITEMW*)tabItem, iItem);\r
- else\r
- TAB_DumpItemExternalA(tabItem, iItem);\r
+ TAB_DumpItemExternalT(tabItem, iItem, bUnicode);\r
\r
return TRUE;\r
}\r
GetClientRect(parent, &parent_rect);\r
cx=LOWORD (lParam);\r
cy=HIWORD (lParam);\r
- if (GetWindowLongA(hwnd, GWL_STYLE) & CCS_NORESIZE)\r
+ if (GetWindowLongW(hwnd, GWL_STYLE) & CCS_NORESIZE)\r
uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE);\r
\r
SetWindowPos (hwnd, 0, parent_rect.left, parent_rect.top,\r
static LRESULT TAB_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
TAB_INFO *infoPtr;\r
- TEXTMETRICA fontMetrics;\r
+ TEXTMETRICW fontMetrics;\r
HDC hdc;\r
HFONT hOldFont;\r
DWORD dwStyle;\r
\r
infoPtr = (TAB_INFO *)Alloc (sizeof(TAB_INFO));\r
\r
- SetWindowLongA(hwnd, 0, (DWORD)infoPtr);\r
+ SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)infoPtr);\r
\r
infoPtr->hwnd = hwnd;\r
infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;\r
infoPtr->uVItemPadding_s = 3;\r
infoPtr->hFont = 0;\r
infoPtr->items = 0;\r
- infoPtr->hcurArrow = LoadCursorA (0, (LPSTR)IDC_ARROW);\r
+ infoPtr->hcurArrow = LoadCursorW (0, (LPWSTR)IDC_ARROW);\r
infoPtr->iSelected = -1;\r
infoPtr->iHotTracked = -1;\r
infoPtr->uFocus = -1;\r
/* The tab control always has the WS_CLIPSIBLINGS style. Even\r
if you don't specify it in CreateWindow. This is necessary in\r
order for paint to work correctly. This follows windows behaviour. */\r
- dwStyle = GetWindowLongA(hwnd, GWL_STYLE);\r
- SetWindowLongA(hwnd, GWL_STYLE, dwStyle|WS_CLIPSIBLINGS);\r
+ dwStyle = GetWindowLongW(hwnd, GWL_STYLE);\r
+ SetWindowLongW(hwnd, GWL_STYLE, dwStyle|WS_CLIPSIBLINGS);\r
\r
if (dwStyle & TCS_TOOLTIPS) {\r
/* Create tooltip control */\r
infoPtr->hwndToolTip =\r
- CreateWindowExA (0, TOOLTIPS_CLASSA, NULL, 0,\r
+ CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, 0,\r
CW_USEDEFAULT, CW_USEDEFAULT,\r
CW_USEDEFAULT, CW_USEDEFAULT,\r
hwnd, 0, 0, 0);\r
hOldFont = SelectObject (hdc, GetStockObject (SYSTEM_FONT));\r
\r
/* Use the system font to determine the initial height of a tab. */\r
- GetTextMetricsA(hdc, &fontMetrics);\r
+ GetTextMetricsW(hdc, &fontMetrics);\r
\r
/*\r
* Make sure there is enough space for the letters + growing the\r
if (!infoPtr)\r
return 0;\r
\r
+ SetWindowLongPtrW(infoPtr->hwnd, 0, 0);\r
+\r
if (infoPtr->items) {\r
for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) {\r
if (TAB_GetItem(infoPtr, iItem)->pszText)\r
KillTimer(infoPtr->hwnd, TAB_HOTTRACK_TIMER);\r
\r
Free (infoPtr);\r
- SetWindowLongA(infoPtr->hwnd, 0, 0);\r
return 0;\r
}\r
\r
\r
case TCM_GETITEMA:\r
case TCM_GETITEMW:\r
- return TAB_GetItemAW (infoPtr, (INT)wParam, (LPTCITEMA)lParam, uMsg == TCM_GETITEMW);\r
+ return TAB_GetItemT (infoPtr, (INT)wParam, (LPTCITEMW)lParam, uMsg == TCM_GETITEMW);\r
\r
case TCM_SETITEMA:\r
case TCM_SETITEMW:\r
- return TAB_SetItemAW (infoPtr, (INT)wParam, (LPTCITEMA)lParam, uMsg == TCM_SETITEMW);\r
+ return TAB_SetItemT (infoPtr, (INT)wParam, (LPTCITEMW)lParam, uMsg == TCM_SETITEMW);\r
\r
case TCM_DELETEITEM:\r
return TAB_DeleteItem (infoPtr, (INT)wParam);\r
\r
case TCM_INSERTITEMA:\r
case TCM_INSERTITEMW:\r
- return TAB_InsertItemAW (infoPtr, wParam, lParam, uMsg == TCM_INSERTITEMW);\r
+ return TAB_InsertItemT (infoPtr, wParam, lParam, uMsg == TCM_INSERTITEMW);\r
\r
case TCM_SETITEMEXTRA:\r
return TAB_SetItemExtra (infoPtr, (int)wParam);\r
}\r
\r
\r
-VOID\r
+void\r
TAB_Register (void)\r
{\r
WNDCLASSW wndClass;\r
}\r
\r
\r
-VOID\r
+void\r
TAB_Unregister (void)\r
{\r
UnregisterClassW (WC_TABCONTROLW, NULL);\r
*\r
* NOTES\r
*\r
- * Differences between MSDN and actual native control operation:\r
- * 1. MSDN says: "TBSTYLE_LIST: Creates a flat toolbar with button text\r
- * to the right of the bitmap. Otherwise, this style is\r
- * identical to TBSTYLE_FLAT."\r
- * As implemented by both v4.71 and v5.80 of the native COMCTL32.DLL\r
- * you can create a TBSTYLE_LIST without TBSTYLE_FLAT and the result\r
- * is non-flat non-transparent buttons. Therefore TBSTYLE_LIST does\r
- * *not* imply TBSTYLE_FLAT as documented. (GA 8/2001)\r
- *\r
* This code was audited for completeness against the documented features\r
* of Comctl32.dll version 6.0 on Mar. 14, 2004, by Robert Shearman.\r
* \r
* setparnt.exe, setrows.exe, toolwnd.exe.\r
* - Microsoft's controlspy examples.\r
* - Charles Petzold's 'Programming Windows': gadgets.exe\r
+ *\r
+ * Differences between MSDN and actual native control operation:\r
+ * 1. MSDN says: "TBSTYLE_LIST: Creates a flat toolbar with button text\r
+ * to the right of the bitmap. Otherwise, this style is\r
+ * identical to TBSTYLE_FLAT."\r
+ * As implemented by both v4.71 and v5.80 of the native COMCTL32.DLL\r
+ * you can create a TBSTYLE_LIST without TBSTYLE_FLAT and the result\r
+ * is non-flat non-transparent buttons. Therefore TBSTYLE_LIST does\r
+ * *not* imply TBSTYLE_FLAT as documented. (GA 8/2001)\r
+ *\r
*/\r
\r
#include <stdarg.h>\r
\r
typedef struct\r
{\r
- DWORD dwStructSize; /* size of TBBUTTON struct */\r
- INT nHeight; /* height of the toolbar */\r
- INT nWidth; /* width of the toolbar */\r
+ DWORD dwStructSize; /* size of TBBUTTON struct */\r
+ INT nHeight; /* height of the toolbar */\r
+ INT nWidth; /* width of the toolbar */\r
RECT client_rect;\r
RECT rcBound; /* bounding rectangle */\r
INT nButtonHeight;\r
INT iListGap; /* default gap between text and image for toolbar with list style */\r
HFONT hDefaultFont;\r
HFONT hFont; /* text font */\r
- HIMAGELIST himlInt; /* image list created internally */\r
+ HIMAGELIST himlInt; /* image list created internally */\r
PIMLENTRY *himlDef; /* default image list array */\r
INT cimlDef; /* default image list array count */\r
PIMLENTRY *himlHot; /* hot image list array */\r
BOOL bDragOutSent; /* has TBN_DRAGOUT notification been sent for this drag? */\r
BOOL bUnicode; /* Notifications are ASCII (FALSE) or Unicode (TRUE)? */\r
BOOL bCaptured; /* mouse captured? */\r
- DWORD dwStyle; /* regular toolbar style */\r
- DWORD dwExStyle; /* extended toolbar style */\r
- DWORD dwDTFlags; /* DrawText flags */\r
+ DWORD dwStyle; /* regular toolbar style */\r
+ DWORD dwExStyle; /* extended toolbar style */\r
+ DWORD dwDTFlags; /* DrawText flags */\r
\r
COLORREF clrInsertMark; /* insert mark color */\r
COLORREF clrBtnHighlight; /* color for Flat Separator */\r
newcolor = (infoPtr->clrBtnShadow == CLR_DEFAULT) ?\r
comctl32_color.clrBtnShadow : infoPtr->clrBtnShadow;\r
oldcolor = SetBkColor (hdc, newcolor);\r
- ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
+ ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
\r
myrect.left = myrect.right;\r
myrect.right = myrect.left + 1;\r
newcolor = (infoPtr->clrBtnHighlight == CLR_DEFAULT) ?\r
comctl32_color.clrBtnHighlight : infoPtr->clrBtnHighlight;\r
SetBkColor (hdc, newcolor);\r
- ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
+ ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
\r
SetBkColor (hdc, oldcolor);\r
}\r
newcolor = (infoPtr->clrBtnShadow == CLR_DEFAULT) ?\r
comctl32_color.clrBtnShadow : infoPtr->clrBtnShadow;\r
oldcolor = SetBkColor (hdc, newcolor);\r
- ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
+ ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
\r
myrect.top = myrect.bottom;\r
myrect.bottom = myrect.top + 1;\r
newcolor = (infoPtr->clrBtnHighlight == CLR_DEFAULT) ?\r
comctl32_color.clrBtnHighlight : infoPtr->clrBtnHighlight;\r
SetBkColor (hdc, newcolor);\r
- ExtTextOutA (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
+ ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &myrect, 0, 0, 0);\r
\r
SetBkColor (hdc, oldcolor);\r
}\r
COLORREF oldclr;\r
\r
oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack);\r
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, 0);\r
if (hasDropDownArrow)\r
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0);\r
+ ExtTextOutW(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0);\r
SetBkColor(hdc, oldclr);\r
}\r
}\r
/* copy the bitmap before adding it so that the user's bitmap\r
* doesn't get modified.\r
*/\r
- GetObjectA ((HBITMAP)lpAddBmp->nID, sizeof(BITMAP), (LPVOID)&bmp);\r
+ GetObjectW ((HBITMAP)lpAddBmp->nID, sizeof(BITMAP), (LPVOID)&bmp);\r
\r
hdcImage = CreateCompatibleDC(0);\r
hdcBitmap = CreateCompatibleDC(0);\r
switch (lpAddBmp->nID)\r
{\r
case IDB_STD_SMALL_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_STD_SMALL));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_STD_SMALL));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
break;\r
\r
case IDB_STD_LARGE_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_STD_LARGE));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_STD_LARGE));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
break;\r
\r
case IDB_VIEW_SMALL_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_VIEW_SMALL));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_VIEW_SMALL));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
break;\r
\r
case IDB_VIEW_LARGE_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_VIEW_LARGE));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_VIEW_LARGE));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
break;\r
\r
case IDB_HIST_SMALL_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_HIST_SMALL));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_HIST_SMALL));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
break;\r
\r
case IDB_HIST_LARGE_COLOR:\r
- hbmLoad = LoadBitmapA (COMCTL32_hModule,\r
- MAKEINTRESOURCEA(IDB_HIST_LARGE));\r
+ hbmLoad = LoadBitmapW (COMCTL32_hModule,\r
+ MAKEINTRESOURCEW(IDB_HIST_LARGE));\r
nIndex = ImageList_AddMasked (himlDef,\r
hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
}\r
else\r
{\r
- hbmLoad = LoadBitmapA (lpAddBmp->hInst, (LPSTR)lpAddBmp->nID);\r
+ hbmLoad = LoadBitmapW (lpAddBmp->hInst, (LPWSTR)lpAddBmp->nID);\r
nIndex = ImageList_AddMasked (himlDef, hbmLoad, comctl32_color.clrBtnFace);\r
DeleteObject (hbmLoad);\r
}\r
INT len;\r
TRACE("adding string from resource!\n");\r
\r
- len = LoadStringA ((HINSTANCE)wParam, (UINT)lParam,\r
- szString, 256);\r
+ len = LoadStringA ((HINSTANCE)wParam, (UINT)lParam, szString, sizeof(szString));\r
\r
TRACE("len=%d \"%s\"\n", len, szString);\r
nIndex = infoPtr->nNumStrings;\r
return MAKELONG((WORD)infoPtr->nButtonWidth,\r
(WORD)infoPtr->nButtonHeight);\r
else\r
- return MAKELONG(8,7);\r
+ return MAKELONG(23,22);\r
}\r
\r
\r
/* copy the bitmap before adding it so that the user's bitmap\r
* doesn't get modified.\r
*/\r
- GetObjectA (hBitmap, sizeof(BITMAP), (LPVOID)&bmp);\r
+ GetObjectW (hBitmap, sizeof(BITMAP), (LPVOID)&bmp);\r
\r
hdcImage = CreateCompatibleDC(0);\r
hdcBitmap = CreateCompatibleDC(0);\r
res = ERROR_FILE_NOT_FOUND;\r
if (!res)\r
{\r
- nmtbr.pData = HeapAlloc(GetProcessHeap(), 0, dwSize);\r
+ nmtbr.pData = Alloc(dwSize);\r
nmtbr.cbData = (UINT)dwSize;\r
if (!nmtbr.pData) res = ERROR_OUTOFMEMORY;\r
}\r
if (infoPtr->nNumButtons > 0) ret = TRUE;\r
}\r
}\r
- HeapFree(GetProcessHeap(), 0, nmtbr.pData);\r
+ Free (nmtbr.pData);\r
RegCloseKey(hkey);\r
\r
return ret;\r
static LRESULT\r
TOOLBAR_SaveRestoreA (HWND hwnd, WPARAM wParam, LPTBSAVEPARAMSA lpSave)\r
{\r
+ LPWSTR pszValueName = 0, pszSubKey = 0;\r
TBSAVEPARAMSW SaveW;\r
+ LRESULT result = 0;\r
int len;\r
\r
if (lpSave == NULL) return 0;\r
\r
- SaveW.hkr = lpSave->hkr;\r
-\r
len = MultiByteToWideChar(CP_ACP, 0, lpSave->pszSubKey, -1, NULL, 0);\r
- SaveW.pszSubKey = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));\r
- MultiByteToWideChar(CP_ACP, 0, lpSave->pszSubKey, -1, (LPWSTR)SaveW.pszSubKey, len);\r
+ pszSubKey = Alloc(len * sizeof(WCHAR));\r
+ if (pszSubKey) goto exit;\r
+ MultiByteToWideChar(CP_ACP, 0, lpSave->pszSubKey, -1, pszSubKey, len);\r
\r
len = MultiByteToWideChar(CP_ACP, 0, lpSave->pszValueName, -1, NULL, 0);\r
- SaveW.pszValueName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));\r
- MultiByteToWideChar(CP_ACP, 0, lpSave->pszValueName, -1, (LPWSTR)SaveW.pszValueName, len);\r
+ pszValueName = Alloc(len * sizeof(WCHAR));\r
+ if (!pszValueName) goto exit;\r
+ MultiByteToWideChar(CP_ACP, 0, lpSave->pszValueName, -1, pszValueName, len);\r
+\r
+ SaveW.pszValueName = pszValueName;\r
+ SaveW.pszSubKey = pszSubKey;\r
+ SaveW.hkr = lpSave->hkr;\r
+ result = TOOLBAR_SaveRestoreW(hwnd, wParam, &SaveW);\r
+\r
+exit:\r
+ Free (pszValueName);\r
+ Free (pszSubKey);\r
\r
- return TOOLBAR_SaveRestoreW(hwnd, wParam, &SaveW);\r
+ return result;\r
}\r
\r
\r
{\r
TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);\r
DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
- LOGFONTA logFont;\r
+ LOGFONTW logFont;\r
\r
TRACE("hwnd = %p\n", hwnd);\r
\r
infoPtr->bUnicode = infoPtr->hwndNotify && \r
(NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, (LPARAM)NF_REQUERY));\r
\r
- SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);\r
- infoPtr->hFont = infoPtr->hDefaultFont = CreateFontIndirectA (&logFont);\r
+ SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);\r
+ infoPtr->hFont = infoPtr->hDefaultFont = CreateFontIndirectW (&logFont);\r
\r
if (dwStyle & TBSTYLE_TOOLTIPS) {\r
/* Create tooltip control */\r
infoPtr->hwndToolTip =\r
- CreateWindowExA (0, TOOLTIPS_CLASSA, NULL, 0,\r
+ CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, 0,\r
CW_USEDEFAULT, CW_USEDEFAULT,\r
CW_USEDEFAULT, CW_USEDEFAULT,\r
hwnd, 0, 0, 0);\r
DestroyWindow (infoPtr->hwndToolTip);\r
\r
/* delete temporary buffer for tooltip text */\r
- HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText);\r
+ Free (infoPtr->pszTooltipText);\r
\r
/* delete button data */\r
if (infoPtr->buttons)\r
\r
if (nHit >= 0)\r
TOOLBAR_LButtonDown (hwnd, wParam, lParam);\r
- else if (GetWindowLongA (hwnd, GWL_STYLE) & CCS_ADJUSTABLE)\r
+ else if (GetWindowLongW (hwnd, GWL_STYLE) & CCS_ADJUSTABLE)\r
TOOLBAR_Customize (hwnd);\r
\r
return 0;\r
/* native control does:\r
* Get a lot of colors and brushes\r
* WM_NOTIFYFORMAT\r
- * SystemParametersInfoA(0x1f, 0x3c, adr1, 0)\r
- * CreateFontIndirectA(adr1)\r
+ * SystemParametersInfoW(0x1f, 0x3c, adr1, 0)\r
+ * CreateFontIndirectW(adr1)\r
* CreateBitmap(0x27, 0x24, 1, 1, 0)\r
* hdc = GetDC(toolbar)\r
* GetSystemMetrics(0x48)\r
- * fnt2=CreateFontA(0xe, 0, 0, 0, 0x190, 0, 0, 0, 0, 2,\r
+ * fnt2=CreateFontW(0xe, 0, 0, 0, 0x190, 0, 0, 0, 0, 2,\r
* 0, 0, 0, 0, "MARLETT")\r
* oldfnt = SelectObject(hdc, fnt2)\r
- * GetCharWidthA(hdc, 0x36, 0x36, adr2)\r
- * GetTextMetricsA(hdc, adr3)\r
+ * GetCharWidthW(hdc, 0x36, 0x36, adr2)\r
+ * GetTextMetricsW(hdc, adr3)\r
* SelectObject(hdc, oldfnt)\r
* DeleteObject(fnt2)\r
* ReleaseDC(hdc)\r
* InvalidateRect(toolbar, 0, 1)\r
- * SetWindowLongA(toolbar, 0, addr)\r
- * SetWindowLongA(toolbar, -16, xxx) **sometimes**\r
+ * SetWindowLongW(toolbar, 0, addr)\r
+ * SetWindowLongW(toolbar, -16, xxx) **sometimes**\r
* WM_STYLECHANGING\r
* CallWinEx old new\r
* ie 1 0x56000a4c 0x46000a4c 0x56008a4d\r
\r
TRACE("button index = %d\n", index);\r
\r
- HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText);\r
+ Free (infoPtr->pszTooltipText);\r
infoPtr->pszTooltipText = NULL;\r
\r
if (index < 0)\r
/* need to allocate temporary buffer in infoPtr as there\r
* isn't enough space in buffer passed to us by the\r
* tooltip control */\r
- infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));\r
+ infoPtr->pszTooltipText = Alloc((len+1)*sizeof(WCHAR));\r
if (infoPtr->pszTooltipText)\r
{\r
memcpy(infoPtr->pszTooltipText, tbgit.pszText, (len+1)*sizeof(WCHAR));\r
/* need to allocate temporary buffer in infoPtr as there\r
* isn't enough space in buffer passed to us by the\r
* tooltip control */\r
- infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));\r
+ infoPtr->pszTooltipText = Alloc((len+1)*sizeof(WCHAR));\r
if (infoPtr->pszTooltipText)\r
{\r
MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, len+1, infoPtr->pszTooltipText, (len+1)*sizeof(WCHAR));\r
/* need to allocate temporary buffer in infoPtr as there\r
* isn't enough space in buffer passed to us by the\r
* tooltip control */\r
- infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));\r
+ infoPtr->pszTooltipText = Alloc((len+1)*sizeof(WCHAR));\r
if (infoPtr->pszTooltipText)\r
{\r
memcpy(infoPtr->pszTooltipText, pszText, (len+1)*sizeof(WCHAR));\r
* License along with this library; if not, write to the Free Software\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
+ * NOTES\r
+ *\r
* This code was audited for completeness against the documented features\r
* of Comctl32.dll version 6.0 on Sep. 08, 2004, by Robert Shearman.\r
* \r
\r
if (infoPtr->nMaxTipWidth > -1)\r
uFlags |= DT_WORDBREAK;\r
- if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX)\r
+ if (GetWindowLongW (hwnd, GWL_STYLE) & TTS_NOPREFIX)\r
uFlags |= DT_NOPREFIX;\r
GetClientRect (hwnd, &rc);\r
\r
else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKW) {\r
INT max_len = (ttnmdi.lpszText == &ttnmdi.szText[0]) ? \r
sizeof(ttnmdi.szText)/sizeof(ttnmdi.szText[0]) : INFOTIPSIZE-1;\r
- strncpyW(infoPtr->szTipText, ttnmdi.lpszText, max_len);\r
+ lstrcpynW(infoPtr->szTipText, ttnmdi.lpszText, max_len);\r
if (ttnmdi.uFlags & TTF_DI_SETITEM) {\r
INT len = max(strlenW(ttnmdi.lpszText), max_len);\r
toolPtr->hinst = 0;\r
rect.top = rect.bottom - size.cy;\r
}\r
\r
- AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE),\r
- FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE));\r
+ AdjustWindowRectEx (&rect, GetWindowLongW (hwnd, GWL_STYLE),\r
+ FALSE, GetWindowLongW (hwnd, GWL_EXSTYLE));\r
\r
if (style & TTS_BALLOON)\r
{\r
rect.right = rect.left + size.cx;\r
rect.bottom = rect.top + size.cy;\r
\r
- AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE),\r
- FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE));\r
+ AdjustWindowRectEx (&rect, GetWindowLongW (hwnd, GWL_STYLE),\r
+ FALSE, GetWindowLongW (hwnd, GWL_EXSTYLE));\r
\r
if (GetWindowLongW(hwnd, GWL_STYLE) & TTS_BALLOON)\r
{\r
if (nTool == -1)\r
return -1;\r
\r
- if (!(GetWindowLongA (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) {\r
+ if (!(GetWindowLongW (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) {\r
if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER)))\r
return -1;\r
}\r
static LRESULT\r
TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)\r
{\r
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);\r
- DWORD dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE);\r
+ DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
+ DWORD dwExStyle = GetWindowLongW (hwnd, GWL_EXSTYLE);\r
\r
dwStyle &= 0x0000FFFF;\r
dwStyle |= (WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS);\r
* window region, therefore it is useless to us in balloon mode */\r
if (dwStyle & TTS_BALLOON) dwStyle &= ~WS_BORDER;\r
\r
- SetWindowLongA (hwnd, GWL_STYLE, dwStyle);\r
+ SetWindowLongW (hwnd, GWL_STYLE, dwStyle);\r
\r
dwExStyle |= WS_EX_TOOLWINDOW;\r
- SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle);\r
+ SetWindowLongW (hwnd, GWL_EXSTYLE, dwExStyle);\r
\r
return TRUE;\r
}\r
* License along with this library; if not, write to the Free Software\r
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
*\r
+ * NOTES\r
+ *\r
* Note that TREEVIEW_INFO * and HTREEITEM are the same thing.\r
*\r
* Note2: All items always! have valid (allocated) pszText field.\r
return DPA_GetPtrIndex(infoPtr->items, handle);\r
}\r
\r
+/* Checks if item has changed and needs to be redrawn */\r
+static inline BOOL item_changed (TREEVIEW_ITEM *tiOld, TREEVIEW_ITEM *tiNew, LPTVITEMEXW tvChange)\r
+{\r
+ /* Number of children has changed */\r
+ if ((tvChange->mask & TVIF_CHILDREN) && (tiOld->cChildren != tiNew->cChildren))\r
+ return TRUE;\r
+\r
+ /* Image has changed and it's not a callback */\r
+ if ((tvChange->mask & TVIF_IMAGE) && (tiOld->iImage != tiNew->iImage) &&\r
+ tiNew->iImage != I_IMAGECALLBACK)\r
+ return TRUE;\r
+\r
+ /* Selected image has changed and it's not a callback */\r
+ if ((tvChange->mask & TVIF_SELECTEDIMAGE) && (tiOld->iSelectedImage != tiNew->iSelectedImage) &&\r
+ tiNew->iSelectedImage != I_IMAGECALLBACK)\r
+ return TRUE;\r
+\r
+ /* Text has changed and it's not a callback */\r
+ if ((tvChange->mask & TVIF_TEXT) && (tiOld->pszText != tiNew->pszText) &&\r
+ tiNew->pszText != LPSTR_TEXTCALLBACKW)\r
+ return TRUE;\r
+\r
+ /* Indent has changed */\r
+ if ((tvChange->mask & TVIF_INTEGRAL) && (tiOld->iIntegral != tiNew->iIntegral))\r
+ return TRUE;\r
+\r
+ /* Item state has changed */\r
+ if ((tvChange->mask & TVIF_STATE) && ((tiOld->state ^ tiNew->state) & tvChange->stateMask ))\r
+ return TRUE;\r
+\r
+ return FALSE;\r
+}\r
+\r
/***************************************************************************\r
* This method checks that handle is an item for this tree.\r
*/\r
tvItem->state = item->state;\r
tvItem->stateMask = 0;\r
tvItem->iImage = item->iImage;\r
- tvItem->iImage = item->iImage;\r
tvItem->iSelectedImage = item->iSelectedImage;\r
tvItem->cChildren = item->cChildren;\r
tvItem->lParam = item->lParam;\r
\r
static BOOL\r
TREEVIEW_SendCustomDrawItemNotify(TREEVIEW_INFO *infoPtr, HDC hdc,\r
- TREEVIEW_ITEM *wineItem, UINT uItemDrawState)\r
+ TREEVIEW_ITEM *wineItem, UINT uItemDrawState,\r
+ NMTVCUSTOMDRAW *nmcdhdr)\r
{\r
HWND hwnd = infoPtr->hwnd;\r
- NMTVCUSTOMDRAW nmcdhdr;\r
LPNMCUSTOMDRAW nmcd;\r
DWORD dwDrawStage, dwItemSpec;\r
UINT uItemState;\r
if (wineItem == infoPtr->hotItem)\r
uItemState |= CDIS_HOT;\r
\r
- nmcd = &nmcdhdr.nmcd;\r
+ nmcd = &nmcdhdr->nmcd;\r
nmcd->hdr.hwndFrom = hwnd;\r
nmcd->hdr.idFrom = GetWindowLongPtrW(hwnd, GWLP_ID);\r
nmcd->hdr.code = NM_CUSTOMDRAW;\r
nmcd->dwItemSpec = dwItemSpec;\r
nmcd->uItemState = uItemState;\r
nmcd->lItemlParam = wineItem->lParam;\r
- nmcdhdr.clrText = infoPtr->clrText;\r
- nmcdhdr.clrTextBk = infoPtr->clrBk;\r
- nmcdhdr.iLevel = wineItem->iLevel;\r
+ nmcdhdr->iLevel = wineItem->iLevel;\r
\r
TRACE("drawstage:%lx hdc:%p item:%lx, itemstate:%x, lItemlParam:%lx\n",\r
nmcd->dwDrawStage, nmcd->hdc, nmcd->dwItemSpec,\r
\r
retval = TREEVIEW_SendRealNotify(infoPtr,\r
(WPARAM)nmcd->hdr.idFrom,\r
- (LPARAM)&nmcdhdr);\r
+ (LPARAM)nmcdhdr);\r
\r
- infoPtr->clrText = nmcdhdr.clrText;\r
- infoPtr->clrBk = nmcdhdr.clrTextBk;\r
return (BOOL)retval;\r
}\r
\r
if (!newItem)\r
return NULL;\r
\r
+ newItem->iImage = -1;\r
+ newItem->iSelectedImage = -1;\r
+\r
if (DPA_InsertPtr(infoPtr->items, INT_MAX, newItem) == -1)\r
{\r
Free(newItem);\r
/* The refresh updates everything, but we can't wait until then. */\r
TREEVIEW_ComputeItemInternalMetrics(infoPtr, wineItem);\r
\r
- /* if any of the items values changed, redraw the item */\r
- if(memcmp(&originalItem, wineItem, sizeof(TREEVIEW_ITEM)) ||\r
- (tvItem->stateMask & TVIS_BOLD))\r
+ /* if any of the item's values changed and it's not a callback, redraw the item */\r
+ if (item_changed(&originalItem, wineItem, tvItem))\r
{\r
if (tvItem->mask & TVIF_INTEGRAL)\r
{\r
BOOL lar = ((infoPtr->dwStyle\r
& (TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS))\r
> TVS_LINESATROOT);\r
+ HBRUSH hbr, hbrOld;\r
\r
if (!lar && item->iLevel == 0)\r
return;\r
\r
+ hbr = CreateSolidBrush(infoPtr->clrBk);\r
+ hbrOld = SelectObject(hdc, hbr);\r
+ \r
centerx = (item->linesOffset + item->stateOffset) / 2;\r
centery = (item->rect.top + item->rect.bottom) / 2;\r
\r
\r
HPEN hNewPen = CreatePen(PS_SOLID, 0, infoPtr->clrLine);\r
HPEN hOldPen = SelectObject(hdc, hNewPen);\r
- HBRUSH hbr = CreateSolidBrush(infoPtr->clrBk);\r
- HBRUSH hbrOld = SelectObject(hdc, hbr);\r
\r
Rectangle(hdc, centerx - rectsize - 1, centery - rectsize - 1,\r
centerx + rectsize + 2, centery + rectsize + 2);\r
\r
- SelectObject(hdc, hbrOld);\r
- DeleteObject(hbr);\r
-\r
SelectObject(hdc, hOldPen);\r
DeleteObject(hNewPen);\r
\r
}\r
}\r
}\r
+ SelectObject(hdc, hbrOld);\r
+ DeleteObject(hbr);\r
}\r
\r
static void\r
{\r
INT cditem;\r
HFONT hOldFont;\r
+ COLORREF oldTextColor, oldTextBkColor;\r
int centery;\r
-\r
- hOldFont = SelectObject(hdc, TREEVIEW_FontForItem(infoPtr, wineItem));\r
+ BOOL inFocus = (GetFocus() == infoPtr->hwnd);\r
+ NMTVCUSTOMDRAW nmcdhdr;\r
\r
TREEVIEW_UpdateDispInfo(infoPtr, wineItem, CALLBACK_MASK_ALL);\r
\r
+ /* - If item is drop target or it is selected and window is in focus -\r
+ * use blue background (COLOR_HIGHLIGHT).\r
+ * - If item is selected, window is not in focus, but it has style\r
+ * TVS_SHOWSELALWAYS - use grey background (COLOR_BTNFACE)\r
+ * - Otherwise - use background color\r
+ */\r
+ if ((wineItem->state & TVIS_DROPHILITED) || ((wineItem == infoPtr->focusedItem) && !(wineItem->state & TVIS_SELECTED)) ||\r
+ ((wineItem->state & TVIS_SELECTED) && (!infoPtr->focusedItem) &&\r
+ (inFocus || (infoPtr->dwStyle & TVS_SHOWSELALWAYS))))\r
+ {\r
+ if ((wineItem->state & TVIS_DROPHILITED) || inFocus)\r
+ {\r
+ nmcdhdr.clrTextBk = GetSysColor(COLOR_HIGHLIGHT);\r
+ nmcdhdr.clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);\r
+ }\r
+ else\r
+ {\r
+ nmcdhdr.clrTextBk = GetSysColor(COLOR_BTNFACE);\r
+ if (infoPtr->clrText == -1)\r
+ nmcdhdr.clrText = GetSysColor(COLOR_WINDOWTEXT);\r
+ else\r
+ nmcdhdr.clrText = infoPtr->clrText;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ nmcdhdr.clrTextBk = infoPtr->clrBk;\r
+ if ((infoPtr->dwStyle & TVS_TRACKSELECT) && (wineItem == infoPtr->hotItem))\r
+ nmcdhdr.clrText = comctl32_color.clrHighlight;\r
+ else if (infoPtr->clrText == -1)\r
+ nmcdhdr.clrText = GetSysColor(COLOR_WINDOWTEXT);\r
+ else\r
+ nmcdhdr.clrText = infoPtr->clrText;\r
+ }\r
+\r
+ hOldFont = SelectObject(hdc, TREEVIEW_FontForItem(infoPtr, wineItem));\r
+\r
/* The custom draw handler can query the text rectangle,\r
* so get ready. */\r
/* should already be known, set to 0 when changed */\r
if (infoPtr->cdmode & CDRF_NOTIFYITEMDRAW)\r
{\r
cditem = TREEVIEW_SendCustomDrawItemNotify\r
- (infoPtr, hdc, wineItem, CDDS_ITEMPREPAINT);\r
+ (infoPtr, hdc, wineItem, CDDS_ITEMPREPAINT, &nmcdhdr);\r
TRACE("prepaint:cditem-app returns 0x%x\n", cditem);\r
\r
if (cditem & CDRF_SKIPDEFAULT)\r
\r
TREEVIEW_DrawItemLines(infoPtr, hdc, wineItem);\r
\r
+ /* Set colors. Custom draw handler can change these so we do this after it. */\r
+ oldTextColor = SetTextColor(hdc, nmcdhdr.clrText);\r
+ oldTextBkColor = SetBkColor(hdc, nmcdhdr.clrTextBk);\r
+\r
centery = (wineItem->rect.top + wineItem->rect.bottom) / 2;\r
\r
/*\r
* non-selected image.\r
*/\r
\r
- if ((wineItem->state & TVIS_SELECTED) && (wineItem->iSelectedImage))\r
+ if ((wineItem->state & TVIS_SELECTED) && (wineItem->iSelectedImage >= 0))\r
{\r
/* The item is currently selected */\r
imageIndex = wineItem->iSelectedImage;\r
{\r
if (wineItem->pszText)\r
{\r
- COLORREF oldTextColor = 0;\r
- INT oldBkMode;\r
- HBRUSH hbrBk = 0;\r
- BOOL inFocus = (GetFocus() == infoPtr->hwnd);\r
RECT rcText;\r
\r
- oldBkMode = SetBkMode(hdc, TRANSPARENT);\r
-\r
- /* - If item is drop target or it is selected and window is in focus -\r
- * use blue background (COLOR_HIGHLIGHT).\r
- * - If item is selected, window is not in focus, but it has style\r
- * TVS_SHOWSELALWAYS - use grey background (COLOR_BTNFACE)\r
- * - Otherwise - don't fill background\r
- */\r
- if ((wineItem->state & TVIS_DROPHILITED) || ((wineItem == infoPtr->focusedItem) && !(wineItem->state & TVIS_SELECTED)) ||\r
- ((wineItem->state & TVIS_SELECTED) && (!infoPtr->focusedItem) &&\r
- (inFocus || (infoPtr->dwStyle & TVS_SHOWSELALWAYS))))\r
- {\r
- if ((wineItem->state & TVIS_DROPHILITED) || inFocus)\r
- {\r
- hbrBk = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));\r
- oldTextColor =\r
- SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));\r
- }\r
- else\r
- {\r
- hbrBk = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));\r
-\r
- if (infoPtr->clrText == -1)\r
- oldTextColor =\r
- SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));\r
- else\r
- oldTextColor = SetTextColor(hdc, infoPtr->clrText);\r
- }\r
- }\r
- else\r
- {\r
- if ((infoPtr->dwStyle & TVS_TRACKSELECT) && (wineItem == infoPtr->hotItem))\r
- oldTextColor = SetTextColor(hdc, comctl32_color.clrHighlight);\r
- else if (infoPtr->clrText == -1)\r
- oldTextColor =\r
- SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));\r
- else\r
- oldTextColor = SetTextColor(hdc, infoPtr->clrText);\r
- }\r
-\r
rcText.top = wineItem->rect.top;\r
rcText.bottom = wineItem->rect.bottom;\r
rcText.left = wineItem->textOffset;\r
rcText.right = rcText.left + wineItem->textWidth + 4;\r
\r
- if (hbrBk)\r
- {\r
- FillRect(hdc, &rcText, hbrBk);\r
- DeleteObject(hbrBk);\r
- }\r
+ TRACE("drawing text %s at (%ld,%ld)-(%ld,%ld)\n",\r
+ debugstr_w(wineItem->pszText),\r
+ rcText.left, rcText.top, rcText.right, rcText.bottom);\r
\r
+ /* Draw it */\r
+ ExtTextOutW(hdc, rcText.left + 2, rcText.top + 1,\r
+ ETO_CLIPPED | ETO_OPAQUE,\r
+ &rcText,\r
+ wineItem->pszText,\r
+ lstrlenW(wineItem->pszText),\r
+ NULL);\r
+ \r
/* Draw the box around the selected item */\r
if ((wineItem == infoPtr->selectedItem) && inFocus)\r
{\r
DrawFocusRect(hdc,&rcText);\r
}\r
\r
- InflateRect(&rcText, -2, -1); /* allow for the focus rect */\r
-\r
- TRACE("drawing text %s at (%ld,%ld)-(%ld,%ld)\n",\r
- debugstr_w(wineItem->pszText),\r
- rcText.left, rcText.top, rcText.right, rcText.bottom);\r
-\r
- /* Draw it */\r
- DrawTextW(hdc,\r
- wineItem->pszText,\r
- lstrlenW(wineItem->pszText),\r
- &rcText,\r
- DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);\r
-\r
- /* Restore the hdc state */\r
- SetTextColor(hdc, oldTextColor);\r
-\r
- if (oldBkMode != TRANSPARENT)\r
- SetBkMode(hdc, oldBkMode);\r
}\r
}\r
\r
if (cditem & CDRF_NOTIFYPOSTPAINT)\r
{\r
cditem = TREEVIEW_SendCustomDrawItemNotify\r
- (infoPtr, hdc, wineItem, CDDS_ITEMPOSTPAINT);\r
+ (infoPtr, hdc, wineItem, CDDS_ITEMPOSTPAINT, &nmcdhdr);\r
TRACE("postpaint:cditem-app returns 0x%x\n", cditem);\r
}\r
\r
+ /* Restore the hdc state */\r
+ SetTextColor(hdc, oldTextColor);\r
+ SetBkColor(hdc, oldTextBkColor);\r
SelectObject(hdc, hOldFont);\r
}\r
\r
BITMAP bitmap;\r
hbitmap = GetCurrentObject(hdc, OBJ_BITMAP);\r
if (!hbitmap) return 0;\r
- GetObjectA(hbitmap, sizeof(BITMAP), &bitmap);\r
+ GetObjectW(hbitmap, sizeof(BITMAP), &bitmap);\r
rc.left = 0; rc.top = 0;\r
rc.right = bitmap.bmWidth;\r
rc.bottom = bitmap.bmHeight;\r
\r
while (1)\r
{\r
- if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE | PM_NOYIELD))\r
+ if (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE | PM_NOYIELD))\r
{\r
if (msg.message == WM_MOUSEMOVE)\r
{\r
break;\r
}\r
\r
- DispatchMessageA(&msg);\r
+ DispatchMessageW(&msg);\r
}\r
\r
if (GetCapture() != infoPtr->hwnd)\r
\r
TREEVIEW_EnsureVisible(infoPtr, infoPtr->selectedItem, FALSE);\r
\r
+ if (prevSelect)\r
+ TREEVIEW_Invalidate(infoPtr, prevSelect);\r
+ if (newSelect)\r
+ TREEVIEW_Invalidate(infoPtr, newSelect);\r
+\r
TREEVIEW_SendTreeviewNotify(infoPtr,\r
TVN_SELCHANGEDW,\r
cause,\r
TVIF_HANDLE | TVIF_STATE | TVIF_PARAM,\r
prevSelect,\r
newSelect);\r
- TREEVIEW_Invalidate(infoPtr, prevSelect);\r
- TREEVIEW_Invalidate(infoPtr, newSelect);\r
break;\r
\r
case TVGN_DROPHILITE:\r
break;\r
\r
case TVGN_FIRSTVISIBLE:\r
- TREEVIEW_EnsureVisible(infoPtr, newSelect, FALSE);\r
- TREEVIEW_SetFirstVisible(infoPtr, newSelect, TRUE);\r
- TREEVIEW_Invalidate(infoPtr, NULL);\r
+ if (newSelect != NULL)\r
+ {\r
+ TREEVIEW_EnsureVisible(infoPtr, newSelect, FALSE);\r
+ TREEVIEW_SetFirstVisible(infoPtr, newSelect, TRUE);\r
+ TREEVIEW_Invalidate(infoPtr, NULL);\r
+ }\r
break;\r
}\r
\r
idx=infoPtr->root->firstChild;\r
}\r
do {\r
+ /* At the end point, sort out wrapping */\r
if (idx == NULL) {\r
+\r
+ /* If endidx is null, stop at the last item (ie top to bottom) */\r
if (endidx == NULL)\r
break;\r
+\r
+ /* Otherwise, start again at the very beginning */\r
idx=infoPtr->root->firstChild;\r
+\r
+ /* But if we are stopping on the first child, end now! */\r
+ if (idx == endidx) break;\r
}\r
\r
/* get item */\r
}\r
return 0;\r
}\r
- return DefWindowProcA(infoPtr->hwnd, WM_NOTIFY, wParam, lParam);\r
+ return DefWindowProcW(infoPtr->hwnd, WM_NOTIFY, wParam, lParam);\r
}\r
\r
static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND hwndFrom, UINT nCommand)\r
TVC_UNKNOWN);\r
}\r
\r
- TREEVIEW_SendSimpleNotify(infoPtr, NM_SETFOCUS);\r
TREEVIEW_Invalidate(infoPtr, infoPtr->selectedItem);\r
+ TREEVIEW_SendSimpleNotify(infoPtr, NM_SETFOCUS);\r
return 0;\r
}\r
\r
{\r
TRACE("\n");\r
\r
- TREEVIEW_SendSimpleNotify(infoPtr, NM_KILLFOCUS);\r
TREEVIEW_Invalidate(infoPtr, infoPtr->selectedItem);\r
+ UpdateWindow(infoPtr->hwnd);\r
+ TREEVIEW_SendSimpleNotify(infoPtr, NM_KILLFOCUS);\r
return 0;\r
}\r
\r
if ((uMsg >= WM_USER) && (uMsg < WM_APP))\r
TRACE("Unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam);\r
def:\r
- return DefWindowProcA(hwnd, uMsg, wParam, lParam);\r
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);\r
}\r
}\r
\r
VOID\r
TREEVIEW_Register(void)\r
{\r
- WNDCLASSA wndClass;\r
+ WNDCLASSW wndClass;\r
\r
TRACE("\n");\r
\r
- ZeroMemory(&wndClass, sizeof(WNDCLASSA));\r
+ ZeroMemory(&wndClass, sizeof(WNDCLASSW));\r
wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;\r
wndClass.lpfnWndProc = TREEVIEW_WindowProc;\r
wndClass.cbClsExtra = 0;\r
wndClass.cbWndExtra = sizeof(TREEVIEW_INFO *);\r
\r
- wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);\r
+ wndClass.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW);\r
wndClass.hbrBackground = 0;\r
- wndClass.lpszClassName = WC_TREEVIEWA;\r
+ wndClass.lpszClassName = WC_TREEVIEWW;\r
\r
- RegisterClassA(&wndClass);\r
+ RegisterClassW(&wndClass);\r
}\r
\r
\r
VOID\r
TREEVIEW_Unregister(void)\r
{\r
- UnregisterClassA(WC_TREEVIEWA, NULL);\r
+ UnregisterClassW(WC_TREEVIEWW, NULL);\r
}\r
\r
\r
{\r
HWND Self; /* Handle to this up-down control */\r
HWND Notify; /* Handle to the parent window */\r
+ DWORD dwStyle; /* The GWL_STYLE for this window */\r
UINT AccelCount; /* Number of elements in AccelVect */\r
UDACCEL* AccelVect; /* Vector containing AccelCount elements */\r
INT AccelIndex; /* Current accel index, -1 if not accel'ing */\r
\r
static const WCHAR BUDDY_UPDOWN_HWND[] = { 'b', 'u', 'd', 'd', 'y', 'U', 'p', 'D', 'o', 'w', 'n', 'H', 'W', 'N', 'D', 0 };\r
static const WCHAR BUDDY_SUPERCLASS_WNDPROC[] = { 'b', 'u', 'd', 'd', 'y', 'S', 'u', 'p', 'p', 'e', 'r', \r
- 'C', 'l', 'a', 's', 's', 'W', 'n', 'd', 'P', 'r', 'o', 'c', 0 };\r
+ 'C', 'l', 'a', 's', 's', 'W', 'n', 'd', 'P', 'r', 'o', 'c', 0 };\r
static void UPDOWN_DoAction (UPDOWN_INFO *infoPtr, int delta, int action);\r
\r
/***********************************************************************\r
{\r
/* check if we can do the modification first */\r
if(!UPDOWN_InBounds (infoPtr, infoPtr->CurVal+delta)) {\r
- if (GetWindowLongW (infoPtr->Self, GWL_STYLE) & UDS_WRAP) {\r
+ if (infoPtr->dwStyle & UDS_WRAP) {\r
delta += (delta < 0 ? -1 : 1) *\r
(infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1) *\r
(infoPtr->MinVal - infoPtr->MaxVal) +\r
*/\r
static BOOL UPDOWN_HasBuddyBorder(UPDOWN_INFO* infoPtr)\r
{\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
-\r
- return ( ((dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)) != 0) &&\r
+ return ( ((infoPtr->dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)) != 0) &&\r
UPDOWN_IsBuddyEdit(infoPtr) );\r
}\r
\r
*/\r
static void UPDOWN_GetArrowRect (UPDOWN_INFO* infoPtr, RECT *rect, int arrow)\r
{\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
-\r
GetClientRect (infoPtr->Self, rect);\r
\r
/*\r
* border.\r
*/\r
if (UPDOWN_HasBuddyBorder(infoPtr)) {\r
- if (dwStyle & UDS_ALIGNLEFT)\r
+ if (infoPtr->dwStyle & UDS_ALIGNLEFT)\r
rect->left += DEFAULT_BUDDYBORDER;\r
else\r
rect->right -= DEFAULT_BUDDYBORDER;\r
\r
/* now figure out if we need a space away from the buddy */\r
if ( IsWindow(infoPtr->Buddy) ) {\r
- if (dwStyle & UDS_ALIGNLEFT) rect->right -= DEFAULT_BUDDYSPACER;\r
+ if (infoPtr->dwStyle & UDS_ALIGNLEFT) rect->right -= DEFAULT_BUDDYSPACER;\r
else rect->left += DEFAULT_BUDDYSPACER;\r
}\r
\r
* separation between the buttons will lay. We make sure that we\r
* round the uneven numbers by adding 1.\r
*/\r
- if (dwStyle & UDS_HORZ) {\r
+ if (infoPtr->dwStyle & UDS_HORZ) {\r
int len = rect->right - rect->left + 1; /* compute the width */\r
if (arrow & FLAG_INCR)\r
rect->left = rect->left + len/2;\r
WCHAR txt[20], sep, *src, *dst;\r
int newVal;\r
\r
- if (!IsWindow(infoPtr->Buddy))\r
+ if (!((infoPtr->dwStyle & UDS_SETBUDDYINT) && IsWindow(infoPtr->Buddy)))\r
return FALSE;\r
\r
/*if the buddy is a list window, we must set curr index */\r
if(newVal < 0) return FALSE;\r
} else {\r
/* we have a regular window, so will get the text */\r
- if (!GetWindowTextW(infoPtr->Buddy, txt, COUNT_OF(txt))) return FALSE;\r
+ /* note that a zero-length string is a legitimate value for 'txt',\r
+ * and ought to result in a successful conversion to '0'. */\r
+ if (GetWindowTextW(infoPtr->Buddy, txt, COUNT_OF(txt)) < 0)\r
+ return FALSE;\r
\r
sep = UPDOWN_GetThousandSep();\r
\r
WCHAR txt[20];\r
int len;\r
\r
- if (!IsWindow(infoPtr->Buddy)) return FALSE;\r
+ if (!((infoPtr->dwStyle & UDS_SETBUDDYINT) && IsWindow(infoPtr->Buddy))) \r
+ return FALSE;\r
\r
TRACE("set new value(%d) to buddy.\n", infoPtr->CurVal);\r
\r
\r
\r
/* Do thousands separation if necessary */\r
- if (!(GetWindowLongW (infoPtr->Self, GWL_STYLE) & UDS_NOTHOUSANDS) && (len > 3)) {\r
+ if (!(infoPtr->dwStyle & UDS_NOTHOUSANDS) && (len > 3)) {\r
WCHAR tmp[COUNT_OF(txt)], *src = tmp, *dst = txt;\r
WCHAR sep = UPDOWN_GetThousandSep();\r
int start = len % 3;\r
*/\r
static LRESULT UPDOWN_Draw (UPDOWN_INFO *infoPtr, HDC hdc)\r
{\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
BOOL pressed, hot;\r
RECT rect;\r
\r
GetClientRect(infoPtr->Self, &rect);\r
DrawEdge(hdc, &rect, EDGE_SUNKEN,\r
BF_BOTTOM | BF_TOP |\r
- (dwStyle & UDS_ALIGNLEFT ? BF_LEFT : BF_RIGHT));\r
+ (infoPtr->dwStyle & UDS_ALIGNLEFT ? BF_LEFT : BF_RIGHT));\r
}\r
\r
/* Draw the incr button */\r
pressed = (infoPtr->Flags & FLAG_PRESSED) && (infoPtr->Flags & FLAG_INCR);\r
hot = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN);\r
DrawFrameControl(hdc, &rect, DFC_SCROLL,\r
- (dwStyle & UDS_HORZ ? DFCS_SCROLLRIGHT : DFCS_SCROLLUP) |\r
- ((dwStyle & UDS_HOTTRACK) && hot ? DFCS_HOT : 0) |\r
+ (infoPtr->dwStyle & UDS_HORZ ? DFCS_SCROLLRIGHT : DFCS_SCROLLUP) |\r
+ ((infoPtr->dwStyle & UDS_HOTTRACK) && hot ? DFCS_HOT : 0) |\r
(pressed ? DFCS_PUSHED : 0) |\r
- (dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );\r
+ (infoPtr->dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );\r
\r
/* Draw the decr button */\r
UPDOWN_GetArrowRect(infoPtr, &rect, FLAG_DECR);\r
pressed = (infoPtr->Flags & FLAG_PRESSED) && (infoPtr->Flags & FLAG_DECR);\r
hot = (infoPtr->Flags & FLAG_DECR) && (infoPtr->Flags & FLAG_MOUSEIN);\r
DrawFrameControl(hdc, &rect, DFC_SCROLL,\r
- (dwStyle & UDS_HORZ ? DFCS_SCROLLLEFT : DFCS_SCROLLDOWN) |\r
- ((dwStyle & UDS_HOTTRACK) && hot ? DFCS_HOT : 0) |\r
+ (infoPtr->dwStyle & UDS_HORZ ? DFCS_SCROLLLEFT : DFCS_SCROLLDOWN) |\r
+ ((infoPtr->dwStyle & UDS_HOTTRACK) && hot ? DFCS_HOT : 0) |\r
(pressed ? DFCS_PUSHED : 0) |\r
- (dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );\r
+ (infoPtr->dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );\r
\r
return 0;\r
}\r
{\r
static const WCHAR editW[] = { 'E', 'd', 'i', 't', 0 };\r
static const WCHAR listboxW[] = { 'L', 'i', 's', 't', 'b', 'o', 'x', 0 };\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
RECT budRect; /* new coord for the buddy */\r
int x, width; /* new x position and width for the up-down */\r
WNDPROC baseWndProc;\r
infoPtr->BuddyType = BUDDY_TYPE_LISTBOX;\r
}\r
\r
- if(dwStyle & UDS_ARROWKEYS){\r
+ if(infoPtr->dwStyle & UDS_ARROWKEYS){\r
/* Note that I don't clear the BUDDY_SUPERCLASS_WNDPROC property\r
when we reset the upDown ctrl buddy to another buddy because it is not\r
good to break the window proc chain. */\r
MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Buddy), (POINT *)(&budRect.left), 2);\r
\r
/* now do the positioning */\r
- if (dwStyle & UDS_ALIGNLEFT) {\r
+ if (infoPtr->dwStyle & UDS_ALIGNLEFT) {\r
x = budRect.left;\r
budRect.left += DEFAULT_WIDTH + DEFAULT_XSEP;\r
- } else if (dwStyle & UDS_ALIGNRIGHT) {\r
+ } else if (infoPtr->dwStyle & UDS_ALIGNRIGHT) {\r
budRect.right -= DEFAULT_WIDTH + DEFAULT_XSEP;\r
x = budRect.right+DEFAULT_XSEP;\r
} else {\r
* We nudge the control or change its size to overlap.\r
*/\r
if (UPDOWN_HasBuddyBorder(infoPtr)) {\r
- if(dwStyle & UDS_ALIGNLEFT)\r
+ if(infoPtr->dwStyle & UDS_ALIGNLEFT)\r
width += DEFAULT_BUDDYBORDER;\r
else\r
x -= DEFAULT_BUDDYBORDER;\r
*/\r
static void UPDOWN_DoAction (UPDOWN_INFO *infoPtr, int delta, int action)\r
{\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
NM_UPDOWN ni;\r
\r
TRACE("%d by %d\n", action, delta);\r
TRACE("new %d, delta: %d\n", infoPtr->CurVal, ni.iDelta);\r
\r
/* Now take care about our buddy */\r
- if (dwStyle & UDS_SETBUDDYINT) UPDOWN_SetBuddyInt (infoPtr);\r
+ UPDOWN_SetBuddyInt (infoPtr);\r
}\r
}\r
\r
/* Also, notify it. This message is sent in any case. */\r
- SendMessageW( infoPtr->Notify, dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL,\r
+ SendMessageW( infoPtr->Notify, (infoPtr->dwStyle & UDS_HORZ) ? WM_HSCROLL : WM_VSCROLL,\r
MAKELONG(SB_THUMBPOSITION, infoPtr->CurVal), (LPARAM)infoPtr->Self);\r
}\r
\r
*/\r
static void UPDOWN_HandleMouseEvent (UPDOWN_INFO *infoPtr, UINT msg, INT x, INT y)\r
{\r
- DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE);\r
POINT pt = { x, y };\r
RECT rect;\r
int temp, arrow;\r
if (infoPtr->Flags & FLAG_ARROW) {\r
\r
/* Update the CurVal if necessary */\r
- if (dwStyle & UDS_SETBUDDYINT) UPDOWN_GetBuddyInt (infoPtr);\r
+ UPDOWN_GetBuddyInt (infoPtr);\r
\r
/* Set up the correct flags */\r
infoPtr->Flags |= FLAG_PRESSED;\r
static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr (hwnd);\r
- DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);\r
int temp;\r
\r
TRACE("hwnd=%p msg=%04x wparam=%08x lparam=%08lx\n", hwnd, message, wParam, lParam);\r
switch(message)\r
{\r
case WM_CREATE:\r
- SetWindowLongW (hwnd, GWL_STYLE, dwStyle & ~WS_BORDER);\r
infoPtr = (UPDOWN_INFO*)Alloc (sizeof(UPDOWN_INFO));\r
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);\r
\r
/* initialize the info struct */\r
infoPtr->Self = hwnd;\r
- infoPtr->Notify = ((LPCREATESTRUCTA)lParam)->hwndParent;\r
+ infoPtr->Notify = ((LPCREATESTRUCTW)lParam)->hwndParent;\r
+ infoPtr->dwStyle = ((LPCREATESTRUCTW)lParam)->style;\r
infoPtr->AccelCount = 0;\r
infoPtr->AccelVect = 0;\r
infoPtr->AccelIndex = -1;\r
infoPtr->Buddy = 0; /* No buddy window yet */\r
infoPtr->Flags = 0; /* And no flags */\r
\r
+ SetWindowLongW (hwnd, GWL_STYLE, infoPtr->dwStyle & ~WS_BORDER);\r
+\r
/* Do we pick the buddy win ourselves? */\r
- if (dwStyle & UDS_AUTOBUDDY)\r
+ if (infoPtr->dwStyle & UDS_AUTOBUDDY)\r
UPDOWN_SetBuddy (infoPtr, GetWindow (hwnd, GW_HWNDPREV));\r
\r
TRACE("UpDown Ctrl creation, hwnd=%p\n", hwnd);\r
break;\r
\r
case WM_ENABLE:\r
- if (dwStyle & WS_DISABLED) UPDOWN_CancelMode (infoPtr);\r
+ infoPtr->dwStyle &= ~WS_DISABLED;\r
+ infoPtr->dwStyle |= (wParam ? 0 : WS_DISABLED);\r
+ if (infoPtr->dwStyle & WS_DISABLED) UPDOWN_CancelMode (infoPtr);\r
InvalidateRect (infoPtr->Self, NULL, FALSE);\r
break;\r
\r
+ case WM_STYLECHANGED:\r
+ if (wParam == GWL_STYLE) {\r
+ infoPtr->dwStyle = ((LPSTYLESTRUCT)lParam)->styleNew;\r
+ InvalidateRect (infoPtr->Self, NULL, FALSE);\r
+ }\r
+ break;\r
+\r
case WM_TIMER:\r
/* is this the auto-press timer? */\r
if(wParam == TIMER_AUTOPRESS) {\r
(infoPtr->Flags & FLAG_ARROW) ) {\r
\r
SendMessageW( infoPtr->Notify,\r
- dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL,\r
+ (infoPtr->dwStyle & UDS_HORZ) ? WM_HSCROLL : WM_VSCROLL,\r
MAKELONG(SB_ENDSCROLL, infoPtr->CurVal),\r
(LPARAM)hwnd);\r
if (UPDOWN_IsBuddyEdit(infoPtr))\r
break;\r
\r
case WM_KEYDOWN:\r
- if((dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(infoPtr))\r
+ if((infoPtr->dwStyle & UDS_ARROWKEYS) && UPDOWN_IsEnabled(infoPtr))\r
return UPDOWN_KeyPressed(infoPtr, (int)wParam);\r
break;\r
\r
}\r
wParam = infoPtr->CurVal;\r
infoPtr->CurVal = temp;\r
- if(dwStyle & UDS_SETBUDDYINT) UPDOWN_SetBuddyInt (infoPtr);\r
+ UPDOWN_SetBuddyInt (infoPtr);\r
return wParam; /* return prev value */\r
\r
case UDM_GETRANGE:\r
}\r
temp = infoPtr->CurVal; /* save prev value */\r
infoPtr->CurVal = (int)lParam; /* set the new value */\r
- if(dwStyle & UDS_SETBUDDYINT) UPDOWN_SetBuddyInt (infoPtr);\r
+ UPDOWN_SetBuddyInt (infoPtr);\r
return temp; /* return prev value */\r
\r
case UDM_GETUNICODEFORMAT:\r
LPARAM lParam;
} NMLVGETINFOTIPW, *LPNMLVGETINFOTIPW;
#endif /* _WIN32_IE >= 0x0400 */
+typedef struct tagNMLVODSTATECHANGE
+{
+ NMHDR hdr;
+ int iFrom;
+ int iTo;
+ UINT uNewState;
+ UINT uOldState;
+} NMLVODSTATECHANGE, *LPNMLVODSTATECHANGE;
+#define PNM_ODSTATECHANGE LPNMLVODSTATECHANGE
+#define LPNM_ODSTATECHANGE LPNMLVODSTATECHANGE
+#define NM_ODSTATECHANGE NMLVODSTATECHANGE
typedef struct tagNMTVCUSTOMDRAW {
NMCUSTOMDRAW nmcd;
COLORREF clrText;