- Timestamp:
- Nov 19, 1999, 10:22:01 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/combo.cpp
r1781 r1784 1 /* $Id: combo.cpp,v 1.1 5 1999-11-19 17:59:33cbratschi Exp $ */1 /* $Id: combo.cpp,v 1.16 1999-11-19 21:22:01 cbratschi Exp $ */ 2 2 /* 3 3 * Combo controls … … 14 14 - problems with focus handling (Win32 <-> OS/2) 15 15 will be fixed soon 16 - several other bugs 16 17 */ 17 18 … … 30 31 */ 31 32 32 #define CB_GETPTR( hwnd ) ((LPHEADCOMBO)(GetInfoPtr(hwnd)))33 33 #define CB_NOTIFY( lphc, code ) \ 34 34 (SendMessageA( (lphc)->owner, WM_COMMAND, \ … … 38 38 39 39 /* 40 * Drawing globals41 */42 static HBITMAP hComboBmp = 0;43 static UINT CBitHeight, CBitWidth;44 45 /*46 40 * Look and feel dependant "constants" 47 41 */ … … 53 47 54 48 /*********************************************************************** 55 * COMBO_Init56 *57 * Load combo button bitmap.58 */59 static BOOL COMBO_Init()60 {61 HDC hDC;62 63 if( hComboBmp ) return TRUE;64 hDC = CreateCompatibleDC(0);65 if(hDC)66 {67 BOOL bRet = FALSE;68 69 hComboBmp = LoadBitmapA(hInstanceUser32, MAKEINTRESOURCEA(OBM_COMBO));70 if(hComboBmp)71 {72 BITMAP bm;73 HBITMAP hPrevB;74 RECT r;75 76 GetObjectA( hComboBmp, sizeof(bm), &bm );77 CBitHeight = bm.bmHeight;78 CBitWidth = bm.bmWidth;79 80 //TRACE("combo bitmap [%i,%i]\n", CBitWidth, CBitHeight );81 82 hPrevB = SelectObject( hDC, hComboBmp);83 SetRect( &r, 0, 0, CBitWidth, CBitHeight );84 InvertRect( hDC, &r );85 SelectObject( hDC, hPrevB );86 bRet = TRUE;87 }88 DeleteDC( hDC );89 return bRet;90 }91 return FALSE;92 }93 94 /***********************************************************************95 49 * COMBO_NCCreate 96 50 */ … … 99 53 LPHEADCOMBO lphc; 100 54 101 if ( hwnd && COMBO_Init() &&55 if ( hwnd && 102 56 (lphc = (LPHEADCOMBO)HeapAlloc(GetProcessHeap(), 0, sizeof(HEADCOMBO))) ) 103 57 { … … 144 98 if( lphc ) 145 99 { 146 HWND hwnd = lphc->hwndself;147 148 100 //TRACE("[%04x]: freeing storage\n", CB_HWND(lphc)); 149 101 … … 942 894 HDC hDC; 943 895 944 hDC = (wParam) ? (HDC)wParam:BeginPaint( lphc->hwndself,&ps);896 hDC = (wParam) ? (HDC)wParam:BeginPaint(hwnd,&ps); 945 897 946 898 … … 953 905 * DC. 954 906 */ 955 hBkgBrush = COMBO_PrepareColors( lphc->hwndself, lphc,hDC);907 hBkgBrush = COMBO_PrepareColors(hwnd,lphc,hDC); 956 908 957 909 hPrevBrush = SelectObject( hDC, hBkgBrush ); … … 980 932 } 981 933 982 if(!wParam) EndPaint( lphc->hwndself,&ps);934 if(!wParam) EndPaint(hwnd,&ps); 983 935 984 936 return 0; … … 1447 1399 1448 1400 /*********************************************************************** 1449 * COMBO_ ItemOp1401 * COMBO_HandleItem 1450 1402 * 1451 1403 * Fixup an ownerdrawn item operation and pass it up to the combobox owner. 1452 1404 */ 1453 static LRESULT COMBO_ItemOp( LPHEADCOMBO lphc, UINT msg, 1454 WPARAM wParam, LPARAM lParam ) 1455 { 1456 HWND hWnd = lphc->hwndself; 1405 static LRESULT COMBO_HandleItem(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) 1406 { 1407 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1457 1408 1458 1409 //TRACE("[%04x]: ownerdraw op %04x\n", CB_HWND(lphc), msg ); … … 1462 1413 /* two first items are the same in all 4 structs */ 1463 1414 lpIS->CtlType = ODT_COMBOBOX; 1464 lpIS->CtlID = GetWindowLongA( lphc->hwndself,GWL_ID);1415 lpIS->CtlID = GetWindowLongA(hwnd,GWL_ID); 1465 1416 1466 1417 switch( msg ) /* patch window handle */ 1467 1418 { 1468 1419 case WM_DELETEITEM: 1469 lpIS->hwndItem = h Wnd;1420 lpIS->hwndItem = hwnd; 1470 1421 #undef lpIS 1471 1422 break; 1472 1423 case WM_DRAWITEM: 1473 1424 #define lpIS ((LPDRAWITEMSTRUCT)lParam) 1474 lpIS->hwndItem = h Wnd;1425 lpIS->hwndItem = hwnd; 1475 1426 #undef lpIS 1476 1427 break; 1477 1428 case WM_COMPAREITEM: 1478 1429 #define lpIS ((LPCOMPAREITEMSTRUCT)lParam) 1479 lpIS->hwndItem = h Wnd;1430 lpIS->hwndItem = hwnd; 1480 1431 #undef lpIS 1481 1432 break; 1482 1433 } 1483 1434 1484 return SendMessageA( lphc->owner, msg, GetWindowLongA( lphc->hwndself,GWL_ID), lParam );1435 return SendMessageA( lphc->owner, msg, GetWindowLongA(hwnd,GWL_ID), lParam ); 1485 1436 } 1486 1437 … … 1535 1486 } 1536 1487 1488 static LRESULT COMBO_HandleText(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 1489 { 1490 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1491 1492 if ((message == WM_GETTEXTLENGTH) && !(lphc->wState & CBF_EDIT)) 1493 { 1494 int j = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0 ); 1495 1496 if (j == -1) return 0; 1497 return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, j, 0); 1498 } else if( lphc->wState & CBF_EDIT ) 1499 { 1500 lphc->wState |= CBF_NOEDITNOTIFY; 1501 1502 return SendMessageA( lphc->hWndEdit, message, wParam, lParam ); 1503 } else return CB_ERR; 1504 } 1537 1505 1538 1506 /*********************************************************************** … … 1592 1560 if(lphc->hWndLBox && !(lphc->wState & CBF_NORESIZE)) 1593 1561 { 1594 CBCalcPlacement( lphc->hwndself,1562 CBCalcPlacement(hwnd, 1595 1563 lphc, 1596 1564 &lphc->textRect, … … 1629 1597 if ( CB_GETTYPE(lphc) == CBS_SIMPLE) 1630 1598 { 1631 CBCalcPlacement( lphc->hwndself,1599 CBCalcPlacement(hwnd, 1632 1600 lphc, 1633 1601 &lphc->textRect, … … 1654 1622 1655 1623 /*********************************************************************** 1656 * COMBO_SetItemHeight1657 */1658 static LRESULT COMBO_SetItemHeight( LPHEADCOMBO lphc, INT index, INT height )1659 {1660 LRESULT lRet = CB_ERR;1661 1662 if( index == -1 ) /* set text field height */1663 {1664 if( height < 32768 )1665 {1666 lphc->editHeight = height;1667 1668 /*1669 * Redo the layout of the control.1670 */1671 if ( CB_GETTYPE(lphc) == CBS_SIMPLE)1672 {1673 CBCalcPlacement(lphc->hwndself,1674 lphc,1675 &lphc->textRect,1676 &lphc->buttonRect,1677 &lphc->droppedRect);1678 1679 CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );1680 }1681 else1682 {1683 CBForceDummyResize(lphc);1684 }1685 1686 lRet = height;1687 }1688 }1689 else if ( CB_OWNERDRAWN(lphc) ) /* set listbox item height */1690 lRet = SendMessageA( lphc->hWndLBox, LB_SETITEMHEIGHT,1691 (WPARAM)index, (LPARAM)height );1692 return lRet;1693 }1694 1695 /***********************************************************************1696 * COMBO_SelectString1697 */1698 static LRESULT COMBO_SelectString( LPHEADCOMBO lphc, INT start, LPCSTR pText )1699 {1700 INT index = SendMessageA( lphc->hWndLBox, LB_SELECTSTRING,1701 (WPARAM)start, (LPARAM)pText );1702 if( index >= 0 )1703 {1704 if( lphc->wState & CBF_EDIT )1705 CBUpdateEdit( lphc, index );1706 else1707 {1708 InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE);1709 }1710 }1711 return (LRESULT)index;1712 }1713 1714 /***********************************************************************1715 1624 * COMBO_LButtonDown 1716 1625 */ 1717 static void COMBO_LButtonDown( LPHEADCOMBO lphc, LPARAM lParam ) 1718 { 1626 static LRESULT COMBO_LButtonDown(HWND hwnd,WPARAM wParam,LPARAM lParam) 1627 { 1628 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1719 1629 POINT pt; 1720 1630 BOOL bButton; 1721 HWND hWnd = lphc->hwndself; 1631 1632 if(!(lphc->wState & CBF_FOCUSED)) SetFocus(hwnd); 1633 if(!(lphc->wState & CBF_FOCUSED)) return 0; 1722 1634 1723 1635 pt.x = LOWORD(lParam); … … 1735 1647 lphc->wState &= ~CBF_BUTTONDOWN; 1736 1648 CBRollUp( lphc, TRUE, FALSE ); 1737 if( !IsWindow( h Wnd ) ) return;1649 if( !IsWindow( hwnd ) ) return 0; 1738 1650 1739 1651 if( lphc->wState & CBF_CAPTURE ) … … 1749 1661 lphc->wState |= CBF_CAPTURE; 1750 1662 CBDropDown( lphc ); 1751 SetCapture( h Wnd );1663 SetCapture( hwnd ); 1752 1664 } 1753 1665 if( bButton ) CBRepaintButton( lphc ); 1754 1666 } 1667 1668 return 0; 1755 1669 } 1756 1670 … … 1760 1674 * Release capture and stop tracking if needed. 1761 1675 */ 1762 static void COMBO_LButtonUp( LPHEADCOMBO lphc, LPARAM lParam ) 1763 { 1676 static LRESULT COMBO_LButtonUp(HWND hwnd,WPARAM wParam,LPARAM lParam) 1677 { 1678 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1679 1764 1680 if( lphc->wState & CBF_CAPTURE ) 1765 1681 { … … 1780 1696 CBRepaintButton( lphc ); 1781 1697 } 1698 1699 return 0; 1782 1700 } 1783 1701 … … 1788 1706 * pointer goes into the listbox. 1789 1707 */ 1790 static void COMBO_MouseMove( LPHEADCOMBO lphc, WPARAM wParam, LPARAM lParam ) 1791 { 1708 static LRESULT COMBO_MouseMove(HWND hwnd,WPARAM wParam,LPARAM lParam) 1709 { 1710 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1792 1711 POINT pt; 1793 1712 RECT lbRect; 1713 1714 if(!(lphc->wState & CBF_CAPTURE)) return 0; 1794 1715 1795 1716 pt.x = LOWORD(lParam); … … 1810 1731 1811 1732 GetClientRect( lphc->hWndLBox, &lbRect ); 1812 MapWindowPoints( lphc->hwndself, lphc->hWndLBox, &pt, 1 );1733 MapWindowPoints(hwnd, lphc->hWndLBox, &pt, 1 ); 1813 1734 if( PtInRect(&lbRect, pt) ) 1814 1735 { … … 1820 1741 SendMessageA( lphc->hWndLBox, WM_LBUTTONDOWN, wParam, lParam ); 1821 1742 } 1822 } 1823 1743 1744 return 0; 1745 } 1746 1747 static LRESULT COMBO_Enable(HWND hwnd,WPARAM wParam,LPARAM lParam) 1748 { 1749 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1750 1751 if( lphc->wState & CBF_EDIT ) 1752 EnableWindow( lphc->hWndEdit, (BOOL)wParam ); 1753 EnableWindow( lphc->hWndLBox, (BOOL)wParam ); 1754 1755 /* Force the control to repaint when the enabled state changes. */ 1756 InvalidateRect(CB_HWND(lphc), NULL, TRUE); 1757 1758 return 0; 1759 } 1760 1761 static LRESULT COMBO_SetRedraw(HWND hwnd,WPARAM wParam,LPARAM lParam) 1762 { 1763 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1764 1765 if( wParam ) 1766 lphc->wState &= ~CBF_NOREDRAW; 1767 else 1768 lphc->wState |= CBF_NOREDRAW; 1769 1770 if( lphc->wState & CBF_EDIT ) 1771 SendMessageA( lphc->hWndEdit, WM_SETREDRAW, wParam, lParam ); 1772 SendMessageA( lphc->hWndLBox, WM_SETREDRAW, wParam, lParam ); 1773 1774 return 0; 1775 } 1776 1777 static LRESULT COMBO_SysKeyDown(HWND hwnd,WPARAM wParam,LPARAM lParam) 1778 { 1779 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1780 1781 if( KEYDATA_ALT & HIWORD(lParam) ) 1782 if( wParam == VK_UP || wParam == VK_DOWN ) 1783 COMBO_FlipListbox( lphc, TRUE ); 1784 1785 return DefWindowProcA(hwnd,WM_SYSKEYDOWN,wParam,lParam); 1786 } 1787 1788 static LRESULT COMBO_HandleKey(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 1789 { 1790 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1791 1792 if( lphc->wState & CBF_EDIT ) 1793 return SendMessageA( lphc->hWndEdit, message, wParam, lParam ); 1794 else 1795 return SendMessageA( lphc->hWndLBox, message, wParam, lParam ); 1796 } 1797 1798 /* combobox messages */ 1799 1800 static LRESULT COMBO_AddString(HWND hwnd,WPARAM wParam,LPARAM lParam) 1801 { 1802 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1803 1804 return SendMessageA(lphc->hWndLBox,LB_ADDSTRING,0,lParam); 1805 } 1806 1807 static LRESULT COMBO_InsertString(HWND hwnd,WPARAM wParam,LPARAM lParam) 1808 { 1809 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1810 1811 return SendMessageA(lphc->hWndLBox,LB_INSERTSTRING,wParam,lParam); 1812 } 1813 1814 static LRESULT COMBO_DeleteString(HWND hwnd,WPARAM wParam,LPARAM lParam) 1815 { 1816 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1817 1818 return SendMessageA(lphc->hWndLBox,LB_DELETESTRING,wParam,0); 1819 } 1820 1821 /*********************************************************************** 1822 * COMBO_SelectString 1823 */ 1824 static LRESULT COMBO_SelectString(HWND hwnd,WPARAM wParam,LPARAM lParam) 1825 { 1826 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1827 INT index = SendMessageA(lphc->hWndLBox,LB_SELECTSTRING,wParam,lParam); 1828 1829 if( index >= 0 ) 1830 { 1831 if( lphc->wState & CBF_EDIT ) 1832 CBUpdateEdit( lphc, index ); 1833 else 1834 InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE); 1835 } 1836 1837 return (LRESULT)index; 1838 } 1839 1840 static LRESULT COMBO_FindString(HWND hwnd,WPARAM wParam,LPARAM lParam) 1841 { 1842 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1843 1844 return SendMessageA(lphc->hWndLBox,LB_FINDSTRING,wParam,lParam); 1845 } 1846 1847 static LRESULT COMBO_FindStringExact(HWND hwnd,WPARAM wParam,LPARAM lParam) 1848 { 1849 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1850 1851 return SendMessageA(lphc->hWndLBox,LB_FINDSTRINGEXACT,wParam,lParam); 1852 } 1853 1854 /*********************************************************************** 1855 * COMBO_SetItemHeight 1856 */ 1857 static LRESULT COMBO_SetItemHeight(HWND hwnd,WPARAM wParam,LPARAM lParam) 1858 { 1859 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1860 LRESULT lRet = CB_ERR; 1861 1862 if( wParam == -1 ) /* set text field height */ 1863 { 1864 if( lParam < 32768 ) 1865 { 1866 lphc->editHeight = lParam; 1867 1868 /* 1869 * Redo the layout of the control. 1870 */ 1871 if ( CB_GETTYPE(lphc) == CBS_SIMPLE) 1872 { 1873 CBCalcPlacement(hwnd, 1874 lphc, 1875 &lphc->textRect, 1876 &lphc->buttonRect, 1877 &lphc->droppedRect); 1878 1879 CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE ); 1880 } 1881 else 1882 { 1883 CBForceDummyResize(lphc); 1884 } 1885 1886 lRet = lParam; 1887 } 1888 } 1889 else if ( CB_OWNERDRAWN(lphc) ) /* set listbox item height */ 1890 lRet = SendMessageA( lphc->hWndLBox, LB_SETITEMHEIGHT, 1891 wParam,lParam); 1892 return lRet; 1893 } 1894 1895 static LRESULT COMBO_GetItemHeight(HWND hwnd,WPARAM wParam,LPARAM lParam) 1896 { 1897 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1898 1899 if( (INT)wParam >= 0 ) /* listbox item */ 1900 return SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0); 1901 1902 return CBGetTextAreaHeight(hwnd, lphc); 1903 } 1904 1905 static LRESULT COMBO_ResetContent(HWND hwnd,WPARAM wParam,LPARAM lParam) 1906 { 1907 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1908 1909 SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 ); 1910 InvalidateRect(CB_HWND(lphc), NULL, TRUE); 1911 1912 return TRUE; 1913 } 1914 1915 static LRESULT COMBO_InitStorage(HWND hwnd,WPARAM wParam,LPARAM lParam) 1916 { 1917 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1918 1919 return SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam); 1920 } 1921 1922 static LRESULT COMBO_GetHorizontalExtent(HWND hwnd,WPARAM wParam,LPARAM lParam) 1923 { 1924 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1925 1926 return SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0); 1927 } 1928 1929 static LRESULT COMBO_SetHorizontalExtent(HWND hwnd,WPARAM wParam,LPARAM lParam) 1930 { 1931 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1932 1933 return SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0); 1934 } 1935 1936 static LRESULT COMBO_GetTopIndex(HWND hwnd,WPARAM wParam,LPARAM lParam) 1937 { 1938 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1939 1940 return SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0); 1941 } 1942 1943 static LRESULT COMBO_GetLocale(HWND hwnd,WPARAM wParam,LPARAM lParam) 1944 { 1945 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1946 1947 return SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0); 1948 } 1949 1950 static LRESULT COMBO_SetLocale(HWND hwnd,WPARAM wParam,LPARAM lParam) 1951 { 1952 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1953 1954 return SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0); 1955 } 1956 1957 static LRESULT COMBO_GetDroppedWidth(HWND hwnd,WPARAM wParam,LPARAM lParam) 1958 { 1959 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1960 1961 if( lphc->droppedWidth ) 1962 return lphc->droppedWidth; 1963 1964 return lphc->droppedRect.right - lphc->droppedRect.left; 1965 } 1966 1967 static LRESULT COMBO_SetDroppedWidth(HWND hwnd,WPARAM wParam,LPARAM lParam) 1968 { 1969 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1970 1971 if( (CB_GETTYPE(lphc) != CBS_SIMPLE) && 1972 (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam; 1973 1974 return CB_ERR; 1975 } 1976 1977 static LRESULT COMBO_GetDroppedControlRect(HWND hwnd,WPARAM wParam,LPARAM lParam) 1978 { 1979 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1980 1981 if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam ); 1982 1983 return CB_OKAY; 1984 } 1985 1986 static LRESULT COMBO_GetDroppedState(HWND hwnd,WPARAM wParam,LPARAM lParam) 1987 { 1988 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1989 1990 return (lphc->wState & CBF_DROPPED) ? TRUE : FALSE; 1991 } 1992 1993 static LRESULT COMBO_Dir(HWND hwnd,WPARAM wParam,LPARAM lParam) 1994 { 1995 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 1996 1997 return COMBO_Directory( lphc, (UINT)wParam, 1998 (LPSTR)lParam,TRUE); 1999 } 2000 2001 static LRESULT COMBO_ShowDropDown(HWND hwnd,WPARAM wParam,LPARAM lParam) 2002 { 2003 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2004 2005 if( CB_GETTYPE(lphc) != CBS_SIMPLE ) 2006 { 2007 if( wParam ) 2008 { 2009 if( !(lphc->wState & CBF_DROPPED) ) 2010 CBDropDown( lphc ); 2011 } 2012 else 2013 if( lphc->wState & CBF_DROPPED ) 2014 CBRollUp( lphc, FALSE, TRUE ); 2015 } 2016 2017 return TRUE; 2018 } 2019 2020 static LRESULT COMBO_GetCount(HWND hwnd,WPARAM wParam,LPARAM lParam) 2021 { 2022 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2023 2024 return SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0); 2025 } 2026 2027 static LRESULT COMBO_GetCurSel(HWND hwnd,WPARAM wParam,LPARAM lParam) 2028 { 2029 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2030 2031 return SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0); 2032 } 2033 2034 static LRESULT COMBO_SetCurSel(HWND hwnd,WPARAM wParam,LPARAM lParam) 2035 { 2036 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2037 2038 lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0); 2039 if( lphc->wState & CBF_SELCHANGE ) 2040 { 2041 /* no LBN_SELCHANGE in this case, update manually */ 2042 InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE); 2043 lphc->wState &= ~CBF_SELCHANGE; 2044 } 2045 2046 return lParam; 2047 } 2048 2049 static LRESULT COMBO_GetLBText(HWND hwnd,WPARAM wParam,LPARAM lParam) 2050 { 2051 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2052 2053 return SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam); 2054 } 2055 2056 static LRESULT COMBO_GetLBTextLen(HWND hwnd,WPARAM wParam,LPARAM lParam) 2057 { 2058 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2059 2060 return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0); 2061 } 2062 2063 static LRESULT COMBO_GetItemData(HWND hwnd,WPARAM wParam,LPARAM lParam) 2064 { 2065 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2066 2067 return SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0); 2068 } 2069 2070 static LRESULT COMBO_SetItemData(HWND hwnd,WPARAM wParam,LPARAM lParam) 2071 { 2072 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2073 2074 return SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam); 2075 } 2076 2077 static LRESULT COMBO_GetEditSel(HWND hwnd,WPARAM wParam,LPARAM lParam) 2078 { 2079 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2080 2081 if( lphc->wState & CBF_EDIT ) 2082 { 2083 INT a, b; 2084 2085 return SendMessageA( lphc->hWndEdit, EM_GETSEL, 2086 (wParam) ? wParam : (WPARAM)&a, 2087 (lParam) ? lParam : (LPARAM)&b ); 2088 } 2089 2090 return CB_ERR; 2091 } 2092 2093 static LRESULT COMBO_SetEditSel(HWND hwnd,WPARAM wParam,LPARAM lParam) 2094 { 2095 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2096 2097 if( lphc->wState & CBF_EDIT ) 2098 return SendMessageA( lphc->hWndEdit, EM_SETSEL, 2099 (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) ); 2100 2101 return CB_ERR; 2102 } 2103 2104 static LRESULT COMBO_SetExtendedUI(HWND hwnd,WPARAM wParam,LPARAM lParam) 2105 { 2106 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2107 2108 if( CB_GETTYPE(lphc) == CBS_SIMPLE ) 2109 return CB_ERR; 2110 if( wParam ) 2111 lphc->wState |= CBF_EUI; 2112 else lphc->wState &= ~CBF_EUI; 2113 return CB_OKAY; 2114 } 2115 2116 static LRESULT COMBO_GetExtendedUI(HWND hwnd,WPARAM wParam,LPARAM lParam) 2117 { 2118 LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd); 2119 2120 return (lphc->wState & CBF_EUI) ? TRUE : FALSE; 2121 } 1824 2122 1825 2123 /*********************************************************************** … … 1831 2129 WPARAM wParam, LPARAM lParam ) 1832 2130 { 1833 LPHEADCOMBO lphc = NULL;1834 LONG ptr = GetInfoPtr(hwnd);1835 1836 if(ptr)1837 lphc = (LPHEADCOMBO)ptr;1838 1839 2131 //TRACE("[%04x]: msg %s wp %08x lp %08lx\n", 1840 2132 // pWnd->hwndSelf, SPY_GetMsgName(message), wParam, lParam ); 1841 2133 1842 if( lphc || message == WM_NCCREATE )1843 2134 switch(message) 1844 2135 { … … 1890 2181 case WM_GETTEXT: 1891 2182 return COMBO_GetText(hwnd,wParam,lParam); 1892 //CB: 2183 1893 2184 case WM_SETTEXT: 1894 2185 case WM_GETTEXTLENGTH: … … 1897 2188 case WM_PASTE: 1898 2189 case WM_COPY: 1899 if ((message == WM_GETTEXTLENGTH) && !(lphc->wState & CBF_EDIT)) 1900 { 1901 int j = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0 ); 1902 if (j == -1) return 0; 1903 return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, j, 0); 1904 } 1905 else if( lphc->wState & CBF_EDIT ) 1906 { 1907 lphc->wState |= CBF_NOEDITNOTIFY; 1908 1909 return SendMessageA( lphc->hWndEdit, message, wParam, lParam ); 1910 } 1911 else return CB_ERR; 2190 return COMBO_HandleText(hwnd,message,wParam,lParam); 2191 1912 2192 case WM_DRAWITEM: 1913 2193 case WM_DELETEITEM: 1914 2194 case WM_COMPAREITEM: 1915 2195 case WM_MEASUREITEM: 1916 return COMBO_ItemOp( lphc, message, wParam, lParam ); 2196 return COMBO_HandleItem(hwnd,message,wParam,lParam); 2197 1917 2198 case WM_ENABLE: 1918 if( lphc->wState & CBF_EDIT ) 1919 EnableWindow( lphc->hWndEdit, (BOOL)wParam ); 1920 EnableWindow( lphc->hWndLBox, (BOOL)wParam ); 1921 1922 /* Force the control to repaint when the enabled state changes. */ 1923 InvalidateRect(CB_HWND(lphc), NULL, TRUE); 1924 return TRUE; 2199 return COMBO_Enable(hwnd,wParam,lParam); 2200 1925 2201 case WM_SETREDRAW: 1926 if( wParam ) 1927 lphc->wState &= ~CBF_NOREDRAW; 1928 else 1929 lphc->wState |= CBF_NOREDRAW; 1930 1931 if( lphc->wState & CBF_EDIT ) 1932 SendMessageA( lphc->hWndEdit, message, wParam, lParam ); 1933 SendMessageA( lphc->hWndLBox, message, wParam, lParam ); 1934 return 0; 2202 return COMBO_SetRedraw(hwnd,wParam,lParam); 2203 1935 2204 case WM_SYSKEYDOWN: 1936 if( KEYDATA_ALT & HIWORD(lParam) ) 1937 if( wParam == VK_UP || wParam == VK_DOWN ) 1938 COMBO_FlipListbox( lphc, TRUE ); 1939 break;/* -> DefWindowProc */ 2205 return COMBO_SysKeyDown(hwnd,wParam,lParam); 1940 2206 1941 2207 case WM_CHAR: 1942 2208 case WM_KEYDOWN: 1943 if( lphc->wState & CBF_EDIT ) 1944 return SendMessageA( lphc->hWndEdit, message, wParam, lParam ); 1945 else 1946 return SendMessageA( lphc->hWndLBox, message, wParam, lParam ); 2209 return COMBO_HandleKey(hwnd,message,wParam,lParam); 2210 1947 2211 case WM_LBUTTONDOWN: 1948 if( !(lphc->wState & CBF_FOCUSED) ) SetFocus( lphc->hwndself ); 1949 if( lphc->wState & CBF_FOCUSED ) COMBO_LButtonDown( lphc, lParam ); 1950 return TRUE; 2212 return COMBO_LButtonDown(hwnd,wParam,lParam); 2213 1951 2214 case WM_LBUTTONUP: 1952 COMBO_LButtonUp( lphc, lParam);1953 return TRUE; 2215 return COMBO_LButtonUp(hwnd,wParam,lParam); 2216 1954 2217 case WM_MOUSEMOVE: 1955 if( lphc->wState & CBF_CAPTURE ) 1956 COMBO_MouseMove( lphc, wParam, lParam ); 1957 return 0; 2218 return COMBO_MouseMove(hwnd,wParam,lParam); 2219 1958 2220 /* Combo messages */ 1959 2221 1960 2222 case CB_ADDSTRING: 1961 return SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam); 2223 return COMBO_AddString(hwnd,wParam,lParam); 2224 1962 2225 case CB_INSERTSTRING: 1963 return SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); 2226 return COMBO_InsertString(hwnd,wParam,lParam); 2227 1964 2228 case CB_DELETESTRING: 1965 return SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0); 2229 return COMBO_DeleteString(hwnd,wParam,lParam); 2230 1966 2231 case CB_SELECTSTRING: 1967 return COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam ); 2232 return COMBO_SelectString(hwnd,wParam,lParam); 2233 1968 2234 case CB_FINDSTRING: 1969 return SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam); 2235 return COMBO_FindString(hwnd,wParam,lParam); 2236 1970 2237 case CB_FINDSTRINGEXACT: 1971 return SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT,1972 wParam, lParam ); 2238 return COMBO_FindStringExact(hwnd,wParam,lParam); 2239 1973 2240 case CB_SETITEMHEIGHT: 1974 return COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam); 2241 return COMBO_SetItemHeight(hwnd,wParam,lParam); 2242 1975 2243 case CB_GETITEMHEIGHT: 1976 if( (INT)wParam >= 0 ) /* listbox item */ 1977 return SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0); 1978 return CBGetTextAreaHeight(hwnd, lphc); 2244 return COMBO_GetItemHeight(hwnd,wParam,lParam); 2245 1979 2246 case CB_RESETCONTENT: 1980 SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 ); 1981 InvalidateRect(CB_HWND(lphc), NULL, TRUE); 1982 return TRUE; 2247 return COMBO_ResetContent(hwnd,wParam,lParam); 2248 1983 2249 case CB_INITSTORAGE: 1984 return SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam); 2250 return COMBO_InitStorage(hwnd,wParam,lParam); 2251 1985 2252 case CB_GETHORIZONTALEXTENT: 1986 return SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0); 2253 return COMBO_GetHorizontalExtent(hwnd,wParam,lParam); 2254 1987 2255 case CB_SETHORIZONTALEXTENT: 1988 return SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0); 2256 return COMBO_SetHorizontalExtent(hwnd,wParam,lParam); 2257 1989 2258 case CB_GETTOPINDEX: 1990 return SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0); 2259 return COMBO_GetTopIndex(hwnd,wParam,lParam); 2260 1991 2261 case CB_GETLOCALE: 1992 return SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0); 2262 return COMBO_GetLocale(hwnd,wParam,lParam); 2263 1993 2264 case CB_SETLOCALE: 1994 return SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0); 2265 return COMBO_SetLocale(hwnd,wParam,lParam); 2266 1995 2267 case CB_GETDROPPEDWIDTH: 1996 if( lphc->droppedWidth ) 1997 return lphc->droppedWidth; 1998 return lphc->droppedRect.right - lphc->droppedRect.left; 2268 return COMBO_GetDroppedWidth(hwnd,wParam,lParam); 2269 1999 2270 case CB_SETDROPPEDWIDTH: 2000 if( (CB_GETTYPE(lphc) != CBS_SIMPLE) && 2001 (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam; 2002 return CB_ERR; 2271 return COMBO_SetDroppedWidth(hwnd,wParam,lParam); 2272 2003 2273 case CB_GETDROPPEDCONTROLRECT: 2004 if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam);2005 return CB_OKAY; 2274 return COMBO_GetDroppedControlRect(hwnd,wParam,lParam); 2275 2006 2276 case CB_GETDROPPEDSTATE: 2007 return (lphc->wState & CBF_DROPPED) ? TRUE : FALSE; 2277 return COMBO_GetDroppedState(hwnd,wParam,lParam); 2278 2008 2279 case CB_DIR: 2009 return COMBO_Directory( lphc, (UINT)wParam,2010 (LPSTR)lParam, (message == CB_DIR)); 2280 return COMBO_Dir(hwnd,wParam,lParam); 2281 2011 2282 case CB_SHOWDROPDOWN: 2012 if( CB_GETTYPE(lphc) != CBS_SIMPLE ) 2013 { 2014 if( wParam ) 2015 { 2016 if( !(lphc->wState & CBF_DROPPED) ) 2017 CBDropDown( lphc ); 2018 } 2019 else 2020 if( lphc->wState & CBF_DROPPED ) 2021 CBRollUp( lphc, FALSE, TRUE ); 2022 } 2023 return TRUE; 2283 return COMBO_ShowDropDown(hwnd,wParam,lParam); 2284 2024 2285 case CB_GETCOUNT: 2025 return SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0); 2286 return COMBO_GetCount(hwnd,wParam,lParam); 2287 2026 2288 case CB_GETCURSEL: 2027 return SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0); 2289 return COMBO_GetCurSel(hwnd,wParam,lParam); 2290 2028 2291 case CB_SETCURSEL: 2029 lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0); 2030 if( lphc->wState & CBF_SELCHANGE ) 2031 { 2032 /* no LBN_SELCHANGE in this case, update manually */ 2033 InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE); 2034 lphc->wState &= ~CBF_SELCHANGE; 2035 } 2036 return lParam; 2292 return COMBO_SetCurSel(hwnd,wParam,lParam); 2293 2037 2294 case CB_GETLBTEXT: 2038 return SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam); 2295 return COMBO_GetLBText(hwnd,wParam,lParam); 2296 2039 2297 case CB_GETLBTEXTLEN: 2040 return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0); 2298 return COMBO_GetLBTextLen(hwnd,wParam,lParam); 2299 2041 2300 case CB_GETITEMDATA: 2042 return SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0); 2301 return COMBO_GetItemData(hwnd,wParam,lParam); 2302 2043 2303 case CB_SETITEMDATA: 2044 return SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam); 2304 return COMBO_SetItemData(hwnd,wParam,lParam); 2305 2045 2306 case CB_GETEDITSEL: 2046 if( lphc->wState & CBF_EDIT ) 2047 { 2048 INT a, b; 2049 2050 return SendMessageA( lphc->hWndEdit, EM_GETSEL, 2051 (wParam) ? wParam : (WPARAM)&a, 2052 (lParam) ? lParam : (LPARAM)&b ); 2053 } 2054 return CB_ERR; 2307 return COMBO_GetEditSel(hwnd,wParam,lParam); 2308 2055 2309 case CB_SETEDITSEL: 2056 if( lphc->wState & CBF_EDIT ) 2057 return SendMessageA( lphc->hWndEdit, EM_SETSEL, 2058 (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) ); 2059 return CB_ERR; 2310 return COMBO_SetEditSel(hwnd,wParam,lParam); 2311 2060 2312 case CB_SETEXTENDEDUI: 2061 if( CB_GETTYPE(lphc) == CBS_SIMPLE ) 2062 return CB_ERR; 2063 if( wParam ) 2064 lphc->wState |= CBF_EUI; 2065 else lphc->wState &= ~CBF_EUI; 2066 return CB_OKAY; 2313 return COMBO_SetExtendedUI(hwnd,wParam,lParam); 2314 2067 2315 case CB_GETEXTENDEDUI: 2068 return (lphc->wState & CBF_EUI) ? TRUE : FALSE; 2316 return COMBO_GetExtendedUI(hwnd,wParam,lParam); 2317 2069 2318 //case (WM_USER + 0x1B): 2070 2319 // WARN("[%04x]: undocumented msg!\n", hwnd );
Note:
See TracChangeset
for help on using the changeset viewer.