applicat.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:10k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * applicat.h
  3.  *
  4.  * GUI application class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: applicat.h,v $
  30.  * Revision 1.33  2000/03/17 20:32:21  robertj
  31.  * Fixed race conditions in mult-threaded windows (dialogs in particular)
  32.  *
  33.  * Revision 1.32  2000/03/04 07:47:49  robertj
  34.  * Fixed problem with window not appearing when assert on GUI based win32 apps.
  35.  *
  36.  * Revision 1.31  1999/08/07 07:13:22  robertj
  37.  * Fixed problems with "balloon help" text popup.
  38.  *
  39.  * Revision 1.30  1999/02/16 08:08:47  robertj
  40.  * MSVC 6.0 compatibility changes.
  41.  *
  42.  * Revision 1.29  1998/12/02 03:51:41  robertj
  43.  * Unix compatibility changes
  44.  *
  45.  * Revision 1.28  1998/11/30 02:59:48  robertj
  46.  * New directory structure
  47.  *
  48.  * Revision 1.27  1998/09/24 03:39:28  robertj
  49.  * Added open software license.
  50.  *
  51.  * Revision 1.26  1998/04/07 13:32:17  robertj
  52.  * Changed startup code to support PApplication class.
  53.  *
  54.  * Revision 1.25  1998/03/29 06:20:07  robertj
  55.  * Rearranged initialisation sequence so PProcess descendent constructors can do "things".
  56.  *
  57.  * Revision 1.24  1997/07/08 12:59:14  robertj
  58.  * DLL support
  59.  *
  60.  * Revision 1.23  1997/04/27 05:50:28  robertj
  61.  * DLL support.
  62.  *
  63.  * Revision 1.22  1996/08/17 10:00:39  robertj
  64.  * Changes for Windows DLL support.
  65.  *
  66.  * Revision 1.21  1996/08/08 10:09:25  robertj
  67.  * Directory structure changes for common files.
  68.  *
  69.  * Revision 1.20  1996/06/28 13:24:00  robertj
  70.  * If WIN32 then platform has threads, removed resundent ifdef.
  71.  *
  72.  * Revision 1.19  1996/01/02 12:58:55  robertj
  73.  * Mac OS compatibility changes.
  74.  *
  75.  * Revision 1.18  1995/12/10 11:53:10  robertj
  76.  * Changes to main() startup mechanism to support Mac.
  77.  *
  78.  * Revision 1.17  1995/11/09 12:24:24  robertj
  79.  * Moved window style bits to member variable.
  80.  *
  81.  * Revision 1.16  1995/08/24 12:40:23  robertj
  82.  * Added Construct() function required by X platform.
  83.  * Added standard colours for balloon help windows.
  84.  *
  85.  * Revision 1.15  1995/07/31 12:17:53  robertj
  86.  * Split off pop up window from balloon.
  87.  *
  88.  * Revision 1.14  1995/04/25 11:34:09  robertj
  89.  * Changes for DLL support.
  90.  *
  91.  * Revision 1.13  1995/04/03 11:27:45  robertj
  92.  * Fixed balloon help window so doesn't flash main window.
  93.  *
  94.  * Revision 1.12  1995/04/02 09:27:37  robertj
  95.  * Added "balloon" help.
  96.  *
  97.  * Revision 1.11  1995/03/12 05:00:11  robertj
  98.  * Re-organisation of DOS/WIN16 and WIN32 platforms to maximise common code.
  99.  * Used built-in equate for WIN32 API (_WIN32).
  100.  *
  101.  * Revision 1.10  1995/02/05  00:53:53  robertj
  102.  * Removed incorrect inline include.
  103.  *
  104.  * Revision 1.9  1995/01/22  07:29:43  robertj
  105.  * Added font & colour standard dialogs.
  106.  *
  107.  * Revision 1.8  1995/01/09  12:27:11  robertj
  108.  * Moved EXPORTED definition to object.h
  109.  *
  110.  * Revision 1.7  1994/08/21  23:43:02  robertj
  111.  * Made last tick an int for efficiency.
  112.  *
  113.  * Revision 1.6  1994/07/27  05:58:07  robertj
  114.  * Synchronisation.
  115.  *
  116.  * Revision 1.5  1994/07/21  12:33:49  robertj
  117.  * Moved cooperative threads to common.
  118.  *
  119.  * Revision 1.4  1994/07/02  03:03:49  robertj
  120.  * Changes to timer processing.
  121.  *
  122.  * Revision 1.3  1994/06/25  11:55:15  robertj
  123.  * Unix version synchronisation.
  124.  *
  125.  * Revision 1.2  1994/04/20  12:17:44  robertj
  126.  * assert changes
  127.  *
  128.  * Revision 1.1  1994/04/12  08:21:52  robertj
  129.  * Initial revision
  130.  *
  131.  */
  132. #ifndef _PAPPLICATION
  133. class PInteractorLayout;
  134. ///////////////////////////////////////////////////////////////////////////////
  135. // PApplication
  136. #include "../../applicat.h"
  137.   public:
  138.     virtual BOOL IsGUIProcess() const;
  139. #ifndef P_PLATFORM_HAS_THREADS
  140.     // Overrides for class PThread
  141.     virtual void OperatingSystemYield();
  142.       // This is here so that other MS-Windows tasks get scheduled if the
  143.       // PApplication thread is blocked internal to PWLib.
  144. #endif
  145.     // New functions for class
  146.     HINSTANCE GetInstance() const;
  147.       // Return the MS-Windows instance handle.
  148.     // Support for looking up C++ objects from HWNDs
  149.     void AddWindowHandle(HWND hWnd, PInteractor * pWnd);
  150.     void RemoveWindowHandle(HWND hWnd);
  151.     PInteractor * GetWindowObject(HWND hWnd) const;
  152.     // Support for non-modal dialogs
  153.     void AddDialog(PInteractorLayout * pWnd);
  154.     void RemoveDialog(PInteractorLayout * pWnd);
  155.   private:
  156.     enum WndProcTypes {
  157.       WndProcType,
  158.       DlgProcType,
  159.       FileDlgProcType,
  160.       PrintDlgProcType,
  161.       FontDlgProcType,
  162.       ColourDlgProcType,
  163.       NumWndProcTypes
  164.     };
  165.     WNDPROC GetWndProcPtr(WndProcTypes proc) const;
  166.       // Return the MS-Windows callback functions.
  167.     LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  168.       // Called by the static function but is now bound to the application
  169.       // object data.
  170.     BOOL DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  171.       // Called by the static function but is now bound to the application
  172.       // object data.
  173.     BOOL FileDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  174.       // Called by the static function but is now bound to the application
  175.       // object data.
  176.     BOOL PrintDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  177.       // Called by the static function but is now bound to the application
  178.       // object data.
  179.     BOOL FontDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  180.       // Called by the static function but is now bound to the application
  181.       // object data.
  182.     BOOL ColourDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  183.       // Called by the static function but is now bound to the application
  184.       // object data.
  185.     BOOL ProcessMessage();
  186.       // Process a MS-Windows message.
  187.     // Member Variables
  188.     HINSTANCE hInstance;
  189.       // The MS-Windows instance handle for the running image.
  190.     WNDPROC wndProcPtr[NumWndProcTypes];
  191.       // Pointers to the MS-Windows callback functions that bind MS-Windows
  192.       // messages to the C++ class objects.
  193.     class HWNDKey : public PObject
  194.     {
  195.       PCLASSINFO(HWNDKey, PObject)
  196.       // This class is used in the hash table lookup for getting a PInteractor
  197.       // pointer given a MS-Windows window handle.
  198.       public:
  199.         HWNDKey(HWND newKey)
  200.           { theKey = newKey; }
  201.         inline PObject * Clone() const
  202.           { return new HWNDKey(theKey); }
  203.         inline Comparison Compare(const PObject & obj) const
  204.           { return theKey != ((const HWNDKey &)obj).theKey
  205.                                                      ? GreaterThan : EqualTo; }
  206.         inline PINDEX HashFunction() const
  207.           { return ((UINT)theKey/8)%23; }
  208.       private:
  209.         HWND theKey;
  210.     };
  211.     PDICTIONARY(WindowDict, HWNDKey, PInteractor);
  212.     WindowDict createdWindows;
  213.     PMutex windowsMutex;
  214.       // Mutual exclusion on threads accessing windows structures
  215.     PLIST(NonModalDict, PInteractorLayout);
  216.     NonModalDict nonModalDialogs;
  217.     PInteractorList delayedCreateInteractors;
  218.       // List of interactors that require creation at end of main loop.
  219.     PSyncPoint delayedCreateInteractorsDone;
  220.       // Signal for having processed delayedCreateInteractors
  221.     BOOL receivedQuitMessage;
  222.       // Flag that the last message WM_QUIT has been received
  223.     HACCEL hAccelerator;
  224.       // Current menus accelerator, needed by the ProcessMessage() loop.
  225.     HWND mdiClient;
  226.       // MDI client window, needed by the ProcessMessage() loop.
  227. #ifndef P_PLATFORM_HAS_THREADS
  228.     HWND timerWnd;
  229.       // Internal window to receive WM_TIMER messages to assure this process
  230.       // is scheduled for background threads and timers.
  231.     UINT lastSetTimerTick;
  232.       // Last GetTickCount() value for SetTimer() call to prevent the call
  233.       // being made on every received message.
  234. #endif
  235.     friend LRESULT PEXPORTED WndProc(HWND, UINT, WPARAM, LPARAM);
  236.     friend BOOL PEXPORTED DlgProc(HWND, UINT, WPARAM, LPARAM);
  237.     friend BOOL PEXPORTED FileDlgProc(HWND, UINT, WPARAM, LPARAM);
  238.     friend BOOL PEXPORTED PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
  239.     friend BOOL PEXPORTED FontDlgProc(HWND, UINT, WPARAM, LPARAM);
  240.     friend BOOL PEXPORTED ColourDlgProc(HWND, UINT, WPARAM, LPARAM);
  241.     friend HWND PInteractor::GetHWND() const;
  242.     friend void PInteractor::GetCreateWinInfo(WNDCLASS &);
  243.     friend void PControl::SubClassControlWndProc();
  244.     friend void PInteractorLayout::CreateHWND();
  245.     friend void PTitledWindow::WndProc();
  246.     friend int PModalDialog::RunModal();
  247.     friend PFileDialog::PFileDialog(PInteractor *, PRESOURCE_ID);
  248.     friend void PPrintDialog::Construct();
  249.     friend void PFontDialog::Construct(PRESOURCE_ID);
  250.     friend void PColourDialog::Construct(PRESOURCE_ID);
  251.     friend PMDIFrameWindow::PMDIFrameWindow(unsigned CanDo);
  252. };
  253. #if defined(_MSC_VER) && !defined(_WIN32)
  254. extern "C" int __argc;
  255. extern "C" char ** __argv;
  256. #endif
  257. #ifdef __BORLANDC__
  258. #define __argc _argc
  259. #define __argv _argv
  260. #endif
  261. #undef PCREATE_PROCESS
  262. #define PCREATE_PROCESS(cls) 
  263.   extern "C" int PASCAL WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) 
  264.     { PProcess::PreInitialise(__argc, __argv, _environ); 
  265.       static cls instance; 
  266.       return instance._main(hInst); 
  267.     }
  268. #endif