mainfrm.h
来自「一个使用wtl写的完整的多窗口浏览器」· C头文件 代码 · 共 1,660 行 · 第 1/4 页
H
1,660 行
void OnParentNotify(UINT fwEvent, UINT idChild, LPARAM lParam)
{
if (fwEvent != WM_RBUTTONDOWN)
return;
CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
ClientToScreen(&pt);
CRect rc;
::GetClientRect(m_hWndToolBar, &rc);
CPoint ptRebar = pt; ::ScreenToClient(m_hWndToolBar, &ptRebar);
if (!rc.PtInRect(ptRebar)) // not on rebar
return;
HWND hWnd = ::WindowFromPoint(pt);
if (hWnd == m_MDITab.m_hWnd) { // on tab bar
CPoint ptTab = pt; m_MDITab.ScreenToClient(&ptTab);
if (m_MDITab.HitTest(ptTab) != -1)
return;
}
/* if (idChild == IDC_MDITAB) {
CPoint pt2 = pt;
ClientToScreen(&pt2);
m_MDITab.ScreenToClient(&pt2);
if (m_MDITab.HitTest(pt2) != -1)
return;
}
*/
CMenuHandle menuView = ::GetSubMenu(m_CmdBar.GetMenu(), _nPosViewMenu);
CMenuHandle menu = menuView.GetSubMenu(0);
// CPoint ptCursor; ::GetCursorPos(&ptCursor);
menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd, NULL);
}
void OnDestroy()
{
SetMsgHandled(FALSE);
MtlSendCommand(m_hWnd, ID_VIEW_STOP_ALL);// added by DOGSTORE
// Note. The script error dialog makes the app hung up.
// I can't find the reason, but I can avoid it by closing
// windows explicitly.
MtlCloseAllMDIChildren(m_hWndMDIClient);
CCriticalIdleTimer::UninstallCriticalIdleTimer();
// what can I trust?
ATLASSERT(::IsMenu(m_hMenu));
::DestroyMenu(m_hMenu);
RevokeDragDrop();
}
void OnActivate(UINT nState, BOOL bMinimized, HWND hWndOther)
{
if (nState == WA_INACTIVE) {
m_hWndFocus = ::GetFocus();
}
else {
if (m_hWndFocus)
::SetFocus(m_hWndFocus);
}
}
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CFavoritesMenuOption::Add(m_hWnd);
//////////////////////////////////////////////////////////////////
// initialize menus' infomation
CMenuHandle menu = m_hMenu;
CMenuHandle menuFav = menu.GetSubMenu(_nPosFavoriteMenu);
m_FavoriteMenu.InstallExplorerMenu(menuFav);
CMenuHandle menuGroup = menuFav.GetSubMenu(_nPosFavGroupMenu);
m_FavGroupMenu.InstallExplorerMenu(menuGroup);
// MRU list
CMainOption::SetMRUMenuHandle(menu, _nPosMRU);
//////////////////////////////////////////////////////////////////
// create command bar window
SetMenu(NULL);// remove menu
HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault, NULL, MTL_SIMPLE_CMDBAR2_PANE_STYLE, 0, ATL_IDW_COMMAND_BAR);
m_CmdBar.AttachMenu(m_hMenu);
m_CmdBar.EnableButton(_nPosWindowMenu, false);
//////////////////////////////////////////////////////////////////
// create toolbar
HWND hWndToolBar = m_ToolBar.DonutToolBar_Create(m_hWnd);
ATLASSERT(::IsWindow(hWndToolBar));
m_ToolBar.DonutToolBar_SetFavoritesMenu(menuFav);
//////////////////////////////////////////////////////////////////
// create addressbar
HWND hWndAddressBar = m_AddressBar.Create(m_hWnd, IDC_ADDRESSBAR, ID_VIEW_GO,
IDB_GOBUTTON, IDB_GOBUTTON_HOT, 16, 16, RGB(255, 0, 255));
ATLASSERT(::IsWindow(hWndAddressBar));
//////////////////////////////////////////////////////////////////
// create tabctrl
HWND hWndMDITab = m_MDITab.Create(m_hWnd, CRect(0, 0, 200, 20), _T("Donut MDITab"),
WS_CHILD | WS_VISIBLE, NULL, IDC_MDITAB);
m_MDITab.LoadMenu(IDR_MENU_TAB);
m_MDITab.LoadConnectingAndDownloadingImageList(IDB_MDITAB, 6, 6, RGB(255, 255, 255));
//////////////////////////////////////////////////////////////////
// create link bar
HWND hWndLinkBar = m_LinkBar.Create(m_hWnd, rcDefault, NULL, ATL_SIMPLE_TOOLBAR_PANE_STYLE, 0, IDC_LINKBAR);
//////////////////////////////////////////////////////////////////
// create rebar
CreateSimpleReBar(MTL_SIMPLE_REBAR_STYLE | RBS_DBLCLKTOGGLE);
// CWindow(m_hWndToolBar).ModifyStyleEx(0, WS_EX_CLIENTEDGE);
//////////////////////////////////////////////////////////////////
// create statusbar //CreateSimpleStatusBar();
m_wndStatusBar.Create(m_hWnd);
m_hWndStatusBar = m_wndStatusBar.m_hWnd;
int nPanes[] = { ID_DEFAULT_PANE, ID_PROGRESS_PANE };
m_wndStatusBar.SetPanes(nPanes, 2, false);
//////////////////////////////////////////////////////////////////
// create prgress bar
m_wndProgress.Create(m_hWndStatusBar, NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS
| PBS_SMOOTH, 0, IDC_PROGRESS);
m_wndProgress.ModifyStyleEx(WS_EX_STATICEDGE, 0);
//////////////////////////////////////////////////////////////////
CIniSection pr;
//////////////////////////////////////////////////////////////////
// load band position
CReBarBandInfo rbis[] = {
{ 0, hWndCmdBar, ATL_IDW_COMMAND_BAR, 0, NULL, 0 },
{ 1, hWndToolBar, ATL_IDW_TOOLBAR, RBBS_BREAK, NULL, 0 },
{ 2, hWndAddressBar, IDC_ADDRESSBAR, RBBS_BREAK, NULL/*_T("Address")*/, 0 },
{ 3, hWndMDITab, IDC_MDITAB, RBBS_BREAK, NULL, 0 },
{ 4, hWndLinkBar, IDC_LINKBAR, RBBS_BREAK, _T("Links"), 0 },
};
pr.Open(_szIniFileName, _T("ReBar"));
MtlGetProfileReBarBandsState(rbis, rbis + _countof(rbis), pr, *this);
pr.Close();
m_CmdBar.RefreshBandIdealSize(m_hWndToolBar);
m_AddressBar.InitReBarBandInfo(m_hWndToolBar);// if you dislike a header, remove this.
//////////////////////////////////////////////////////////////////
// load status bar state
pr.Open(_szIniFileName, _T("Main"));
BOOL bStatusBarVisible = TRUE;
MtlGetProfileStatusBarState(pr, m_hWndStatusBar, bStatusBarVisible);
m_bStatusBarVisibleUnlessFullScreen = bStatusBarVisible;
pr.Close();
//////////////////////////////////////////////////////////////////
// create mdi client window
m_menuWindow = ::GetSubMenu(m_hMenu, _nPosWindowMenu);
CreateMDIClient(m_menuWindow.m_hMenu);
m_wndMDIClient.SubclassWindow(m_hWndMDIClient);
// NOTE: If WS_CLIPCHILDREN not set, MDI Client will try erase background over MDI child window,
// but as OnEraseBkgnd does nothing, it goes well.
if (CMainOption::s_bTabMode)
m_wndMDIClient.ModifyStyle(WS_CLIPCHILDREN, 0);// to avoid flicker, but scary
//////////////////////////////////////////////////////////////////
// splitter window
m_wndSplit.SetSplitterExtendedStyle(0);
m_hWndClient = m_wndSplit.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
//////////////////////////////////////////////////////////////////
// pane container
m_ExplorerBar.Create(m_hWndClient);
m_ExplorerBar.DonutExplorerBar_Init(m_hWndMDIClient);
//////////////////////////////////////////////////////////////////
// MDIClient misc
m_mcCmdBar.InstallAsMDICmdBar(hWndCmdBar, m_hWndMDIClient, CMainOption::s_bTabMode);
m_mcToolBar.InstallAsStandard(hWndToolBar, m_hWnd, true, ID_VIEW_FULLSCREEN);
m_MDITab.SetMDIClient(m_hWndMDIClient);
//////////////////////////////////////////////////////////////////
// set up UI
CmdUIAddToolBar(hWndToolBar);
// message loop
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
// read general settings
_ReadProfile();
// for dragging files
RegisterDragDrop();// DragAcceptFiles();
_ShowBandsFullScreen(true, true);
CCriticalIdleTimer::InstallCriticalIdleTimer(m_hWnd, ID_VIEW_IDLE);
return 0;
}
LRESULT OnMouseWheel(UINT fwKeys, short zDelta, CPoint point)
{
// I don't have a wheel mouse...
if ( (m_MDITab.GetMDITabExtendedStyle() & MTB_EX_WHEEL) &&
MtlIsBandVisible(m_hWndToolBar, IDC_MDITAB) ) {
CRect rcTab;
m_MDITab.GetWindowRect(&rcTab);
if (rcTab.PtInRect(point)) {
if (zDelta > 0) {
m_MDITab.LeftTab();
}
else {
m_MDITab.RightTab();
}
SetMsgHandled(TRUE);
return 0;
}
}
SetMsgHandled(FALSE);
return 1;
}
LRESULT OnFileRecent(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// get file name from the MRU list
TCHAR szFile[INTERNET_MAX_PATH_LENGTH];
if(CMainOption::s_pMru->GetFromList(wID, szFile))
{
OnUserOpenFile(szFile, DonutGetStdOpenFlag());
}
else
{
::MessageBeep(MB_ICONERROR);
}
return 0;
}
LRESULT OnViewRefreshFavBar(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
m_FavoriteMenu.RefreshMenu();
m_FavGroupMenu.RefreshMenu();
return 0;
}
LRESULT OnViewIdle(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
_OnIdleCritical();
return 0;
}
void OnClose()
{
SetMsgHandled(FALSE);
if (!CDonutConfirmOption::OnDonutExit(m_hWnd)) {
SetMsgHandled(TRUE);
return;
}
if (_IsFullScreen()) {
CMainOption::s_dwMainExtendedStyle |= MAIN_EX_FULLSCREEN;// save style
_ShowBandsFullScreen(FALSE);// restore bands position
}
else {
CMainOption::s_dwMainExtendedStyle &= ~MAIN_EX_FULLSCREEN;
}
if (m_nBackUpTimerID != 0)
KillTimer(m_nBackUpTimerID);
m_mcCmdBar.Uninstall();
m_mcToolBar.Uninstall();
_WriteProfile();
CMainOption::s_bAppClosing = true;
}
void OnNewInstance(ATOM nAtom)
{
TCHAR szBuff[4096];
if (::GlobalGetAtomName(nAtom, szBuff, 4096) != 0) {
dmfTRACE(_T("CMainFrame::OnNewInstance: %s\n"), szBuff);
OnUserOpenFile(szBuff, DonutGetStdOpenFlag());
::GlobalDeleteAtom(nAtom);
if (!(CMainOption::s_dwMainExtendedStyle & MAIN_EX_NOACTIVATE))
MtlSetForegroundWindow(m_hWnd);
}
}
LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (CFileNewOption::s_dwFlags == FILENEW_BLANK)
OnFileNewBlank(0, 0, 0);
else if (CFileNewOption::s_dwFlags == FILENEW_COPY) {
if (MDIGetActive() != NULL)
SendMessage(WM_COMMAND, MAKEWPARAM(ID_FILE_NEW_COPY, 0), 0);
else
OnFileNewBlank(0, 0, 0);
}
else if (CFileNewOption::s_dwFlags == FILENEW_HOME)
OnFileNewHome(0, 0, 0);
else
ATLASSERT(FALSE);
return 0;
}
void OnFileNewHome(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
HWND hWndChild = OnUserOpenFile(NULL, DonutGetStdOpenActivateFlag());
if (hWndChild) {
CWebBrowser2 browser = DonutGetIWebBrowser2(hWndChild);
if (browser.m_spBrowser != NULL)
browser.GoHome();
}
}
void OnViewHome(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
bool bNew = ::GetAsyncKeyState(VK_CONTROL) < 0 || ::GetAsyncKeyState(VK_SHIFT) < 0;
if (bNew || MDIGetActive() == NULL) {
OnFileNewHome(0, 0, 0);
}
else {
SetMsgHandled(FALSE);
}
}
void OnRegisterAsBrowser(WORD wNotifyCode, WORD /*wID*/, HWND /*hWndCtl*/)
{
if (wNotifyCode == NM_ON) {
MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_ON));
}
else if (wNotifyCode == NM_OFF) {
MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_OFF));
}
else if (!_check_flag(MAIN_EX_REGISTER_AS_BROWSER, CMainOption::s_dwMainExtendedStyle)) {
CMainOption::s_dwMainExtendedStyle |= MAIN_EX_REGISTER_AS_BROWSER;
MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_ON));
}
else {
CMainOption::s_dwMainExtendedStyle &= ~MAIN_EX_REGISTER_AS_BROWSER;
MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_OFF));
}
}
void OnFileNewClipBoard(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
CString strText = MtlGetClipboardText();
if (strText.IsEmpty())
return;
OnUserOpenFile(strText, DonutGetStdOpenActivateFlag());
}
void OnFileNewClipBoard2(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
CString strText = MtlGetClipboardText();
if (strText.IsEmpty())
return;
OnUserOpenFile(strText, DonutGetStdOpenFlag());// allow the option
}
void OnFileNewClipBoardEx(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
m_ExplorerBar.m_ClpBar.OpenClipboardUrl();
}
void OnFileNewCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
HWND hWndActive = MDIGetActive();
if (hWndActive) {
CWebBrowser2 browser = DonutGetIWebBrowser2(hWndActive);
if (browser.m_spBrowser != NULL) {
CString strURL = browser.GetLocationURL();
if (!strURL.IsEmpty())
OnUserOpenFile(strURL, DonutGetStdOpenActivateFlag());
}
}
}
void OnFileNewBlank(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
OnUserOpenFile(_T("about:blank"), DonutGetStdOpenActivateFlag());
}
void OnFileWorkOffline(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
{
MtlSetGlobalOffline(!MtlIsGlobalOffline());
UpdateTitleBarUpsideDown();
}
LRESULT OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
dmfTRACE(_T("CMainFrame::OnFileOpen\n"));
COpenURLDlg dlg;
if (dlg.DoModal() == IDOK && !dlg.m_strEdit.IsEmpty()) {
OnUserOpenFile(dlg.m_strEdit, DonutGetStdOpenFlag());
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?