использование htmlayout компоненты
От: игппук Беларусь  
Дата: 30.11.06 12:38
Оценка:
а именно, перехватит нажатие на кнопку.

у меня в ресурсах есть следующий html код


<html>
    <head>
        <style>
        html 
        { 
            font:10pt Verdana; 
            background-color:threedface;
        }
        body
        {
            margin:0;
            padding:0;
            width:100%; 
            height:100%; 
        }
        #inthecenter 
        {
            border:1px solid threedshadow;
            width:100%; 
            height:80%; 
            background-color:white antiquewhite navajowhite ghostwhite;
        }
        #filebutton
        {
            position:absolute;
            width:30%;
            top:90%;
            left:85%;
        }
        </style>
    </head>
    <body>
        <Form id="whiteboard_form">
            <div id="filebutton">
                <input type="button" value="File">
            </div>
            <div id="inthecenter">
                <textarea name="address" cols="47" rows="14">
            </div>
        </Form>
    </body>
</html>



нужно его отобразить и перехватить кнопку
<input type="button" value="File">

далее, немного обрезанный класс (оставил только саму суть)


// Whiteboard.cpp: implementation of the Whiteboard class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Whiteboard.h"
#include "Commdlg.h"
#include "FileMessage.h"
#include "../../sdk/plugins/proxy/IProxyDispatcher.h"
#include "htmlayout/htmlayout.h"

//----------------------------------------------------------------------------- 
// Name        : Whiteboard
// Parameters  : 
// Return      : 
// Description : Constructor.
//-----------------------------------------------------------------------------
Whiteboard::Whiteboard()
{
}

//----------------------------------------------------------------------------- 
// Name        : ~Whiteboard
// Parameters  : 
// Return      : 
// Description : Destructor.
//-----------------------------------------------------------------------------
Whiteboard::~Whiteboard()
{
}

//----------------------------------------------------------------------------- 
// Name        : Create
// Parameters  : 
// Return      : 
// Description : Create the whiteboard.
//-----------------------------------------------------------------------------
bool Whiteboard::Create( int _X,
                     int _Y,
             int _DX,
             int _DY,
             Window* _pParent,
             IWindowProc* _pWinProc )
{
    if( m_hwnd != NULL )
    {
        return true;
    }

    m_hwnd = ::CreateWindow( _STRING_HTMLAYOUT, //#define _STRING_HTMLAYOUT "HTMLayout"
                         "",
                 WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_SIZEBOX,
                                 _X,
                     _Y,
                 _DX,
                 _DY,
                 NULL,
                 NULL,
                 App::Instance()->GetHinstance(),
                 NULL );

    ::SetWindowPos( m_hwnd,
                HWND_TOPMOST,
            0,
            0,
            0,
            0,
            SWP_NOMOVE | SWP_NOSIZE );

    /*RECT rc = { 0 };
    ::GetClientRect( GetWnd(), &rc );

    int x = rc.left + 1;
    int y = rc.top + 1;
    int dx = rc.right - rc.left - 2;
    int dy = rc.bottom - rc.top - 5 - 28;

    PBYTE pb = 0;
    DWORD cb = 0;

    HTMLayoutSetCallback( GetWnd(), &HTMLayoutNotifyHandler, 0 );
    if( GetHtmlResource( IDR_WHITEBOARD, pb, cb ) )
    {
        BOOL b = HTMLayoutLoadHtml( GetWnd(), pb, cb );
    }
    
    return true;
}

//----------------------------------------------------------------------------- 
// Name        : WinProc
// Parameters  : 
// Return      : 
// Description : Events handler.
//-----------------------------------------------------------------------------
LRESULT Whiteboard::WinProc( HWND _hwnd,
                         UINT _message,
                 WPARAM _wParam,
                             LPARAM _lParam )
{
    LRESULT lResult = NULL;
    BOOL bHandled = FALSE;

    lResult = HTMLayoutProcND( _hwnd, _message,
                               _wParam, _lParam,
                               &bHandled );
    if( bHandled )
    {
        return lResult;
    }

    switch( _message )
    {
        case WM_COMMAND:
        {
                }; break;
        default:
        {
        }; break;
    };

    return 0;
}

//----------------------------------------------------------------------------- 
// Name        : GetHtmlResource
// Parameters  : 
// Return      : 
// Description : Load html resources.
//-----------------------------------------------------------------------------
bool Whiteboard::GetHtmlResource( int _resourceID, PBYTE& _pb, DWORD& _cb )
{
    //Find specified resource and check if ok
    HRSRC hrsrc = ::FindResource( App::Instance()->GetHinstance(),
                                 MAKEINTRESOURCE( _resourceID ),
                                 MAKEINTRESOURCE( RT_HTML ) );
    if( !hrsrc ) 
    {
        return false;
    }

    //Load specified resource and check if ok
    HGLOBAL hgres = ::LoadResource( App::Instance()->GetHinstance(),
                                    hrsrc );
    if( !hgres )
    {
        return false;
    }

    //Retrieve resource data and check if ok
    _pb = ( PBYTE )::LockResource( hgres );
    if( !_pb )
    {
        return false;
    }

    _cb = ::SizeofResource( App::Instance()->GetHinstance(),
                            hrsrc);
    if( !_cb )
    {
        return false;
    }

    return true;
}

//----------------------------------------------------------------------------- 
// Name        : HTMLayoutNotifyHandler
// Parameters  : 
// Return      : 
// Description : HTMLayout events handler.
//-----------------------------------------------------------------------------
LRESULT CALLBACK Whiteboard::HTMLayoutNotifyHandler( UINT _uMsg,
                              WPARAM _wParam,
                             LPARAM _lParam,
                             LPVOID _vParam )
{
    NMHDR* phdr = ( NMHDR* )_lParam;

    switch( phdr->code )
    {
        case HLN_CREATE_CONTROL:    break; //return OnCreateControl((LPNMHL_CREATE_CONTROL) lParam);
        case HLN_CONTROL_CREATED:   break; //return OnControlCreated((LPNMHL_CREATE_CONTROL) lParam);
        case HLN_DESTROY_CONTROL:   break; //return OnDestroyControl((LPNMHL_DESTROY_CONTROL) lParam);
        case HLN_LOAD_DATA:         break; //return OnLoadData((LPNMHL_LOAD_DATA) lParam);
        case HLN_DATA_LOADED:       break; //return OnDataLoaded((LPNMHL_DATA_LOADED)lParam);
        case HLN_DOCUMENT_COMPLETE: break; //return OnDocumentComplete();
        //case HLN_ATTACH_BEHAVIOR:   return OnAttachBehavior((LPNMHL_ATTACH_BEHAVIOR)lParam );
    }
    
    return 0;
}


итак, что происходит?
1. создается окно (без родителя) и в него загружается html, которые отображается при помощи htmlayout компоненты. отображает корректно, здесь вопросов нет.
2. постоянно вызывается обработчик HTMLayoutNotifyHandler
3. WinProc не вызывается. хотя, по этому коду он и не должен вызываться. но я пробывал много вариантов, в том числе, когда регистрировал за окном эту функцию для обработки. но клик по кнопке я все равно не получал

подскажите, как мне правильно поймать клик по кнопке?
спасибо.

01.12.06 12:06: Перенесено из 'C/C++'
проклятый антисутенерский закон
Re: использование htmlayout компоненты
От: FreshMeat Россия http://www.rsdn.org
Дата: 30.11.06 14:06
Оценка: 4 (1)
Здравствуйте, игппук, Вы писали:

И>подскажите, как мне правильно поймать клик по кнопке?

И>спасибо.
Типичное решение выглядит так.
В стиле div-а определить.
#filebutton
{
behavior: my-behavior;
}
Следующую строчку разремарить. Здесь происходит связывание объявленного в CSS behavior и объекта, обрабатывающего события (events).
И> //case HLN_ATTACH_BEHAVIOR: return OnAttachBehavior((LPNMHL_ATTACH_BEHAVIOR)lParam );

(Если происходит ошибка при старте приложения в OnAttachBehavior, добавь в проект behavior_accesskeys.cpp. Поведение accesskeys определено в Master style sheet для тега html { behavior:accesskeys; }, подробности см. http://terrainformatica.com/htmlayout/master_ss_css.php. Второй вариант решения проблемы, добавить в свою html стиль html { behavior: none; })

И реализовать behavior отнаследовавшись от htmlayout::behavior.
behavior_my_button::behavior_my_button(): 
    htmlayout::behavior(HANDLE_BEHAVIOR_EVENT, "my-behavior") 
{}
virtual BOOL on_event (HELEMENT he, HELEMENT target, BEHAVIOR_EVENTS type, UINT reason ) 
{
// события ловить тут 
//      BUTTON_CLICK = 0,              // click on button
//      BUTTON_PRESS = 1,              // mouse down or key down in button
}

behavior_my_button my_button_instance; // не забыть создать экземпляр

Для примера, можно посмотреть на реализацию HTMLayoutSDK\include\behaviors\behavior_*.cpp
Так же, см. http://gzip.rsdn.ru/Forum/Message.aspx?mid=2240494&amp;only=1
Автор: Зверёк Харьковский
Дата: 29.11.06
Хорошо там, где мы есть! :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.