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 + -
显示快捷键?