⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winevent.c

📁 Netscape NSPR库源码
💻 C
字号:
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//*  * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape Portable Runtime (NSPR). *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. *//*** File:        winevent.c** Description: Test functions in plevent.c using Windows**** The winevent test exercises the PLEvent library in a maner** similar to how the Mozilla (or NGLayout) Client will use** it in a Windows environment.**** This test is based on ideas taken from Charles Petzold's** book "Programming Windows 3.1". License to use is in the** book. It has been ported to Win32.**** Operation:** The initialization is a standard Windows GUI application** setup. When the main window receives its WM_CREATE** message, a child window is created, a edit control is** instantiated in that window.**** A thread is created; this thread runs in the function:** TimerThread(). The new thread sends a message every second** via the PL_PostEvent() function. The event handler** HandlePadEvent() sends a windows message to the edit** control window; these messages are WM_CHAR messages that** cause the edit control to place a single '.' character in** the edit control. **** After a deterministic number of '.' characters, the** TimerThread() function is notified via a global variable** that it's quitting time.** ** TimerThread() callse TestEvents(), an external function** that tests additional function of PLEvent.***/#include "nspr.h"#include "plevent.h"#include <windows.h>#include <commdlg.h>#define ID_EDIT     1/* ** Declarations for NSPR customization** */typedef struct PadEvent{    PLEvent plEvent;    int     unused;    } PadEvent;static void PR_CALLBACK TimerThread( void *arg);static void PR_CALLBACK HandlePadEvent( PadEvent *padEvent );static void PR_CALLBACK DestroyPadEvent( PadEvent *padevent );static PRThread *tThread;static PLEventQueue *padQueue; static long ThreadSleepTime = 1000; /* in milli-seconds */static long timerCount = 0;static HWND hDlgModeless ;static HWND hwndEdit ;static PRBool testFinished = PR_FALSE;static HWND     hwnd ;LRESULT CALLBACK WinProc (HWND, UINT, WPARAM, LPARAM);TCHAR appName[] = TEXT ("WinEvent") ;int WINAPI WinMain(    HINSTANCE hInstance,     HINSTANCE hPrevInstance,    PSTR szCmdLine,     int iCmdShow    ){    MSG      msg ;    WNDCLASS wndclass ;    HANDLE   hAccel ;        PR_Init(0, 0, 0);    wndclass.style = CS_HREDRAW | CS_VREDRAW;    wndclass.lpfnWndProc = WinProc;    wndclass.cbClsExtra = 0;    wndclass.cbWndExtra = 0;    wndclass.hInstance = hInstance;    wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );    wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );    wndclass.lpszMenuName = NULL;    wndclass.lpszClassName = appName;         if ( !RegisterClass( &wndclass ))    {        MessageBox( NULL,             TEXT( "This program needs Win32" ),            appName,             MB_ICONERROR );        return 0;     }         hwnd = CreateWindow( appName,         appName,        WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT,         CW_USEDEFAULT,        CW_USEDEFAULT,         CW_USEDEFAULT,        NULL,         NULL,         hInstance,         NULL);          ShowWindow( hwnd, iCmdShow );     UpdateWindow( hwnd );           for(;;)     {        if ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE  ))        {            if ( GetMessage( &msg, NULL, 0, 0 ))            {                if ( hDlgModeless == NULL || !IsDialogMessage( hDlgModeless, &msg ))                {                    if ( !TranslateAccelerator( hwnd, hAccel, &msg ))                    {                        TranslateMessage( &msg );                        DispatchMessage( &msg );                    } /* end if !TranslateAccelerator */                }             }            else            {                break;                } /* end if GetMessage() */        }         else /* !PeekMessage */        {            PR_Sleep(50);        }/* end if PeekMessage() */     } /* end for() */     PR_JoinThread( tThread );     PL_DestroyEventQueue( padQueue );     PR_Cleanup();     return msg.wParam ;}LRESULT CALLBACK WinProc(    HWND hwnd,     UINT message,     WPARAM wParam,     LPARAM lParam){     switch (message)     {     case WM_CREATE :          hwndEdit = CreateWindow(                        TEXT( "edit" ),                         NULL,                        WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |                             WS_BORDER | ES_LEFT | ES_MULTILINE |                            ES_AUTOHSCROLL | ES_AUTOVSCROLL,                         0, 0, 0, 0,                          hwnd,                          (HMENU)ID_EDIT,                         ((LPCREATESTRUCT)lParam)->hInstance,                          NULL);               /* Initialize Event Processing for NSPR          ** Retrieve the event queue just created          ** Create the TimerThread          *//*          PL_InitializeEventsLib( "someName" );          padQueue = PL_GetMainEventQueue();*/          padQueue = PL_CreateEventQueue("MainQueue", PR_GetCurrentThread());		  PR_ASSERT( padQueue != NULL );          tThread = PR_CreateThread( PR_USER_THREAD,                    TimerThread,                    NULL,                    PR_PRIORITY_NORMAL,                    PR_LOCAL_THREAD,                    PR_JOINABLE_THREAD,                    0 );          return 0 ;               case WM_SETFOCUS :          SetFocus( hwndEdit );          return 0;               case WM_SIZE :           MoveWindow( hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE );          return 0 ;               case WM_COMMAND :          if ( LOWORD(wParam) == ID_EDIT )               if ( HIWORD(wParam ) == EN_ERRSPACE ||                          HIWORD( wParam ) == EN_MAXTEXT )                    MessageBox( hwnd, TEXT( "Edit control out of space." ),                        appName, MB_OK | MB_ICONSTOP );          return 0;                    case WM_DESTROY :          PostQuitMessage(0);          return 0;     }     return DefWindowProc( hwnd, message, wParam, lParam );}/*** TimerThread() -- The Main function of the timer pop thread***/static void PR_CALLBACK TimerThread( void *arg ){    PRIntn  rc;    do {        PadEvent   *ev;                /*        ** Create and Post the event the event        */        PL_ENTER_EVENT_QUEUE_MONITOR( padQueue );        ev = (PadEvent *) PR_NEW( PadEvent );        PL_InitEvent( &ev->plEvent, NULL,                 (PLHandleEventProc)HandlePadEvent,                 (PLDestroyEventProc)DestroyPadEvent );        PL_PostEvent( padQueue, &ev->plEvent );        PL_EXIT_EVENT_QUEUE_MONITOR( padQueue );                    PR_Sleep( PR_MillisecondsToInterval(ThreadSleepTime) );    } while( testFinished == PR_FALSE );    PR_Sleep( PR_SecondsToInterval(4) );    /*    ** All done now. This thread can kill the main thread by sending     ** WM_DESTROY message to the main window.    */    SendMessage( hwnd, WM_DESTROY, 0, 0 );    return;}    static char *startMessage = "Poppad: NSPR Windows GUI and event test program.\n"                            "Every 1 second gets a '.'.\n"                            "The test self terminates in less than a minute\n"                            "You should be able to type in the window.\n\n";static char *stopMessage = "\n\nIf you saw a series of dots being emitted in the window\n"                           " at one second intervals, the test worked.\n\n";/*** HandlePadEvent() -- gets called because of PostEvent*/static void PR_CALLBACK HandlePadEvent( PadEvent *padEvent ){    char *cp;    static const long lineLimit = 10;   /* limit on number of '.' per line */    static const long timerLimit = 25;  /* limit on timer pop iterations */    if ( timerCount++ == 0 )    {                for ( cp = startMessage; *cp != 0 ; cp++ )        {            SendMessage( hwndEdit, WM_CHAR, *cp, 1 );        }    }    /*     ** Send a WM_CHAR event the edit Window    */    SendMessage( hwndEdit, WM_CHAR, '.', 1 );        /*    ** Limit the number of characters sent via timer pop to lineLimit    */    if ( (timerCount % lineLimit) == 0)    {        SendMessage( hwndEdit, WM_CHAR, '\n', 1 );    }    if ( timerCount >= timerLimit )    {        for ( cp = stopMessage; *cp != 0 ; cp++ )        {            SendMessage( hwndEdit, WM_CHAR, *cp, 1 );        }        testFinished = PR_TRUE;    }    return;}/*** DestroyPadEvent() -- Called after HandlePadEvent()*/static void PR_CALLBACK DestroyPadEvent( PadEvent *padevent ){   PR_Free( padevent );   return;}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -