fmain.cpp
来自「使用TCppWebBrowser控件实现的浏览器」· C++ 代码 · 共 1,381 行 · 第 1/3 页
CPP
1,381 行
//---------------------------------------------------------------------------
#include <vcl.h>
#include <Shlwapi.h>
#include <exdisp.h>
#include <Clipbrd.hpp>
#include <ComObj.hpp>
#include <Shellapi.h.>
#include <Registry.hpp>
#pragma hdrstop
#include "g_AppMaros.h"
#include "fMain.h"
#include "fChildwin.h"
//---------------------------------------------------------------------------
#pragma link "ALStatusBar"
#pragma link "CGAUGES"
#pragma link "IEAddress"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
char szAppCmdLine[MAX_PATH]; // 命令行参数
TfmMain *fmMain;
#define GetActiveBrowserWindow() static_cast<TfmChildwin *>(ActiveMDIChild)
//---------------------------------------------------------------------------
// 取得最大的窗口位置
TRect GetMaxRect(void)
{
TRect Rect;
SystemParametersInfo(SPI_GETWORKAREA,0,&Rect,0);
return Rect;
}
//---------------------------------------------------------------------------
void SetWindowsMaxPosition(TForm *From)
{
TRect Rect=GetMaxRect();
From->Left = Rect.Left;
From->Top = Rect.Top;
From->Width = Rect.Width();
From->Height= Rect.Height();
}
//---------------------------------------------------------------------------
// 向TStrings添加新的项目
bool AddTextToString(TStrings *Strings,AnsiString Str)
{
if(Str.IsEmpty())return false;
if(Strings->Count>0)
{
if(Strings->IndexOf(Str) >= 0)
return false;
Strings->Insert(0,Str);
}
else
Strings->Add(Str);
return true;
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::WndProc(TMessage &Msg)
{
TForm::WndProc(Msg);
switch(Msg.Msg)
{
// 以下处理来作浏览窗口的消息
case WM_MDIWINDOWCREATE:
OnMDICreate(Msg);
break;
case WM_MDIWINDOWDELETE:
OnMDIDelete(Msg);
break;
case WM_MDIWINDOWACTIVE:
OnMDIActive(Msg);
break;
//
case WM_STATUSCHANGE:
OnBrowserStatusChange(Msg);
break;
case WM_DOCUMENTCOMPLETE:
OnDocumentComplete(Msg);
break;
}
}
//---------------------------------------------------------------------------
const AnsiString WndCountStr = "窗口数 - ";
// 为新建立的子窗口增加按钮
// Msg.WParam 新子窗口的指针
void __fastcall TfmMain::OnMDICreate(TMessage& Msg)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
TfmChildwin *fChild=(TfmChildwin *)Msg.WParam;
if(fChild == NULL) return;
AnsiString S = fChild->DOC_Title;
if(S.IsEmpty())S = fChild->DOC_URL;
TabWindow->Tabs->AddObject(S,fChild);
LabelWndCount->Caption = WndCountStr + IntToStr(MDIChildCount);
if(ActionWindowClose->Enabled == false)
ActionWindowClose->Enabled = true;
if(TabWindow->Visible == false)
TabWindow->Visible = true;
ComboBoxAddress->Text = "";
}
//---------------------------------------------------------------------------
// 为删除的子窗口删除Tab页
// Msg.WParam 子窗口的指针
void __fastcall TfmMain::OnMDIDelete(TMessage& Msg)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
TfmChildwin *fChild=(TfmChildwin *)Msg.WParam;
int Indx=TabWindow->Tabs->IndexOfObject(fChild);
if(Indx>=0)TabWindow->Tabs->Delete(Indx);
LabelWndCount->Caption = WndCountStr + IntToStr(MDIChildCount - 1);
ActionWindowClose->Enabled = MDIChildCount>1;
TabWindow->Visible = ActionWindowClose->Enabled;
if(MDIChildCount <= 1)
{
ComboBoxAddress->Text = "";
m_PanelMsg->Text = "";
ActionBack->Enabled = false;
ActionForword->Enabled = false;
ActionEditCut->Enabled = false;
ActionEditCopy->Enabled = false;
ActionEditPaste->Enabled = false;
ProgressBar1->Visible = false;
}
}
//---------------------------------------------------------------------------
// 显示子窗口对应的Tab页
// Msg.WParam 子窗口的指针
void __fastcall TfmMain::OnMDIActive(TMessage& Msg)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
TfmChildwin *fChild=(TfmChildwin *)Msg.WParam;
int Indx=TabWindow->Tabs->IndexOfObject(fChild);
if(Indx>=0)TabWindow->TabIndex=Indx;
// 离线标志
ActionOffline->Checked = fChild->CppWebBrowser->Offline;
// 字体大小菜单
int FontSize = fChild->DOC_FontSize;
if(FontSize >=0 && FontSize <= 4)
{
mFontSize->Items[4 - FontSize]->Checked = true;
}
// 显示当前页对应的网址,状态信息和、进程条
ComboBoxAddress->Text = fChild->DOC_URL;
m_PanelMsg->Text = fChild->DOC_StatusText;
m_PanelProgress->Text = fChild->DOC_ErrorText;
SetProgress(fChild->DOC_ProgressMax,fChild->DOC_Progress);
ActionBack->Enabled = fChild->BackEnabled;
ActionForword->Enabled = fChild->ForwordEnabled;
ActionEditCut->Enabled = fChild->DOC_CanCut;
ActionEditCopy->Enabled = fChild->DOC_CanCopy;
ActionEditPaste->Enabled = fChild->DOC_CanPaste;
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::TabWindowChange(TObject *Sender)
{
int Indx=TabWindow->TabIndex;
TfmChildwin *fChild=(TfmChildwin *)(TabWindow->Tabs->Objects[Indx]);
fChild->Show();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::TabWindowMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
// 保存上一次hint的对象
static last_window_index = -1;
// 更新提示为当前页的Title
int Indx = TabWindow->IndexOfTabAt(X, Y);
if(Indx >= 0)
{
if(last_window_index != Indx)
{
last_window_index = Indx;
Application->CancelHint();
}else
{
TfmChildwin *fChild=(TfmChildwin *)(TabWindow->Tabs->Objects[Indx]);
TabWindow->Hint = fChild->DOC_Title;
}
}else
{
last_window_index = -1;
TabWindow->Hint = "";
}
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::TabWindowGetImageIndex(TObject *Sender,
int TabIndex, int &ImageIndex)
{
// 取得图标
}
//---------------------------------------------------------------------------
void TfmMain::SetTabTitle(int Indx,AnsiString Title)
{
static int max_sheet_caption_length = 120;
static int max_text_length = max_sheet_caption_length - 30;
int Fit;
SIZE sz; // 字符串的大小(像素)
const int &Len = Title.Length();
if(GetTextExtentExPoint(this->Canvas->Handle,
Title.c_str(),
Len,
max_text_length,
&Fit,
NULL,
&sz))
{
if(sz.cx >= max_sheet_caption_length)
{
// 标题太长,则截断
Title = Title.SubString(1,Fit) + "...";
}
}
TabWindow->Tabs->Strings[Indx] = Title;
}
//---------------------------------------------------------------------------
// 更换图标
// Msg.WParam 子窗口的指针
void __fastcall TfmMain::OnDocumentComplete(TMessage& Msg)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
TfmChildwin *fChild=(TfmChildwin *)Msg.WParam;
int Indx=TabWindow->Tabs->IndexOfObject(fChild);
if(Indx<0)return;
SetTabTitle(Indx,fChild->DOC_Title) ;
}
//---------------------------------------------------------------------------
// 设置进程条的值
void TfmMain::SetProgress(int MaxVal,int Val)
{
if(MaxVal > 0)
{
ProgressBar1->Visible = true;
ProgressBar1->MaxValue = MaxVal;
ProgressBar1->Progress = Val;
}else
{
ProgressBar1->Visible = false;
}
}
//---------------------------------------------------------------------------
// Msg.WParam 新子窗口的指针
void __fastcall TfmMain::OnBrowserStatusChange(TMessage& Msg)
{
if(m_IsCloseAllNow)return; // 正在退出,不作处理
TfmChildwin *fBrowser=(TfmChildwin *)Msg.WParam;
if(fBrowser == NULL) return;
int Indx=TabWindow->Tabs->IndexOfObject(fBrowser);
if(Indx<0)
{
//
return;
}
TForm *fChild = this->ActiveMDIChild;
TfmChildwin *fthisBrowser = static_cast<TfmChildwin*>(fChild);
// 不是当前的活动子窗口,不更新
if(fthisBrowser != fBrowser) return;
int Cmd = (int)Msg.LParam;
switch (Cmd)
{
case STATUSCHANGE_PROGRESS:
{
SetProgress(fBrowser->DOC_ProgressMax,fBrowser->DOC_Progress);
break;
}
case STATUSCHANGE_STATUSTEXT:
{
m_PanelMsg->Text = fBrowser->DOC_StatusText;
m_PanelProgress->Text = fBrowser->DOC_ErrorText;
break;
}
case STATUSCHANGE_COMPLETE:
{
m_PanelProgress->Text = fBrowser->DOC_ErrorText;
ProgressBar1->Visible = false;
break;
}
case STATUSCHANGE_URL:
{
// 如果焦点不在ComboBoxAddress控件,则更新显示的地址
if(!ComboBoxAddress->Focused())
{
ComboBoxAddress->Text = fBrowser->DOC_URL;
ComboBoxAddress->Hint = ComboBoxAddress->Text;
}
break;
}
case STATUSCHANGE_TITLE:
{
SetTabTitle(Indx,fBrowser->DOC_Title);
break;
}
case STATUSCHANGE_COMMANDSTATUS:
{
ActionBack->Enabled = fBrowser->BackEnabled;
ActionForword->Enabled = fBrowser->ForwordEnabled;
// ActionStop->Enabled = fBrowser->CppWebBrowser->Busy;
ActionEditCut->Enabled = fBrowser->DOC_CanCut;
ActionEditCopy->Enabled = fBrowser->DOC_CanCopy;
ActionEditPaste->Enabled = fBrowser->DOC_CanPaste;
break;
}
}
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
__fastcall TfmMain::TfmMain(TComponent *Owner)
: TForm(Owner)
{
m_IsCloseAllNow = false;
OleInitialize(NULL);
Caption = Application->Title;
m_PanelMsg = StatusBar1->Panels->Items[0];
m_PanelProgress = StatusBar1->Panels->Items[1];
// 最大化窗口
SetWindowsMaxPosition(this);
// 初使化收藏夹菜单
GetFavories();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormClose(TObject *Sender,
TCloseAction &Action)
{
// 先关闭所有的子窗口
CloseAllChild();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormDestroy(TObject *Sender)
{
//
OleUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormResize(TObject *Sender)
{
int Add=16;
m_PanelMsg->Width = StatusBar1->ClientWidth
- Add
- m_PanelProgress->Width;
ProgressBar1->Left=StatusBar1->ClientWidth
- Add + 2
- ProgressBar1->Width;
}
//---------------------------------------------------------------------------
// 创建一个子窗口
void TfmMain::CreateBrowserWindow(String URL)
{
if(URL.IsEmpty())
return;
TfmChildwin *fBrowser = ::CreateMDIChild();
fBrowser->CppWebBrowser->Offline = ActionOffline->Checked;
if(!URL.IsEmpty())
{
fBrowser->NavigateURL(URL);
}
}
//---------------------------------------------------------------------------
void TfmMain::CloseAllChild(void)
{
TForm *fChild;
while(MDIChildCount>0)
{
fChild=(TForm *)MDIChildren[0];
delete fChild;
}
}
//---------------------------------------------------------------------------
void TfmMain::NavigateURL(const AnsiString &URL,bool AddToURLs)
{
if(AddToURLs)
{
AddTextToString(ComboBoxAddress->Items,URL);
}
ComboBoxAddress->Text = URL;
ComboBoxAddress->Hint = URL;
CreateBrowserWindow(URL);
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::ActionVisitExecute(TObject *Sender)
{
AnsiString URL = ComboBoxAddress->Text;
if(URL.IsEmpty())
return ;
NavigateURL(URL,true);
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::ActionWindowCloseExecute(
TObject *Sender)
{
TForm *fChild = this->ActiveMDIChild;
if(fChild)
{
fChild->Close();
}
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::ActionFileCloseAllExecute(
TObject *Sender)
{
CloseAllChild();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::ActionFileExitExecute(TObject *Sender)
{
m_IsCloseAllNow = true;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormShow(TObject *Sender)
{
if(this->MDIChildCount == 0)
{
ComboBoxAddress->SetFocus();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?