📄 gvpm.c
字号:
first=iword, last=text_mark_last-1;
}
highlight_words(hps, first, last);
text_mark_last = iword;
}
WinReleasePS(hps);
}
}
}
}
/* update cursor */
if (fullscreen && (hwnd == hwnd_fullscreen)) {
if (szWait[0] != '\0')
WinSetPointer(HWND_DESKTOP, 0);
else if (image.open) {
float x, y;
PDFLINK link;
info_link();
if (get_cursorpos(&x, &y) && is_link(x, y, &link))
WinSetPointer(HWND_DESKTOP, hptr_hand);
else
WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(
HWND_DESKTOP, SPTR_ARROW, FALSE));
}
else
WinSetPointer(HWND_DESKTOP,
WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE));
}
else if (szWait[0] != '\0')
WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE));
else {
float x, y;
PDFLINK link;
info_link();
if (get_cursorpos(&x, &y) && is_link(x, y, &link)) {
WinSetPointer(HWND_DESKTOP, hptr_hand);
}
else if (!image.open)
WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE));
else
WinSetPointer(HWND_DESKTOP, hptr_crosshair);
}
return (MRESULT)TRUE; /* cursor has been changed */
case WM_BUTTON1UP:
WinSetCapture(HWND_DESKTOP, NULLHANDLE);
text_marking = FALSE;
break;
case WM_CLOSE:
if (!query_close()) {
return (MRESULT)0;
}
break;
case WM_DESTROY:
hwnd_image = hwnd_bmp;
fullscreen = FALSE;
if ((hwnd == hwnd_fullscreen) && image.open) {
WinShowWindow(hwnd_frame, TRUE);
update_scroll_bars();
WinInvalidateRect(hwnd_image, NULL, FALSE);
WinUpdateWindow(hwnd_image);
if (debug)
gs_addmess("Full Screen finished\r\n");
}
hwnd_fullscreen = (HWND)NULL;
break;
case DM_DRAGOVER:
return DragOver((PDRAGINFO)mp1);
case DM_DROP:
return Drop((PDRAGINFO)mp1);
}
/* All messages not handled by the ClientWndProc must be passed */
/* along to the Presentation Manager for default processing */
return WinDefWindowProc(hwnd, mess, mp1, mp2);
}
/* map from a coordinate in points, to a coordinate in pixels */
/* This is the opposite of the transform part of get_cursorpos */
/* Used when showing bbox */
void
map_pt_to_pixel(float *x, float *y)
{
if (zoom) {
/* WARNING - this doesn't cope with EPS Clip */
*x = (*x - display.zoom_xoffset) * option.zoom_xdpi / 72.0;
*y = (*y - display.zoom_yoffset) * option.zoom_ydpi / 72.0;
*x = (*x * 72.0 / option.xdpi);
*y = (*y * 72.0 / option.ydpi);
itransform_point(x, y);
*x = (*x * option.xdpi / 72.0) - scroll_pos.x + display.offset.x;
*y = (*y * option.ydpi / 72.0) - scroll_pos.y + display.offset.y;
}
else {
int xoffset = display.xoffset / display.xdpi * 72.0 + 0.5;
int yoffset = display.yoffset / display.ydpi * 72.0 + 0.5;
*x = *x - xoffset;
*y = *y - yoffset;
itransform_point(x, y);
*x = *x * option.xdpi/72.0
- scroll_pos.x + display.offset.x;
*y = *y * option.ydpi/72.0
- scroll_pos.y + display.offset.y;
}
}
/* return coordinates in pts from origin of page */
/* For Portrait, this is the bottom left */
/* For rotated pages, this is NOT the bottom left */
BOOL
get_cursorpos(float *x, float *y)
{
RECTL rect;
POINTL pt;
if (!image.open)
return FALSE;
if (!WinQueryPointerPos(HWND_DESKTOP, &pt))
return FALSE;
WinMapWindowPoints(HWND_DESKTOP, hwnd_image, &pt, 1);
WinQueryWindowRect(hwnd_image, &rect);
if (!WinPtInRect(hab, &rect, &pt))
return FALSE;
*x = scroll_pos.x+pt.x-display.offset.x;
*y = scroll_pos.y+pt.y-display.offset.y;
transform_cursorpos(x, y);
return TRUE;
}
void
cursorpos_paint(HPS hps)
{
float x, y;
POINTL pt;
char buf[64];
char fmt[64];
int digits = option.unitfine ? 2 : 0;
request_mutex();
if (get_cursorpos(&x, &y)) {
switch(option.unit) {
case IDM_UNITPT:
sprintf(fmt, "%%.%df, %%.%dfpt", digits, digits);
sprintf(buf, fmt, x, y);
break;
case IDM_UNITMM:
sprintf(fmt, "%%.%df, %%.%dfmm", digits, digits);
sprintf(buf, fmt, x/72*25.4, y/72*25.4);
break;
case IDM_UNITINCH:
digits += 1;
sprintf(fmt, "%%.%df, %%.%dfin", digits, digits);
sprintf(buf, fmt, x/72, y/72);
break;
}
GpiSetTextAlignment(hps, TA_RIGHT, TA_NORMAL_VERT);
pt.x = info_coord.xRight - 1;
pt.y = info_page.y;
GpiCharStringAt(hps, &pt, strlen(buf), (PBYTE)buf);
measure_paint(x, y);
}
release_mutex();
}
void
info_paint(HWND hwnd)
{
HPS ps;
RECTL rect;
POINTL pt;
int i;
char *p;
char buf[MAXSTR];
char fmt[MAXSTR];
request_mutex();
ps = WinBeginPaint(hwnd, (ULONG)0, &rect);
/* draw background */
WinFillRect(ps, &rect, SYSCLR_BUTTONMIDDLE);
GpiSetColor(ps, SYSCLR_BUTTONDARK);
pt.x = 0; pt.y = 0;
GpiMove(ps, &pt);
pt.x = statusbar.x - 1;
GpiLine(ps, &pt);
pt.y = statusbar.y - 1;
GpiLine(ps, &pt);
GpiSetColor(ps, SYSCLR_BUTTONLIGHT);
pt.x = 0;
GpiLine(ps, &pt);
pt.y = 0;
GpiLine(ps, &pt);
GpiSetColor(ps, SYSCLR_BUTTONDEFAULT);
/* write file information */
if (psfile.name[0] != '\0') {
i = load_string(IDS_FILE, buf, sizeof(buf));
if ( (p = strrchr(psfile.name, '\\')) == (char *)NULL )
p = psfile.name;
else
p++;
strcat(buf, p);
GpiCharStringAt(ps, &info_file, strlen(buf), (PBYTE)buf);
if (szWait[0] != '\0') {
sprintf(buf, szWait, percent_done);
GpiCharStringAt(ps, &info_page, strlen(buf), (PBYTE)buf);
}
else {
if (psfile.dsc!=(CDSC *)NULL) {
if (on_link) {
if ((on_link_page == 0) && on_link_action[0]) {
strncpy(buf, on_link_action, sizeof(buf)-1);
}
else {
load_string(IDS_LINKPAGE, fmt, sizeof(fmt));
sprintf(buf, fmt, on_link_page);
}
}
else {
int n = map_page(psfile.pagenum - 1);
i = load_string(IDS_PAGEINFO, fmt, sizeof(fmt));
if ((psfile.dsc->page_count != 0) && (psfile.dsc->page))
sprintf(buf, fmt, psfile.dsc->page[n].label ? psfile.dsc->page[n].label : " ",psfile.pagenum, psfile.dsc->page_count);
else
sprintf(buf, fmt, " " ,psfile.pagenum, psfile.dsc->page_count);
}
if (zoom)
load_string(IDS_ZOOMED, buf+strlen(buf), sizeof(buf)-strlen(buf));
GpiCharStringAt(ps, &info_page, strlen(buf), (PBYTE)buf);
}
else {
if (gsdll.state == GS_IDLE)
i = load_string(IDS_NOMORE, buf, sizeof(buf));
else {
i = load_string(IDS_PAGE, buf, sizeof(buf));
sprintf(buf+i, "%d", psfile.pagenum);
}
GpiCharStringAt(ps, &info_page, strlen(buf), (PBYTE)buf);
}
/* show coordinate */
cursorpos_paint(ps);
}
}
else {
i = load_string(IDS_NOFILE, buf, sizeof(buf));
GpiCharStringAt(ps, &info_file, strlen(buf), (PBYTE)buf);
if (szWait[0] != '\0') {
sprintf(buf, szWait, percent_done);
GpiCharStringAt(ps, &info_page, strlen(buf), (PBYTE)buf);
}
}
WinEndPaint(hwnd);
release_mutex();
}
/* Status Bar Window Proc */
MRESULT EXPENTRY StatusWndProc(HWND hwnd, ULONG mess,
MPARAM mp1, MPARAM mp2)
{
HPS ps;
switch (mess) {
case WM_CREATE:
{
FONTMETRICS fm;
POINTL char_size;
ps = WinGetPS(hwnd);
GpiQueryFontMetrics(ps, sizeof(FONTMETRICS), &fm);
char_size.y = fm.lMaxAscender + fm.lMaxDescender + fm.lExternalLeading + 2;
char_size.x = fm.lAveCharWidth;
statusbar.y = char_size.y + 2;
info_file.x = 2;
info_file.y = fm.lMaxDescender + 3;
info_coord.xLeft = 32 * char_size.x;
info_coord.xRight = 52 * char_size.x;
info_coord.yTop = char_size.y + 1;
info_coord.yBottom = 1;
info_page.x = 54 * char_size.x + 2;
info_page.y = fm.lMaxDescender + 3;
/*
WinFillRect(ps, SYSCLR_BUTTONMIDDLE);
*/
WinReleasePS(ps);
}
break;
case WM_PAINT:
info_paint(hwnd);
return 0;
}
return WinDefWindowProc(hwnd, mess, mp1, mp2);
}
void
delete_buttons(void)
{
struct button *bp = buttonhead;
while (bp) {
buttonhead = bp->next;
free(bp);
bp = buttonhead;
}
}
void
shade_button(HPS hps, struct button *bp, BOOL down)
{
POINTL pt;
/* draw button shading */
if (down)
GpiSetColor(hps, SYSCLR_BUTTONLIGHT);
else
GpiSetColor(hps, SYSCLR_BUTTONDARK);
pt.x = bp->rect.xLeft;
pt.y = bp->rect.yBottom;
GpiMove(hps, &pt);
pt.x = bp->rect.xRight - 1;
GpiLine(hps, &pt);
pt.y = bp->rect.yTop - 1;
GpiLine(hps, &pt);
if (down)
GpiSetColor(hps, SYSCLR_BUTTONDARK);
else
GpiSetColor(hps, SYSCLR_BUTTONLIGHT);
pt.x = bp->rect.xLeft;
GpiLine(hps, &pt);
pt.y = bp->rect.yBottom;
GpiLine(hps, &pt);
GpiSetColor(hps, SYSCLR_BUTTONDEFAULT);
}
void
size_buttons(PPOINTL ppt)
{
struct button *bp;
int i = 0;
if (option.button_show) {
for (bp = buttonhead; bp != (struct button *)NULL; bp = bp->next) {
bp->rect.xLeft = i * button_shift.x;
bp->rect.yBottom = ppt->y - button_size.y - i * button_shift.y;
bp->rect.xRight = bp->rect.xLeft + button_size.x;
bp->rect.yTop = bp->rect.yBottom + button_size.y;
i++;
}
}
}
/* Button Bar Window Proc */
MRESULT EXPENTRY ButtonWndProc(HWND hwnd, ULONG mess,
MPARAM mp1, MPARAM mp2)
{
HPS hps;
RECTL rect;
POINTL pt;
struct button *bp;
switch (mess) {
case WM_SIZE:
/* reposition buttons */
pt.x = SHORT1FROMMP(mp2);
pt.y = SHORT2FROMMP(mp2);
size_buttons(&pt);
WinInvalidateRect(hwnd, (PRECTL)NULL, FALSE);
break;
case WM_BUTTON1DOWN:
pt.x = SHORT1FROMMP(mp1);
pt.y = SHORT2FROMMP(mp1);
for (bp = buttonhead; bp != (struct button *)NULL; bp = bp->next) {
if (WinPtInRect(hab, &(bp->rect), &pt)) {
button_current = bp;
button_down = TRUE;
hps = WinGetPS(hwnd);
shade_button(hps, bp, TRUE);
WinReleasePS(hps);
WinSetCapture(HWND_DESKTOP, hwnd);
break;
}
}
break;
case WM_BUTTON1UP:
pt.x = SHORT1FROMMP(mp1);
pt.y = SHORT2FROMMP(mp1);
bp = button_current;
if (bp != (struct button *)NULL) {
hps = WinGetPS(hwnd);
shade_button(hps, bp, FALSE);
WinReleasePS(hps);
if (WinPtInRect(hab, &(bp->rect), &pt)) {
WinPostMsg(hwnd_bmp, WM_COMMAND, MPFROMSHORT(bp->id), MPFROMLONG(0));
}
}
WinSetCapture(HWND_DESKTOP, NULLHANDLE);
WinInvalidateRect(hwnd_status, NULL, FALSE);
WinUpdateWindow(hwnd_status);
button_info = NULL;
button_current = NULL;
button_down = FALSE;
break;
case WM_MOUSEMOVE:
pt.x = SHORT1FROMMP(mp1);
pt.y = SHORT2FROMMP(mp1);
bp = button_current;
if (bp != (struct button *)NULL) {
if (button_down && !WinPtInRect(hab, &(bp->rect), &pt)) {
button_down = FALSE;
hps = WinGetPS(hwnd);
shade_button(hps, bp, FALSE);
WinReleasePS(hps);
}
else if (!button_down && WinPtInRect(hab, &(bp->rect), &pt)) {
button_down = TRUE;
hps = WinGetPS(hwnd);
shade_button(hps, bp, TRUE);
WinReleasePS(hps);
}
}
else {
/* track cursor and display button function */
char buf[64];
/* find button */
for (bp = buttonhead; bp != (struct button *)NULL; bp = bp->next) {
if (WinPtInRect(hab, &(bp->rect), &pt)) {
break;
}
}
if (bp != button_info) {
button_info = bp;
if (bp != (struct button *)NULL) {
if (WinQueryCapture(HWND_DESKTOP) != hwnd)
WinSetCapture(HWND_DESKTOP, hwnd); /* track all mouse movements */
/* erase page area of status bar */
hps = WinGetPS(hwnd_status);
rect.xLeft = info_file.x;
rect.xRight = statusbar.x - 1;
rect.yBottom = info_coord.yBottom;
rect.yTop = info_coord.yTop;
WinFillRect(hps, &rect, SYSCLR_BUTTONMIDDLE);
load_string(bp->id, buf, sizeof(buf));
GpiCharStringAt(hps, &info_file, strlen(buf), (PBYTE)buf);
WinReleasePS(hps);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -