📄 gvwin.c
字号:
else
cyAdjust = 0;
}
cyClient += cyAdjust;
#endif
nVscrollMax = max(0, image.height - cyClient);
nVscrollPos = min(nVscrollPos, nVscrollMax);
if (!image.open)
nVscrollMax = nVscrollPos = 0;
if (fullscreen) {
/* never display scroll bars */
SetScrollRange(hwnd, SB_VERT, 0, 0, TRUE);
}
else if (is_win4 && pSetScrollInfo) {
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
/* Win32 docs say use nMax = nVscrollMax + (nPage-1) */
/* Overview example says use nMax = nVscrollMax */
if (nVscrollMax) {
si.nPage = cyClient;
si.nMax = nVscrollMax + (cyClient - 1);
}
else {
si.nMax = si.nPage = 0;
}
si.nPos = nVscrollPos;
si.nTrackPos = 0;
pSetScrollInfo(hwnd, SB_VERT, &si, TRUE);
}
else
{
SetScrollRange(hwnd, SB_VERT, 0, nVscrollMax, FALSE);
SetScrollPos(hwnd, SB_VERT, nVscrollPos, TRUE);
}
#ifdef OLD
cxAdjust = min(image.width, cxClient) - cxClient;
cxClient += cxAdjust;
#else
if (image.width < cxClient) {
/* shrink window */
cxAdjust = image.width - cxClient;
}
else {
if (fit_page_enabled) {
/* We just got a GSDLL_SIZE and option.fitpage was TRUE */
/* enlarge window to smaller of bitmap width */
/* and width if client extended to right of screen */
GetWindowRect(GetParent(hwnd),&rect);
cxAdjust = min(image.width,
cxClient + GetSystemMetrics(SM_CXFULLSCREEN)-rect.right)
- cxClient;
}
else
cxAdjust = 0;
}
cxClient += cxAdjust;
#endif
nHscrollMax = max(0, image.width - cxClient);
nHscrollPos = min(nHscrollPos, nHscrollMax);
if (!image.open)
nHscrollMax = nHscrollPos = 0;
if (fullscreen) {
/* never display scroll bars */
SetScrollRange(hwnd, SB_HORZ, 0, 0, TRUE);
}
else if (is_win4 && pSetScrollInfo) {
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
if (nHscrollMax) {
si.nPage = cxClient;
si.nMax = nHscrollMax + (cxClient - 1);
}
else {
si.nMax = si.nPage = 0;
}
si.nPos = nHscrollPos;
si.nTrackPos = 0;
pSetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
}
else
{
SetScrollRange(hwnd, SB_HORZ, 0, nHscrollMax, FALSE);
SetScrollPos(hwnd, SB_HORZ, nHscrollPos, TRUE);
}
bitmap.scrollx = nHscrollPos;
bitmap.scrolly = nVscrollPos;
if (!fullscreen && option.fit_page &&
(wParam==SIZE_RESTORED) && !IsZoomed(hwndimg) &&
image.open && (cxAdjust!=0 || cyAdjust!=0) ) {
GetWindowRect(GetParent(hwnd),&rect);
MoveWindow(GetParent(hwnd),rect.left,rect.top,
rect.right-rect.left+cxAdjust,
rect.bottom-rect.top+cyAdjust, TRUE);
cxAdjust = cyAdjust = 0;
}
fit_page_enabled = FALSE;
/* centre the bitmap if smaller than client window */
GetClientRect(hwnd, &rect);
cxClient = rect.right - rect.left;
cyClient = rect.bottom - rect.top;
if (image.width < cxClient)
display.offset.x = (cxClient - image.width) / 2;
else
display.offset.x = 0;
if (image.height < cyClient)
display.offset.y = (cyClient - image.height) / 2;
else
display.offset.y = 0;
return(0);
case WM_VSCROLL:
switch(LOWORD(wParam)) {
case SB_TOP:
nVscrollInc = -nVscrollPos;
break;
case SB_BOTTOM:
nVscrollInc = nVscrollMax - nVscrollPos;
break;
case SB_LINEUP:
nVscrollInc = -cyClient/16;
break;
case SB_LINEDOWN:
nVscrollInc = cyClient/16;
break;
case SB_PAGEUP:
nVscrollInc = min(-1,-cyClient);
break;
case SB_PAGEDOWN:
nVscrollInc = max(1,cyClient);
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nVscrollInc = HIWORD(wParam) - nVscrollPos;
break;
case SB_FIND:
/* non standard */
nVscrollInc = (short)HIWORD(wParam);
break;
default:
nVscrollInc = 0;
}
if ((nVscrollInc = max(-nVscrollPos,
min(nVscrollInc, nVscrollMax - nVscrollPos)))!=0) {
nVscrollPos += nVscrollInc;
ScrollWindow(hwnd,0,-nVscrollInc,NULL,NULL);
SetScrollPos(hwnd,SB_VERT,nVscrollPos,TRUE);
bitmap.scrollx = nHscrollPos;
bitmap.scrolly = nVscrollPos;
UpdateWindow(hwnd);
}
else if (gsdll.state != GS_IDLE) {
/* We are at the top or bottom of the
* scroll range. Change page if
* PageUp or PageDown pressed. */
int numpages = 0;
request_mutex();
if (psfile.dsc != (CDSC *)NULL)
numpages = psfile.dsc->page_count;
release_mutex();
switch(LOWORD(wParam)) {
case SB_PAGEUP:
if ((psfile.dsc != (CDSC *)NULL)
&& (psfile.pagenum != 1)) {
PostMessage(hwnd ,WM_VSCROLL, SB_BOTTOM,0L);
gsview_command(IDM_PREV);
}
break;
case SB_PAGEDOWN:
if ((psfile.dsc == (CDSC *)NULL)
|| (psfile.pagenum < numpages)) {
PostMessage(hwnd ,WM_VSCROLL, SB_TOP,0L);
gsview_command(IDM_NEXT);
}
break;
}
}
return(0);
case WM_HSCROLL:
switch(LOWORD(wParam)) {
case SB_TOP:
nHscrollInc = -nHscrollPos;
break;
case SB_BOTTOM:
nHscrollInc = nHscrollMax - nHscrollPos;
break;
case SB_LINEUP:
nHscrollInc = -cxClient/16;
break;
case SB_LINEDOWN:
nHscrollInc = cyClient/16;
break;
case SB_PAGEUP:
nHscrollInc = min(-1,-cxClient);
break;
case SB_PAGEDOWN:
nHscrollInc = max(1,cxClient);
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nHscrollInc = HIWORD(wParam) - nHscrollPos;
break;
case SB_FIND:
/* non standard */
nHscrollInc = (short)HIWORD(wParam);
break;
default:
nHscrollInc = 0;
}
if ((nHscrollInc = max(-nHscrollPos,
min(nHscrollInc, nHscrollMax - nHscrollPos)))!=0) {
nHscrollPos += nHscrollInc;
ScrollWindow(hwnd,-nHscrollInc,0,NULL,NULL);
SetScrollPos(hwnd,SB_HORZ,nHscrollPos,TRUE);
bitmap.scrollx = nHscrollPos;
bitmap.scrolly = nVscrollPos;
UpdateWindow(hwnd);
}
return(0);
case WM_KEYDOWN:
end_button_help();
switch(LOWORD(wParam)) {
case VK_HOME:
SendMessage(hwnd,WM_VSCROLL,SB_TOP,0L);
break;
case VK_END:
SendMessage(hwnd,WM_VSCROLL,SB_BOTTOM,0L);
break;
case VK_PRIOR:
SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0L);
break;
case VK_NEXT:
SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0L);
break;
case VK_UP:
if (GetKeyState(VK_CONTROL) & 0x8000)
SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0L);
else
SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0L);
break;
case VK_DOWN:
if (GetKeyState(VK_CONTROL) & 0x8000)
SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0L);
else
SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0L);
break;
case VK_LEFT:
if (GetKeyState(VK_CONTROL) & 0x8000)
SendMessage(hwnd,WM_HSCROLL,SB_PAGEUP,0L);
else
SendMessage(hwnd,WM_HSCROLL,SB_LINEUP,0L);
break;
case VK_RIGHT:
if (GetKeyState(VK_CONTROL) & 0x8000)
SendMessage(hwnd,WM_HSCROLL,SB_PAGEDOWN,0L);
else
SendMessage(hwnd,WM_HSCROLL,SB_LINEDOWN,0L);
break;
case VK_ESCAPE:
gsview_fullscreen_end();
break;
}
return(0);
case WM_KEYUP:
end_button_help();
break;
case WM_SETCURSOR:
if (fullscreen && (hwnd == hwnd_fullscreen)) {
if (szWait[0] != '\0')
SetCursor(NULL);
else
SetCursor(hCursorArrow);
if (image.open) {
float x, y;
if (get_cursorpos(&x, &y)) {
PDFLINK link;
if (is_link(x, y, &link)) {
SetCursor(hcHand);
return TRUE;
}
}
}
return TRUE;
}
break;
case WM_RBUTTONDOWN:
if (fullscreen && (hwnd == hwnd_fullscreen)) {
SendMessage(hwndimg, WM_COMMAND, IDM_PREV, 0L);
break;
}
break;
case WM_LBUTTONDOWN:
#ifndef VIEWONLY
if (hDlgModeless && in_child_client_area())
SendMessage(hDlgModeless, WM_COMMAND, BB_CLICK, lParam);
else {
int iword ;
float x, y;
PDFLINK link;
BOOL full = fullscreen && (hwnd == hwnd_fullscreen);
if (get_cursorpos(&x, &y)) {
if (!full) {
HDC hdc = GetDC(hwnd);
if ( (iword = word_find((int)x, (int)y)) >= 0){
/* remove any current selection */
highlight_words(hdc, text_mark_first,
text_mark_last);
/* mark new selection */
text_mark_first = text_mark_last = iword;
text_marking = TRUE;
highlight_words(hdc, text_mark_first,
text_mark_last);
SetCapture(hwnd);
}
else {
/* remove selection */
highlight_words(hdc, text_mark_first,
text_mark_last);
text_mark_first = text_mark_last = -1;
ReleaseCapture();
}
ReleaseDC(hwnd, hdc);
}
/* pdfmark link */
if (is_link(x, y, &link)) {
/* found link */
if (link.page == 0) {
if (strcmp(link.action, "GoBack")==0)
history_back();
else
gserror(IDS_NOLINKTARGET, NULL, 0,
SOUND_ERROR);
}
else {
gsview_unzoom();
pending.pagenum = link.page;
history_add(pending.pagenum);
pending.now = TRUE;
}
}
else if (full) {
SendMessage(hwndimg, WM_COMMAND, IDM_NEXT, 0L);
break;
}
}
/* set last point for measuring distances */
measure_setpoint(x, y);
}
#endif
break;
#ifndef VIEWONLY
case WM_MOUSEMOVE:
if (text_marking) {
int iword ;
float x, y;
while (!in_child_client_area()) {
RECT rect;
POINT pt;
GetCursorPos(&pt);
GetClientRect(hwnd, &rect);
ScreenToClient(hwnd, &pt);
if (pt.x > rect.right)
SendMessage(hwnd, WM_HSCROLL,SB_LINEDOWN,0L);
if (pt.x < rect.left)
SendMessage(hwnd, WM_HSCROLL,SB_LINEUP,0L);
if (pt.y > rect.bottom)
SendMessage(hwnd, WM_VSCROLL,SB_LINEDOWN,0L);
if (pt.y < rect.top)
SendMessage(hwnd, WM_VSCROLL,SB_LINEUP,0L);
Sleep(100);
}
if (get_cursorpos(&x, &y)) {
if ( (iword = word_find((int)x, (int)y)) >= 0 ) {
if (iword != text_mark_last) {
HDC hdc = GetDC(hwnd_image);
int first, last;
if ((text_mark_last-text_mark_first >= 0) != (iword-text_mark_first >= 0)) {
/* changing direction */
/* clear everything */
highlight_words(hdc, text_mark_first, text_mark_last);
/* reinstate first word */
text_mark_last = text_mark_first;
highlight_words(hdc, text_mark_first, text_mark_last);
}
if (iword != text_mark_last) {
if (iword >= text_mark_first) {
if (iword > text_mark_last)
first=text_mark_last+1, last=iword;
else
first=iword+1, last=text_mark_last;
}
else {
if (iword > text_mark_last)
first=text_mark_last, last=iword-1;
else
first=iword, last=text_mark_last-1;
}
highlight_words(hdc, first, last);
text_mark_last = iword;
}
ReleaseDC(hwnd_image, hdc);
}
}
}
}
break;
case WM_LBUTTONUP:
ReleaseCapture();
text_marking = FALSE;
break;
#endif
case WM_GSTILE:
/* draw a tile that has changed */
image_lock(&image);
if (image.open) {
/* calculate area */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -