а именно, перехватит нажатие на кнопку.
у меня в ресурсах есть следующий 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++'
Здравствуйте, игппук, Вы писали:
И>подскажите, как мне правильно поймать клик по кнопке?
И>спасибо.
Типичное решение выглядит так.
В стиле 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&only=1Автор: Зверёк Харьковский
Дата: 29.11.06