Changeset 236 for trunk/src/comctl32/header.c
- Timestamp:
- Jun 28, 1999, 5:46:28 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/header.c
r94 r236 1 /* $Id: header.c,v 1. 5 1999-06-10 16:21:58 achimhaExp $ */1 /* $Id: header.c,v 1.6 1999-06-28 15:46:24 cbratschi Exp $ */ 2 2 /* 3 3 * Header control … … 5 5 * Copyright 1998 Eric Kohl 6 6 * Copyright 1999 Achim Hasenmueller 7 * Copyright 1999 Christoph Bratschi 7 8 * 8 9 * TODO: … … 49 50 r = phdi->rect; 50 51 if (r.right - r.left == 0) 51 52 return phdi->rect.right; 52 53 53 54 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) { 54 55 56 57 55 if (phdi->bDown) { 56 DrawEdge (hdc, &r, BDR_RAISEDOUTER, 57 BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST); 58 r.left += 2; 58 59 r.top += 2; 59 60 61 62 60 } 61 else 62 DrawEdge (hdc, &r, EDGE_RAISED, 63 BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST); 63 64 } 64 65 else … … 66 67 67 68 if (phdi->fmt & HDF_OWNERDRAW) { 68 69 70 71 72 73 74 75 76 77 78 79 69 DRAWITEMSTRUCT dis; 70 dis.CtlType = ODT_HEADER; 71 dis.CtlID = GetWindowLongA (hwnd, GWL_ID); 72 dis.itemID = iItem; 73 dis.itemAction = ODA_DRAWENTIRE; 74 dis.itemState = phdi->bDown ? ODS_SELECTED : 0; 75 dis.hwndItem = hwnd; 76 dis.hDC = hdc; 77 dis.rcItem = r; 78 dis.itemData = phdi->lParam; 79 SendMessageA (GetParent (hwnd), WM_DRAWITEM, 80 (WPARAM)dis.CtlID, (LPARAM)&dis); 80 81 } 81 82 else { … … 87 88 uTextJustify = DT_RIGHT; 88 89 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 90 if ((phdi->fmt & HDF_BITMAP) && (phdi->hbm)) { 91 BITMAP bmp; 92 HDC hdcBitmap; 93 INT yD, yS, cx, cy, rx, ry; 94 95 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp); 96 97 ry = r.bottom - r.top; 98 rx = r.right - r.left; 99 100 if (ry >= bmp.bmHeight) { 101 cy = bmp.bmHeight; 102 yD = r.top + (ry - bmp.bmHeight) / 2; 103 yS = 0; 104 } 105 else { 106 cy = ry; 107 yD = r.top; 108 yS = (bmp.bmHeight - ry) / 2; 109 110 } 111 112 if (rx >= bmp.bmWidth + 6) { 113 cx = bmp.bmWidth; 114 } 115 else { 116 cx = rx - 6; 117 } 118 119 hdcBitmap = CreateCompatibleDC (hdc); 120 SelectObject (hdcBitmap, phdi->hbm); 121 BitBlt (hdc, r.left + 3, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY); 122 DeleteDC (hdcBitmap); 123 124 r.left += (bmp.bmWidth + 3); 125 } 126 127 128 if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm)) { 129 BITMAP bmp; 130 HDC hdcBitmap; 131 INT xD, yD, yS, cx, cy, rx, ry, tx; 132 RECT textRect; 133 134 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp); 135 136 textRect = r; 136 137 DrawTextW (hdc, phdi->pszText, lstrlenW (phdi->pszText), 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 /* 181 138 &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT); 139 tx = textRect.right - textRect.left; 140 ry = r.bottom - r.top; 141 rx = r.right - r.left; 142 143 if (ry >= bmp.bmHeight) { 144 cy = bmp.bmHeight; 145 yD = r.top + (ry - bmp.bmHeight) / 2; 146 yS = 0; 147 } 148 else { 149 cy = ry; 150 yD = r.top; 151 yS = (bmp.bmHeight - ry) / 2; 152 153 } 154 155 if (r.left + tx + bmp.bmWidth + 9 <= r.right) { 156 cx = bmp.bmWidth; 157 xD = r.left + tx + 6; 158 } 159 else { 160 if (rx >= bmp.bmWidth + 6) { 161 cx = bmp.bmWidth; 162 xD = r.right - bmp.bmWidth - 3; 163 r.right = xD - 3; 164 } 165 else { 166 cx = rx - 3; 167 xD = r.left; 168 r.right = r.left; 169 } 170 } 171 172 hdcBitmap = CreateCompatibleDC (hdc); 173 SelectObject (hdcBitmap, phdi->hbm); 174 BitBlt (hdc, xD, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY); 175 DeleteDC (hdcBitmap); 176 } 177 178 if (phdi->fmt & HDF_IMAGE) { 179 180 181 /* ImageList_Draw (infoPtr->himl, phdi->iImage,...); */ 182 } 182 183 183 184 if ((phdi->fmt & HDF_STRING) && (phdi->pszText)) { 184 185 oldBkMode = SetBkMode(hdc, TRANSPARENT); 185 186 r.left += 3; 186 187 187 r.right -= 3; 188 SetTextColor (hdc, bHotTrack ? COLOR_HIGHLIGHT : COLOR_BTNTEXT); 188 189 DrawTextW (hdc, phdi->pszText, lstrlenW (phdi->pszText), 189 190 &r, uTextJustify|DT_VCENTER|DT_SINGLELINE); 190 191 if (oldBkMode != TRANSPARENT) 191 192 SetBkMode(hdc, oldBkMode); … … 197 198 198 199 199 static void 200 static void 200 201 HEADER_Refresh (HWND hwnd, HDC hdc) 201 202 { … … 279 280 280 281 if (infoPtr->uNumItem == 0) 281 282 return; 282 283 283 284 x = 0; 284 285 for (i = 0; i < infoPtr->uNumItem; i++) { 285 286 287 288 289 290 286 phdi = &infoPtr->items[i]; 287 phdi->rect.top = 0; 288 phdi->rect.bottom = cy; 289 phdi->rect.left = x; 290 phdi->rect.right = phdi->rect.left + phdi->cxy; 291 x = phdi->rect.right; 291 292 } 292 293 } … … 307 308 if (PtInRect (&rect, *lpPt)) 308 309 { 309 310 311 312 // 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 // 329 330 331 332 333 334 335 336 337 338 // 339 340 341 342 343 344 // 345 346 347 348 349 350 351 352 353 354 // 355 356 357 358 359 360 // 361 362 363 364 365 366 367 368 369 370 371 372 373 // 374 375 376 377 378 379 // 380 381 382 383 384 385 386 // 387 388 310 if (infoPtr->uNumItem == 0) { 311 *pFlags |= HHT_NOWHERE; 312 *pItem = 1; 313 // TRACE (header, "NOWHERE\n"); 314 return; 315 } 316 else { 317 /* somewhere inside */ 318 for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) { 319 rect = infoPtr->items[iCount].rect; 320 width = rect.right - rect.left; 321 if (width == 0) { 322 bNoWidth = TRUE; 323 continue; 324 } 325 if (PtInRect (&rect, *lpPt)) { 326 if (width <= 2 * DIVIDER_WIDTH) { 327 *pFlags |= HHT_ONHEADER; 328 *pItem = iCount; 329 // TRACE (header, "ON HEADER %d\n", iCount); 330 return; 331 } 332 if (iCount > 0) { 333 rcTest = rect; 334 rcTest.right = rcTest.left + DIVIDER_WIDTH; 335 if (PtInRect (&rcTest, *lpPt)) { 336 if (bNoWidth) { 337 *pFlags |= HHT_ONDIVOPEN; 338 *pItem = iCount - 1; 339 // TRACE (header, "ON DIVOPEN %d\n", *pItem); 340 return; 341 } 342 else { 343 *pFlags |= HHT_ONDIVIDER; 344 *pItem = iCount - 1; 345 // TRACE (header, "ON DIVIDER %d\n", *pItem); 346 return; 347 } 348 } 349 } 350 rcTest = rect; 351 rcTest.left = rcTest.right - DIVIDER_WIDTH; 352 if (PtInRect (&rcTest, *lpPt)) { 353 *pFlags |= HHT_ONDIVIDER; 354 *pItem = iCount; 355 // TRACE (header, "ON DIVIDER %d\n", *pItem); 356 return; 357 } 358 359 *pFlags |= HHT_ONHEADER; 360 *pItem = iCount; 361 // TRACE (header, "ON HEADER %d\n", iCount); 362 return; 363 } 364 } 365 366 /* check for last divider part (on nowhere) */ 367 rect = infoPtr->items[infoPtr->uNumItem-1].rect; 368 rect.left = rect.right; 369 rect.right += DIVIDER_WIDTH; 370 if (PtInRect (&rect, *lpPt)) { 371 if (bNoWidth) { 372 *pFlags |= HHT_ONDIVOPEN; 373 *pItem = infoPtr->uNumItem - 1; 374 // TRACE (header, "ON DIVOPEN %d\n", *pItem); 375 return; 376 } 377 else { 378 *pFlags |= HHT_ONDIVIDER; 379 *pItem = infoPtr->uNumItem-1; 380 // TRACE (header, "ON DIVIDER %d\n", *pItem); 381 return; 382 } 383 } 384 385 *pFlags |= HHT_NOWHERE; 386 *pItem = 1; 387 // TRACE (header, "NOWHERE\n"); 388 return; 389 } 389 390 } 390 391 else { 391 392 // 393 394 395 396 // 397 398 399 400 401 // 402 403 404 405 // 406 407 392 if (lpPt->x < rect.left) { 393 // TRACE (header, "TO LEFT\n"); 394 *pFlags |= HHT_TOLEFT; 395 } 396 else if (lpPt->x > rect.right) { 397 // TRACE (header, "TO LEFT\n"); 398 *pFlags |= HHT_TORIGHT; 399 } 400 401 if (lpPt->y < rect.top) { 402 // TRACE (header, "ABOVE\n"); 403 *pFlags |= HHT_ABOVE; 404 } 405 else if (lpPt->y > rect.bottom) { 406 // TRACE (header, "BELOW\n"); 407 *pFlags |= HHT_BELOW; 408 } 408 409 } 409 410 … … 442 443 443 444 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, 444 445 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr); 445 446 } 446 447 … … 472 473 473 474 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, 474 475 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr); 475 476 } 476 477 … … 489 490 490 491 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, 491 492 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr); 492 493 } 493 494 … … 509 510 510 511 // TRACE(header, "[iItem=%d]\n", iItem); 511 512 512 513 if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem)) 513 514 return FALSE; … … 550 551 HEADER_Refresh (hwnd, hdc); 551 552 ReleaseDC (hwnd, hdc); 552 553 553 554 return TRUE; 554 555 } … … 573 574 574 575 if (!phdi) 575 576 return FALSE; 576 577 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) 577 578 return FALSE; … … 580 581 581 582 if (phdi->mask == 0) 582 583 return TRUE; 583 584 584 585 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; 585 586 if (phdi->mask & HDI_BITMAP) 586 587 phdi->hbm = lpItem->hbm; 587 588 588 589 if (phdi->mask & HDI_FORMAT) 589 590 phdi->fmt = lpItem->fmt; 590 591 591 592 if (phdi->mask & HDI_WIDTH) 592 593 phdi->cxy = lpItem->cxy; 593 594 594 595 if (phdi->mask & HDI_LPARAM) 595 596 phdi->lParam = lpItem->lParam; 596 597 597 598 if (phdi->mask & HDI_TEXT) { 598 599 lstrcpynWtoA (phdi->pszText, lpItem->pszText, phdi->cchTextMax);600 601 599 if (lpItem->pszText != LPSTR_TEXTCALLBACKW) 600 lstrcpynWtoA (phdi->pszText, lpItem->pszText, MIN(phdi->cchTextMax,lstrlenW(lpItem->pszText))); 601 else 602 phdi->pszText = LPSTR_TEXTCALLBACKA; 602 603 } 603 604 604 605 if (phdi->mask & HDI_IMAGE) 605 606 phdi->iImage = lpItem->iImage; 606 607 607 608 if (phdi->mask & HDI_ORDER) 608 609 phdi->iOrder = lpItem->iOrder; 609 610 610 611 return TRUE; … … 621 622 622 623 if (!phdi) 623 624 return FALSE; 624 625 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) 625 626 return FALSE; … … 628 629 629 630 if (phdi->mask == 0) 630 631 return TRUE; 631 632 632 633 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; 633 634 if (phdi->mask & HDI_BITMAP) 634 635 phdi->hbm = lpItem->hbm; 635 636 636 637 if (phdi->mask & HDI_FORMAT) 637 638 phdi->fmt = lpItem->fmt; 638 639 639 640 if (phdi->mask & HDI_WIDTH) 640 641 phdi->cxy = lpItem->cxy; 641 642 642 643 if (phdi->mask & HDI_LPARAM) 643 644 phdi->lParam = lpItem->lParam; 644 645 645 646 if (phdi->mask & HDI_TEXT) { 646 647 lstrcpynW (phdi->pszText, lpItem->pszText, phdi->cchTextMax);648 649 647 if (lpItem->pszText != LPSTR_TEXTCALLBACKW) 648 lstrcpynW (phdi->pszText, lpItem->pszText, MIN(phdi->cchTextMax,lstrlenW(lpItem->pszText))); 649 else 650 phdi->pszText = LPSTR_TEXTCALLBACKW; 650 651 } 651 652 652 653 if (phdi->mask & HDI_IMAGE) 653 654 phdi->iImage = lpItem->iImage; 654 655 655 656 if (phdi->mask & HDI_ORDER) 656 657 phdi->iOrder = lpItem->iOrder; 657 658 658 659 return TRUE; … … 720 721 721 722 if ((phdi == NULL) || (nItem < 0)) 722 723 return -1; 723 724 724 725 if (nItem > infoPtr->uNumItem) … … 752 753 } 753 754 } 754 755 755 756 COMCTL32_Free (oldItems); 756 757 } … … 760 761 761 762 if (phdi->mask & HDI_WIDTH) 762 763 lpItem->cxy = phdi->cxy; 763 764 764 765 if (phdi->mask & HDI_TEXT) { 765 766 767 768 769 770 771 772 773 766 if (!phdi->pszText) /* null pointer check */ 767 phdi->pszText = ""; 768 if (phdi->pszText != LPSTR_TEXTCALLBACKA) { 769 len = lstrlenA (phdi->pszText); 770 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 771 lstrcpyAtoW (lpItem->pszText, phdi->pszText); 772 } 773 else 774 lpItem->pszText = LPSTR_TEXTCALLBACKW; 774 775 } 775 776 776 777 if (phdi->mask & HDI_FORMAT) 777 778 lpItem->fmt = phdi->fmt; 778 779 779 780 if (lpItem->fmt == 0) 780 781 lpItem->fmt = HDF_LEFT; 781 782 782 783 if (phdi->mask & HDI_BITMAP) … … 813 814 814 815 if ((phdi == NULL) || (nItem < 0)) 815 816 return -1; 816 817 817 818 if (nItem > infoPtr->uNumItem) … … 839 840 } 840 841 841 842 COMCTL32_Free (oldItems); 842 843 } 843 844 … … 846 847 847 848 if (phdi->mask & HDI_WIDTH) 848 849 lpItem->cxy = phdi->cxy; 849 850 850 851 if (phdi->mask & HDI_TEXT) { 851 852 853 phdi->pszText = &wide_null_char; 854 855 856 857 858 859 860 852 WCHAR wide_null_char = 0; 853 if (!phdi->pszText) /* null pointer check */ 854 phdi->pszText = &wide_null_char; 855 if (phdi->pszText != LPSTR_TEXTCALLBACKW) { 856 len = lstrlenW (phdi->pszText); 857 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 858 lstrcpyW (lpItem->pszText, phdi->pszText); 859 } 860 else 861 lpItem->pszText = LPSTR_TEXTCALLBACKW; 861 862 } 862 863 863 864 if (phdi->mask & HDI_FORMAT) 864 865 lpItem->fmt = phdi->fmt; 865 866 866 867 if (lpItem->fmt == 0) 867 868 lpItem->fmt = HDF_LEFT; 868 869 869 870 if (phdi->mask & HDI_BITMAP) … … 947 948 948 949 if (phdi == NULL) 949 950 return FALSE; 950 951 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) 951 952 return FALSE; … … 954 955 955 956 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem)) 956 957 return FALSE; 957 958 958 959 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; 959 960 if (phdi->mask & HDI_BITMAP) 960 961 lpItem->hbm = phdi->hbm; 961 962 962 963 if (phdi->mask & HDI_FORMAT) 963 964 lpItem->fmt = phdi->fmt; 964 965 965 966 if (phdi->mask & HDI_LPARAM) 966 967 lpItem->lParam = phdi->lParam; 967 968 968 969 if (phdi->mask & HDI_TEXT) { 969 970 971 972 973 974 975 976 977 978 979 980 981 970 if (phdi->pszText != LPSTR_TEXTCALLBACKA) { 971 if (lpItem->pszText) { 972 COMCTL32_Free (lpItem->pszText); 973 lpItem->pszText = NULL; 974 } 975 if (phdi->pszText) { 976 INT len = lstrlenA (phdi->pszText); 977 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 978 lstrcpyAtoW (lpItem->pszText, phdi->pszText); 979 } 980 } 981 else 982 lpItem->pszText = LPSTR_TEXTCALLBACKW; 982 983 } 983 984 984 985 if (phdi->mask & HDI_WIDTH) 985 986 lpItem->cxy = phdi->cxy; 986 987 987 988 if (phdi->mask & HDI_IMAGE) 988 989 lpItem->iImage = phdi->iImage; 989 990 990 991 if (phdi->mask & HDI_ORDER) 991 992 lpItem->iOrder = phdi->iOrder; 992 993 993 994 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem); … … 1012 1013 1013 1014 if (phdi == NULL) 1014 1015 return FALSE; 1015 1016 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem)) 1016 1017 return FALSE; … … 1019 1020 1020 1021 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem)) 1021 1022 return FALSE; 1022 1023 1023 1024 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem]; 1024 1025 if (phdi->mask & HDI_BITMAP) 1025 1026 lpItem->hbm = phdi->hbm; 1026 1027 1027 1028 if (phdi->mask & HDI_FORMAT) 1028 1029 lpItem->fmt = phdi->fmt; 1029 1030 1030 1031 if (phdi->mask & HDI_LPARAM) 1031 1032 lpItem->lParam = phdi->lParam; 1032 1033 1033 1034 if (phdi->mask & HDI_TEXT) { 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1035 if (phdi->pszText != LPSTR_TEXTCALLBACKW) { 1036 if (lpItem->pszText) { 1037 COMCTL32_Free (lpItem->pszText); 1038 lpItem->pszText = NULL; 1039 } 1040 if (phdi->pszText) { 1041 INT len = lstrlenW (phdi->pszText); 1042 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1043 lstrcpyW (lpItem->pszText, phdi->pszText); 1044 } 1045 } 1046 else 1047 lpItem->pszText = LPSTR_TEXTCALLBACKW; 1047 1048 } 1048 1049 1049 1050 if (phdi->mask & HDI_WIDTH) 1050 1051 lpItem->cxy = phdi->cxy; 1051 1052 1052 1053 if (phdi->mask & HDI_IMAGE) 1053 1054 lpItem->iImage = phdi->iImage; 1054 1055 1055 1056 if (phdi->mask & HDI_ORDER) 1056 1057 lpItem->iOrder = phdi->iOrder; 1057 1058 1058 1059 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem); … … 1126 1127 1127 1128 if (infoPtr->items) { 1128 1129 lpItem = (HEADER_ITEM*)infoPtr->items; 1129 1130 for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) { 1130 1131 1131 if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACKW)) 1132 COMCTL32_Free (lpItem->pszText); 1132 1133 } 1133 1134 COMCTL32_Free (infoPtr->items); … … 1135 1136 1136 1137 if (infoPtr->himl) 1137 1138 ImageList_Destroy (infoPtr->himl); 1138 1139 1139 1140 COMCTL32_Free (infoPtr); … … 1159 1160 INT nItem; 1160 1161 1161 pt.x = (INT)LOWORD(lParam); 1162 pt.x = (INT)LOWORD(lParam); 1162 1163 pt.y = (INT)HIWORD(lParam); 1163 1164 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1164 1165 1165 1166 if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER)) 1166 1167 HEADER_SendHeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem); 1167 1168 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) 1168 1169 HEADER_SendHeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem); 1169 1170 1170 1171 return 0; … … 1182 1183 HDC hdc; 1183 1184 1184 pt.x = (INT)LOWORD(lParam); 1185 pt.x = (INT)LOWORD(lParam); 1185 1186 pt.y = (INT)HIWORD(lParam); 1186 1187 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem); 1187 1188 1188 1189 if ((dwStyle & HDS_BUTTONS) && (flags == HHT_ONHEADER)) { 1189 1190 infoPtr->bCaptured = TRUE; 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 // 1202 } 1190 SetCapture (hwnd); 1191 infoPtr->bCaptured = TRUE; 1192 infoPtr->bPressed = TRUE; 1193 infoPtr->iMoveItem = nItem; 1194 1195 infoPtr->items[nItem].bDown = TRUE; 1196 1197 /* Send WM_CUSTOMDRAW */ 1198 hdc = GetDC (hwnd); 1199 HEADER_RefreshItem (hwnd, hdc, nItem); 1200 ReleaseDC (hwnd, hdc); 1201 1202 // TRACE (header, "Pressed item %d!\n", nItem); 1203 } 1203 1204 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) { 1204 1205 1206 infoPtr->bCaptured = TRUE; 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 // 1220 1205 if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem))) { 1206 SetCapture (hwnd); 1207 infoPtr->bCaptured = TRUE; 1208 infoPtr->bTracking = TRUE; 1209 infoPtr->iMoveItem = nItem; 1210 infoPtr->nOldWidth = infoPtr->items[nItem].cxy; 1211 infoPtr->xTrackOffset = infoPtr->items[nItem].rect.right - pt.x; 1212 1213 if (!(dwStyle & HDS_FULLDRAG)) { 1214 infoPtr->xOldTrack = infoPtr->items[nItem].rect.right; 1215 hdc = GetDC (hwnd); 1216 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1217 ReleaseDC (hwnd, hdc); 1218 } 1219 1220 // TRACE (header, "Begin tracking item %d!\n", nItem); 1221 } 1221 1222 } 1222 1223 … … 1240 1241 1241 1242 if (infoPtr->bPressed) { 1242 1243 1244 1245 1246 1247 1248 1249 1250 // 1251 1243 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) { 1244 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE; 1245 hdc = GetDC (hwnd); 1246 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem); 1247 ReleaseDC (hwnd, hdc); 1248 1249 HEADER_SendClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem); 1250 } 1251 // TRACE (header, "Released item %d!\n", infoPtr->iMoveItem); 1252 infoPtr->bPressed = FALSE; 1252 1253 } 1253 1254 else if (infoPtr->bTracking) { 1254 // 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1255 // TRACE (header, "End tracking item %d!\n", infoPtr->iMoveItem); 1256 infoPtr->bTracking = FALSE; 1257 1258 HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem); 1259 1260 if (!(dwStyle & HDS_FULLDRAG)) { 1261 hdc = GetDC (hwnd); 1262 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1263 ReleaseDC (hwnd, hdc); 1264 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem)) 1265 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1266 else { 1267 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; 1268 if (nWidth < 0) 1269 nWidth = 0; 1270 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1271 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, infoPtr->iMoveItem); 1272 } 1273 1274 HEADER_SetItemBounds (hwnd); 1275 hdc = GetDC (hwnd); 1276 HEADER_Refresh (hwnd, hdc); 1277 ReleaseDC (hwnd, hdc); 1278 } 1278 1279 } 1279 1280 1280 1281 if (infoPtr->bCaptured) { 1281 1282 1283 1282 infoPtr->bCaptured = FALSE; 1283 ReleaseCapture (); 1284 HEADER_SendSimpleNotify (hwnd, NM_RELEASEDCAPTURE); 1284 1285 } 1285 1286 … … 1303 1304 1304 1305 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) { 1305 1306 1307 1308 1309 1310 1311 1306 if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN)) 1307 infoPtr->iHotItem = nItem; 1308 else 1309 infoPtr->iHotItem = -1; 1310 hdc = GetDC (hwnd); 1311 HEADER_Refresh (hwnd, hdc); 1312 ReleaseDC (hwnd, hdc); 1312 1313 } 1313 1314 1314 1315 if (infoPtr->bCaptured) { 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 // 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 infoPtr->items[infoPtr->iMoveItem].cxy = 1350 1351 1352 1353 1354 1355 1356 // 1357 1316 if (infoPtr->bPressed) { 1317 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) 1318 infoPtr->items[infoPtr->iMoveItem].bDown = TRUE; 1319 else 1320 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE; 1321 hdc = GetDC (hwnd); 1322 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem); 1323 ReleaseDC (hwnd, hdc); 1324 1325 // TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem); 1326 } 1327 else if (infoPtr->bTracking) { 1328 if (dwStyle & HDS_FULLDRAG) { 1329 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem)) 1330 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth; 1331 else { 1332 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset; 1333 if (nWidth < 0) 1334 nWidth = 0; 1335 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth; 1336 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, 1337 infoPtr->iMoveItem); 1338 } 1339 HEADER_SetItemBounds (hwnd); 1340 hdc = GetDC (hwnd); 1341 HEADER_Refresh (hwnd, hdc); 1342 ReleaseDC (hwnd, hdc); 1343 } 1344 else { 1345 hdc = GetDC (hwnd); 1346 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1347 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset; 1348 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left) 1349 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left; 1350 infoPtr->items[infoPtr->iMoveItem].cxy = 1351 infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left; 1352 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack); 1353 ReleaseDC (hwnd, hdc); 1354 } 1355 1356 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem); 1357 // TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem); 1358 } 1358 1359 } 1359 1360 1360 1361 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) { 1361 // 1362 // FIXME (header, "hot track support!\n"); 1362 1363 } 1363 1364 … … 1375 1376 HEADER_Refresh (hwnd, hdc); 1376 1377 if(!wParam) 1377 1378 EndPaint (hwnd, &ps); 1378 1379 return 0; 1379 1380 } … … 1447 1448 { 1448 1449 switch (msg) { 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 /* 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 /* 1497 1498 1499 1450 case HDM_CREATEDRAGIMAGE: 1451 return HEADER_CreateDragImage (hwnd, wParam); 1452 1453 case HDM_DELETEITEM: 1454 return HEADER_DeleteItem (hwnd, wParam); 1455 1456 case HDM_GETIMAGELIST: 1457 return HEADER_GetImageList (hwnd); 1458 1459 case HDM_GETITEMA: 1460 return HEADER_GetItemA (hwnd, wParam, lParam); 1461 1462 case HDM_GETITEMW: 1463 return HEADER_GetItemW (hwnd, wParam, lParam); 1464 1465 case HDM_GETITEMCOUNT: 1466 return HEADER_GetItemCount (hwnd); 1467 1468 case HDM_GETITEMRECT: 1469 return HEADER_GetItemRect (hwnd, wParam, lParam); 1470 1471 /* case HDM_GETORDERARRAY: */ 1472 1473 case HDM_GETUNICODEFORMAT: 1474 return HEADER_GetUnicodeFormat (hwnd); 1475 1476 case HDM_HITTEST: 1477 return HEADER_HitTest (hwnd, wParam, lParam); 1478 1479 case HDM_INSERTITEMA: 1480 return HEADER_InsertItemA (hwnd, wParam, lParam); 1481 1482 case HDM_INSERTITEMW: 1483 return HEADER_InsertItemW (hwnd, wParam, lParam); 1484 1485 case HDM_LAYOUT: 1486 return HEADER_Layout (hwnd, wParam, lParam); 1487 1488 case HDM_SETIMAGELIST: 1489 return HEADER_SetImageList (hwnd, wParam, lParam); 1490 1491 case HDM_SETITEMA: 1492 return HEADER_SetItemA (hwnd, wParam, lParam); 1493 1494 case HDM_SETITEMW: 1495 return HEADER_SetItemW (hwnd, wParam, lParam); 1496 1497 /* case HDM_SETORDERARRAY: */ 1498 1499 case HDM_SETUNICODEFORMAT: 1500 return HEADER_SetUnicodeFormat (hwnd, wParam); 1500 1501 1501 1502 … … 1527 1528 return HEADER_MouseMove (hwnd, wParam, lParam); 1528 1529 1529 /* 1530 /* case WM_NOTIFYFORMAT: */ 1530 1531 1531 1532 case WM_PAINT: … … 1542 1543 1543 1544 default: 1544 // if (msg >= WM_USER) 1545 // 1546 // 1547 1545 // if (msg >= WM_USER) 1546 // ERR (header, "unknown msg %04x wp=%04x lp=%08lx\n", 1547 // msg, wParam, lParam ); 1548 return DefWindowProcA (hwnd, msg, wParam, lParam); 1548 1549 } 1549 1550 return 0; … … 1565 1566 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA); 1566 1567 wndClass.lpszClassName = WC_HEADERA; 1567 1568 1568 1569 RegisterClassA (&wndClass); 1569 1570 } … … 1574 1575 { 1575 1576 if (GlobalFindAtomA (WC_HEADERA)) 1576 1577 } 1578 1577 UnregisterClassA (WC_HEADERA, (HINSTANCE)NULL); 1578 } 1579
Note:
See TracChangeset
for help on using the changeset viewer.