⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sumatrapdf.cpp.svn-base

📁 SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多KB)
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
/* Copyright Krzysztof Kowalczyk 2006-2007   License: GPLv2 */#include "SumatraPDF.h"#include "file_util.h"#include "geom_util.h"#include "str_strsafe.h"#include "str_util.h"#include "strlist_util.h"#include "translations.h"#include "utf_util.h"#include "win_util.h"#include "tstr_util.h"#include "SumatraDialogs.h"#include "FileHistory.h"#include "AppPrefs.h"#include <assert.h>#include <stdio.h>#include <stdarg.h>#include <ctype.h>#include <direct.h> /* for _mkdir() */#include <shellapi.h>#include <shlobj.h>#include "WinUtil.hpp"#include <windowsx.h>#include <Wininet.h>#ifdef CRASHHANDLER#include "client\windows\handler\exception_handler.h"#endif#ifndef CURR_VERSION#define CURR_VERSION "0.9.3"#endif// #define SVN_PRE_RELEASE_VER 994#define _QUOTEME(x) #x#define QM(x) _QUOTEME(x)#ifdef SVN_PRE_RELEASE_VER#define UPDATE_CHECK_VER QM(SVN_PRE_RELEASE_VER)#else#define UPDATE_CHECK_VER CURR_VERSION#endif// this sucks but I don't know any other way#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")//#define FANCY_UI 1/* Define if you want to conserve memory by always freeing cached bitmaps   for pages not visible. Only enable for stress-testing the logic. On   desktop machine we usually have plenty memory *///#define CONSERVE_MEMORY 1/* Next action for the benchmark mode */#define MSG_BENCH_NEXT_ACTION WM_USER + 1#define ZOOM_IN_FACTOR      1.2#define ZOOM_OUT_FACTOR     1.0 / ZOOM_IN_FACTOR/* if TRUE, we're in debug mode where we show links as blue rectangle on   the screen. Makes debugging code related to links easier.   TODO: make a menu item in DEBUG build to turn it on/off. */#ifdef DEBUGstatic BOOL             gDebugShowLinks = TRUE;#elsestatic BOOL             gDebugShowLinks = FALSE;#endif/* default UI settings *///#define DEFAULT_ZOOM            ZOOM_FIT_WIDTH#define DEFAULT_ZOOM            ZOOM_FIT_PAGE#define DEFAULT_ROTATION        0//#define START_WITH_ABOUT        1/* define if want to use double-buffering for rendering the PDF. Takes more memory!. */#define DOUBLE_BUFFER 1#define DRAGQUERY_NUMFILES 0xFFFFFFFF#define MAX_LOADSTRING 100#define WM_CREATE_FAILED -1#define WM_CREATE_OK 0#define WM_NCPAINT_HANDLED 0#define WM_VSCROLL_HANDLED 0#define WM_HSCROLL_HANDLED 0#define ABOUT_WIN_DX 440#define ABOUT_WIN_DY 328#define WM_APP_REPAINT_DELAYED (WM_APP + 10)#define WM_APP_REPAINT_NOW     (WM_APP + 11)#define WM_APP_URL_DOWNLOADED  (WM_APP + 12)/* A caption is 4 white/blue 2 pixel line and a 3 pixel white line */#define CAPTION_DY 2*(2*4)+3#define COL_CAPTION_BLUE RGB(0,0x50,0xa0)#define COL_WHITE RGB(0xff,0xff,0xff)#define COL_BLACK RGB(0,0,0)#define COL_WINDOW_BG RGB(0xcc, 0xcc, 0xcc)#define COL_WINDOW_SHADOW RGB(0x40, 0x40, 0x40)#ifdef SVN_PRE_RELEASE_VER#define ABOUT_BG_COLOR          RGB(255,0,0)#else#define ABOUT_BG_COLOR          RGB(255,242,0)#endif#define FRAME_CLASS_NAME        _T("SUMATRA_PDF_FRAME")#define CANVAS_CLASS_NAME       _T("SUMATRA_PDF_CANVAS")#define ABOUT_CLASS_NAME        _T("SUMATRA_PDF_ABOUT")#define SPLITER_CLASS_NAME      _T("Spliter")#define FINDSTATUS_CLASS_NAME   _T("FindStatus")#define PDF_DOC_NAME            _T("Adobe PDF Document")#define ABOUT_WIN_TITLE         _TR("About SumatraPDF")#define PREFS_FILE_NAME         _T("sumatrapdfprefs.dat")#define APP_SUB_DIR             _T("SumatraPDF")#define APP_NAME_STR            "SumatraPDF"#define DEFAULT_INVERSE_SEARCH_COMMANDLINE _T("C:\\Program Files\\WinEdt Team\\WinEdt\\winedt.exe \"[Open(|%f|);SelPar(%l,8)]\"")/* Default size for the window, happens to be american A4 size (I think) */#define DEF_PAGE_DX 612#define DEF_PAGE_DY 792#define SPLITTER_DX  5#define REPAINT_TIMER_ID    1#define REPAINT_DELAY_IN_MS 400#define SMOOTHSCROLL_TIMER_ID       2#define SMOOTHSCROLL_DELAY_IN_MS    20#define SMOOTHSCROLL_SLOW_DOWN_FACTOR 10#define FIND_STATUS_WIDTH       200 // Default width for the find status window#define FIND_STATUS_MARGIN      8/* A special "pointer" vlaue indicating that we tried to render this bitmap   but couldn't (e.g. due to lack of memory) */#define BITMAP_CANNOT_RENDER (RenderedBitmap*)NULL#define WS_REBAR (WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | RBS_VARHEIGHT | \                  RBS_BANDBORDERS | CCS_NODIVIDER | CCS_NOPARENTALIGN)#define MAX_RECENT_FILES_IN_MENU 15static FileHistoryList *            gFileHistoryRoot = NULL;static HINSTANCE                    ghinst = NULL;TCHAR                               windowTitle[MAX_LOADSTRING];static WindowInfo*                  gWindowList;static HCURSOR                      gCursorArrow;static HCURSOR                      gCursorHand;static HCURSOR                      gCursorDrag;static HCURSOR                      gCursorIBeam;static HCURSOR                      gCursorScroll;static HBRUSH                       gBrushBg;static HBRUSH                       gBrushWhite;static HBRUSH                       gBrushShadow;static HBRUSH                       gBrushLinkDebug;static HPEN                         ghpenWhite;static HPEN                         ghpenBlue;static HBITMAP                      gBitmapCloseToc;//static AppVisualStyle               gVisualStyle = VS_WINDOWS;static WCHAR *                      gBenchFileName;static int                          gBenchPageNum = INVALID_PAGE_NO;#ifdef DOUBLE_BUFFERstatic bool                         gUseDoubleBuffer = true;#elsestatic bool                         gUseDoubleBuffer = false;#endif#define MAX_PAGE_REQUESTS 8static PageRenderRequest            gPageRenderRequests[MAX_PAGE_REQUESTS];static int                          gPageRenderRequestsCount = 0;static HANDLE                       gPageRenderThreadHandle;static HANDLE                       gPageRenderSem;static HANDLE                       gPageRenderClearQueue;static HANDLE                       gPageRenderQueueCleared;static PageRenderRequest *          gCurPageRenderReq;static int                          gReBarDy;static int                          gReBarDyFrame;static int                          gToolbarSpacer = -1;static HWND                         gHwndAbout;static bool                         gRestrictedUse = false;#ifdef BUILD_RM_VERSION    static bool                         gDeleteFileOnClose = false; // Delete the file which was passed into the program by command line.#endifSerializableGlobalPrefs             gGlobalPrefs = {    TRUE, // BOOL m_showToolbar    FALSE, // BOOL m_pdfAssociateDontAskAgain    TRUE, // BOOL m_pdfAssociateShouldAssociate#ifdef BUILD_RM_VERSION    FALSE, // BOOL m_enableAutoUpdate#else    TRUE,#endif    ABOUT_BG_COLOR, // int  m_bgColor    FALSE, // BOOL m_escToExit    NULL, // char *m_inverseSearchCmdLine    NULL, // char *m_versionToSkip    NULL, // char *m_lastUpdateTime#ifdef BUILD_RM_VERSION    DM_CONTINUOUS, // DisplayMode m_defaultDisplayMode#else    DM_SINGLE_PAGE,#endif    DEFAULT_ZOOM, // double m_defaultZoom    WIN_STATE_NORMAL, // int  m_windowState    DEFAULT_WIN_POS, // int  m_windowPosX    DEFAULT_WIN_POS, // int  m_windowPosY    DEFAULT_WIN_POS, // int  m_windowDx    DEFAULT_WIN_POS, // int  m_windowDy    DEFAULT_WIN_POS, // int  m_tmpWindowPosX    DEFAULT_WIN_POS, // int  m_tmpWindowPosY    DEFAULT_WIN_POS, // int  m_tmpWindowDx    DEFAULT_WIN_POS, // int  m_tmpWindowDy    0 // int  m_pdfsOpened};typedef struct ToolbarButtonInfo {    /* information provided at compile time */    int           bitmapResourceId;    int           cmdId;    const char *  toolTip;    int           flags;    /* information calculated at runtime */    int           index;} ToolbarButtonInfo;enum ToolbarButtonFlag {    TBF_RESTRICTED = 0x1 };#define IDB_SEPARATOR  -1#define IDB_SEPARATOR2 -2static ToolbarButtonInfo gToolbarButtons[] = {    { IDB_SILK_OPEN,     IDM_OPEN,              _TRN("Open"),           TBF_RESTRICTED, 0 },    { IDB_SEPARATOR,     IDB_SEPARATOR,         NULL,                   TBF_RESTRICTED, 0 },    { IDB_SILK_PREV,     IDM_GOTO_PREV_PAGE,    _TRN("Previous Page"),  0,              0 },    { IDB_SILK_NEXT,     IDM_GOTO_NEXT_PAGE,    _TRN("Next Page"),      0,              0 },    { IDB_SEPARATOR,     IDB_SEPARATOR,         NULL,                   0,              0 },    { IDB_SILK_ZOOM_OUT, IDT_VIEW_ZOOMOUT,      _TRN("Zoom Out"),       0,              0 },    { IDB_SILK_ZOOM_IN,  IDT_VIEW_ZOOMIN,		_TRN("Zoom In"),        0,              0 },    { IDB_SEPARATOR,     IDB_SEPARATOR,         NULL,                   0,              IDB_SEPARATOR },    { IDB_FIND_PREV,     IDM_FIND_PREV,         _TRN("Find Previous"),  0,              0 },    { IDB_FIND_NEXT,     IDM_FIND_NEXT,         _TRN("Find Next"),      0,              0 },    { IDB_FIND_MATCH,    IDM_FIND_MATCH,        _TRN("Match case"),     0,              0 },    { IDB_SEPARATOR,     IDB_SEPARATOR,         NULL,                   0,              IDB_SEPARATOR2 },};#define DEFAULT_LANGUAGE "en"#define TOOLBAR_BUTTONS_COUNT dimof(gToolbarButtons)static const char *g_currLangName;static void CreateToolbar(WindowInfo *win, HINSTANCE hInst);static void CreateTocBox(WindowInfo *win, HINSTANCE hInst);static void RebuildProgramMenus(void);static void UpdateToolbarFindText(WindowInfo *win);static void UpdateToolbarPageText(WindowInfo *win);static void UpdateToolbarToolText(void);static void OnMenuFindMatchCase(WindowInfo *win);static bool RefreshPdfDocument(const WCHAR *fileName, WindowInfo *win,     DisplayState *state, bool reuseExistingWindow, bool autorefresh,     bool showWin);static void WindowInfo_ShowMessage_Asynch(WindowInfo *win, const wchar_t *message, bool resize);void Find(HWND hwnd, WindowInfo *win, PdfSearchDirection direction = FIND_FORWARD);void WindowInfo_EnterFullscreen(WindowInfo *win);#define SEP_ITEM "-----"/* according to http://wiki.snap.com/index.php/User_talk:Snap, Serbian (latin) should    be sp-rs and Serbian (Cyrillic) should be sr-rs */#include "LangMenuDef.h"// based on http://msdn2.microsoft.com/en-us/library/ms776260.aspxstatic const char *g_lcidLangMap[] = {    "en", "0409", NULL, // English    "pl", "0415", NULL, // Polish    "fr", "080c", "0c0c", "040c", "140c", "180c", "100c", NULL, // French    "de", "0407", "0c07", "1407", "1007", "0807", NULL, // German    "tr", "041f", NULL, // Turkish    "by", "0423", NULL, // Belarusian    "ja", "0411", NULL, // Japanese    "hu", "040e", NULL, // Hungarian    "fa", "0429", NULL, // Persian    "dk", "0406", NULL, // Danish    "it", "0410", NULL, // Italian    "nl", "0813", "0413", NULL, // Dutch    "ta", "0449", NULL, // Tamil    "es", "0c0a", "040a", "500a", "280a", "3c0a", "180a", "080a", "2c0a", NULL, // Spanish    "hr", "101a", "041a", NULL, // Croatian    "ru", "0419", NULL, // Russian    "ar", "1401", "3c01", "0c01", "0801", "2c01", "3401", "3001", "1001", "1801", "2001", "4001", "0401", "2801", "1c01", "3801", "2401", NULL, // Arabic    "cn", NULL, // Chinese Simplified    "sv", "081d", "041d", NULL, // Swedish    "cz", "0405", NULL, // Czech    "gr", "0408", NULL, // Greek    "th", "041e", NULL, // Thai    "pt", "0816", NULL, // Portuguese (Portugal)    "br", "0416", NULL, // Portuguese (Brazillian)    "no", "0414", "0814", NULL, // Norwegian    "sk", "041b", NULL, // Slovak    "vn", "042a", NULL, // Vietnamese    "lt", NULL, NULL, // Lithuanian    "my", NULL, NULL, // Malaysian    "fi", NULL, NULL, // Finnish    "ca", NULL, NULL, // Catalan    "si", NULL, NULL, // Slovenian    "tw", NULL, NULL, // Chinese Traditional    "ml", NULL, NULL, // Malayalam    "he", NULL, NULL, // Hebrew    "sp-rs", NULL, NULL, // Serbian (Latin)    "id", NULL, NULL, // Indonesian    "mk", NULL, NULL, // Macedonian    "ro", NULL, NULL, // Romanian    "sr-rs", NULL, NULL, // Serbian (Cyrillic)    "kr", NULL, NULL, // Korean    "gl", NULL, NULL, // Galician    "bg", NULL, NULL, // Bulgarian    "uk", NULL, NULL, // Ukrainian    NULL};const char* CurrLangNameGet() {    if (!g_currLangName)        return DEFAULT_LANGUAGE;    return g_currLangName;}bool CurrLangNameSet(const char* langName) {    bool validLang = false;    for (int i=0; i < LANGS_COUNT; i++) {        if (str_eq(langName, g_langs[i]._langName)) {            validLang = true;            break;        }    }    if (!validLang)         return false;    free((void*)g_currLangName);    g_currLangName = str_dup(langName);    bool ok = Translations_SetCurrentLanguage(langName);    assert(ok);    return true;}static void CurrLangNameFree() {    free((void*)g_currLangName);    g_currLangName = NULL;}static const char *GetLangFromLcid(const char *lcid){    const char *lang;    const char *langLcid;    int i = 0;    for (;;) {        lang = g_lcidLangMap[i++];        if (NULL == lang)            return NULL;        for (;;) {            langLcid = g_lcidLangMap[i++];            if (NULL == langLcid)                break;            if (str_eq(lcid, langLcid))                return lang;        }    }    assert(0);    return NULL;}static void GuessLanguage(){    char langBuf[20];    int res = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE, langBuf, sizeof(langBuf));    assert(0 != res);    if (0 == res) return;    const char *lang = GetLangFromLcid((const char*)&langBuf[0]);    if (NULL != lang)        CurrLangNameSet(lang);}/* Convert FILETIME to a string.   Caller needs to free() the result. */char *FileTimeToStr(FILETIME* ft){    return mem_to_hexstr((unsigned char*)ft, sizeof(*ft));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -