Changeset 295 for trunk/src/comctl32/ipaddress.c
- Timestamp:
- Jul 12, 1999, 5:58:51 PM (26 years ago)
- File:
-
- 1 edited
-
trunk/src/comctl32/ipaddress.c (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/ipaddress.c
r190 r295 1 /* $Id: ipaddress.c,v 1. 5 1999-06-25 15:49:01 achimhaExp $ */1 /* $Id: ipaddress.c,v 1.6 1999-07-12 15:58:47 cbratschi Exp $ */ 2 2 /* 3 3 * IP Address control 4 4 * 5 * Copyright 1999 Chris Morgan<cmorgan@wpi.edu> and 6 * James Abbatiello<abbeyj@wpi.edu> 5 7 * Copyright 1998, 1999 Eric Kohl 6 8 * Copyright 1998 Alex Priem <alexp@sci.kun.nl> … … 8 10 * 9 11 * NOTES 10 11 12 * 12 13 * TODO: 13 14 * -Check ranges when changing field-focus. 14 * -Check all notifications/behavior.15 * -Check all notifications/behavior. 15 16 * -Optimization: include lpipsi in IPADDRESS_INFO. 16 * -CurrentFocus: field that has focus at moment of processing.17 * -connect Rect32 rcClient.18 * -handle right and left arrows correctly. Boring.19 * -split GotoNextField in CheckField and GotoNextField.20 * -check ipaddress.cpp for missing features.17 * -CurrentFocus: field that has focus at moment of processing. 18 * -connect Rect32 rcClient. 19 * -handle right and left arrows correctly. Boring. 20 * -split GotoNextField in CheckField and GotoNextField. 21 * -check ipaddress.cpp for missing features. 21 22 * -refresh: draw '.' instead of setpixel. 22 * -handle VK_ESCAPE.23 * -handle VK_ESCAPE. 23 24 */ 24 25 … … 36 37 37 38 38 static BOOL 39 static BOOL 39 40 IPADDRESS_SendNotify (HWND hwnd, UINT command); 40 static BOOL 41 static BOOL 41 42 IPADDRESS_SendIPAddressNotify (HWND hwnd, UINT field, BYTE newValue); 42 43 … … 55 56 IPADDRESS_Refresh (HWND hwnd, HDC hdc) 56 57 { 57 RECT rcClient;58 HBRUSH hbr;59 COLORREF clr=GetSysColor (COLOR_3DDKSHADOW);58 RECT rcClient; 59 HBRUSH hbr; 60 COLORREF clr=GetSysColor (COLOR_3DDKSHADOW); 60 61 int i,x,fieldsize; 61 62 62 63 GetClientRect (hwnd, &rcClient); 63 hbr = CreateSolidBrush (RGB(255,255,255));64 hbr = CreateSolidBrush (RGB(255,255,255)); 64 65 DrawEdge (hdc, &rcClient, EDGE_SUNKEN, BF_RECT | BF_ADJUST); 65 FillRect (hdc, &rcClient, hbr);66 FillRect (hdc, &rcClient, hbr); 66 67 DeleteObject (hbr); 67 68 68 x=rcClient.left; 69 fieldsize=(rcClient.right-rcClient.left) /4; 70 71 for (i=0; i<3; i++) { /* Should draw text "." here */ 72 x+=fieldsize; 73 SetPixel (hdc, x, 13, clr); 74 SetPixel (hdc, x, 14, clr); 75 SetPixel (hdc, x+1, 13, clr); 76 SetPixel (hdc, x+1, 14, clr); 77 78 } 79 80 } 81 82 83 69 x=rcClient.left; 70 fieldsize=(rcClient.right-rcClient.left) /4; 71 72 for (i=0; i<3; i++) { /* Should draw text "." here */ 73 x+=fieldsize; 74 SetPixel (hdc, x, 13, clr); 75 SetPixel (hdc, x, 14, clr); 76 SetPixel (hdc, x+1, 13, clr); 77 SetPixel (hdc, x+1, 14, clr); 78 } 79 } 84 80 85 81 … … 88 84 { 89 85 IPADDRESS_INFO *infoPtr; 90 RECT rcClient, edit;91 int i,fieldsize;92 LPIP_SUBCLASS_INFO lpipsi;93 86 RECT rcClient, edit; 87 int i,fieldsize; 88 LPIP_SUBCLASS_INFO lpipsi; 89 94 90 95 91 infoPtr = (IPADDRESS_INFO *)COMCTL32_Alloc (sizeof(IPADDRESS_INFO)); … … 98 94 GetClientRect (hwnd, &rcClient); 99 95 100 fieldsize=(rcClient.right-rcClient.left) /4; 101 102 edit.top =rcClient.top+2; 103 edit.bottom=rcClient.bottom-2; 104 105 lpipsi=(LPIP_SUBCLASS_INFO) 106 GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP); 107 if (lpipsi == NULL) { 108 lpipsi= (LPIP_SUBCLASS_INFO) COMCTL32_Alloc (sizeof(IP_SUBCLASS_INFO)); 109 lpipsi->hwnd = hwnd; 110 lpipsi->uRefCount++; 111 SetPropA ((HWND)hwnd, IP_SUBCLASS_PROP, 112 (HANDLE)lpipsi); 113 /* infoPtr->lpipsi= lpipsi; */ 114 // } else 115 } 116 // WARN (ipaddress,"IP-create called twice\n"); 117 118 for (i=0; i<=3; i++) { 119 infoPtr->LowerLimit[i]=0; 120 infoPtr->UpperLimit[i]=255; 121 edit.left=rcClient.left+i*fieldsize+3; 122 edit.right=rcClient.left+(i+1)*fieldsize-2; 123 lpipsi->hwndIP[i]= CreateWindowA ("edit", NULL, 124 WS_CHILD | WS_VISIBLE | ES_LEFT, 125 edit.left, edit.top, edit.right-edit.left, edit.bottom-edit.top, 126 hwnd, (HMENU) 1, GetWindowLongA (hwnd, GWL_HINSTANCE), NULL); 127 lpipsi->wpOrigProc[i]= (WNDPROC) 128 SetWindowLongA (lpipsi->hwndIP[i],GWL_WNDPROC, (LONG) 129 IPADDRESS_SubclassProc); 130 SetPropA ((HWND)lpipsi->hwndIP[i], IP_SUBCLASS_PROP, 131 (HANDLE)lpipsi); 132 } 133 134 lpipsi->infoPtr= infoPtr; 96 fieldsize=(rcClient.right-rcClient.left) /4; 97 98 edit.top =rcClient.top+2; 99 edit.bottom=rcClient.bottom-2; 100 101 lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP); 102 if (lpipsi == NULL) { 103 lpipsi= (LPIP_SUBCLASS_INFO) COMCTL32_Alloc (sizeof(IP_SUBCLASS_INFO)); 104 lpipsi->hwnd = hwnd; 105 lpipsi->uRefCount++; 106 SetPropA ((HWND)hwnd, IP_SUBCLASS_PROP, (HANDLE)lpipsi); 107 /* infoPtr->lpipsi= lpipsi; */ 108 // } else 109 } 110 // WARN (ipaddress,"IP-create called twice\n"); 111 112 for (i=0; i<=3; i++) 113 { 114 infoPtr->LowerLimit[i]=0; 115 infoPtr->UpperLimit[i]=255; 116 edit.left=rcClient.left+i*fieldsize+6; 117 edit.right=rcClient.left+(i+1)*fieldsize-2; 118 lpipsi->hwndIP[i]= CreateWindowA ("edit", NULL, 119 WS_CHILD | WS_VISIBLE | ES_CENTER, 120 edit.left, edit.top, edit.right-edit.left, edit.bottom-edit.top, 121 hwnd, (HMENU) 1, GetWindowLongA (hwnd, GWL_HINSTANCE), NULL); 122 lpipsi->wpOrigProc[i]= (WNDPROC) 123 SetWindowLongA (lpipsi->hwndIP[i],GWL_WNDPROC, (LONG) 124 IPADDRESS_SubclassProc); 125 SetPropA ((HWND)lpipsi->hwndIP[i], IP_SUBCLASS_PROP, (HANDLE)lpipsi); 126 } 127 128 lpipsi->infoPtr= infoPtr; 135 129 136 130 return 0; … … 141 135 IPADDRESS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) 142 136 { 143 int i;137 int i; 144 138 IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); 145 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)139 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) 146 140 GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP); 147 141 148 for (i=0; i<=3; i++) {149 SetWindowLongA ((HWND)lpipsi->hwndIP[i], GWL_WNDPROC,142 for (i=0; i<=3; i++) { 143 SetWindowLongA ((HWND)lpipsi->hwndIP[i], GWL_WNDPROC, 150 144 (LONG)lpipsi->wpOrigProc[i]); 151 }145 } 152 146 153 147 COMCTL32_Free (infoPtr); … … 161 155 HDC hdc; 162 156 163 // TRACE (ipaddress,"\n");157 // TRACE (ipaddress,"\n"); 164 158 hdc = GetDC (hwnd); 165 159 IPADDRESS_Refresh (hwnd, hdc); … … 167 161 168 162 IPADDRESS_SendIPAddressNotify (hwnd, 0, 0); /* FIXME: should use -1 */ 169 IPADDRESS_SendNotify (hwnd, EN_KILLFOCUS); 163 IPADDRESS_SendNotify (hwnd, EN_KILLFOCUS); 170 164 InvalidateRect (hwnd, NULL, TRUE); 171 165 … … 183 177 IPADDRESS_Refresh (hwnd, hdc); 184 178 if(!wParam) 185 EndPaint (hwnd, &ps);179 EndPaint (hwnd, &ps); 186 180 return 0; 187 181 } … … 193 187 HDC hdc; 194 188 195 // TRACE (ipaddress,"\n");189 // TRACE (ipaddress,"\n"); 196 190 197 191 hdc = GetDC (hwnd); … … 207 201 { 208 202 /* IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); */ 209 // TRACE (ipaddress,"\n");203 // TRACE (ipaddress,"\n"); 210 204 return 0; 211 205 } … … 225 219 IPADDRESS_SendIPAddressNotify (HWND hwnd, UINT field, BYTE newValue) 226 220 { 227 NMIPADDRESS nmip;221 NMIPADDRESS nmip; 228 222 229 223 // TRACE (ipaddress, "%x %x\n",field,newValue); … … 232 226 nmip.hdr.code = IPN_FIELDCHANGED; 233 227 234 nmip.iField=field;235 nmip.iValue=newValue;228 nmip.iField=field; 229 nmip.iValue=newValue; 236 230 237 231 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY, … … 245 239 IPADDRESS_ClearAddress (HWND hwnd, WPARAM wParam, LPARAM lParam) 246 240 { 247 int i;248 HDC hdc;249 char buf[1];250 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)241 int i; 242 HDC hdc; 243 char buf[1]; 244 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) 251 245 GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP); 252 246 253 // TRACE (ipaddress,"\n");254 255 buf[0]=0;256 for (i=0; i<=3; i++) 257 SetWindowTextA (lpipsi->hwndIP[i],buf);258 247 // TRACE (ipaddress,"\n"); 248 249 buf[0]=0; 250 for (i=0; i<=3; i++) 251 SetWindowTextA (lpipsi->hwndIP[i],buf); 252 259 253 hdc = GetDC (hwnd); 260 254 IPADDRESS_Refresh (hwnd, hdc); 261 255 ReleaseDC (hwnd, hdc); 262 263 return 0;256 257 return 0; 264 258 } 265 259 … … 275 269 276 270 for (i=0; i<=3; i++) { 277 GetWindowTextA (lpipsi->hwndIP[i],buf,5);278 if (buf[0])279 return 0;280 }271 GetWindowTextA (lpipsi->hwndIP[i],buf,5); 272 if (buf[0]) 273 return 0; 274 } 281 275 282 276 return 1; … … 298 292 ip_addr=0; 299 293 for (i=0; i<=3; i++) { 300 GetWindowTextA (lpipsi->hwndIP[i],field,4);301 ip_addr*=256;302 if (field[0]) {303 field[3]=0;304 fieldvalue=atoi(field);305 if (fieldvalue<infoPtr->LowerLimit[i]) 306 fieldvalue=infoPtr->LowerLimit[i];307 if (fieldvalue>infoPtr->UpperLimit[i]) 308 fieldvalue=infoPtr->UpperLimit[i];309 ip_addr+=fieldvalue;310 valid++;311 }294 GetWindowTextA (lpipsi->hwndIP[i],field,4); 295 ip_addr*=256; 296 if (field[0]) { 297 field[3]=0; 298 fieldvalue=atoi(field); 299 if (fieldvalue<infoPtr->LowerLimit[i]) 300 fieldvalue=infoPtr->LowerLimit[i]; 301 if (fieldvalue>infoPtr->UpperLimit[i]) 302 fieldvalue=infoPtr->UpperLimit[i]; 303 ip_addr+=fieldvalue; 304 valid++; 305 } 312 306 } 313 307 … … 322 316 { 323 317 IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); 324 INT index;325 326 // TRACE (ipaddress,"\n");327 328 index=(INT) wParam;329 if ((index<0) || (index>3)) return 0;330 331 infoPtr->LowerLimit[index]=lParam & 0xff;332 infoPtr->UpperLimit[index]=(lParam >>8) & 0xff;333 return 1;318 INT index; 319 320 // TRACE (ipaddress,"\n"); 321 322 index=(INT) wParam; 323 if ((index<0) || (index>3)) return 0; 324 325 infoPtr->LowerLimit[index]=lParam & 0xff; 326 infoPtr->UpperLimit[index]=(lParam >>8) & 0xff; 327 return 1; 334 328 } 335 329 … … 338 332 { 339 333 IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); 340 HDC hdc;341 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)334 HDC hdc; 335 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) 342 336 GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP); 343 int i,ip_address,value;337 int i,ip_address,value; 344 338 char buf[20]; 345 339 346 // TRACE (ipaddress,"\n");347 ip_address=(DWORD) lParam;348 349 for (i=3; i>=0; i--) {350 value=ip_address & 0xff;351 if ((value>=infoPtr->LowerLimit[i]) && (value<=infoPtr->UpperLimit[i])) 352 {353 sprintf (buf,"%d",value);354 SetWindowTextA (lpipsi->hwndIP[i],buf);355 IPADDRESS_SendNotify (hwnd, EN_CHANGE);356 }357 ip_address/=256;358 }359 360 hdc = GetDC (hwnd); /* & send notifications */340 // TRACE (ipaddress,"\n"); 341 ip_address=(DWORD) lParam; 342 343 for (i=3; i>=0; i--) { 344 value=ip_address & 0xff; 345 if ((value>=infoPtr->LowerLimit[i]) && (value<=infoPtr->UpperLimit[i])) 346 { 347 sprintf (buf,"%d",value); 348 SetWindowTextA (lpipsi->hwndIP[i],buf); 349 IPADDRESS_SendNotify (hwnd, EN_CHANGE); 350 } 351 ip_address/=256; 352 } 353 354 hdc = GetDC (hwnd); /* & send notifications */ 361 355 IPADDRESS_Refresh (hwnd, hdc); 362 356 ReleaseDC (hwnd, hdc); … … 372 366 { 373 367 /* IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); */ 374 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) 375 GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP);376 INT index;377 378 index=(INT) wParam;379 // TRACE (ipaddress," %d\n", index);380 if ((index<0) || (index>3)) return 0;381 382 SetFocus (lpipsi->hwndIP[index]);383 368 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd, 369 IP_SUBCLASS_PROP); 370 INT index; 371 372 index=(INT) wParam; 373 // TRACE (ipaddress," %d\n", index); 374 if ((index<0) || (index>3)) return 0; 375 376 SetFocus (lpipsi->hwndIP[index]); 377 384 378 return 1; 385 379 } … … 391 385 // TRACE (ipaddress, "\n"); 392 386 393 SetFocus (hwnd); 394 IPADDRESS_SendNotify (hwnd, EN_SETFOCUS); 395 IPADDRESS_SetFocusToField (hwnd, 0, 0); 396 397 return TRUE; 398 } 399 400 401 402 /* tab/shift-tab: IPN_FIELDCHANGED, lose focus. 403 dot, space,right arrow: set focus to next child edit. 404 numerics (0..9), control characters: forward to default edit control 405 other characters: dropped 406 */ 407 408 409 410 411 static int 387 SetFocus (hwnd); 388 IPADDRESS_SendNotify (hwnd, EN_SETFOCUS); 389 IPADDRESS_SetFocusToField (hwnd, 0, 0); 390 391 return TRUE; 392 } 393 394 static INT 395 IPADDRESS_CheckField (LPIP_SUBCLASS_INFO lpipsi, int currentfield) 396 { 397 int newField,fieldvalue; 398 char field[20]; 399 IPADDRESS_INFO *infoPtr=lpipsi->infoPtr; 400 401 if(currentfield >= 0 && currentfield < 4) 402 { 403 // TRACE("\n"); 404 GetWindowTextA (lpipsi->hwndIP[currentfield],field,4); 405 if (field[0]) 406 { 407 field[3]=0; 408 newField=-1; 409 fieldvalue=atoi(field); 410 411 if (fieldvalue < infoPtr->LowerLimit[currentfield]) 412 newField=infoPtr->LowerLimit[currentfield]; 413 414 if (fieldvalue > infoPtr->UpperLimit[currentfield]) 415 newField=infoPtr->UpperLimit[currentfield]; 416 417 if (newField >= 0) 418 { 419 sprintf (field,"%d",newField); 420 SetWindowTextA (lpipsi->hwndIP[currentfield], field); 421 return TRUE; 422 } 423 } 424 } 425 return FALSE; 426 } 427 428 429 static INT 412 430 IPADDRESS_GotoNextField (LPIP_SUBCLASS_INFO lpipsi, int currentfield) 413 431 { 414 int newField,fieldvalue; 415 char field[20]; 416 IPADDRESS_INFO *infoPtr=lpipsi->infoPtr; 417 418 // TRACE (ipaddress,"\n"); 419 GetWindowTextA (lpipsi->hwndIP[currentfield],field,4); 420 if (field[0]) { 421 field[3]=0; 422 newField=-1; 423 fieldvalue=atoi(field); 424 if (fieldvalue<infoPtr->LowerLimit[currentfield]) 425 newField=infoPtr->LowerLimit[currentfield]; 426 if (fieldvalue>infoPtr->UpperLimit[currentfield]) 427 newField=infoPtr->UpperLimit[currentfield]; 428 if (newField>=0) { 429 sprintf (field,"%d",newField); 430 SetWindowTextA (lpipsi->hwndIP[currentfield], field); 431 return 1; 432 } 433 } 434 435 if (currentfield<3) 436 SetFocus (lpipsi->hwndIP[currentfield+1]); 437 return 0; 438 } 432 if(currentfield >= -1 && currentfield < 4) 433 { 434 IPADDRESS_CheckField(lpipsi, currentfield); /* check the fields value */ 435 436 if(currentfield < 3) 437 { 438 SetFocus (lpipsi->hwndIP[currentfield+1]); 439 return TRUE; 440 } 441 } 442 return FALSE; 443 } 444 445 446 /* period: move and select the text in the next field to the right if */ 447 /* the current field is not empty(l!=0), we are not in the */ 448 /* left most position, and nothing is selected(startsel==endsel) */ 449 450 /* spacebar: same behavior as period */ 451 452 /* alpha characters: completely ignored */ 453 454 /* digits: accepted when field text length < 2 ignored otherwise. */ 455 /* when 3 numbers have been entered into the field the value */ 456 /* of the field is checked, if the field value exceeds the */ 457 /* maximum value and is changed the field remains the current */ 458 /* field, otherwise focus moves to the field to the right */ 459 460 /* tab: change focus from the current ipaddress control to the next */ 461 /* control in the tab order */ 462 463 /* right arrow: move to the field on the right to the left most */ 464 /* position in that field if no text is selected, */ 465 /* we are in the right most position in the field, */ 466 /* we are not in the right most field */ 467 468 /* left arrow: move to the field on the left to the right most */ 469 /* position in that field if no text is selected, */ 470 /* we are in the left most position in the current field */ 471 /* and we are not in the left most field */ 472 473 /* backspace: delete the character to the left of the cursor position, */ 474 /* if none are present move to the field on the left if */ 475 /* we are not in the left most field and delete the right */ 476 /* most digit in that field while keeping the cursor */ 477 /* on the right side of the field */ 478 439 479 440 480 … … 442 482 IPADDRESS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 443 483 { 444 int i,l,index; 445 IPADDRESS_INFO *infoPtr; 446 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) 447 GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP); 448 449 infoPtr = lpipsi->infoPtr; 450 index=0; /* FIXME */ 451 for (i=0; i<=3; i++) 452 if (lpipsi->hwndIP[i]==hwnd) index=i; 453 454 switch (uMsg) { 455 case WM_CHAR: break; 456 case WM_KEYDOWN: { 457 char c=(char) wParam; 458 if (c==VK_TAB) { 459 HWND pwnd; 460 int shift; 461 shift = GetKeyState(VK_SHIFT) & 0x8000; 462 if (shift) 463 pwnd=GetNextDlgTabItem (GetParent (hwnd), 0, TRUE); 464 else 465 pwnd=GetNextDlgTabItem (GetParent (hwnd), 0, FALSE); 466 if (pwnd) SetFocus (pwnd); 467 break; 468 } 469 470 if ((c==' ') || (c=='.') || (c==VK_RIGHT)) { 471 IPADDRESS_GotoNextField (lpipsi,index); 472 wParam=0; 473 lParam=0; 474 break; 475 } 476 if (c==VK_LEFT) { 477 478 } 479 if (c==VK_RETURN) { 480 } 481 if (((c>='0') && (c<='9')) || (iscntrl(c))) { 482 l=GetWindowTextLengthA (lpipsi->hwndIP[index]); 483 if (l==3) 484 if (IPADDRESS_GotoNextField (lpipsi,index)) { 485 wParam=0; 486 lParam=0; 487 } 488 break; 489 } 490 491 wParam=0; 492 lParam=0; 493 break; 494 } 495 } 496 497 return CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam); 484 IPADDRESS_INFO *infoPtr; 485 LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO) GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP); 486 CHAR c = (CHAR)wParam; 487 INT i, l, index, startsel, endsel; 488 489 infoPtr = lpipsi->infoPtr; 490 index=0; /* FIXME */ 491 for (i=0; i<=3; i++) 492 if (lpipsi->hwndIP[i]==hwnd) index=i; 493 494 switch (uMsg) { 495 case WM_CHAR: 496 if(isdigit(c)) /* process all digits */ 497 { 498 int return_val; 499 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 500 l = GetWindowTextLengthA (lpipsi->hwndIP[index]); 501 if(l==2 && startsel==endsel) /* field is full after this key is processed */ 502 { 503 /* process the digit press before we check the field */ 504 return_val = CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam); 505 506 /* if the field value was changed stay at the current field */ 507 if(!IPADDRESS_CheckField(lpipsi, index)) 508 IPADDRESS_GotoNextField (lpipsi,index); 509 510 return return_val; 511 } 512 513 if(l > 2) /* field is full, stop key messages */ 514 { 515 lParam = 0; 516 wParam = 0; 517 } 518 break; 519 } 520 521 if(c == '.') /* VK_PERIOD */ 522 { 523 l = GetWindowTextLengthA(lpipsi->hwndIP[index]); 524 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 525 if(l != 0 && startsel==endsel && startsel != 0) 526 { 527 IPADDRESS_GotoNextField(lpipsi, index); 528 SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0, (LPARAM)3); 529 } 530 } 531 532 /* stop all other characters */ 533 wParam = 0; 534 lParam = 0; 535 break; 536 537 case WM_KEYDOWN: 538 if(c == VK_SPACE) 539 { 540 l = GetWindowTextLengthA(lpipsi->hwndIP[index]); 541 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 542 if(l != 0 && startsel==endsel && startsel != 0) 543 { 544 IPADDRESS_GotoNextField(lpipsi, index); 545 SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0, (LPARAM)3); 546 } 547 } 548 549 if(c == VK_RIGHT) 550 { 551 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 552 l = GetWindowTextLengthA (lpipsi->hwndIP[index]); 553 554 if(startsel==endsel && startsel==l) 555 { 556 IPADDRESS_GotoNextField(lpipsi, index); 557 SendMessageA(lpipsi->hwndIP[index+1], EM_SETSEL, (WPARAM)0,(LPARAM)0); 558 } 559 } 560 561 if(c == VK_LEFT) 562 { 563 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 564 if(startsel==0 && startsel==endsel && index > 0) 565 { 566 IPADDRESS_GotoNextField(lpipsi, index - 2); 567 l = GetWindowTextLengthA(lpipsi->hwndIP[index-1]); 568 SendMessageA(lpipsi->hwndIP[index-1], EM_SETSEL, (WPARAM)l,(LPARAM)l); 569 } 570 } 571 572 if(c == VK_BACK) /* VK_BACKSPACE */ 573 { 574 CHAR buf[4]; 575 576 SendMessageA(lpipsi->hwndIP[index], EM_GETSEL, (WPARAM)&startsel, (LPARAM)&endsel); 577 l = GetWindowTextLengthA (lpipsi->hwndIP[index]); 578 if(startsel==endsel && startsel==0 && index > 0) 579 { 580 l = GetWindowTextLengthA(lpipsi->hwndIP[index-1]); 581 if(l!=0) 582 { 583 GetWindowTextA (lpipsi->hwndIP[index-1],buf,4); 584 buf[l-1] = '\0'; 585 SetWindowTextA(lpipsi->hwndIP[index-1], buf); 586 SendMessageA(lpipsi->hwndIP[index-1], EM_SETSEL, (WPARAM)l,(LPARAM)l); 587 } 588 IPADDRESS_GotoNextField(lpipsi, index - 2); 589 } 590 } 591 break; 592 593 default: 594 break; 595 } 596 return CallWindowProcA (lpipsi->wpOrigProc[index], hwnd, uMsg, wParam, lParam); 498 597 } 499 598 … … 503 602 switch (uMsg) 504 603 { 505 case IPM_CLEARADDRESS:506 return IPADDRESS_ClearAddress (hwnd, wParam, lParam);507 508 case IPM_SETADDRESS:509 return IPADDRESS_SetAddress (hwnd, wParam, lParam);510 511 case IPM_GETADDRESS:512 return IPADDRESS_GetAddress (hwnd, wParam, lParam);513 514 case IPM_SETRANGE:515 return IPADDRESS_SetRange (hwnd, wParam, lParam);516 517 case IPM_SETFOCUS:518 return IPADDRESS_SetFocusToField (hwnd, wParam, lParam);519 520 case IPM_ISBLANK:521 return IPADDRESS_IsBlank (hwnd, wParam, lParam);522 523 case WM_CREATE:524 return IPADDRESS_Create (hwnd, wParam, lParam);525 526 case WM_DESTROY:527 return IPADDRESS_Destroy (hwnd, wParam, lParam);528 529 case WM_GETDLGCODE:530 return DLGC_WANTARROWS | DLGC_WANTCHARS;531 532 case WM_KILLFOCUS:533 return IPADDRESS_KillFocus (hwnd, wParam, lParam);534 535 case WM_LBUTTONDOWN:604 case IPM_CLEARADDRESS: 605 return IPADDRESS_ClearAddress (hwnd, wParam, lParam); 606 607 case IPM_SETADDRESS: 608 return IPADDRESS_SetAddress (hwnd, wParam, lParam); 609 610 case IPM_GETADDRESS: 611 return IPADDRESS_GetAddress (hwnd, wParam, lParam); 612 613 case IPM_SETRANGE: 614 return IPADDRESS_SetRange (hwnd, wParam, lParam); 615 616 case IPM_SETFOCUS: 617 return IPADDRESS_SetFocusToField (hwnd, wParam, lParam); 618 619 case IPM_ISBLANK: 620 return IPADDRESS_IsBlank (hwnd, wParam, lParam); 621 622 case WM_CREATE: 623 return IPADDRESS_Create (hwnd, wParam, lParam); 624 625 case WM_DESTROY: 626 return IPADDRESS_Destroy (hwnd, wParam, lParam); 627 628 case WM_GETDLGCODE: 629 return DLGC_WANTARROWS | DLGC_WANTCHARS; 630 631 case WM_KILLFOCUS: 632 return IPADDRESS_KillFocus (hwnd, wParam, lParam); 633 634 case WM_LBUTTONDOWN: 536 635 return IPADDRESS_LButtonDown (hwnd, wParam, lParam); 537 636 538 case WM_PAINT:539 return IPADDRESS_Paint (hwnd, wParam);540 541 case WM_SETFOCUS:542 return IPADDRESS_SetFocus (hwnd, wParam, lParam);543 544 case WM_SIZE:545 return IPADDRESS_Size (hwnd, wParam, lParam);546 547 default:548 // if (uMsg >= WM_USER)549 // ERR (ipaddress, "unknown msg %04x wp=%08x lp=%08lx\n",550 // uMsg, wParam, lParam);551 return DefWindowProcA (hwnd, uMsg, wParam, lParam);637 case WM_PAINT: 638 return IPADDRESS_Paint (hwnd, wParam); 639 640 case WM_SETFOCUS: 641 return IPADDRESS_SetFocus (hwnd, wParam, lParam); 642 643 case WM_SIZE: 644 return IPADDRESS_Size (hwnd, wParam, lParam); 645 646 default: 647 // if (uMsg >= WM_USER) 648 // ERR (ipaddress, "unknown msg %04x wp=%08x lp=%08lx\n", 649 // uMsg, wParam, lParam); 650 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 552 651 } 553 652 return 0; … … 570 669 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 571 670 wndClass.lpszClassName = WC_IPADDRESSA; 572 671 573 672 RegisterClassA (&wndClass); 574 673 }
Note:
See TracChangeset
for help on using the changeset viewer.
