2 * Common controls functions
4 * Copyright 1997 Dimitrie O. Paun
5 * Copyright 1998,2000 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #define NO_SHLWAPI_STREAM
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
36 extern void ANIMATE_Register(void);
37 extern void ANIMATE_Unregister(void);
38 extern void COMBOEX_Register(void);
39 extern void COMBOEX_Unregister(void);
40 extern void DATETIME_Register(void);
41 extern void DATETIME_Unregister(void);
42 extern void FLATSB_Register(void);
43 extern void FLATSB_Unregister(void);
44 extern void HEADER_Register(void);
45 extern void HEADER_Unregister(void);
46 extern void HOTKEY_Register(void);
47 extern void HOTKEY_Unregister(void);
48 extern void IPADDRESS_Register(void);
49 extern void IPADDRESS_Unregister(void);
50 extern void LISTVIEW_Register(void);
51 extern void LISTVIEW_Unregister(void);
52 extern void MONTHCAL_Register(void);
53 extern void MONTHCAL_Unregister(void);
54 extern void NATIVEFONT_Register(void);
55 extern void NATIVEFONT_Unregister(void);
56 extern void PAGER_Register(void);
57 extern void PAGER_Unregister(void);
58 extern void PROGRESS_Register(void);
59 extern void PROGRESS_Unregister(void);
60 extern void REBAR_Register(void);
61 extern void REBAR_Unregister(void);
62 extern void STATUS_Register(void);
63 extern void STATUS_Unregister(void);
64 extern void TAB_Register(void);
65 extern void TAB_Unregister(void);
66 extern void TOOLBAR_Register(void);
67 extern void TOOLBAR_Unregister(void);
68 extern void TOOLTIPS_Register(void);
69 extern void TOOLTIPS_Unregister(void);
70 extern void TRACKBAR_Register(void);
71 extern void TRACKBAR_Unregister(void);
72 extern void TREEVIEW_Register(void);
73 extern void TREEVIEW_Unregister(void);
74 extern void UPDOWN_Register(void);
75 extern void UPDOWN_Unregister(void);
78 HANDLE COMCTL32_hHeap = (HANDLE)NULL;
79 LPSTR COMCTL32_aSubclass = (LPSTR)NULL;
80 HMODULE COMCTL32_hModule = 0;
81 LANGID COMCTL32_uiLang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
82 HBRUSH COMCTL32_hPattern55AABrush = (HANDLE)NULL;
83 COMCTL32_SysColor comctl32_color;
85 static HBITMAP COMCTL32_hPattern55AABitmap = (HANDLE)NULL;
87 static const WORD wPattern55AA[] =
89 0x5555, 0xaaaa, 0x5555, 0xaaaa,
90 0x5555, 0xaaaa, 0x5555, 0xaaaa
94 /***********************************************************************
95 * COMCTL32_LibMain [Internal] Initializes the internal 'COMCTL32.DLL'.
98 * hinstDLL [I] handle to the 'dlls' instance
100 * lpvReserved [I] reserverd, must be NULL
108 COMCTL32_LibMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
110 TRACE("%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
113 case DLL_PROCESS_ATTACH:
114 COMCTL32_hModule = (HMODULE)hinstDLL;
116 /* create private heap */
117 COMCTL32_hHeap = HeapCreate (0, 0x10000, 0);
118 TRACE("Heap created: 0x%x\n", COMCTL32_hHeap);
120 /* add global subclassing atom (used by 'tooltip' and 'updown') */
121 COMCTL32_aSubclass = (LPSTR)(DWORD)GlobalAddAtomA ("CC32SubclassInfo");
122 TRACE("Subclassing atom added: %p\n", COMCTL32_aSubclass);
124 /* create local pattern brush */
125 COMCTL32_hPattern55AABitmap = CreateBitmap (8, 8, 1, 1, wPattern55AA);
126 COMCTL32_hPattern55AABrush = CreatePatternBrush (COMCTL32_hPattern55AABitmap);
128 /* Get all the colors at DLL load */
129 COMCTL32_RefreshSysColors();
131 /* register all Win95 common control classes */
136 LISTVIEW_Register ();
137 PROGRESS_Register ();
141 TOOLTIPS_Register ();
142 TRACKBAR_Register ();
143 TREEVIEW_Register ();
147 case DLL_PROCESS_DETACH:
148 /* unregister all common control classes */
149 ANIMATE_Unregister ();
150 COMBOEX_Unregister ();
151 DATETIME_Unregister ();
152 FLATSB_Unregister ();
153 HEADER_Unregister ();
154 HOTKEY_Unregister ();
155 IPADDRESS_Unregister ();
156 LISTVIEW_Unregister ();
157 MONTHCAL_Unregister ();
158 NATIVEFONT_Unregister ();
160 PROGRESS_Unregister ();
162 STATUS_Unregister ();
164 TOOLBAR_Unregister ();
165 TOOLTIPS_Unregister ();
166 TRACKBAR_Unregister ();
167 TREEVIEW_Unregister ();
168 UPDOWN_Unregister ();
170 /* delete local pattern brush */
171 DeleteObject (COMCTL32_hPattern55AABrush);
172 COMCTL32_hPattern55AABrush = (HANDLE)NULL;
173 DeleteObject (COMCTL32_hPattern55AABitmap);
174 COMCTL32_hPattern55AABitmap = (HANDLE)NULL;
176 /* delete global subclassing atom */
177 GlobalDeleteAtom (LOWORD(COMCTL32_aSubclass));
178 TRACE("Subclassing atom deleted: %p\n", COMCTL32_aSubclass);
179 COMCTL32_aSubclass = (LPSTR)NULL;
181 /* destroy private heap */
182 HeapDestroy (COMCTL32_hHeap);
183 TRACE("Heap destroyed: 0x%x\n", COMCTL32_hHeap);
184 COMCTL32_hHeap = (HANDLE)NULL;
192 /***********************************************************************
193 * MenuHelp [COMCTL32.2]
196 * uMsg [I] message (WM_MENUSELECT) (see NOTES)
197 * wParam [I] wParam of the message uMsg
198 * lParam [I] lParam of the message uMsg
199 * hMainMenu [I] handle to the application's main menu
200 * hInst [I] handle to the module that contains string resources
201 * hwndStatus [I] handle to the status bar window
202 * lpwIDs [I] pointer to an array of integers (see NOTES)
208 * The official documentation is incomplete!
209 * This is the correct documentation:
212 * MenuHelp() does NOT handle WM_COMMAND messages! It only handles
213 * WM_MENUSELECT messages.
216 * (will be written ...)
220 MenuHelp (UINT uMsg, WPARAM wParam, LPARAM lParam, HMENU hMainMenu,
221 HINSTANCE hInst, HWND hwndStatus, LPUINT lpwIDs)
225 if (!IsWindow (hwndStatus))
230 TRACE("WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
233 if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {
234 /* menu was closed */
235 TRACE("menu was closed!\n");
236 SendMessageA (hwndStatus, SB_SIMPLE, FALSE, 0);
239 /* menu item was selected */
240 if (HIWORD(wParam) & MF_POPUP)
241 uMenuID = (UINT)*(lpwIDs+1);
243 uMenuID = (UINT)LOWORD(wParam);
244 TRACE("uMenuID = %u\n", uMenuID);
249 if (!LoadStringA (hInst, uMenuID, szText, 256))
252 SendMessageA (hwndStatus, SB_SETTEXTA,
253 255 | SBT_NOBORDERS, (LPARAM)szText);
254 SendMessageA (hwndStatus, SB_SIMPLE, TRUE, 0);
260 TRACE("WM_COMMAND wParam=0x%X lParam=0x%lX\n",
262 /* WM_COMMAND is not invalid since it is documented
263 * in the windows api reference. So don't output
264 * any FIXME for WM_COMMAND
266 WARN("We don't care about the WM_COMMAND\n");
270 FIXME("Invalid Message 0x%x!\n", uMsg);
276 /***********************************************************************
277 * ShowHideMenuCtl [COMCTL32.3]
279 * Shows or hides controls and updates the corresponding menu item.
282 * hwnd [I] handle to the client window.
283 * uFlags [I] menu command id.
284 * lpInfo [I] pointer to an array of integers. (See NOTES.)
291 * The official documentation is incomplete!
292 * This is the correct documentation:
295 * Handle to the window that contains the menu and controls.
298 * Identifier of the menu item to receive or loose a check mark.
301 * The array of integers contains pairs of values. BOTH values of
302 * the first pair must be the handles to the application's main menu.
303 * Each subsequent pair consists of a menu id and control id.
307 ShowHideMenuCtl (HWND hwnd, UINT uFlags, LPINT lpInfo)
311 TRACE("%x, %x, %p\n", hwnd, uFlags, lpInfo);
316 if (!(lpInfo[0]) || !(lpInfo[1]))
319 /* search for control */
320 lpMenuId = &lpInfo[2];
321 while (*lpMenuId != uFlags)
324 if (GetMenuState (lpInfo[1], uFlags, MF_BYCOMMAND) & MFS_CHECKED) {
325 /* uncheck menu item */
326 CheckMenuItem (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_UNCHECKED);
330 SetWindowPos (GetDlgItem (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
334 /* check menu item */
335 CheckMenuItem (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_CHECKED);
339 SetWindowPos (GetDlgItem (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
347 /***********************************************************************
348 * GetEffectiveClientRect [COMCTL32.4]
351 * hwnd [I] handle to the client window.
352 * lpRect [O] pointer to the rectangle of the client window
353 * lpInfo [I] pointer to an array of integers (see NOTES)
359 * The official documentation is incomplete!
360 * This is the correct documentation:
363 * (will be written...)
367 GetEffectiveClientRect (HWND hwnd, LPRECT lpRect, LPINT lpInfo)
373 TRACE("(0x%08lx 0x%08lx 0x%08lx)\n",
374 (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
376 GetClientRect (hwnd, lpRect);
384 hwndCtrl = GetDlgItem (hwnd, *lpRun);
385 if (GetWindowLongA (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {
386 TRACE("control id 0x%x\n", *lpRun);
387 GetWindowRect (hwndCtrl, &rcCtrl);
388 MapWindowPoints ((HWND)0, hwnd, (LPPOINT)&rcCtrl, 2);
389 SubtractRect (lpRect, lpRect, &rcCtrl);
396 /***********************************************************************
397 * DrawStatusTextW [COMCTL32.28]
399 * Draws text with borders, like in a status bar.
402 * hdc [I] handle to the window's display context
403 * lprc [I] pointer to a rectangle
404 * text [I] pointer to the text
405 * style [I] drawing style
411 * The style variable can have one of the following values:
412 * (will be written ...)
416 DrawStatusTextW (HDC hdc, LPRECT lprc, LPCWSTR text, UINT style)
419 UINT border = BDR_SUNKENOUTER;
421 if (style & SBT_POPOUT)
422 border = BDR_RAISEDOUTER;
423 else if (style & SBT_NOBORDERS)
426 DrawEdge (hdc, &r, border, BF_RECT|BF_ADJUST|BF_MIDDLE);
430 int oldbkmode = SetBkMode (hdc, TRANSPARENT);
432 DrawTextW (hdc, text, lstrlenW(text),
433 &r, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
434 if (oldbkmode != TRANSPARENT)
435 SetBkMode(hdc, oldbkmode);
440 /***********************************************************************
441 * DrawStatusText [COMCTL32.27]
442 * DrawStatusTextA [COMCTL32.5]
444 * Draws text with borders, like in a status bar.
447 * hdc [I] handle to the window's display context
448 * lprc [I] pointer to a rectangle
449 * text [I] pointer to the text
450 * style [I] drawing style
457 DrawStatusTextA (HDC hdc, LPRECT lprc, LPCSTR text, UINT style)
463 if ( (len = MultiByteToWideChar( CP_ACP, 0, text, -1, NULL, 0 )) ) {
464 if ( (textW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )) )
465 MultiByteToWideChar( CP_ACP, 0, text, -1, textW, len );
468 DrawStatusTextW( hdc, lprc, textW, style );
469 HeapFree( GetProcessHeap(), 0, textW );
473 /***********************************************************************
474 * CreateStatusWindow [COMCTL32.21]
475 * CreateStatusWindowA [COMCTL32.6]
477 * Creates a status bar
480 * style [I] window style
481 * text [I] pointer to the window text
482 * parent [I] handle to the parent window
483 * wid [I] control id of the status bar
486 * Success: handle to the status window
491 CreateStatusWindowA (INT style, LPCSTR text, HWND parent, UINT wid)
493 return CreateWindowA(STATUSCLASSNAMEA, text, style,
494 CW_USEDEFAULT, CW_USEDEFAULT,
495 CW_USEDEFAULT, CW_USEDEFAULT,
500 /***********************************************************************
501 * CreateStatusWindowW [COMCTL32.22] Creates a status bar control
504 * style [I] window style
505 * text [I] pointer to the window text
506 * parent [I] handle to the parent window
507 * wid [I] control id of the status bar
510 * Success: handle to the status window
515 CreateStatusWindowW (INT style, LPCWSTR text, HWND parent, UINT wid)
517 return CreateWindowW(STATUSCLASSNAMEW, text, style,
518 CW_USEDEFAULT, CW_USEDEFAULT,
519 CW_USEDEFAULT, CW_USEDEFAULT,
524 /***********************************************************************
525 * CreateUpDownControl [COMCTL32.16] Creates an up-down control
528 * style [I] window styles
529 * x [I] horizontal position of the control
530 * y [I] vertical position of the control
531 * cx [I] with of the control
532 * cy [I] height of the control
533 * parent [I] handle to the parent window
534 * id [I] the control's identifier
535 * inst [I] handle to the application's module instance
536 * buddy [I] handle to the buddy window, can be NULL
537 * maxVal [I] upper limit of the control
538 * minVal [I] lower limit of the control
539 * curVal [I] current value of the control
542 * Success: handle to the updown control
547 CreateUpDownControl (DWORD style, INT x, INT y, INT cx, INT cy,
548 HWND parent, INT id, HINSTANCE inst,
549 HWND buddy, INT maxVal, INT minVal, INT curVal)
552 CreateWindowA (UPDOWN_CLASSA, 0, style, x, y, cx, cy,
553 parent, id, inst, 0);
555 SendMessageA (hUD, UDM_SETBUDDY, buddy, 0);
556 SendMessageA (hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));
557 SendMessageA (hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));
564 /***********************************************************************
565 * InitCommonControls [COMCTL32.17]
567 * Registers the common controls.
576 * This function is just a dummy.
577 * The Win95 controls are registered at the DLL's initialization.
578 * To register other controls InitCommonControlsEx() must be used.
582 InitCommonControls (void)
587 /***********************************************************************
588 * InitCommonControlsEx [COMCTL32.84]
590 * Registers the common controls.
593 * lpInitCtrls [I] pointer to an INITCOMMONCONTROLS structure.
600 * Only the additional common controls are registered by this function.
601 * The Win95 controls are registered at the DLL's initialization.
605 InitCommonControlsEx (LPINITCOMMONCONTROLSEX lpInitCtrls)
612 if (lpInitCtrls->dwSize != sizeof(INITCOMMONCONTROLSEX))
615 TRACE("(0x%08lx)\n", lpInitCtrls->dwICC);
617 for (cCount = 0; cCount < 32; cCount++) {
618 dwMask = 1 << cCount;
619 if (!(lpInitCtrls->dwICC & dwMask))
622 switch (lpInitCtrls->dwICC & dwMask) {
623 /* dummy initialization */
624 case ICC_ANIMATE_CLASS:
625 case ICC_BAR_CLASSES:
626 case ICC_LISTVIEW_CLASSES:
627 case ICC_TREEVIEW_CLASSES:
628 case ICC_TAB_CLASSES:
629 case ICC_UPDOWN_CLASS:
630 case ICC_PROGRESS_CLASS:
631 case ICC_HOTKEY_CLASS:
634 /* advanced classes - not included in Win95 */
635 case ICC_DATE_CLASSES:
636 MONTHCAL_Register ();
637 DATETIME_Register ();
640 case ICC_USEREX_CLASSES:
644 case ICC_COOL_CLASSES:
648 case ICC_INTERNET_CLASSES:
649 IPADDRESS_Register ();
652 case ICC_PAGESCROLLER_CLASS:
656 case ICC_NATIVEFNTCTL_CLASS:
657 NATIVEFONT_Register ();
661 FIXME("Unknown class! dwICC=0x%lX\n", dwMask);
670 /***********************************************************************
671 * CreateToolbarEx [COMCTL32.23] Creates a tool bar window
689 * Success: handle to the tool bar control
694 CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps,
695 HINSTANCE hBMInst, UINT wBMID, LPCTBBUTTON lpButtons,
696 INT iNumButtons, INT dxButton, INT dyButton,
697 INT dxBitmap, INT dyBitmap, UINT uStructSize)
701 /* If not position is specified then put it at the top */
702 if ((style & CCS_BOTTOM) == 0) {
707 CreateWindowExA (0, TOOLBARCLASSNAMEA, "", style|WS_CHILD, 0, 0, 0, 0,
708 hwnd, (HMENU)wID, 0, NULL);
712 SendMessageA (hwndTB, TB_BUTTONSTRUCTSIZE,
713 (WPARAM)uStructSize, 0);
715 /* set bitmap and button size */
716 /*If CreateToolbarEx receives 0, windows sets default values*/
721 SendMessageA (hwndTB, TB_SETBITMAPSIZE, 0,
722 MAKELPARAM((WORD)dxBitmap, (WORD)dyBitmap));
728 SendMessageA (hwndTB, TB_SETBUTTONSIZE, 0,
729 MAKELPARAM((WORD)dxButton, (WORD)dyButton));
735 tbab.hInst = hBMInst;
738 SendMessageA (hwndTB, TB_ADDBITMAP,
739 (WPARAM)nBitmaps, (LPARAM)&tbab);
743 SendMessageA (hwndTB, TB_ADDBUTTONSA,
744 (WPARAM)iNumButtons, (LPARAM)lpButtons);
751 /***********************************************************************
752 * CreateMappedBitmap [COMCTL32.8]
762 * Success: handle to the new bitmap
767 CreateMappedBitmap (HINSTANCE hInstance, INT idBitmap, UINT wFlags,
768 LPCOLORMAP lpColorMap, INT iNumMaps)
772 LPBITMAPINFOHEADER lpBitmap, lpBitmapInfo;
773 UINT nSize, nColorTableSize;
774 RGBQUAD *pColorTable;
775 INT iColor, i, iMaps, nWidth, nHeight;
778 LPCOLORMAP sysColorMap;
780 COLORMAP internalColorMap[4] =
781 {{0x000000, 0}, {0x808080, 0}, {0xC0C0C0, 0}, {0xFFFFFF, 0}};
783 /* initialize pointer to colortable and default color table */
786 sysColorMap = lpColorMap;
789 internalColorMap[0].to = GetSysColor (COLOR_BTNTEXT);
790 internalColorMap[1].to = GetSysColor (COLOR_BTNSHADOW);
791 internalColorMap[2].to = GetSysColor (COLOR_BTNFACE);
792 internalColorMap[3].to = GetSysColor (COLOR_BTNHIGHLIGHT);
794 sysColorMap = (LPCOLORMAP)internalColorMap;
797 hRsrc = FindResourceA (hInstance, (LPSTR)idBitmap, RT_BITMAPA);
800 hglb = LoadResource (hInstance, hRsrc);
803 lpBitmap = (LPBITMAPINFOHEADER)LockResource (hglb);
804 if (lpBitmap == NULL)
807 nColorTableSize = (1 << lpBitmap->biBitCount);
808 nSize = lpBitmap->biSize + nColorTableSize * sizeof(RGBQUAD);
809 lpBitmapInfo = (LPBITMAPINFOHEADER)GlobalAlloc (GMEM_FIXED, nSize);
810 if (lpBitmapInfo == NULL)
812 RtlMoveMemory (lpBitmapInfo, lpBitmap, nSize);
814 pColorTable = (RGBQUAD*)(((LPBYTE)lpBitmapInfo)+(UINT)lpBitmapInfo->biSize);
816 for (iColor = 0; iColor < nColorTableSize; iColor++) {
817 for (i = 0; i < iMaps; i++) {
818 cRef = RGB(pColorTable[iColor].rgbRed,
819 pColorTable[iColor].rgbGreen,
820 pColorTable[iColor].rgbBlue);
821 if ( cRef == sysColorMap[i].from) {
823 if (wFlags & CBS_MASKED) {
824 if (sysColorMap[i].to != COLOR_BTNTEXT)
825 pColorTable[iColor] = RGB(255, 255, 255);
829 pColorTable[iColor].rgbBlue = GetBValue(sysColorMap[i].to);
830 pColorTable[iColor].rgbGreen = GetGValue(sysColorMap[i].to);
831 pColorTable[iColor].rgbRed = GetRValue(sysColorMap[i].to);
836 nWidth = (INT)lpBitmapInfo->biWidth;
837 nHeight = (INT)lpBitmapInfo->biHeight;
838 hdcScreen = GetDC ((HWND)0);
839 hbm = CreateCompatibleBitmap (hdcScreen, nWidth, nHeight);
841 HDC hdcDst = CreateCompatibleDC (hdcScreen);
842 HBITMAP hbmOld = SelectObject (hdcDst, hbm);
843 LPBYTE lpBits = (LPBYTE)(lpBitmap + 1);
844 lpBits += (1 << (lpBitmapInfo->biBitCount)) * sizeof(RGBQUAD);
845 StretchDIBits (hdcDst, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight,
846 lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS,
848 SelectObject (hdcDst, hbmOld);
851 ReleaseDC ((HWND)0, hdcScreen);
852 GlobalFree ((HGLOBAL)lpBitmapInfo);
859 /***********************************************************************
860 * CreateToolbar [COMCTL32.7] Creates a tool bar control
873 * Success: handle to the tool bar control
877 * Do not use this functions anymore. Use CreateToolbarEx instead.
881 CreateToolbar (HWND hwnd, DWORD style, UINT wID, INT nBitmaps,
882 HINSTANCE hBMInst, UINT wBMID,
883 LPCOLDTBBUTTON lpButtons,INT iNumButtons)
885 return CreateToolbarEx (hwnd, style | CCS_NODIVIDER, wID, nBitmaps,
886 hBMInst, wBMID, (LPCTBBUTTON)lpButtons,
887 iNumButtons, 0, 0, 0, 0, sizeof (OLDTBBUTTON));
891 /***********************************************************************
892 * DllGetVersion [COMCTL32.25]
894 * Retrieves version information of the 'COMCTL32.DLL'
897 * pdvi [O] pointer to version information structure.
901 * Failure: E_INVALIDARG
904 * Returns version of a comctl32.dll from IE4.01 SP1.
908 COMCTL32_DllGetVersion (DLLVERSIONINFO *pdvi)
910 if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
911 WARN("wrong DLLVERSIONINFO size from app\n");
915 pdvi->dwMajorVersion = COMCTL32_VERSION;
916 pdvi->dwMinorVersion = COMCTL32_VERSION_MINOR;
917 pdvi->dwBuildNumber = 2919;
918 pdvi->dwPlatformID = 6304;
920 TRACE("%lu.%lu.%lu.%lu\n",
921 pdvi->dwMajorVersion, pdvi->dwMinorVersion,
922 pdvi->dwBuildNumber, pdvi->dwPlatformID);
927 /***********************************************************************
928 * DllInstall (COMCTL32.26)
930 HRESULT WINAPI COMCTL32_DllInstall(BOOL bInstall, LPCWSTR cmdline)
932 FIXME("(%s, %s): stub\n", bInstall?"TRUE":"FALSE",
933 debugstr_w(cmdline));
938 /***********************************************************************
939 * _TrackMouseEvent [COMCTL32.91]
941 * Requests notification of mouse events
943 * During mouse tracking WM_MOUSEHOVER or WM_MOUSELEAVE events are posted
944 * to the hwnd specified in the ptme structure. After the event message
945 * is posted to the hwnd, the entry in the queue is removed.
947 * If the current hwnd isn't ptme->hwndTrack the TME_HOVER flag is completely
948 * ignored. The TME_LEAVE flag results in a WM_MOUSELEAVE message being posted
949 * immediately and the TME_LEAVE flag being ignored.
952 * ptme [I,O] pointer to TRACKMOUSEEVENT information structure.
958 * IMPLEMENTATION moved to USER32.TrackMouseEvent
963 _TrackMouseEvent (TRACKMOUSEEVENT *ptme)
965 return TrackMouseEvent (ptme);
968 /*************************************************************************
969 * GetMUILanguage [COMCTL32.39]
971 * FIXME: What's this supposed to do? Apparently some i18n thing.
974 LANGID WINAPI GetMUILanguage (VOID)
976 return COMCTL32_uiLang;
980 /*************************************************************************
981 * InitMUILanguage [COMCTL32.85]
983 * FIXME: What's this supposed to do? Apparently some i18n thing.
987 VOID WINAPI InitMUILanguage (LANGID uiLang)
989 COMCTL32_uiLang = uiLang;
993 /***********************************************************************
994 * COMCTL32_CreateToolTip [NOT AN API]
996 * Creates a tooltip for the control specified in hwnd and does all
997 * necessary setup and notifications.
1000 * hwndOwner [I] Handle to the window that will own the tool tip.
1003 * Success: Handle of tool tip window.
1007 COMCTL32_CreateToolTip(HWND hwndOwner)
1011 hwndToolTip = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, 0,
1012 CW_USEDEFAULT, CW_USEDEFAULT,
1013 CW_USEDEFAULT, CW_USEDEFAULT, hwndOwner,
1016 /* Send NM_TOOLTIPSCREATED notification */
1019 NMTOOLTIPSCREATED nmttc;
1020 /* true owner can be different if hwndOwner is a child window */
1021 HWND hwndTrueOwner = GetWindow(hwndToolTip, GW_OWNER);
1022 nmttc.hdr.hwndFrom = hwndTrueOwner;
1023 nmttc.hdr.idFrom = GetWindowLongA(hwndTrueOwner, GWL_ID);
1024 nmttc.hdr.code = NM_TOOLTIPSCREATED;
1025 nmttc.hwndToolTips = hwndToolTip;
1027 SendMessageA(GetParent(hwndTrueOwner), WM_NOTIFY,
1028 (WPARAM)GetWindowLongA(hwndTrueOwner, GWL_ID),
1036 /***********************************************************************
1037 * COMCTL32_RefreshSysColors [NOT AN API]
1039 * Invoked on any control recognizing a WM_SYSCOLORCHANGE message to
1040 * refresh the color values in the color structure
1049 COMCTL32_RefreshSysColors(void)
1051 comctl32_color.clrBtnHighlight = GetSysColor (COLOR_BTNHIGHLIGHT);
1052 comctl32_color.clrBtnShadow = GetSysColor (COLOR_BTNSHADOW);
1053 comctl32_color.clrBtnText = GetSysColor (COLOR_BTNTEXT);
1054 comctl32_color.clrBtnFace = GetSysColor (COLOR_BTNFACE);
1055 comctl32_color.clrHighlight = GetSysColor (COLOR_HIGHLIGHT);
1056 comctl32_color.clrHighlightText = GetSysColor (COLOR_HIGHLIGHTTEXT);
1057 comctl32_color.clr3dHilight = GetSysColor (COLOR_3DHILIGHT);
1058 comctl32_color.clr3dShadow = GetSysColor (COLOR_3DSHADOW);
1059 comctl32_color.clr3dDkShadow = GetSysColor (COLOR_3DDKSHADOW);
1060 comctl32_color.clr3dFace = GetSysColor (COLOR_3DFACE);
1061 comctl32_color.clrWindow = GetSysColor (COLOR_WINDOW);
1062 comctl32_color.clrWindowText = GetSysColor (COLOR_WINDOWTEXT);
1063 comctl32_color.clrGrayText = GetSysColor (COLOR_GRAYTEXT);
1064 comctl32_color.clrActiveCaption = GetSysColor (COLOR_ACTIVECAPTION);
1065 comctl32_color.clrInfoBk = GetSysColor (COLOR_INFOBK);
1066 comctl32_color.clrInfoText = GetSysColor (COLOR_INFOTEXT);