|
|
1.1 ! root 1: /**************************************************************************** ! 2: ! 3: PROGRAM: Generic.c ! 4: ! 5: PURPOSE: Generic template for Windows applications ! 6: ! 7: FUNCTIONS: ! 8: ! 9: WinMain() - calls initialization function, processes message loop ! 10: InitApplication() - initializes window data and registers window ! 11: InitInstance() - saves instance handle and creates main window ! 12: MainWndProc() - processes messages ! 13: About() - processes messages for "About" dialog box ! 14: ! 15: COMMENTS: ! 16: ! 17: Windows can have several copies of your application running at the ! 18: same time. The variable hInst keeps track of which instance this ! 19: application is so that processing will be to the correct window. ! 20: ! 21: ****************************************************************************/ ! 22: ! 23: #include <windows.h> /* required for all Windows applications */ ! 24: #include "generic.h" /* specific to this program */ ! 25: ! 26: HANDLE hInst; /* current instance */ ! 27: ! 28: /**************************************************************************** ! 29: ! 30: FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int) ! 31: ! 32: PURPOSE: calls initialization function, processes message loop ! 33: ! 34: COMMENTS: ! 35: ! 36: Windows recognizes this function by name as the initial entry point ! 37: for the program. This function calls the application initialization ! 38: routine, if no other instance of the program is running, and always ! 39: calls the instance initialization routine. It then executes a message ! 40: retrieval and dispatch loop that is the top-level control structure ! 41: for the remainder of execution. The loop is terminated when a WM_QUIT ! 42: message is received, at which time this function exits the application ! 43: instance by returning the value passed by PostQuitMessage(). ! 44: ! 45: If this function must abort before entering the message loop, it ! 46: returns the conventional value NULL. ! 47: ! 48: ****************************************************************************/ ! 49: ! 50: int APIENTRY WinMain( ! 51: HANDLE hInstance, ! 52: HANDLE hPrevInstance, ! 53: LPSTR lpCmdLine, ! 54: int nCmdShow ! 55: ) ! 56: { ! 57: ! 58: MSG msg; /* message */ ! 59: ! 60: UNREFERENCED_PARAMETER( lpCmdLine ); ! 61: ! 62: if (!hPrevInstance) /* Other instances of app running? */ ! 63: if (!InitApplication(hInstance)) /* Initialize shared things */ ! 64: return (FALSE); /* Exits if unable to initialize */ ! 65: ! 66: /* Perform initializations that apply to a specific instance */ ! 67: ! 68: if (!InitInstance(hInstance, nCmdShow)) ! 69: return (FALSE); ! 70: ! 71: /* Acquire and dispatch messages until a WM_QUIT message is received. */ ! 72: ! 73: while (GetMessage(&msg, /* message structure */ ! 74: NULL, /* handle of window receiving the message */ ! 75: NULL, /* lowest message to examine */ ! 76: NULL)) /* highest message to examine */ ! 77: { ! 78: TranslateMessage(&msg); /* Translates virtual key codes */ ! 79: DispatchMessage(&msg); /* Dispatches message to window */ ! 80: } ! 81: return (msg.wParam); /* Returns the value from PostQuitMessage */ ! 82: } ! 83: ! 84: ! 85: /**************************************************************************** ! 86: ! 87: FUNCTION: InitApplication(HANDLE) ! 88: ! 89: PURPOSE: Initializes window data and registers window class ! 90: ! 91: COMMENTS: ! 92: ! 93: This function is called at initialization time only if no other ! 94: instances of the application are running. This function performs ! 95: initialization tasks that can be done once for any number of running ! 96: instances. ! 97: ! 98: In this case, we initialize a window class by filling out a data ! 99: structure of type WNDCLASS and calling the Windows RegisterClass() ! 100: function. Since all instances of this application use the same window ! 101: class, we only need to do this when the first instance is initialized. ! 102: ! 103: ! 104: ****************************************************************************/ ! 105: ! 106: BOOL InitApplication(HANDLE hInstance) /* current instance */ ! 107: { ! 108: WNDCLASS wc; ! 109: ! 110: /* Fill in window class structure with parameters that describe the */ ! 111: /* main window. */ ! 112: ! 113: wc.style = NULL; /* Class style(s). */ ! 114: wc.lpfnWndProc = (WNDPROC)MainWndProc; /* Function to retrieve messages for */ ! 115: /* windows of this class. */ ! 116: wc.cbClsExtra = 0; /* No per-class extra data. */ ! 117: wc.cbWndExtra = 0; /* No per-window extra data. */ ! 118: wc.hInstance = hInstance; /* Application that owns the class. */ ! 119: wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); ! 120: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 121: wc.hbrBackground = GetStockObject(WHITE_BRUSH); ! 122: wc.lpszMenuName = "GenericMenu"; /* Name of menu resource in .RC file. */ ! 123: wc.lpszClassName = "GenericWClass"; /* Name used in call to CreateWindow. */ ! 124: ! 125: /* Register the window class and return success/failure code. */ ! 126: ! 127: return (RegisterClass(&wc)); ! 128: ! 129: } ! 130: ! 131: ! 132: /**************************************************************************** ! 133: ! 134: FUNCTION: InitInstance(HANDLE, int) ! 135: ! 136: PURPOSE: Saves instance handle and creates main window ! 137: ! 138: COMMENTS: ! 139: ! 140: This function is called at initialization time for every instance of ! 141: this application. This function performs initialization tasks that ! 142: cannot be shared by multiple instances. ! 143: ! 144: In this case, we save the instance handle in a static variable and ! 145: create and display the main program window. ! 146: ! 147: ****************************************************************************/ ! 148: ! 149: BOOL InitInstance( ! 150: HANDLE hInstance, /* Current instance identifier. */ ! 151: int nCmdShow) /* Param for first ShowWindow() call. */ ! 152: { ! 153: HWND hWnd; /* Main window handle. */ ! 154: ! 155: /* Save the instance handle in static variable, which will be used in */ ! 156: /* many subsequence calls from this application to Windows. */ ! 157: ! 158: hInst = hInstance; ! 159: ! 160: /* Create a main window for this application instance. */ ! 161: ! 162: hWnd = CreateWindow( ! 163: "GenericWClass", /* See RegisterClass() call. */ ! 164: "Generic Sample Application", /* Text for window title bar. */ ! 165: WS_OVERLAPPEDWINDOW, /* Window style. */ ! 166: CW_USEDEFAULT, /* Default horizontal position. */ ! 167: CW_USEDEFAULT, /* Default vertical position. */ ! 168: CW_USEDEFAULT, /* Default width. */ ! 169: CW_USEDEFAULT, /* Default height. */ ! 170: NULL, /* Overlapped windows have no parent. */ ! 171: NULL, /* Use the window class menu. */ ! 172: hInstance, /* This instance owns this window. */ ! 173: NULL /* Pointer not needed. */ ! 174: ); ! 175: ! 176: /* If window could not be created, return "failure" */ ! 177: ! 178: if (!hWnd) ! 179: return (FALSE); ! 180: ! 181: /* Make the window visible; update its client area; and return "success" */ ! 182: ! 183: ShowWindow(hWnd, nCmdShow); /* Show the window */ ! 184: UpdateWindow(hWnd); /* Sends WM_PAINT message */ ! 185: return (TRUE); /* Returns the value from PostQuitMessage */ ! 186: ! 187: } ! 188: ! 189: /**************************************************************************** ! 190: ! 191: FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG) ! 192: ! 193: PURPOSE: Processes messages ! 194: ! 195: MESSAGES: ! 196: ! 197: WM_COMMAND - application menu (About dialog box) ! 198: WM_DESTROY - destroy window ! 199: ! 200: COMMENTS: ! 201: ! 202: To process the IDM_ABOUT message, call MakeProcInstance() to get the ! 203: current instance address of the About() function. Then call Dialog ! 204: box which will create the box according to the information in your ! 205: generic.rc file and turn control over to the About() function. When ! 206: it returns, free the intance address. ! 207: ! 208: ****************************************************************************/ ! 209: ! 210: LONG APIENTRY MainWndProc( ! 211: HWND hWnd, /* window handle */ ! 212: UINT message, /* type of message */ ! 213: UINT wParam, /* additional information */ ! 214: LONG lParam) /* additional information */ ! 215: { ! 216: FARPROC lpProcAbout; /* pointer to the "About" function */ ! 217: ! 218: switch (message) { ! 219: case WM_COMMAND: /* message: command from application menu */ ! 220: if (LOWORD(wParam) == IDM_ABOUT) { ! 221: lpProcAbout = MakeProcInstance((FARPROC)About, hInst); ! 222: ! 223: DialogBox(hInst, /* current instance */ ! 224: "AboutBox", /* resource to use */ ! 225: hWnd, /* parent handle */ ! 226: (WNDPROC)lpProcAbout); /* About() instance address */ ! 227: ! 228: FreeProcInstance(lpProcAbout); ! 229: break; ! 230: } ! 231: else /* Lets Windows process it */ ! 232: return (DefWindowProc(hWnd, message, wParam, lParam)); ! 233: ! 234: case WM_DESTROY: /* message: window being destroyed */ ! 235: PostQuitMessage(0); ! 236: break; ! 237: ! 238: default: /* Passes it on if unproccessed */ ! 239: return (DefWindowProc(hWnd, message, wParam, lParam)); ! 240: } ! 241: return (NULL); ! 242: } ! 243: ! 244: ! 245: /**************************************************************************** ! 246: ! 247: FUNCTION: About(HWND, unsigned, WORD, LONG) ! 248: ! 249: PURPOSE: Processes messages for "About" dialog box ! 250: ! 251: MESSAGES: ! 252: ! 253: WM_INITDIALOG - initialize dialog box ! 254: WM_COMMAND - Input received ! 255: ! 256: COMMENTS: ! 257: ! 258: No initialization is needed for this particular dialog box, but TRUE ! 259: must be returned to Windows. ! 260: ! 261: Wait for user to click on "Ok" button, then close the dialog box. ! 262: ! 263: ****************************************************************************/ ! 264: ! 265: BOOL APIENTRY About( ! 266: HWND hDlg, /* window handle of the dialog box */ ! 267: UINT message, /* type of message */ ! 268: UINT wParam, /* message-specific information */ ! 269: LONG lParam) ! 270: { ! 271: switch (message) { ! 272: case WM_INITDIALOG: /* message: initialize dialog box */ ! 273: return (TRUE); ! 274: ! 275: case WM_COMMAND: /* message: received a command */ ! 276: if (LOWORD(wParam) == IDOK /* "OK" box selected? */ ! 277: || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */ ! 278: EndDialog(hDlg, TRUE); /* Exits the dialog box */ ! 279: return (TRUE); ! 280: } ! 281: break; ! 282: } ! 283: return (FALSE); /* Didn't process a message */ ! 284: UNREFERENCED_PARAMETER(lParam); ! 285: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.