때로는 테스트 데이터 도면 처리 프로그램을 신속하게 개발하기 위해 VB를 사용해야 합니다. 도면 컨트롤의 마우스 커서를 AutoCAD 소프트웨어에서 사용되는 큰 십자 커서 형태로 변경하면 일반 화살표 커서보다 더 나은 결과를 얻을 수 있습니다. 그렇다면 이렇게 큰 십자형 커서를 어떻게 구현합니까?
----먼저 달성하려는 효과를 명확히 합시다. Picture 컨트롤을 그리면 마우스가 이 컨트롤로 이동하면 마우스 커서가 즉시 큰 십자 모양으로 바뀌고 그림 컨트롤에 수평선이 나타납니다. 커서는 컨트롤의 왼쪽 경계에서 오른쪽 경계로 변경되고 수직선은 컨트롤의 위쪽 경계에서 아래쪽 경계로 이동합니다. 즉, 큰 십자형 커서가 그리기 컨트롤을 4개의 사분면으로 나눕니다. 마우스가 컨트롤 밖으로 이동하면 커서가 원래 형태로 돌아갑니다.
----이러한 커서를 구현하려면 선을 그려서 직접 구현해야 합니다. 마우스가 그리기 컨트롤에 있는 경우 마우스 위치가 이동할 때 먼저 마우스의 현재 위치에 커서의 가로 및 세로 선을 그립니다. 먼저 커서의 원래 가로 및 세로 선을 지운 다음 가로를 그립니다. 새 위치에 커서의 선과 수직선이 있으면 그리기 컨트롤의 MouseMove 이벤트에 응답해야 합니다. 물론 그리기 컨트롤에 어떤 내용이 있더라도 커서 선을 지우고 커서 선을 다시 그릴 때 원본 내용을 삭제할 수는 없습니다. 따라서 그리기 컨트롤의 DrawMode를 vbXorPen(XOR 모드)으로 설정해야 합니다. 커서의 수평선을 그립니다. 수직선을 추가할 때 XOR을 사용하여 수평선과 수직선을 결합합니다. 커서 색상과 원래 픽셀 색상의 XOR 값으로 픽셀 색상을 설정한 후 XOR 방식을 사용하여 동일한 위치에 수직선과 수평선을 그리고 다시 수평선과 수직선의 픽셀을 그립니다. 커서 색상을 사용한 XOR 연산은 커서의 수평선과 수직선을 지우고 그리기 컨트롤의 원래 내용을 복원합니다.
----또한 마우스가 그리기 컨트롤로 이동하면 일반 마우스 커서가 사라지고 크게 그려진 십자형 커서만 나타나는지 확인해야 합니다. 따라서 그리기 컨트롤의 MousePointer 속성도 vbCuntom으로 설정해야 합니다. 사용자가 정의합니다. 그리기 컨트롤의 MousePointer 속성을 vbCustom으로 설정한 후에는 해당 사용자 정의 그래픽을 MouseIcon 속성에 로드해야 합니다. 왜냐하면 그리기 컨트롤에는 우리가 그리는 커서만 있고 다른 커서는 없기를 바라기 때문입니다. 투명) 커서 그래픽. 커서 파일을 찾고, 리소스 편집기를 통해 편집하고, 전체 커서 그래픽을 투명도로 채우고, 필요에 따라 NoIcon.cur로 저장할 수 있습니다.
----위의 키 설정 및 조작을 통해 큰 십자 커서를 실현할 수 있습니다. 그리기에 XOR 방법을 사용하면 일반 그리기 소프트웨어에서 흔히 볼 수 있는 "고무줄" 효과를 얻을 수도 있습니다. 즉, 마우스를 사용하여 점을 정의한 후 동적으로 마우스를 끌어 다른 점을 정의합니다. 마우스를 드래그하면 그려지는 지점이 그에 따라 그래픽도 동적으로 변경됩니다.
---- 아래에서는 그리기 컨트롤에서 큰 십자 커서를 완벽하게 구현하는 예를 사용하고 "고무줄" 효과를 사용하여 직사각형을 그리는 방법도 보여줍니다.
----VB에서 새로운 표준 EXE 프로젝트를 생성하고, Form1에 Picture 컨트롤을 추가하고, 이름을 PicDraw로 설정합니다. PicDraw의 크기와 그 안의 이미지 크기는 기본적으로 대부분을 포함합니다. Form1이면 충분합니다. 구현 코드는 다음과 같습니다. 이 프로그램은 VB5.0에서 실행됩니다.
OptionExplicit
PRivateOld_XAsSingle
PrivateOld_YAsSingle
PrivateisMouseDownAsBoolean
PrivateBox_X0AsSingle
PrivateBox_Y0AsSingle
PrivateBox_X1AsSingle
PrivateBox_Y1AsSingle
개인펜색상긴
PrivateCrossColorAsLong
PrivateSubForm_Load()
CrossColor=QBColor(8)
펜색상=QBColor(15)
picDraw.DrawMode=vbXorPen
picDraw.MouseIcon=LoadPicture
(App.Path&"/no.cur")
picDraw.MousePointer=vbCustom
isMouseDown=거짓
Box_X0=상자_X1=상자_Y0=상자_Y1=0
EndSub
PrivateSubpicDraw_MouseDown
(ButtonAsInteger,
ShiftAsInteger,XAsSingle,YAsSingle)
IfisMouseDown=TrueThen
'점은 이전에 마우스로 정의되었습니다.
상자_X1=X
Box_Y1=Y
isMouseDown=거짓
picDraw.DrawMode=vbCopyPen
picDraw.Line(Box_X0,Box_Y0)-
(박스_X1,박스_Y1),
펜색상,B
picDraw.DrawMode=vbXorPen
'커서 그리기
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
크로스컬러
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
크로스컬러
이전_X=X
이전_Y=Y
또 다른
'직사각형의 첫 번째 꼭지점을 정의한 다음 커서를 지웁니다.
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
크로스컬러
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
크로스컬러
상자_X0=X
Box_Y0=Y
isMouseDown=참
종료
EndSub
PrivateSubpicDraw_MouseMove(ButtonAsInteger,
ShiftAsInteger,XAsSingle,YAsSingle)
IfisMouseDown=TrueThen
'마우스를 드래그하여 직사각형의 다른 꼭지점을 정의합니다.
이 시점에서 이전 직사각형을 지우고 새 직사각형을 그립니다.
picDraw.Line(Box_X0,Box_Y0)-(Old_X,Old_Y),
펜색상,B
picDraw.Line(Box_X0,Box_Y0)-(X,Y),PenColor,B
또 다른
'이전 커서 줄 지우기
picDraw.Line(0,Old_Y)-(picDraw.ScaleWidth,Old_Y),
크로스컬러
picDraw.Line(Old_X,0)-(Old_X,picDraw.ScaleHeight),
크로스컬러
'새 커서 선 그리기
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
크로스컬러
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
크로스컬러
종료
이전_X=X
Old_Y=Y
EndSub->