현재 커서에서 처음 나오는 각주번호까지를 범위지정하고 싶은데, 어떻게 해야 할지요?

안녕하세요.

여러 전문가 선생님들의 도움을 받아 하나하나 알아가게 되어
너무 행복합니다.

오늘은 각주 관련해서 여쭙고자 합니다.

제가 구현하고 싶은 것은
현재 커서에서 처음 나오는 각주(각주 번호가 아니라 각주입니다.) 이전까지를 범위 지정하는 것입니다.

도움을 부탁드립니다.

안녕하세요.
한글 매크로 코드입니다.

function OnScriptMacro_script3()
{
	var sSet;
	var eSet;

	//현재 캐럿 위치
	sSet = GetPosBySet();
	sList = sSet.Item("List"); //불필요한 변수일 수 있음.
	sPara = sSet.Item("Para");
	sPos = sSet.Item("Pos");

	//각주로 이동
	HAction.GetDefault("Goto", HParameterSet.HGotoE.HSet);
	with (HParameterSet.HGotoE)
	{
		HSet.SetItem("DialogResult", 3);
		SetSelectionIndex = 5;
	}
	HAction.Execute("Goto", HParameterSet.HGotoE.HSet);

	//각주의 위치
	eSet = GetPosBySet();
	eList = eSet.Item("List"); //불필요한 변수일 수 있음.
	ePara = eSet.Item("Para");
	ePos = eSet.Item("Pos");

	//처음 캐럿 위치 ~ 각주 전까지 선택
	SelectText(sPara, sPos, ePara, ePos);
}

Animation

1개의 좋아요

앗. 감사합니다.

그런데 저는 c#으로 작성 중인데, 번거로우시겠지만, 혹시 부탁드려도 될까요?

windows forms 앱 인가요?
c# 코드입니다. 아래 코드 활용하셔서 코딩해 보세요.

dynamic? myHwp;
Type? hType;

hType = Type.GetTypeFromProgID("HWPFrame.HwpObject.2");
myHwp = Activator.CreateInstance(hType);
myHwp!.RegisterModule("FilePathCheckDLL", "SecurityHwpAutomation");
myHwp.XHwpWindows.Item(0).Visible = true;

myHwp.Open(@"한글파일 경로", null, null);

//찾아가기용 변수
dynamic myActGoTo = myHwp.HAction;
dynamic myGoToE = myHwp.HParameterSet.HGotoE;
dynamic myGoToEHSet = myGoToE.HSet;

//찾아가기 초기화
myActGoTo.GetDefault("Goto", myGoToEHSet);
myGoToEHSet.SetItem("DialogResult", 3); /* 3: 각주 */
myGoToE.SetSelectionIndex = 5;

dynamic sSet, eSet;
int sPara, sPos, ePara, ePos;

//현재 캐럿 위치 정보
sSet = myHwp.GetPosBySet();
sPara = Convert.ToInt32(sSet.Item("Para"));
sPos = Convert.ToInt32(sSet.Item("Pos"));

//각주로 가기
myActGoTo.Execute("Goto", myGoToEHSet); 

//각주 위치 정보
eSet = myHwp.GetPosBySet();
ePara = Convert.ToInt32(eSet.Item("Para"));
ePos = Convert.ToInt32(eSet.Item("Pos"));

//처음 캐럿 위치 ~ 각주 전까지 선택
myHwp.SelectText(sPara, sPos, ePara, ePos);

그리고 한글 매크로 코드는 항상 기본입니다.
매크로 코드를 바탕으로
원하는 언어로 변환하는 연습을 많이 하시면 좋을 것 같습니다.

1개의 좋아요

와, 성공했습니다.
알려주셔서 정말 고맙습니다.
조언해 주신 대로 매크로 연습도 많이 하겠습니다.
더위에 늘 건강하세요.^^

선생님,
문단 단위로 범위를 지정해서 복사해서 처리하고 다시 붙여넣는 코드를 짜서 쓰고 있습니다.
보이지 않는 리치텍스트박스를 이용해서 하고 있습니다.
문제는 각주가 포함되어 있을 때인데, 각주의 내용까지 텍스트로 처리가 되어 버려서요.

문단 내에 각주가 있으면 문단 처음에서 그 앞까지만 범위를 지정하고
각주가 없으면 그냥 문단 끝까지 범위를 지정하는 경우에는 어떻게 하면 좋을지요?

이전 댓글과 연계해서 보시기 바랍니다.

//문단의 아무 곳에 캐럿을 두고 실행

//찾아가기용 변수
dynamic myActGoTo = myHwp.HAction;
dynamic myGoToE = myHwp.HParameterSet.HGotoE;
dynamic myGoToEHSet = myGoToE.HSet;

//찾아가기 초기화
myActGoTo.GetDefault("Goto", myGoToEHSet);
myGoToEHSet.SetItem("DialogResult", 3); /* 3: 각주 */
myGoToE.SetSelectionIndex = 5;

dynamic sSet, eSet, cSet;
int sPara, sPos, ePara, ePos, cPara, cPos;

myHwp.MovePos(6, 0, 0); //현재 위치한 문단의 시작으로 이동
//문단 시작의 위치 정보
sSet = myHwp.GetPosBySet();
sPara = Convert.ToInt32(sSet.Item("Para"));
sPos = Convert.ToInt32(sSet.Item("Pos"));

myHwp.MovePos(7, 0, 0); //현재 위치한 문단의 끝으로 이동

//문단 끝의 위치 정보
eSet = myHwp.GetPosBySet();
ePara = Convert.ToInt32(eSet.Item("Para"));
ePos = Convert.ToInt32(eSet.Item("Pos"));

myHwp.SetMessageBoxMode(0x00020000);
myHwp.MovePos(6, 0, 0); //다시 문단 시작으로 와서...
if (myActGoTo.Execute("Goto", myGoToEHSet)) //각주가 있는 경우
{
	//각주로 가기 및 각주 위치 정보
	cSet = myHwp.GetPosBySet();
	cPara = Convert.ToInt32(cSet.Item("Para"));
	cPos = Convert.ToInt32(cSet.Item("Pos"));

	//동일한 문단이고, 각주의 "Pos"가 문단 끝의 "Pos"보다 작아야 함. (왜냐하면 해당 문단 이후에 각주가 있을 수 있기 때문에)
	if (ePara == cPara && cPos < ePos)
	{
		myHwp.SelectText(sPara, sPos, cPara, cPos);
	}
	else if (ePara != cPara) //각주로 갔을 때, 문단 번호가 다르면 해당 문단에 각주가 없는 것으로 판단.
	{
		myHwp.SelectText(sPara, sPos, ePara, ePos);
	}
}
else //각주가 없는 경우는 문단시작~문단끝을 선택
{
	myHwp.SelectText(sPara, sPos, ePara, ePos);
}
3개의 좋아요

저도 비슷한 방식이었는데, 이상하게 두 번째 버튼 이벤트에서는 버튼 이벤트가 안 먹히고 마지막 각주 번호에 커서가 가 있어서 계속 애를 먹었습니다. 신기하게도 선생님 코드를 참조해서 적용하니 바로 해결이 되네요. 정말 너무 감사합니다. 더위에 늘 건강하시길 빕니다.^^