- Timestamp:
- Oct 7, 1999, 11:00:41 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/header.c
r1170 r1175 1 /* $Id: header.c,v 1.1 6 1999-10-07 15:46:30cbratschi Exp $ */1 /* $Id: header.c,v 1.17 1999-10-07 21:00:41 cbratschi Exp $ */ 2 2 /* 3 3 * Header control … … 8 8 * 9 9 * TODO: 10 * - Order list support. 11 * - Control specific cursors (over dividers). 12 * - Custom draw support (including Notifications). 10 * - Control specific cursors (over dividers) 11 * 13 12 * - HDS_FILTERBAR 13 * - HEADER_SetHotDivider() 14 14 * 15 * 16 * Status: Development in progress, a lot to do :) 17 * Version: 5.00 (target) 15 * Status: ready (inconsistent parts in Microsoft SDK documentation) 16 * Version: 5.00 18 17 */ 19 18 … … 341 340 } 342 341 343 if (!(phdi->fmt & HD I_ORDER) || (phdi->iOrder& (HDF_LEFT | HDF_CENTER)))342 if (!(phdi->fmt & HDF_JUSTIFYMASK) || (phdi->fmt & (HDF_LEFT | HDF_CENTER))) 344 343 { 345 344 HEADER_DrawItemImage(hwnd,hdc,infoPtr,phdi,&r,iItem); … … 389 388 HBRUSH hbrBk; 390 389 INT i, x; 391 392 /* get rect for the bar, adjusted for the border */ 393 GetClientRect (hwnd, &rect); 390 NMCUSTOMDRAW cdraw; 391 LRESULT cdctlres,cdres; 392 393 // get rect for the bar, adjusted for the border 394 GetClientRect (hwnd,&rect); 395 396 //Custom draw 397 cdraw.hdr.hwndFrom = hwnd; 398 cdraw.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID); 399 cdraw.hdr.code = NM_CUSTOMDRAW; 400 cdraw.dwDrawStage = CDDS_PREPAINT; 401 cdraw.hdc = hdc; 402 cdraw.dwItemSpec = 0; 403 cdraw.uItemState = CDIS_DEFAULT; 404 cdraw.rc = rect; 405 cdraw.lItemlParam = 0; 406 407 cdctlres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw); 408 409 if (cdctlres & CDRF_SKIPDEFAULT) return; 394 410 395 411 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT); 396 412 hOldFont = SelectObject (hdc, hFont); 397 413 398 / * draw Background */414 // draw Background 399 415 hbrBk = GetSysColorBrush(COLOR_3DFACE); 400 416 FillRect(hdc, &rect, hbrBk); … … 403 419 for (i = 0; i < infoPtr->uNumItem; i++) 404 420 { 405 x = HEADER_DrawItem(hwnd,hdc,i,infoPtr->iHotItem == i,FALSE); 406 if (x > rect.right) 407 { 408 x = -1; 409 break; 421 if (cdctlres & CDRF_NOTIFYITEMDRAW) 422 { 423 cdraw.dwDrawStage = CDDS_ITEMPREPAINT; 424 cdraw.dwItemSpec = x; 425 cdraw.lItemlParam = infoPtr->items[x].lParam; 426 cdraw.rc = infoPtr->items[x].rect; 427 428 cdres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw); 429 } else cdres = 0; 430 431 if (!(cdres & CDRF_SKIPDEFAULT)) 432 { 433 x = HEADER_DrawItem(hwnd,hdc,i,infoPtr->iHotItem == i,FALSE); 434 if (x > rect.right) 435 { 436 x = -1; 437 break; 438 } 439 440 if (cdctlres & CDRF_NOTIFYITEMDRAW) 441 { 442 cdraw.dwDrawStage = CDDS_ITEMPOSTPAINT; 443 444 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw); 445 } 410 446 } 411 447 } … … 413 449 if (x != -1 && (x <= rect.right) && (infoPtr->uNumItem > 0)) 414 450 { 415 416 417 418 419 451 rect.left = x; 452 if (dwStyle & HDS_BUTTONS) 453 DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT); 454 else 455 DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM); 420 456 } 421 457 … … 458 494 } 459 495 ImageList_Draw(infoPtr->dragImage,0,hdc,infoPtr->items[infoPtr->iMoveItem].rect.left+infoPtr->dragPos.x-infoPtr->dragStart.x,0,ILD_NORMAL); 496 } 497 498 if (cdctlres & CDRF_NOTIFYPOSTPAINT) 499 { 500 cdraw.dwDrawStage = CDDS_POSTPAINT; 501 cdraw.dwItemSpec = 0; 502 GetClientRect(hwnd,&cdraw.rc); 503 504 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw); 460 505 } 461 506 } … … 995 1040 HEADER_SetHotDivider(HWND hwnd,WPARAM wParam,LPARAM lParam) 996 1041 { 1042 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1043 997 1044 if (wParam) 998 1045 { 999 //CB:todo 1046 POINT pt; 1047 1048 pt.x = LOWORD(lParam); 1049 pt.y = HIWORD(lParam); 1050 1051 //CB: todo 1000 1052 } else 1001 1053 { 1002 //CB: todo1054 //CB: todo 1003 1055 } 1004 1056 … … 1211 1263 } 1212 1264 1265 static BOOL 1266 HEADER_CheckOrderArray(HEADER_INFO* infoPtr,LPINT lpiArray) 1267 { 1268 INT x,y; 1269 1270 for (x = 0;x < infoPtr->uNumItem;x++) 1271 { 1272 BOOL found = FALSE; 1273 1274 for (y = 0;y <= x;y++) 1275 if (infoPtr->items[y].iOrder == lpiArray[x]) found = TRUE; 1276 for (y = x+1;y < infoPtr->uNumItem;y++) 1277 { 1278 if (infoPtr->items[x].iOrder == infoPtr->items[y].iOrder || lpiArray[x] == lpiArray[y]) return FALSE; 1279 if (infoPtr->items[y].iOrder == lpiArray[x]) found = TRUE; 1280 } 1281 1282 if (!found) return FALSE; 1283 } 1284 1285 return TRUE; 1286 } 1287 1213 1288 static LRESULT 1214 1289 HEADER_GetOrderArray(HWND hwnd,WPARAM wParam,LPARAM lParam) … … 1216 1291 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1217 1292 LPINT lpiArray = (LPINT)lParam; 1218 1219 if (wParam != infoPtr->uNumItem || !lpiArray) return FALSE; 1220 1221 //CB: todo 1293 INT x; 1294 1295 if (wParam != infoPtr->uNumItem || !lpiArray || !HEADER_CheckOrderArray(infoPtr,lpiArray)) return FALSE; 1296 1297 for (x = 0;x < infoPtr->uNumItem;x++) lpiArray[x] = infoPtr->items[x].iOrder; 1222 1298 1223 1299 return TRUE; … … 1229 1305 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd); 1230 1306 LPINT lpiArray = (LPINT)lParam; 1231 1232 if (wParam != infoPtr->uNumItem || !lpiArray) return FALSE; 1233 1234 //CB: todo 1307 HEADER_ITEM* newItems; 1308 INT x,y; 1309 1310 if (wParam != infoPtr->uNumItem || !lpiArray || !HEADER_CheckOrderArray(infoPtr,lpiArray)) return FALSE; 1311 if (infoPtr->uNumItem <= 1) return TRUE; 1312 1313 newItems = COMCTL32_Alloc(infoPtr->uNumItem*sizeof(HEADER_ITEM)); 1314 for (x = 0;x < infoPtr->uNumItem;x++) 1315 for (y = 0;y < infoPtr->uNumItem;y++) 1316 if (infoPtr->items[x].iOrder == lpiArray[x]) memcpy(&newItems[x],&infoPtr->items[y],sizeof(HEADER_ITEM)); 1317 COMCTL32_Free(infoPtr->items); 1318 infoPtr->items = newItems; 1319 1235 1320 HEADER_SetItemBounds(hwnd,0); 1236 1321 HEADER_Refresh(hwnd); … … 1247 1332 1248 1333 for (x = 0;x < infoPtr->uNumItem;x++) 1249 { 1250 //CB:todo 1251 } 1334 if (infoPtr->items[x].iOrder == iOrder) return x; 1252 1335 1253 1336 return iOrder; … … 1344 1427 lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0; 1345 1428 1346 lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder: HDF_LEFT;1429 lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:-1; 1347 1430 1348 1431 lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0; … … 1430 1513 lpItem->iImage = (phdi->mask & HDI_IMAGE) ? phdi->iImage:0; 1431 1514 1432 lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder: HDF_LEFT;1515 lpItem->iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder:-1; 1433 1516 1434 1517 lpItem->hbm = (phdi->mask & HDI_BITMAP) ? phdi->hbm:0;
Note:
See TracChangeset
for help on using the changeset viewer.