| Acknowledgments | xvii |
| Introduction | xix |
| PART I WINDOWS PROGRAMMING BASICS | |
| 1 Hello Windows CE | 3 |
| What Is Different About Windows CE | 3 |
| Fewer Resources in Windows CE Devices | 4 |
| Unicode | 4 |
| New Controls | 5 |
| It’s Still Windows Programming | 6 |
| The Window Class | 6 |
| Your First Program | 8 |
| Hungarian Notation | 15 |
| My Programming Style | 16 |
| Building HelloCE | 16 |
| 2 Drawing on the Screen | 35 |
| Painting Basics | 36 |
| Valid and Invalid Regions | 36 |
| Device Contexts | 37 |
| Writing Text | 39 |
| Device Context Attributes | 39 |
| The TextDemo Example Program | 40 |
| Fonts | 47 |
| The FontList Example Program | 52 |
| Bitmaps | 62 |
| Device Dependent Bitmaps | 63 |
| Device Independent Bitmaps | 64 |
| DIB Sections | 64 |
| Drawing Bitmaps | 67 |
| Lines and Shapes | 70 |
| Lines | 70 |
| Shapes | 72 |
| The Shapes Example Program | 75 |
| 3 Input: Keyboard, Touch Screen, and Menus | 85 |
| The Keyboard | 85 |
| Input Focus | 86 |
| Keyboard Messages | 86 |
| Keyboard Functions | 91 |
| The KeyTrac Example Program | 94 |
| The Touch Screen and the Stylus | 103 |
| Stylus Messages | 103 |
| The TicTac1 Example Program | 112 |
| Menus | 122 |
| Handling Menu Commands | 124 |
| Resources | 125 |
| Resource Scripts | 125 |
| Icons | 127 |
| Accelerators | 128 |
| Bitmaps | 129 |
| Strings | 129 |
| The TicTac2 Example Program | 130 |
| 4 Windows, Controls, and Dialog Boxes | 147 |
| Child Windows | 148 |
| Window Management Functions | 149 |
| Scroll Bars and the FontList2 Example Program | 151 |
| Windows Controls | 167 |
| Button Controls | 168 |
| The Edit Control | 171 |
| The List Box Control | 171 |
| The Combo Box Control | 172 |
| Static Controls | 173 |
| The Scroll Bar Control | 174 |
| The CtlView Example Program | 174 |
| Dialog Boxes | 206 |
| Dialog Box Resource Templates | 206 |
| Creating a Dialog Box | 209 |
| Dialog Box Procedures | 211 |
| Modeless Dialog Boxes | 214 |
| Property Sheets | 216 |
| Common Dialogs | 222 |
| The DlgDemo Example Program | 224 |
| PART II WINDOWS CE BASICS | |
| 5 Common Controls and Windows CE | 263 |
| Programming Common Controls | 264 |
| The Common Controls | 266 |
| The Command Bar | 266 |
| The CmdBar Example Program | 278 |
| Command Bands | 293 |
| The CmdBand Example Program | 303 |
| The Month Calendar Control | 317 |
| The Date and Time Picker Control | 320 |
| The List View Control | 322 |
| The LView Example Program | 325 |
| Other Common Controls | 344 |
| Unsupported Common Controls | 345 |
| 6 Memory Management | 347 |
| Memory Basics | 347 |
| About RAM | 348 |
| About ROM | 348 |
| About Virtual Memory | 349 |
| The Windows CE Address Space | 350 |
| An Application’s Address Space | 354 |
| The Different Kinds of Memory Allocation | 357 |
| Virtual Memory | 357 |
| Heaps | 363 |
| The Local Heap | 364 |
| Separate Heaps | 365 |
| The Stack | 368 |
| Static Data | 369 |
| String Resources | 371 |
| Selecting the Proper Memory Type | 371 |
| Managing Low-Memory Conditions | 372 |
| 7 Files, Databases, and the Registry | 377 |
| The Windows CE File System | 378 |
| The Object Store vs. Other Storage Media | 379 |
| Standard File I/O | 380 |
| Creating and Opening Files | 380 |
| Reading and Writing | 382 |
| The FileView Sample Program | 387 |
| Memory-Mapped Files and Objects | 405 |
| Navigating the File System | 409 |
| Databases | 415 |
| Basic Definitions | 416 |
| The Database API | 417 |
| The AlbumDB Example Program | 433 |
| The Registry | 463 |
| Registry Organization | 464 |
| The Registry API | 465 |
| The RegView Example Program | 469 |
| 8 Processes and Threads | 487 |
| Processes | 487 |
| Creating a Process | 488 |
| Terminating a Process | 491 |
| Other Processes | 492 |
| Threads | 493 |
| The System Scheduler | 493 |
| Never Do This! | 495 |
| Creating a Thread | 496 |
| Thread Local Storage | 501 |
| Synchronization | 503 |
| Events | 504 |
| Waiting... | 505 |
| Semaphores | 509 |
| Mutexes | 511 |
| Critical Sections | 512 |
| Interlocked Variable Access | 514 |
| Windows CE Security | 515 |
| Interprocess Communication | 516 |
| Finding Other Processes | 517 |
| The XTalk Example Program | 519 |
| Exception Handling | 533 |
| The __try, __except Block | 533 |
| The __try, __finally Block | 536 |
| PART III COMMUNICATIONS | |
| 9 Serial Communications | 539 |
| Basic Serial Communication | 539 |
| Opening and Closing a Serial Port | 540 |
| Reading and Writing to a Serial Port | 541 |
| Asynchronous Serial I/O | 542 |
| Configuring the Serial Port | 543 |
| Setting the Port Timeout Values | 546 |
| Querying the Capabilities of the Serial Driver | 547 |
| Controlling the Serial Port | 549 |
| Clearing Errors and Querying Status | 550 |
| Stayin’ Alive | 551 |
| The Infrared Port | 552 |
| Raw IR | 552 |
| IrComm | 555 |
| The CeChat Example Program | 556 |
| 10 Windows Networking and IrSock | 575 |
| Windows Networking Support | 575 |
| WNet Functions | 576 |
| The ListNet Example Program | 587 |
| Basic Sockets | 596 |
| Initializing the WinSock DLL | 597 |
| Stream Sockets | 598 |
| IrSock | 603 |
| The MySquirt Example Program | 609 |
| TCP/IP Pinging | 628 |
| 11 Connecting to the Desktop | 635 |
| The Windows CE Remote API | 636 |
| RAPI Overview | 636 |
| Predefined RAPI Functions | 640 |
| The RapiDir Example Program | 646 |
| Custom RAPI Functions | 650 |
| The RapiFind Example Program | 656 |
| The CeUtil Functions | 665 |
| Connection Notification | 670 |
| Registry Method | 670 |
| COM Method | 672 |
| The CnctNote Example Program | 675 |
| Connection Detection on the Windows CE Side | 684 |
| File Filters | 684 |
| Registering a File Filter | 684 |
| The File Filter Interfaces | 690 |
| The ICeFileFilterOptions Interface | 694 |
| The DivFile Filter Example | 695 |
| PART IV ADVANCED TOPICS | |
| 12 Notifications | 711 |
| User Notifications | 711 |
| Setting a User Notification | 712 |
| Timer Event Notifications | 717 |
| System Event Notifications | 718 |
| The NoteDemo Example Program | 719 |
| Querying Scheduled Notifications | 732 |
| 13 The Explorer Shell | 735 |
| Working with the Shell | 736 |
| The Shell Namespace | 736 |
| Special Folders | 737 |
| Shortcuts | 739 |
| Configuring the Start Menu | 740 |
| Recent Documents List | 741 |
| Launching Applications | 741 |
| The Taskbar | 743 |
| The TBIcons Example Program | 744 |
| The Out Of Memory Error Dialog Box | 751 |
| Console Applications | 752 |
| The CEFind Example Program | 753 |
| Hardware Keys | 757 |
| Virtual Codes for Hardware Keys | 757 |
| Using the Application Launch Keys | 759 |
| Dynamically Overriding Application Launch Keys | 761 |
| 14 Programming the Pocket PC | 763 |
| The Pocket PC Screen | 764 |
| Hello Pocket PC | 764 |
| Differences in a Pocket PC Application | 774 |
| Building HelloPPC | 779 |
| The Menu Bar | 779 |
| Creating a Menu Bar | 780 |
| Menu Bar Resources | 782 |
| Working with a Menu Bar | 786 |
| The NewMenuX Example | 788 |
| The MenuBar Example | 797 |
| Dialog Boxes | 813 |
| Full-Screen Dialog Boxes | 813 |
| Input Dialogs | 815 |
| Property Sheets | 816 |
| AutoRun | 818 |
| SHSipInfo | 821 |
| The Game API | 823 |
| GAPI Initialization | 825 |
| Drawing to the Screen | 827 |
| Indirect Access to the Frame Buffer | 828 |
| GAPI Maintenance | 829 |
| Cleaning Up | 829 |
| The GAPIShow Example | 830 |
| 15 Extending the Pocket PC | 849 |
| Writing a Custom Today Screen Item | 849 |
| Creating a Today Screen Item DLL | 850 |
| The PowerBar Custom Today Screen Item | 855 |
| Writing an Input Method | 867 |
| The Components of a SIP | 868 |
| Threading Issues with Input Methods | 869 |
| The IInputMethod and IInputMethod2 Interfaces | 869 |
| The IIMCallback and IIMCallback2 Interfaces | 874 |
| The NumPanel Example Input Method | 877 |
| 16 System Programming | 901 |
| The Boot Process | 901 |
| Reset | 902 |
| Powering Up Doesn’t Boot the System | 909 |
| System Configuration | 910 |
| Writing Cross-Platform Windows CE Applications | 911 |
| Platforms and Operating System Versions | 911 |
| Compile-Time Versioning | 912 |
| Explicit Linking | 913 |
| Run-Time Version Checking | 916 |
| Power Management | 918 |
| 17 Device Drivers | 925 |
| Basic Drivers | 925 |
| Driver Names | 926 |
| Enumerating the Active Drivers | 926 |
| Reading and Writing Device Drivers | 930 |
| Writing a Windows CE Stream Device Driver | 931 |
| The Stream API | 933 |
| Building a Device Driver | 942 |
| Debug Zones | 942 |
| The Generic Driver Example | 944 |
| Asynchronous Driver I/O | 952 |
| INDEX | 957 |