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

📄 iedde.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        DdeFreeStringHandle( IdInst, hService );
        hService = (HSZ)NULL;
    }
}

BOOL IEHData2Mem( HDDEDATA hData, void **mem, uint_32 *size )
{
    if( ( hData == (HDDEDATA)NULL ) && mem && size ) {
        return( FALSE );
    }

    *size = (uint_32)DdeGetData( hData, NULL, 0, 0 );
    if( *size == 0 ) {
        return( FALSE );
    }

    *mem = MemAlloc( *size );
    if( *mem == NULL ) {
        return( FALSE );
    }

    if( (DWORD)*size != DdeGetData( hData, *mem, (DWORD)*size, 0 ) ) {
        MemFree( *mem );
        *mem = NULL;
        return( FALSE );
    }

    return( TRUE );
}

HDDEDATA IECreateResData( img_node *node )
{
    HDDEDATA    hdata;
    BYTE        *data;
    uint_32     size;
    BOOL        ok;

    data = NULL;
    hdata = (HDDEDATA)NULL;
    ok = ( ( node != NULL ) && ( EditFormat != DDENone ) );

    if( ok ) {
        switch( node->imgtype ) {
            case BITMAP_IMG:
                ok = saveBitmapToData( node, &data, &size );
                break;
            case ICON_IMG:
            case CURSOR_IMG:
                ok = saveImgToData( node, &data, &size );
                break;
            default:
                ok = FALSE;
        }
    }

    if( ok ) {
        hdata = DdeCreateDataHandle( IdInst, (LPBYTE)data, size, 0, hDataItem,
                                     IEClipFormats[EditFormat].format, 0 );
    }

    if( data ) {
        MemFree( data );
    }

    return( hdata );
}

img_node *IEGetCurrentImageNode( void )
{
    img_node    *node;
    img_node    *root;

    node = GetCurrentNode();
    if( node == NULL ) {
        return( NULL );
    }

    root = GetImageNode( node->hwnd );
    if( root == NULL ) {
        return( NULL );
    }

    return( root );
}

BOOL IEUpdateDDEEditSession( void )
{
    img_node            *node;
    HDDEDATA            hdata;
    BOOL                ok;

    hdata = (HDDEDATA)NULL;
    node = IEGetCurrentImageNode();
    ok = ( ( IEClientConv != (HCONV)NULL ) && ( node != NULL ) &&
           ( EditFormat != DDENone ) );

    if( ok ) {
        hdata = IECreateResData( node );
        ok = ( hdata != (HDDEDATA)NULL );
    }

    if( ok ) {
        ok = (BOOL) DdeClientTransaction( (LPBYTE)hdata, -1, IEClientConv,
                                           hDataItem,
                                           IEClipFormats[EditFormat].format,
                                           XTYP_POKE, TIME_OUT, NULL );
    }

    if( hdata != (HDDEDATA)NULL ) {
        DdeFreeDataHandle( hdata );
    }

    if( ok ) {
        SetIsSaved( node->hwnd, TRUE );
    }

    return( ok );
}

BOOL IEStartDDEEditSession( void )
{
    char                *filename;
    HDDEDATA            hData;
    void                *data;
    DWORD               ret;
    uint_32             size;
    BOOL                ok;

    ok = ( EditFormat != DDENone );

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, IEClientConv, hFileItem,
                                      IEClipFormats[EditFormat].format,
                                      XTYP_REQUEST, TIME_OUT, &ret );
        ok = ( hData != (HDDEDATA)NULL );
    }

    if( ok ) {
        ok = IEHData2Mem( hData, &filename, &size );
        DdeFreeDataHandle( hData );
    }

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, IEClientConv, hDataItem,
                                      IEClipFormats[EditFormat].format,
                                      XTYP_REQUEST, TIME_OUT, &ret );
    }

    if( ok ) {
        if( hData != (HDDEDATA)NULL ) {
            ok = IEHData2Mem( hData, &data, &size );
            DdeFreeDataHandle( hData );
        } else {
            data = NULL;
        }
    }

    if( ok ) {
        switch( EditFormat ) {
            case DDEBitmap:
                if( data ) {
                    ok = readBitmapFromData( data, filename, NULL, NULL );
                } else {
                    ok = NewImage( BITMAP_IMG, NULL );
                }
                break;
            case DDECursor:
                if( data ) {
                    ok = readCursorFromData( data, filename, NULL, NULL );
                } else {
                    ok = NewImage( CURSOR_IMG, NULL );
                }
                break;
            case DDEIcon:
                if( data ) {
                    ok = readIconFromData( data, filename, NULL, NULL );
                } else {
                    ok = NewImage( ICON_IMG, NULL );
                }
                break;
            default:
                ok = FALSE;
        }
    }

    if( filename ) {
        MemFree( filename );
    }

    if( data ) {
        MemFree( data );
    }

    return( ok );
}

static BOOL GotEndSession = FALSE;
void IEHandlePokedData( HDDEDATA hdata )
{
    void        *cmd;
    uint_32     size;

    if( hdata == (HDDEDATA)NULL ) {
        return;
    }

    if( !IEHData2Mem( hdata, &cmd, &size ) || !cmd ) {
        return;
    }

    if( !stricmp( cmd, "show" ) ) {
        ShowWindow( HMainWindow, SW_RESTORE );
        ShowWindow( HMainWindow, SW_SHOWNA );
    } else if( !stricmp( cmd, "hide" ) ) {
        ShowWindow( HMainWindow, SW_SHOWMINNOACTIVE );
        ShowWindow( HMainWindow, SW_HIDE );
    } else if( !stricmp( cmd, "endsession" ) ) {
        if( GotEndSession == FALSE ) {
            GotEndSession = TRUE;
            CloseAllImages();
        }
    } else if( !stricmp( cmd, "bringtofront" ) ) {
        if( IsIconic( HMainWindow ) ) {
            ShowWindow( HMainWindow, SW_RESTORE );
        }
#ifdef __NT__
        SetWindowPos( HMainWindow, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( HMainWindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( HMainWindow, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetForegroundWindow( HMainWindow );
#else
        SetActiveWindow( HMainWindow );
        SetWindowPos( HMainWindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
#endif
    }

    MemFree( cmd );
}

HDDEDATA CALLBACK DdeCallBack( WORD wType, WORD wFmt, HCONV hConv,
                               HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
                               DWORD lData1, DWORD lData2 )
{
    img_node            *node;
    HSZPAIR             hszpair[2];
    HDDEDATA            ret;
    int                 i;

    _imged_touch(wFmt);
    _imged_touch(hdata);
    _imged_touch(lData1);
    _imged_touch(lData2);

    ret = (HDDEDATA)NULL;

    switch( wType ) {
        case XTYP_CONNECT_CONFIRM:
            IEServerConv = hConv;
            break;

        case XTYP_DISCONNECT:
            IEServerConv = (HCONV)NULL;
            IEClientConv = (HCONV)NULL;
            SendMessage( HMainWindow, WM_CLOSE, (WPARAM)1, 0 );
            break;

        case XTYP_CONNECT:
            for( i=0; i<NUM_FORMATS; i++ ) {
                if( IEServices[i].htopic == hsz1 ) {
                    EditFormat = (IEEditFormat)i;
                    ret = (HDDEDATA)TRUE;
                }
            }
            break;

        case XTYP_WILDCONNECT:
            for( i=0; i<NUM_FORMATS; i++ ) {
                if( IEServices[i].hservice == hsz2 ) {
                    break;
                }
            }
            if( i == NUM_FORMATS ) {
                break;
            }
            hszpair[0].hszSvc   = IEServices[i].hservice;
            hszpair[0].hszTopic = IEServices[i].htopic;
            hszpair[1].hszSvc   = (HSZ)NULL;
            hszpair[1].hszTopic = (HSZ)NULL;
            ret = (HDDEDATA)
                DdeCreateDataHandle( IdInst, (LPBYTE)&hszpair[0],
                                     sizeof(hszpair), 0L, 0, CF_TEXT, 0 );
            break;

        case XTYP_REQUEST:
            if( wFmt == IEClipFormats[EditFormat].format ) {
                if( hsz1 == IEServices[EditFormat].htopic ) {
                    node = IEGetCurrentImageNode();
                    if( hsz2 == hDataItem ) {
                        ret = IECreateResData( node );
                    }
                }
            }
            break;

        case XTYP_POKE:
            ret = (HDDEDATA)DDE_FNOTPROCESSED;
            if( hsz1 == IEServices[EditFormat].htopic ) {
                if( hsz2 == hDataItem ) {
                    IEHandlePokedData( hdata );
                    ret = (HDDEDATA)DDE_FACK;
                }
            }
            break;

    }

    return( ret );
}

⌨️ 快捷键说明

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