static void paint_ruler(HWND hWnd, LONG EditLeftmost, BOOL NewMetrics) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); HDC hdcPrint = make_dc(); RECT printRect = get_print_rect(hdcPrint); RECT drawRect; HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU)); GetClientRect(hWnd, &drawRect); FillRect(hdc, &drawRect, hBrush); drawRect.top += 3; drawRect.bottom -= 3; drawRect.left = EditLeftmost; drawRect.right = twips_to_pixels(printRect.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX)); FillRect(hdc, &drawRect, GetStockObject(WHITE_BRUSH)); drawRect.top--; drawRect.bottom++; DrawEdge(hdc, &drawRect, EDGE_SUNKEN, BF_RECT); drawRect.left = drawRect.right - 1; drawRect.right = twips_to_pixels(printRect.right + margins.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX)); DrawEdge(hdc, &drawRect, EDGE_ETCHED, BF_RECT); drawRect.left = 0; drawRect.top = 0; add_ruler_units(hdc, &drawRect, NewMetrics, EditLeftmost); SelectObject(hdc, GetStockObject(BLACK_BRUSH)); DeleteObject(hBrush); DeleteDC(hdcPrint); EndPaint(hWnd, &ps); }
static void draw_margin_lines(HDC hdc, int x, int y, float ratio) { HPEN hPen, oldPen; SIZE dpi; RECT page_margin = preview.rcPage; dpi.cx = GetDeviceCaps(hdc, LOGPIXELSX); dpi.cy = GetDeviceCaps(hdc, LOGPIXELSY); page_margin.left = preview.rcPage.left + margins.left; page_margin.top = preview.rcPage.top + margins.top; page_margin.bottom = preview.rcPage.bottom - margins.bottom; page_margin.right = preview.rcPage.right - margins.right; page_margin.left = (int)((float)twips_to_pixels(page_margin.left, dpi.cx) * ratio); page_margin.top = (int)((float)twips_to_pixels(page_margin.top, dpi.cy) * ratio); page_margin.bottom = (int)((float)twips_to_pixels(page_margin.bottom, dpi.cy) * ratio); page_margin.right = (int)((float)twips_to_pixels(page_margin.right, dpi.cx) * ratio); page_margin.left += x; page_margin.top += y; page_margin.bottom += y; page_margin.right += x; hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); oldPen = SelectObject(hdc, hPen); MoveToEx(hdc, x, page_margin.top, NULL); LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.top); MoveToEx(hdc, x, page_margin.bottom, NULL); LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.bottom); MoveToEx(hdc, page_margin.left, y, NULL); LineTo(hdc, page_margin.left, y + preview.bmScaledSize.cy); MoveToEx(hdc, page_margin.right, y, NULL); LineTo(hdc, page_margin.right, y + preview.bmScaledSize.cy); SelectObject(hdc, oldPen); DeleteObject(hPen); }
RTFStatus RTFReader::Paragraph(void) { // MW-2012-03-14: [[ RtfParaStyles ]] Build the paragraph style record up // to apply to the new paragraph. MCTextParagraph t_para; memset(&t_para, 0, sizeof(MCTextParagraph)); t_para . text_align = m_state . GetTextAlign(); t_para . border_width = twips_to_pixels(m_state . GetBorderWidth()); t_para . padding = twips_to_pixels(m_state . GetPadding()); t_para . first_indent = twips_to_pixels(m_state . GetFirstIndent()); t_para . left_indent = twips_to_pixels(m_state . GetLeftIndent()); t_para . right_indent = twips_to_pixels(m_state . GetRightIndent()); t_para . space_above = twips_to_pixels(m_state . GetSpaceAbove()); t_para . space_below = twips_to_pixels(m_state . GetSpaceBelow()); t_para . background_color = m_state . GetParagraphBackgroundColor(); t_para . border_color = m_state . GetBorderColor(); t_para . metadata = m_state . GetParagraphMetadata(); if (m_lists . Count() == 0 || m_state . GetListStyle() == kMCTextListStyleSkip) { t_para . list_style = m_state . GetListStyle(); t_para . list_depth = m_state . GetListLevel() + 1; } else if (m_state . GetListIndex() != 0) { int4 t_list_id; if (m_overrides . Get(m_state . GetListIndex(), t_list_id)) { uint32_t t_level; t_level = m_state . GetListLevel(); MCTextListStyle t_style; if (m_lists . Get(t_list_id, t_level + 1, t_style)) { t_para . list_style = t_style; t_para . list_depth = t_level + 1; } } } m_converter(m_converter_context, &t_para, NULL); return kRTFStatusSuccess; }
static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost) { static HDC hdc; if(NewMetrics) { static HBITMAP hBitmap; int i, x, y, RulerTextEnd; int CmPixels; int QuarterCmPixels; HFONT hFont; WCHAR FontName[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0}; if(hdc) { DeleteDC(hdc); DeleteObject(hBitmap); } hdc = CreateCompatibleDC(0); CmPixels = twips_to_pixels(centmm_to_twips(1000), GetDeviceCaps(hdc, LOGPIXELSX)); QuarterCmPixels = (int)((float)CmPixels / 4.0); hBitmap = CreateCompatibleBitmap(hdc, drawRect->right, drawRect->bottom); SelectObject(hdc, hBitmap); FillRect(hdc, drawRect, GetStockObject(WHITE_BRUSH)); hFont = CreateFontW(10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FontName); SelectObject(hdc, hFont); SetBkMode(hdc, TRANSPARENT); SetTextAlign(hdc, TA_CENTER); y = (int)(((float)drawRect->bottom - (float)drawRect->top) / 2.0) + 1; RulerTextEnd = drawRect->right - EditLeftmost + 1; for(i = 1, x = EditLeftmost; x < (drawRect->right - EditLeftmost + 1); i ++) { WCHAR str[3]; WCHAR format[] = {'%','d',0}; int x2 = x; x2 += QuarterCmPixels; if(x2 > RulerTextEnd) break; MoveToEx(hdc, x2, y, NULL); LineTo(hdc, x2, y+2); x2 += QuarterCmPixels; if(x2 > RulerTextEnd) break; MoveToEx(hdc, x2, y - 3, NULL); LineTo(hdc, x2, y + 3); x2 += QuarterCmPixels; if(x2 > RulerTextEnd) break; MoveToEx(hdc, x2, y, NULL); LineTo(hdc, x2, y+2); x += CmPixels; if(x > RulerTextEnd) break; wsprintfW(str, format, i); TextOutW(hdc, x, 5, str, lstrlenW(str)); } DeleteObject(hFont); } BitBlt(hdcRuler, 0, 0, drawRect->right, drawRect->bottom, hdc, 0, 0, SRCAND); }
LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { HWND hMainWnd = GetParent(hWnd); HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); FORMATRANGE fr; GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200}; HDC hdc = GetDC(hWnd); HDC hdcTarget = make_dc(); fr.rc = preview.rcPage = get_print_rect(hdcTarget); preview.rcPage.bottom += margins.bottom; preview.rcPage.right += margins.right; preview.rcPage.top = preview.rcPage.left = 0; fr.rcPage = preview.rcPage; preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); preview.textlength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); fr.hdc = CreateCompatibleDC(hdc); fr.hdcTarget = hdcTarget; fr.chrg.cpMin = 0; fr.chrg.cpMax = preview.textlength; DeleteDC(fr.hdc); DeleteDC(hdcTarget); ReleaseDC(hWnd, hdc); update_preview_sizes(hWnd, TRUE); update_preview(hMainWnd); break; } case WM_PAINT: return print_preview(hWnd); case WM_SIZE: { update_preview_sizes(hWnd, FALSE); InvalidateRect(hWnd, NULL, FALSE); break; } case WM_VSCROLL: case WM_HSCROLL: { SCROLLINFO si; RECT rc; int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ; int origPos; GetClientRect(hWnd, &rc); si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(hWnd, nBar, &si); origPos = si.nPos; switch(LOWORD(wParam)) { case SB_TOP: /* == SB_LEFT */ si.nPos = si.nMin; break; case SB_BOTTOM: /* == SB_RIGHT */ si.nPos = si.nMax; break; case SB_LINEUP: /* == SB_LINELEFT */ si.nPos -= si.nPage / 10; break; case SB_LINEDOWN: /* == SB_LINERIGHT */ si.nPos += si.nPage / 10; break; case SB_PAGEUP: /* == SB_PAGELEFT */ si.nPos -= si.nPage; break; case SB_PAGEDOWN: /* SB_PAGERIGHT */ si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS; SetScrollInfo(hWnd, nBar, &si, TRUE); GetScrollInfo(hWnd, nBar, &si); if (si.nPos != origPos) { int amount = origPos - si.nPos; if (msg == WM_VSCROLL) ScrollWindow(hWnd, 0, amount, NULL, NULL); else ScrollWindow(hWnd, amount, 0, NULL, NULL); } return 0; } case WM_SETCURSOR: { POINT pt; RECT rc; int bHittest = FALSE; DWORD messagePos = GetMessagePos(); pt.x = (short)LOWORD(messagePos); pt.y = (short)HIWORD(messagePos); ScreenToClient(hWnd, &pt); GetClientRect(hWnd, &rc); if (PtInRect(&rc, pt)) { pt.x += GetScrollPos(hWnd, SB_HORZ); pt.y += GetScrollPos(hWnd, SB_VERT); bHittest = preview_page_hittest(pt); } if (bHittest) SetCursor(LoadCursorW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDC_ZOOM))); else SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW)); return TRUE; } case WM_LBUTTONDOWN: { int page; POINT pt; pt.x = (short)LOWORD(lParam) + GetScrollPos(hWnd, SB_HORZ); pt.y = (short)HIWORD(lParam) + GetScrollPos(hWnd, SB_VERT); if ((page = preview_page_hittest(pt)) > 0) { HWND hMainWnd = GetParent(hWnd); /* Convert point from client coordinate to unzoomed page * coordinate. */ pt.x -= preview.spacing.cx; if (page > 1) pt.x -= preview.bmScaledSize.cx + preview.spacing.cx; pt.y -= preview.spacing.cy; pt.x /= preview.zoomratio; pt.y /= preview.zoomratio; if (preview.zoomlevel == 0) preview.saved_pages_shown = preview.pages_shown; preview.zoomlevel = (preview.zoomlevel + 1) % 3; preview.zoomratio = 0; if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) { toggle_num_pages(hMainWnd); } else if (preview.pages_shown > 1) { if (page >= 2) preview.page++; toggle_num_pages(hMainWnd); } else { update_preview_sizes(hWnd, TRUE); InvalidateRect(hWnd, NULL, FALSE); update_preview_buttons(hMainWnd); } if (preview.zoomlevel > 0) { SCROLLINFO si; /* Convert the coordinate back to client coordinate. */ pt.x *= preview.zoomratio; pt.y *= preview.zoomratio; pt.x += preview.spacing.cx; pt.y += preview.spacing.cy; /* Scroll to center view at that point on the page */ si.cbSize = sizeof(si); si.fMask = SIF_PAGE; GetScrollInfo(hWnd, SB_HORZ, &si); pt.x -= si.nPage / 2; SetScrollPos(hWnd, SB_HORZ, pt.x, TRUE); GetScrollInfo(hWnd, SB_VERT, &si); pt.y -= si.nPage / 2; SetScrollPos(hWnd, SB_VERT, pt.y, TRUE); } } } default: return DefWindowProcW(hWnd, msg, wParam, lParam); } return 0; }