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

📄 reitp.c

📁 文本编辑器
💻 C
📖 第 1 页 / 共 5 页
字号:
	if(predoc->preole->lpVtbl->GetObject(predoc->preole, REO_IOB_SELECTION,
											&reobj,
											REO_GETOBJ_POLESITE |
											REO_GETOBJ_POLEOBJ))
	{
		AssertSz(FALSE, "DoVerb without object");
	}

	SendMessage(predoc->hwndRE, EM_POSFROMCHAR, (WPARAM) &pt, reobj.cp);

	XformSizeInHimetricToPixels(NULL, &reobj.sizel, &reobj.sizel);
	rc.right = (INT) reobj.sizel.cx;
	rc.bottom = (INT) reobj.sizel.cy;
	OffsetRect(&rc, pt.x, pt.y);

	reobj.poleobj->lpVtbl->DoVerb(reobj.poleobj, ioleverb, NULL,
									reobj.polesite, 0, predoc->hwndRE, &rc);
	reobj.poleobj->lpVtbl->Release(reobj.poleobj);
	reobj.polesite->lpVtbl->Release(reobj.polesite);

}


#ifdef DEBUG

LOCAL VOID IgnoreLeftClick(REDOC *predoc)
{
	HMENU hmenu = GetMenu(hwndMain);
	UINT uiMenuFlags;
	DWORD dwMask;

	Assert(predoc->hwndRE);

	dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
	uiMenuFlags = GetMenuState(hmenu, IDM_IGNORELEFTCLICK, MF_BYCOMMAND);
	if(uiMenuFlags & MF_CHECKED)
		dwMask &= ~ENM_MOUSEEVENTS;
	else
		dwMask |= ENM_MOUSEEVENTS;
	uiMenuFlags ^= MF_CHECKED;
	CheckMenuItem(hmenu, IDM_IGNORELEFTCLICK, MF_BYCOMMAND |
		(uiMenuFlags & MF_CHECKED));
	SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
}


LOCAL VOID EatEs(REDOC *predoc)
{
	HMENU hmenu = GetMenu(hwndMain);
	UINT uiMenuFlags;
	DWORD dwMask;

	Assert(predoc->hwndRE);

	dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
	uiMenuFlags = GetMenuState(hmenu, IDM_EATES, MF_BYCOMMAND);
	if(uiMenuFlags & MF_CHECKED)
		dwMask &= ~ENM_KEYEVENTS;
	else
		dwMask |= ENM_KEYEVENTS;
	uiMenuFlags ^= MF_CHECKED;
	CheckMenuItem(hmenu, IDM_EATES, MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));
	SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
}


LOCAL VOID Bottomless(REDOC *predoc)
{
	HMENU hmenu = GetMenu(hwndMain);
	UINT uiMenuFlags;
	DWORD dwMask;

	Assert(predoc->hwndRE);

	dwMask = SendMessage(predoc->hwndRE, EM_GETEVENTMASK, 0, 0);
	uiMenuFlags = GetMenuState(hmenu, IDM_BOTTOMLESS, MF_BYCOMMAND);
	if(uiMenuFlags & MF_CHECKED)
		dwMask &= ~ENM_REQUESTRESIZE;
	else
		dwMask |= ENM_REQUESTRESIZE;
	uiMenuFlags ^= MF_CHECKED;
	CheckMenuItem(hmenu, IDM_BOTTOMLESS,
		MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));
	SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0, dwMask);
	if(dwMask & ENM_REQUESTRESIZE)
	{
		SendMessage(predoc->hwndRE, EM_REQUESTRESIZE, 0, 0);
	}
	else
	{
		RECT rc;

		GetClientRect(predoc->hwndParent, &rc);
		ResizeRedoc(predoc, rc);
	}
}

#endif	// DEBUG


LOCAL BOOL ToggleCheck(REDOC *predoc, UINT uiMenuid)
{
	HMENU hmenu = GetMenu(hwndMain);
	UINT uiMenuFlags;

	Assert(predoc->hwndRE);

	uiMenuFlags = GetMenuState(hmenu, uiMenuid, MF_BYCOMMAND);
	uiMenuFlags ^= MF_CHECKED;
	CheckMenuItem(hmenu, uiMenuid, MF_BYCOMMAND | (uiMenuFlags & MF_CHECKED));

	return !!(uiMenuFlags & MF_CHECKED);
}


LOCAL BOOL QueryCheck(REDOC *predoc, UINT uiMenuid)
{
	HMENU hmenu = GetMenu(hwndMain);
	UINT uiMenuFlags;

	Assert(predoc->hwndRE);
	if(!hmenu)
		return fFalse;

	uiMenuFlags = GetMenuState(hmenu, uiMenuid, MF_BYCOMMAND);

	return !!(uiMenuFlags & MF_CHECKED);
}


LOCAL LRESULT NewREDoc(REDOC *predoc, BOOL fPrompt, BOOL fUpdateUI)
{
	RECT rc;
	DWORD dwStyle;
	if(predoc->hwndRE)
	{
		PARAFORMAT pf = {0};

		pf.cbSize = sizeof(PARAFORMAT);

		if(fPrompt && CheckSave(predoc) < 0)
			return -1;
		predoc->szFile[0] = TEXT('\0');
		lstrcpy(predoc->szTitle, szUntitled);
		SetWindowText(predoc->hwndRE, TEXT(""));
		pf.wAlignment = PFA_LEFT;
		pf.cTabCount = 1;
		pf.rgxTabs[0] = lDefaultTab;
		pf.dwMask = PFM_STARTINDENT | PFM_RIGHTINDENT | PFM_OFFSET |
						PFM_ALIGNMENT | PFM_TABSTOPS | PFM_NUMBERING;
		SendMessage(predoc->hwndRE, EM_SETPARAFORMAT, 0, (LPARAM) &pf);
		SendMessage(predoc->hwndRE, EM_SETCHARFORMAT, 0,
						(LPARAM) (LPVOID) &cfDefault);
		goto done;
	}
	else
	{
		predoc->szFile[0] = TEXT('\0');
		lstrcpy(predoc->szTitle, szUntitled);
	}
	GetClientRect(predoc->hwndParent, &rc);
	InflateRect(&rc, dxRESize, dyRESize);

	// Create and display the format bar
	if(predoc->hwndFormatBar = HwndCreateFormatBar(predoc->hwndParent,
							FBR_FormatBar, NULL))
	{
		RECT rcFormatBar;

		ShowWindow(predoc->hwndFormatBar, SW_SHOW);
		GetClientRect(predoc->hwndFormatBar, &rcFormatBar);
		rc.top += rcFormatBar.bottom;
	}

#ifdef SUNKENRICHEDIT
	dwStyle = 
				ES_AUTOHSCROLL |
				ES_AUTOVSCROLL |
//				ES_DISABLENOSCROLL |
				ES_MULTILINE |
//				ES_NOHIDESEL |
				ES_SAVESEL |
				ES_SELECTIONBAR |
				ES_SUNKEN |
//				WS_BORDER |
				WS_CHILD |
				WS_CLIPCHILDREN |
				WS_HSCROLL |
				WS_VISIBLE |
				WS_VSCROLL |
				0;		// zero gets or'd with above
	predoc->hwndRE = CreateWindow(szClassRE, TEXT(""),
				dwStyle,
				rc.left, rc.top,
				rc.right - rc.left,	rc.bottom - rc.top, predoc->hwndParent,
				NULL, HinstFromHwnd(predoc->hwndParent), NULL);

#else	// SUNKENRICHEDIT
				ES_AUTOHSCROLL |
				ES_AUTOVSCROLL |
//				ES_DISABLENOSCROLL |
				ES_MULTILINE |
//				ES_NOHIDESEL |
				ES_SAVESEL |
				ES_SELECTIONBAR |
//				ES_SUNKEN |
//				WS_BORDER |
				WS_CHILD |
				WS_CLIPCHILDREN |
				WS_HSCROLL |
				WS_VISIBLE |
				WS_VSCROLL |
				0;		// zero gets or'd with above
	predoc->hwndRE = CreateWindow(szClassRE, TEXT(""),
				dwStyle,
				rc.left, rc.top,
				rc.right - rc.left,	rc.bottom - rc.top, predoc->hwndParent,
				NULL, HinstFromHwnd(predoc->hwndParent), NULL);
#endif	// SUNKENRICHEDIT, else
	if(!predoc->hwndRE)
	{
		MessageBoxA(hwndMain, "Unable to create a new document", NULL, MB_ICONSTOP | MB_OK);
		return -1;
	}
	if(cchTextMost)
		SendMessage(predoc->hwndRE, EM_EXLIMITTEXT, 0, cchTextMost);
#ifndef NO_OLE
	DragAcceptFiles(predoc->hwndRE, TRUE);
#endif	// !NO_OLE


	// request EN_SELCHANGE, EN_CHANGE, EN_PROTECTED, and EN_DROPFILES
	SendMessage(predoc->hwndRE, EM_SETEVENTMASK, 0,
		ENM_SELCHANGE | ENM_CHANGE | ENM_PROTECTED | EN_DROPFILES |
		ENM_CORRECTTEXT);

	SetFocus(predoc->hwndRE);

	predoc->scf = SCF_SELECTION;
	if(GetMenu(hwndMain) && QueryCheck(predoc, IDM_APPLYTOWORD))
		predoc->scf |= SCF_WORD;

#ifndef NO_OLE
	if(!SendMessage(predoc->hwndRE, EM_GETOLEINTERFACE, 0, (LPARAM) &predoc->preole))
	{
		MessageBoxA(hwndMain, "No OLE interface!", NULL, MB_OK);
		DestroyWindow(predoc->hwndRE);
		predoc->hwndRE = 0;
		return -1;
	}

	if(!(predoc->pstg = OleStdCreateRootStorage(NULL, STGM_SHARE_EXCLUSIVE)))
	{
		MessageBoxA(hwndMain, "No Storage!", NULL, MB_OK);
		DestroyWindow(predoc->hwndRE);
		predoc->hwndRE = 0;
		return -1;
	}

	if(!(predoc->pitpcall = ITPCALL_New(predoc)))
	{
		MessageBoxA(hwndMain, "No callback object!", NULL, MB_OK);
		DestroyWindow(predoc->hwndRE);
		predoc->hwndRE = 0;
		return -1;
	}
	SendMessage(predoc->hwndRE, EM_SETOLECALLBACK, 0, (LPARAM) predoc->pitpcall);
#endif	// !NO_OLE

done:
	if(fUpdateUI)
	{
		TCHAR szT[64];

		wsprintf(szT, szFmtTitle, predoc->szTitle);
		SetWindowText(predoc->hwndParent, szT);
		SetMenu(hwndMain, hmenuFull);
		DrawMenuBar(hwndMain);
	}

	predoc->fReadOnly = fFalse;
	EnableWindow(predoc->hwndFormatBar, TRUE);

	// illegal values to force SetWordWrap() to do something
	predoc->fWrap = fFalse;
	predoc->fWysiwyg = fTrue;
	SetWordWrap(predoc, fWysiwygDefault, fWrapDefault);
	// if we don't have a default font, use the windows variable width font
	// otherwise, use the default font
	if(cfDefault.dwMask == 0)
	{
		SendMessage(predoc->hwndRE, WM_SETFONT,
						(WPARAM) GetStockObject(ANSI_VAR_FONT), 0);
		SendMessage(predoc->hwndRE, EM_GETCHARFORMAT, FALSE,
						(LPARAM) (LPVOID) &cfDefault);
	}
	else
	{
		SendMessage(predoc->hwndRE, EM_SETCHARFORMAT, 0,
						(LPARAM) (LPVOID) &cfDefault);
	}
	SendMessage(predoc->hwndRE, EM_SETMODIFY, (WPARAM) fFalse, 0);
	SendMessage(predoc->hwndRE, EM_SETREADONLY, (WPARAM) fFalse, 0);
	UpdateFormatBar(predoc);

	return 0;
}


LOCAL LONG CheckSave(REDOC *predoc)
{
	int iMbid;
	TCHAR szT[128];

#ifdef NO_SAVE_PROMPT
	return 0;
#endif	// NO_SAVE_PROMPT

	if(!SendMessage(predoc->hwndRE, EM_GETMODIFY, 0, 0))
		return 0;

	wsprintf(szT, TEXT("Save changes to %s?"), predoc->szTitle);
	iMbid = MessageBox(hwndMain, szT, szAppName, MB_APPLMODAL |
			MB_ICONQUESTION | MB_YESNOCANCEL);
	switch(iMbid)
	{
	case IDYES:
		if(SaveREDoc(predoc) < 0)
			return -1;
		break;

	case IDCANCEL:
		return -1;
	}
	return 0;
}


// returns 0 if no changes have been made
// returns > 0 if revert should continue
// returns < 0 if revert should be aborted
LOCAL INT CheckRevert(REDOC *predoc)
{
	int iMbid;
	TCHAR szT[128];

	if(!SendMessage(predoc->hwndRE, EM_GETMODIFY, 0, 0))
		return 0;

#ifdef NO_SAVE_PROMPT
	return 1;
#endif	// NO_SAVE_PROMPT

	wsprintf(szT, TEXT("Revert %s to last saved changes?"), predoc->szTitle);
	iMbid = MessageBox(hwndMain, szT, szAppName, MB_APPLMODAL |
			MB_ICONQUESTION | MB_YESNO);

	return iMbid == IDYES ? 1 : -1;
}


LOCAL LRESULT CloseREDoc(REDOC *predoc, BOOL fPrompt, BOOL fUpdateUI)
{
	if(fPrompt && CheckSave(predoc) < 0)
		return -1;

	if(predoc->hdcTarget)
	{
		DeleteDC(predoc->hdcTarget);
		predoc->hdcTarget = 0;
	}
#ifndef NO_OLE
	// Deactivate any existing in place object
	//$ FUTURE: This might be some generic I'm gonna close you call
	predoc->preole->lpVtbl->InPlaceDeactivate(predoc->preole);
	ITPCALL_Release((LPUNKNOWN) predoc->pitpcall);
	predoc->pitpcall = NULL;
	predoc->pstg->lpVtbl->Release(predoc->pstg);
	predoc->pstg = NULL;
	predoc->preole->lpVtbl->Release(predoc->preole);
	predoc->preole = NULL;
	predoc->cItem = 0;
#endif	// !NO_OLE
	DestroyWindow(predoc->hwndRE);
	DestroyWindow(predoc->hwndFormatBar);

	predoc->hwndRE = 0;
	predoc->szFile[0] = TEXT('\0');
	lstrcpy(predoc->szTitle, szUntitled);
	predoc->dwFormat = SF_TEXT;
	predoc->fReadOnly = fFalse;
	EnableWindow(predoc->hwndFormatBar, TRUE);
#ifdef DEBUG
	CheckMenuItem(hmenuFull, IDM_IGNORELEFTCLICK, MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hmenuFull, IDM_EATES, MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hmenuFull, IDM_IGNOREDROPS, MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hmenuFull, IDM_BOTTOMLESS, MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hmenuFull, IDM_TEXTONLY, MF_BYCOMMAND | MF_UNCHECKED);

	if(hwndGT)
	{
		DestroyWindow(hwndGT);
		hwndGT = 0;
	}
#endif	// DEBUG

	if(fUpdateUI)
	{
		SetWindowText(predoc->hwndParent, szClosedName);
		SetMenu(hwndMain, hmenuLoaded);
		DrawMenuBar(hwndMain);
	}

	return 1;
}


DWORD CALLBACK MyRead(DWORD dwCookie, LPBYTE pbBuffer, LONG cb, LONG *pcb)
{
	HFILE	hf = (HFILE) dwCookie;

	if(hf == HFILE_ERROR)
		return (DWORD) E_FAIL;
	*pcb = _lread(hf, pbBuffer, cb);
	return (DWORD) (*pcb >= 0 ? NOERROR : (*pcb = 0, E_FAIL));
}


// This function gives the Mac version the ability to open and print
// files via Apple Events.
LRESULT DoOpen(predoc, szT, szTitle, fInsert)
REDOC *predoc;
LPSTR szT, szTitle;
BOOL fInsert;
{
	DWORD dwError;

	if((dwError = ReadREDoc(predoc, szT, szTitle, 0, fInsert)))
		goto err;
	wsprintf(szT, szFmtTitle, szTitle);
	SetWindowText(predoc->hwndParent, szT);

	EnableWindow(predoc->hwndFormatBar, !predoc->fReadOnly);
	SendMessage(predoc->hwndRE, EM_SETREADONLY, (WPARAM) predoc->fReadOnly, 0);
	SetMenu(hwndMain, hmenuFull);

	SetupWordWrapMenu(predoc);
	DrawMenuBar(hwndMain);
	return 0;

err:
	wsprintf(szT, TEXT("Error opening document. [%ld]"), dwError);
	MessageBox(hwndMain, szT, NULL, MB_OK);
	return -1;
}


LOCAL LRESULT OpenREDoc(REDOC *predoc, BOOL fInsert)
{
	DWORD dwError;
	OPENFILENAME ofn;
	TCHAR szTitle[64];
	TCHAR szT[256];

	if(predoc->hwndRE && !fInsert && CheckSave(predoc) < 0)
		return -1;

	if(fInsert && predoc->fReadOnly)
		return -1;

	ofn.lStructSize			= sizeof(ofn);
	ofn.hInstance			= 0;
	ofn.lpstrFilter			= szFilterLoad;
	ofn.lpstrCustomFilter	= NULL;
	ofn.nMaxCustFilter		= 0;
	ofn.nFilterIndex		= 0;
	ofn.lpstrFileTitle		= szTitle;
	ofn.nMaxFileTitle		= sizeof(szTitle);
	ofn.lpstrInitialDir		= NULL;
	ofn.lpstrTitle			= fInsert ? "Insert from File" : NULL;
	ofn.nFileOffset			= 0;
	ofn.nFileExtension		= 0;
	ofn.lpstrDefExt			= NULL;
	ofn.lCustData			= 0L;
	ofn.lpfnHook			= NULL;
	ofn.lpTemplateName		= NULL;
	ofn.hwndOwner			= hwndMain;
	ofn.lpstrFile			= szT;
	ofn.nMaxFile			= sizeof(szT);
	ofn.Flags				= OFN_FILEMUSTEXIST;

	szTitle[0] = TEXT('\0');
	szT[0] = TEXT('\0');

	// Query user for filename for input
    if(!GetOpenFileName(&ofn))
	{
		if((dwError = CommDlgExtendedError()) != 0)
		{
			wsprintf(szT, TEXT("Error opening document. [%ld]"), dwError);
			MessageBox(hwndMain, szT, NULL, MB_OK);
			return -1;
		}
		return 0;
	}
	predoc->fReadOnly = (ofn.Flags & OFN_READONLY) ? fTrue : fFalse;
	EnableWindow(predoc->hwndFormatBar, !predoc->fReadOnly);
	return(DoOpen(predoc, szT, szTitle, fInsert));	
}


LOCAL LRESULT RevertREDoc(REDOC *predoc)
{
	DWORD dwError;
	TCHAR szT[256];

⌨️ 快捷键说明

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