Здравствуйте, cls, Вы писали:
cls>Вдобавок хотелось бы знать, как после того, как я отловлю события, поменять ширину/высоту контрола(в коде put_width/height не работают) и проскроллить экран на заданное значение. Также хочу узнать, как убрать полосы прокрутки.
Как проскроллить на заданную подицию вертикально (сори, но код из реального проекта, но доточить до чистого WinAPI можно без особого труда)
bool CHTMLViewEx::SetIHTMLScrollPos(const ULONG lPos)
{
bool bRet=false;
IHTMLDocument2* const pDoc=(IHTMLDocument2*)this->GetHtmlDocument();//тут получили IHTMLDocument2;
//понеслася
if (pDoc) {
ASSERT(!IsBadReadPtr(pDoc,sizeof(IHTMLDocument2)));
HRESULT hr;
IHTMLElement* pBody=NULL;
hr=pDoc->get_body(&pBody);
if ((pBody) && (S_OK==hr)) {
IDispatch* pIHTMLElement2=GetIHTMLElement2(pBody);
if (pIHTMLElement2) {
DISPID dispid=0;
if (GetScrollTopDISPID(pIHTMLElement2,dispid)) {
VARIANTARG var;
var.lVal=(long)lPos;
var.vt=VT_I4;
DISPPARAMS params;
params.cArgs=1;
params.cNamedArgs=0;
params.rgdispidNamedArgs=NULL;
params.rgvarg=&var;
hr=pIHTMLElement2->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT
,DISPATCH_PROPERTYPUT,¶ms,NULL,NULL,NULL);
if (S_OK==hr) bRet=true;
}
pIHTMLElement2->Release();
}
pBody->Release();
}
pDoc->Release();
if (bRet) {
//RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW);
CRect r;
GetWindowRect(&r);
//static int delta=-1;
SetWindowPos(NULL,0,0,r.Width()-1,r.Height()-1,SWP_NOMOVE|SWP_NOREDRAW);
SetWindowPos(NULL,0,0,r.Width(),r.Height(),SWP_NOMOVE);
//delta*=(-1);
}//if (bRet) {
}
return bRet;
}
bool CHTMLViewEx::GetIHTMLElement2UUID(UUID& uuid)
{
if (UuidFromString(
(unsigned char*)TEXT("3050f434-98b5-11cf-bb82-00aa00bdce0b")
,&uuid)==RPC_S_OK)
return true;
else
return false;
}
IDispatch* CHTMLViewEx::GetIHTMLElement2(IHTMLElement* pElem)
{
UUID uuid;
if (!GetIHTMLElement2UUID(uuid))
return NULL;
IDispatch* pIHTMLElement2=NULL;
const HRESULT hr=pElem->QueryInterface(uuid,(void**)&pIHTMLElement2);
ASSERT(S_OK==hr);
if (S_OK==hr)
return pIHTMLElement2;
else
return NULL;
}