亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? global.cpp

?? 使用BorlandC++4.5編譯的一個MUD客戶端程序
?? CPP
字號:
//
// global.cpp -- Global functions and main app event loop
//
// $Id: global.cpp 2.4 1995/10/31 02:20:37 tsurace Beta $
// $Log: global.cpp $// Revision 2.4  1995/10/31  02:20:37  tsurace// Modified startup code to take command line.//
// Revision 2.3  1995/10/31  00:43:03  tsurace
// Added code to specify startup file on command line, default to
// "C:/VT/MAIN.VTC".
//
// Revision 2.2  1995/10/27  20:06:46  tsurace
// Added Getch function to allow retrieving single keystroke.
// Added accelerator loading/translation code.
//
// Revision 2.1  1995/10/24  15:52:51  tsurace
// Roll.
//
// Revision 1.5  1995/10/18  23:53:59  tsurace
// Added version string
//
// Revision 1.4  1995/10/18  22:46:59  tsurace
// Added BlockingHook to handle blocking calls correctly (connect()).
//
// Revision 1.3  1995/10/11  21:02:31  tsurace
// Added out-of-memory handling (xalloc).
//
// Revision 1.2  1995/10/08  23:28:47  tsurace
// Change the order of calls on exiting.
//
// (end of log)

#define  STRICT
#include <windows.h>
#pragma hdrstop

#include <except.h>

#include "global.hpp"
#include "resids.hpp"
#include "vt102em.hpp"

#ifndef __FLAT__
#error hey, we only deal with 32-bit code, buddy!
#endif

extern "C" {
 extern void main_init_all (int argc, char ** argv); /* in ../main.c */
};

VT102Emulator * main_window = NULL;
HINSTANCE Global::_hInstance = 0;
HINSTANCE Global::_hPrevInstance = 0;
HACCEL Global::_accelerators = 0;

// The version string -- this will be displayed in an ABOUT dialog
// some day...
const char * Global::VersionInfo =
"<insert name here> Version 1.0.0 $State: Beta $";

// This cannot be loaded from a resource file
static const char * _out_of_memory_message =
"You seem to be out of memory, :( and it is probable\n\
that this program will soon die. :< On the bright side,\n\
the crash could free up some memory.";

// ----------------------------------------------------------------------
// GetPointer, SetPointer -- Functions to get/set the Window pointer
//   from the "extra" field in a window.
// ----------------------------------------------------------------------
inline VT102Emulator * GetPointer (HWND hWnd)
{
    return (VT102Emulator *) GetWindowLong(hWnd, 0);
}

inline void SetPointer(HWND hWnd, VT102Emulator * pWindow)
{
    SetWindowLong(hWnd, 0, (LONG) pWindow);
}

// -----------------------------------------------------------------
// BlockingHook - called while WinSock is in a blocking call (connect)
//
// We must not call any WinSock interface functions during this--which
// is to say we must not process keyboard input except for BREAK, and
// of course we must not retrieve socket messages (DUH).
//
BOOL CALLBACK Global::BlockingHook(void)
{
    MSG msg;
    BOOL ret;

    // Get a keystroke if available, yield to other processes
    ret = PeekMessage(&msg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE);
    if (ret) 
    {
        // Ignore keystrokes, but if break key is hit, cancel!
        if (WM_KEYDOWN == msg.message && VK_CANCEL == msg.wParam)
            WSACancelBlockingCall();
    }
    else
    {
        // Check for expose and destroy events (don't yield)
        ret = (PeekMessage(&msg,NULL,WM_PAINT,WM_PAINT,PM_REMOVE|PM_NOYIELD)
               || PeekMessage(&msg,NULL,WM_DESTROY,WM_DESTROY,PM_REMOVE|PM_NOYIELD));
        if (ret)
        {
            TranslateMessage(&msg); // Don't bother with accelerators
            DispatchMessage(&msg);
        };
    };

    return ret; // TRUE if we got a message and handled it
}

// ----------------------------------------------------------------------
// GetchLoop - simulated getch!
//
// This ignores most everything except keystrokes, paint events, and
// related things (maybe minimize/restore?)
//
// Returns:
//   the got character
//
int Global::GetchLoop()
{
    MSG msg;
    int got_ch;
    int done = 0;
    while (!done) // Several continue statements in this loop...
    {
        // Get a keystroke if available, yield to other processes
        if (PeekMessage(&msg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE))
        {
            // Turn into a char, if possible
            if (0 == TranslateMessage(&msg)  // Not translatable
                && WM_CHAR == msg.message)   // keystroke message?
            {
                got_ch = (int)msg.wParam;    // Got a keystroke!
                done = 1;
            }
        }
        else if (PeekMessage(&msg,NULL,WM_PAINT,WM_PAINT,PM_REMOVE|PM_NOYIELD)
                 || PeekMessage(&msg,NULL,WM_DESTROY,WM_DESTROY,PM_REMOVE|PM_NOYIELD))
        {
            TranslateMessage(&msg); // Don't bother with accelerators
            DispatchMessage(&msg);
        };
    };
    return got_ch; // Return the char we got
}


// ----------------------------------------------------------------------
// Init - to be called from WinMain to save the instance variables
// ----------------------------------------------------------------------
void Global::Init(HINSTANCE inst, HINSTANCE prev)
{
    _hInstance = inst;
    _hPrevInstance = prev;
    _accelerators = LoadAccelerators(inst,
                                     MAKEINTRESOURCE(ACC_MyAccelerators));
};

// ----------------------------------------------------------------------
// PostOutOfMemoryMessage - tell the user we're out
// ----------------------------------------------------------------------
void Global::PostOutOfMemoryMessage()
{
    MessageBox(NULL,
               _out_of_memory_message,
               "Terribly sorry to bother you...",
               MB_SYSTEMMODAL | MB_ICONHAND | MB_OK);
}

// ----------------------------------------------------------------------
// WndProc - Main window proc where all (window) messages are recieved
// ----------------------------------------------------------------------
LRESULT CALLBACK _export Global::WndProc(HWND hWnd,
                                         UINT iMessage,
                                         WPARAM wParam,
                                         LPARAM lParam)
{
    LRESULT return_value;
    try                        // Handle exceptions
    {
        // The pointer pWindow will have an invalid value if the WM_CREATE
        // message has not yet been processed.  At a call to WM_CREATE,
        // of course, we set that value.
        
        // This code will break if windows fails to set extra bytes to
        // zero at some future rev.

        // Get window's "this" pointer
        VT102Emulator *pWindow = GetPointer(hWnd); 
        if (pWindow == 0)                // Pointer not set?
        {
            if (iMessage == WM_CREATE) // Create message is special
            {
                // Retrieve the window's "this" pointer
                
                LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
                pWindow = (VT102Emulator *) lpcs->lpCreateParams;
                
                // Store the "This" pointer in the window's extra bytes
                SetPointer(hWnd, pWindow);
            
                // Now let the object perform whatever
                // initialization it needs for WM_CREATE in its own
                // WndProc.
                return_value = pWindow->WndProc( iMessage, wParam, lParam );
            }
            else
            {
                // Not our message, pass it on.
                return_value = DefWindowProc( hWnd, iMessage, wParam, lParam );
            };
        }
        else
        {
            // Call the window's proc
            return_value = pWindow->WndProc( iMessage, wParam, lParam );
        };
    }
    catch (xalloc &)
    {
        PostOutOfMemoryMessage();
        return_value = DefWindowProc(hWnd, iMessage, wParam, lParam);
    };
    
    return return_value;
}


// ----------------------------------------------------------------------
// _MessageLoop - main program loop of the emulator.
//
// Loops until program exit.
// ----------------------------------------------------------------------
int Global::MessageLoop()
{
    MSG msg;              // Windows event message
    while (GetMessage(&msg, NULL, 0, 0))
    {
        // Accelerators get first dibs on the keystrokes
        if (0 == TranslateAccelerator(msg.hwnd, _accelerators, &msg))
            TranslateMessage(&msg);
        
        // Shouldn't we be doing something special for dialogs here?
        
        DispatchMessage(&msg);
    };
    return msg.wParam;    // Hopefully the return value of the exit dialog
}

//
// >>>>> WinMain <<<<< //
//

// ----------------------------------------------------------------------
// WinMain - called by Windoze at program startup
// ----------------------------------------------------------------------
int PASCAL WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine,
                   int nCmdShow)
{
    (void) lpszCmdLine; // Silence 'not used' warning
    extern int _argc;
    extern char **_argv;
    int ret_val = EXIT_FAILURE;
    try
    {
        // Require path to startup file as command-line option
        if (2 != _argc)
            scream_and_die(EC_FatalError, ERR_CommandLine);
        
        Global::Init(hInstance, hPrevInstance);     // Init globals
        
        // Initialize the winsock interface
        WORD wVersionRequested;
        WSADATA wsaData;
        wVersionRequested = MAKEWORD (1, 1);
        if (WSAStartup(wVersionRequested, &wsaData) != 0)
            scream_and_die(EC_WinSock, ERR_WinSockMissing);
        
        if (NULL == WSASetBlockingHook(Global::BlockingHook))
            scream_and_die(EC_WinSock, ERR_BlockingHook);

        main_window = new VT102Emulator(nCmdShow);  // Create main window
        main_init_all(_argc, _argv); // Initialize VT
        ret_val = Global::MessageLoop();            // Go!
    }
    catch (xalloc &)
    {
        Global::PostOutOfMemoryMessage();
    }
    catch (...)
    {
        WSACleanup();        // At least take care of the sockets
        throw;
    };
    delete main_window;      // Free memory
    WSACleanup ();           // clean up Winsock stuff
    return ret_val;
}

// ----------------------------------------------------------------------
// These are called by VaporTalk
//
extern "C" {

    /* Returns non-null on error */
    const char * NewSocket(SOCKET s, long evt)
    {
        if (main_window)
            return main_window->NewSocket(s, evt);

        return "Main program not initialized";
    };
    
    
    void WriteString(char * str, int len)
    {
        if (main_window)
            main_window->Output(str, len);
    }
}

// EOF //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美二区三区| 亚洲成av人影院| 亚洲一区二区三区在线看| 日本福利一区二区| 国产欧美一区视频| 青椒成人免费视频| 日本韩国一区二区三区| 日本一区二区免费在线观看视频| 亚洲高清久久久| 色综合久久综合网97色综合| 久久亚洲一级片| 天天影视色香欲综合网老头| 91小视频免费看| 国产精品视频一二三| 紧缚奴在线一区二区三区| 欧美视频在线不卡| 亚洲人xxxx| 成人av在线资源网| 国产女人aaa级久久久级| 看电视剧不卡顿的网站| 欧美日韩在线播放| 亚洲综合一区二区| 一本到三区不卡视频| 国产精品乱码久久久久久| 国模冰冰炮一区二区| 欧美成人三级电影在线| 日本aⅴ精品一区二区三区| 欧美日韩国产综合草草| 午夜精品一区在线观看| 在线播放日韩导航| 视频一区视频二区中文字幕| 欧美日韩美少妇| 午夜精品123| 9191久久久久久久久久久| 亚洲成人动漫一区| 欧美猛男gaygay网站| 亚洲大片精品永久免费| 欧美精品日日鲁夜夜添| 青青国产91久久久久久| 日韩天堂在线观看| 国产麻豆午夜三级精品| 国产精品网站在线观看| 99久久777色| 亚洲第一电影网| 日韩欧美一级在线播放| 国产一区二区三区视频在线播放| 日韩欧美在线影院| 国产精品一区二区三区乱码| 亚洲国产精品激情在线观看| 99精品偷自拍| 三级欧美韩日大片在线看| 日韩精品自拍偷拍| 高清不卡在线观看av| 亚洲婷婷综合久久一本伊一区| 欧美亚洲日本国产| 久久激情综合网| 国产精品久久久久久亚洲毛片| 色综合天天综合网天天看片| 日韩精品一级二级| 国产色产综合产在线视频| 91蜜桃传媒精品久久久一区二区 | 99r精品视频| 一区二区三区在线看| 欧美一区二区三区四区五区| 国产激情一区二区三区四区 | 成人免费看黄yyy456| 亚洲色图一区二区三区| 欧美美女网站色| 国产精品系列在线播放| 亚洲免费av在线| xf在线a精品一区二区视频网站| 不卡一区二区三区四区| 日韩**一区毛片| 成人欧美一区二区三区白人| 91精品一区二区三区在线观看| 国产成人av福利| 日本三级亚洲精品| 欧美日韩国产a| 日本伊人午夜精品| 国产成人免费视频一区| 亚洲一区在线免费观看| 久久综合999| 欧美视频在线一区| 成人免费视频视频| 精品在线播放午夜| 亚洲已满18点击进入久久| 国产日产亚洲精品系列| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产成人啪午夜精品网站男同| 香蕉影视欧美成人| 亚洲人成影院在线观看| 久久一区二区三区四区| 在线播放91灌醉迷j高跟美女| 99久久精品免费观看| 国产精品一区二区x88av| 日韩国产精品91| 亚洲一区二区综合| 亚洲欧美一区二区在线观看| 久久久.com| 日韩午夜在线影院| 欧美一区二区三区在| 99久久亚洲一区二区三区青草| 久久国产精品一区二区| 日本一道高清亚洲日美韩| 亚洲国产精品天堂| 一区二区三区色| 亚洲激情图片小说视频| 国产精品高潮呻吟| 国产精品拍天天在线| 国产亚洲精品7777| 久久视频一区二区| 久久久久99精品一区| 久久蜜臀精品av| 精品剧情v国产在线观看在线| 欧美一区二区三区免费视频 | 成人小视频免费观看| 国产成人av电影| 国产福利精品一区二区| 国产精品影视天天线| 国产福利一区二区三区| 国产成+人+日韩+欧美+亚洲| 国产不卡免费视频| eeuss国产一区二区三区| 国产不卡视频在线播放| 9人人澡人人爽人人精品| 色综合久久中文综合久久97| 日本韩国一区二区三区| 欧美日韩一区二区三区免费看| 欧美色图激情小说| 日韩午夜小视频| 日本一区二区三区四区| 亚洲日本在线a| 亚洲资源中文字幕| 六月丁香综合在线视频| 国产成人精品一区二区三区网站观看 | 久久这里都是精品| 国产精品高潮呻吟| 午夜电影网一区| 国产美女主播视频一区| 9l国产精品久久久久麻豆| 欧美三级欧美一级| 久久婷婷成人综合色| 亚洲人成电影网站色mp4| 性做久久久久久久免费看| 精品写真视频在线观看 | 久久国产欧美日韩精品| 成人小视频免费观看| 欧美日韩中文字幕精品| 久久综合九色综合久久久精品综合 | 懂色av一区二区夜夜嗨| 色哟哟亚洲精品| 日韩一区二区三区四区| 国产精品区一区二区三区| 亚洲成精国产精品女| 国产精品456| 欧美三级中文字| 日本一区二区综合亚洲| 日韩电影在线免费| www.av精品| 日韩一区二区三区四区| 亚洲人成在线观看一区二区| 麻豆91在线播放免费| 91亚洲精品久久久蜜桃网站| 欧美一激情一区二区三区| 日韩一区中文字幕| 国产一区美女在线| 欧美日韩视频专区在线播放| 中文字幕高清一区| 玖玖九九国产精品| 欧美日韩三级视频| 国产精品国产三级国产| 国产在线不卡视频| 欧美高清性hdvideosex| 亚洲激情五月婷婷| 成人av网址在线| www亚洲一区| 日本特黄久久久高潮| 日本国产一区二区| 中文字幕中文字幕一区二区| 黄色资源网久久资源365| 欧美男人的天堂一二区| 亚洲免费av网站| 99热国产精品| 欧美激情一区不卡| 经典三级在线一区| 日韩精品一区二区三区swag| 亚洲gay无套男同| 欧美优质美女网站| 亚洲精品综合在线| 久久综合色一综合色88| 麻豆视频观看网址久久| 欧美肥妇bbw| 亚洲r级在线视频| 欧美制服丝袜第一页| 亚洲一区二区在线免费观看视频| av午夜精品一区二区三区| 国产精品欧美久久久久无广告| 国产麻豆视频一区| 亚洲国产精品精华液2区45| 国产98色在线|日韩|