📄 mainframe.cpp
字号:
}
}
if (IsWindowVisible(_hstatusbar)) {
int parts[] = {300, 500};
SendMessage(_hstatusbar, WM_SIZE, 0, 0);
SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
ClientRect rt(_hstatusbar);
rect.bottom -= rt.bottom;
}
if (IsWindowVisible(_hsidebar)) {
WindowRect rt(_hsidebar);
rect.left += rt.right-rt.left;
SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
}
}
void MainFrameBase::resize_frame_client()
{
ClientRect rect(_hwnd);
resize_frame(rect.right, rect.bottom);
}
void MainFrameBase::frame_get_clientspace(PRECT prect)
{
if (!IsIconic(_hwnd))
GetClientRect(_hwnd, prect);
else {
WINDOWPLACEMENT wp;
GetWindowPlacement(_hwnd, &wp);
prect->left = prect->top = 0;
prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left-
2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE));
prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top-
2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))-
GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE);
}
if (IsWindowVisible(_htoolbar)) {
ClientRect rt(_htoolbar);
prect->top += rt.bottom+2;
}
if (IsWindowVisible(_hstatusbar)) {
ClientRect rt(_hstatusbar);
prect->bottom -= rt.bottom;
}
}
BOOL MainFrameBase::toggle_fullscreen()
{
RECT rt;
if ((_fullscreen._mode=!_fullscreen._mode)) {
GetWindowRect(_hwnd, &_fullscreen._orgPos);
_fullscreen._wasZoomed = IsZoomed(_hwnd);
Frame_CalcFrameClient(_hwnd, &rt);
ClientToScreen(_hwnd, (LPPOINT)&rt.left);
ClientToScreen(_hwnd, (LPPOINT)&rt.right);
rt.left = _fullscreen._orgPos.left-rt.left;
rt.top = _fullscreen._orgPos.top-rt.top;
rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right;
rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom;
MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
} else {
MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top,
_fullscreen._orgPos.right-_fullscreen._orgPos.left,
_fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE);
if (_fullscreen._wasZoomed)
ShowWindow(_hwnd, WS_MAXIMIZE);
}
return _fullscreen._mode;
}
void MainFrameBase::fullscreen_move()
{
RECT rt, pos;
GetWindowRect(_hwnd, &pos);
Frame_CalcFrameClient(_hwnd, &rt);
ClientToScreen(_hwnd, (LPPOINT)&rt.left);
ClientToScreen(_hwnd, (LPPOINT)&rt.right);
rt.left = pos.left-rt.left;
rt.top = pos.top-rt.top;
rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right;
rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom;
MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
}
void MainFrameBase::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx)
{
BOOL vis = IsWindowVisible(hchild);
CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED);
if (band_idx != -1)
SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis);
else
ShowWindow(hchild, vis? SW_HIDE: SW_SHOW);
if (_fullscreen._mode)
fullscreen_move();
resize_frame_client();
}
void MainFrameBase::FillBookmarks()
{
/*@@
HiddenWindow hide(_hsidebar);
WindowCanvas canvas(_hwnd);
TreeView_DeleteAllItems(_hsidebar);
g_icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas);
g_icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas);
ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas);
g_icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
g_icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
TV_INSERTSTRUCT tvi;
tvi.hParent = TVI_ROOT;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
ResString sFavorites(IDS_FAVORITES);
tvi.item.pszText = (LPTSTR)sFavorites.c_str();
tvi.item.iSelectedImage = tvi.item.iImage = 0;
HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi);
g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas);
TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND);
*/
}
MainFrame::MainFrame(HWND hwnd)
: super(hwnd)
{
_split_pos = DEFAULT_SPLIT_POS;
_last_split = DEFAULT_SPLIT_POS;
}
HWND MainFrame::Create()
{
HMENU hMenuFrame = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_SDIFRAME));
return Window::Create(WINDOW_CREATOR(MainFrame), 0,
(LPCTSTR)(int)g_hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0/*hwndDesktop*/, hMenuFrame);
}
/*@@
HWND MainFrame::Create(LPCTSTR url)
{
HWND hFrame = Create();
if (!hFrame)
return 0;
ShowWindow(hFrame, SW_SHOW);
MainFrame* pFrame = GET_WINDOW(MainFrame, hFrame);
if (pFrame)
pFrame->set_url(url);
return hFrame;
}
*/
LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
switch(nmsg) {
case WM_SIZE:
resize_frame(LOWORD(lparam), HIWORD(lparam));
break;
case WM_PAINT: {
PaintCanvas canvas(_hwnd);
if (_left_hwnd && _right_hwnd) {
ClientRect rt(_hwnd);
rt.left = _split_pos-SPLIT_WIDTH/2;
rt.right = _split_pos+SPLIT_WIDTH/2+1;
if (_right_hwnd) {
WindowRect right_rect(_right_hwnd);
ScreenToClient(_hwnd, &right_rect);
rt.top = right_rect.top;
rt.bottom = right_rect.bottom;
}
HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR));
Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
SelectObject(canvas, lastBrush);
}
break;}
case WM_SETCURSOR:
if (LOWORD(lparam) == HTCLIENT) {
POINT pt;
GetCursorPos(&pt);
ScreenToClient(_hwnd, &pt);
if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
SetCursor(LoadCursor(0, IDC_SIZEWE));
return TRUE;
}
}
goto def;
case WM_LBUTTONDOWN: {
int x = GET_X_LPARAM(lparam);
ClientRect rt(_hwnd);
if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
_last_split = _split_pos;
SetCapture(_hwnd);
}
break;}
case WM_LBUTTONUP:
if (GetCapture() == _hwnd)
ReleaseCapture();
break;
case WM_KEYDOWN:
if (wparam == VK_ESCAPE)
if (GetCapture() == _hwnd) {
_split_pos = _last_split;
resize_children();
_last_split = -1;
ReleaseCapture();
SetCursor(LoadCursor(0, IDC_ARROW));
}
break;
case WM_MOUSEMOVE:
if (GetCapture() == _hwnd) {
int x = LOWORD(lparam);
ClientRect rt(_hwnd);
if (x>=0 && x<rt.right) {
_split_pos = x;
resize_children();
rt.left = x-SPLIT_WIDTH/2;
rt.right = x+SPLIT_WIDTH/2+1;
InvalidateRect(_hwnd, &rt, FALSE);
UpdateWindow(_left_hwnd);
UpdateWindow(_hwnd);
UpdateWindow(_right_hwnd);
}
}
break;
case PM_OPEN_WINDOW: {CONTEXT("MainFrame PM_OPEN_WINDOW");
LPCTSTR url = (LPCTSTR)lparam;
if (!url || !*url)
#ifdef _DEBUG
url = TEXT("http://localhost");
#else
url = TEXT("about:blank");
#endif
if (!_right_hwnd) {
_right_hwnd = create_webchildwindow(WebChildWndInfo(_hwnd, url));
resize_children();
} else
set_url(url);
return TRUE;} // success
default: def:
return super::WndProc(nmsg, wparam, lparam);
}
return 0;
}
int MainFrame::Command(int id, int code)
{
if (_right_hwnd)
if (SendMessage(_right_hwnd, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0))
return 0;
return super::Command(id, code);
}
void MainFrame::resize_frame(int cx, int cy)
{
if (cy <= 0)
return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
RECT rect = {0, 0, cx, cy};
if (_hwndrebar) {
int height = ClientRect(_hwndrebar).bottom;
MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE);
rect.top += height;
} else {
if (IsWindowVisible(_htoolbar)) {
SendMessage(_htoolbar, WM_SIZE, 0, 0);
WindowRect rt(_htoolbar);
rect.top = rt.bottom;
// rect.bottom -= rt.bottom;
}
}
if (IsWindowVisible(_hstatusbar)) {
int parts[] = {300, 500};
SendMessage(_hstatusbar, WM_SIZE, 0, 0);
SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
ClientRect rt(_hstatusbar);
rect.bottom -= rt.bottom;
}
if (IsWindowVisible(_hsidebar)) {
WindowRect rt(_hsidebar);
rect.left += rt.right-rt.left;
SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
}
_clnt_rect = rect;
resize_children();
}
void MainFrame::resize_children()
{
HDWP hdwp = BeginDeferWindowPos(2);
int cx = _clnt_rect.left;
if (_left_hwnd) {
cx = _split_pos + SPLIT_WIDTH/2;
hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, _clnt_rect.left, _clnt_rect.top, _split_pos-SPLIT_WIDTH/2-_clnt_rect.left, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
} else {
//_split_pos = 0;
cx = 0;
}
if (_right_hwnd)
hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, _clnt_rect.left+cx, _clnt_rect.top, _clnt_rect.right-cx, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
EndDeferWindowPos(hdwp);
}
void MainFrame::update_clnt_rect()
{
ClientRect rect(_hwnd);
resize_frame(rect.right, rect.bottom);
}
void MainFrame::set_url(LPCTSTR url)
{
if (_url != url) {
_url = url;
SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
}
}
bool MainFrame::go_to(LPCTSTR url, bool new_window)
{
if (_right_hwnd) {
SendMessage(_right_hwnd, PM_JUMP_TO_URL, 0, (LPARAM)url);
return true;
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -