개발메모(형식에 매이지 않는 짤막한 개발 낙서)

투명한 Canvas를 이용할 때 이런 모드...

조회 수 3158 추천 수 0 2006.04.13 20:58:16
허창원 *.19.45.160



투명한 Canvas를 이용할 때 이런 모드...

지도 그림 위에 투명한 캔버스를 올리고, 직선과 사각형을 마우스로 그릴때 알아둔 캔버스의 Control Settings을 메모함



int CVICALLBACK CANVAS_Map (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_LEFT_CLICK:
            /* Enable the timer and move the Pen to the click location. */
            SetCtrlAttribute (panel, PANEL_TIMER_CanvasMain, ATTR_ENABLED, 1);
            GetRelativeMouseState (panel, PANEL_CANVAS_Map, &(watchfirejj_ini_setting.startPoint.x), &(watchfirejj_ini_setting.startPoint.y), 0, 0, 0);
            //CanvasSetPenPosition (panel, PANEL_CANVAS_Map, MakePoint (startPoint.x, startPoint.y));
            break;
    }
    return 0;
}

int CVICALLBACK TIMER_CanvasMainCB (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_TIMER_TICK:
            {
                // Canvas 내의 영역을 표시
                Proc_CanvasDrawRect(panelHandle, PANEL_CANVAS_Map, PANEL_TIMER_CanvasMain);
            }
            break;
    }
    return 0;
}

void Proc_CanvasDrawRect(int panel, int control_canvas, int control_timer)
// Canvas에 영역을 표시하는 프로시저(2006.2.22)
// INI 내의 변수를 이용합니다.
{
    /* Where is the mouse now? */
    GetRelativeMouseState (panel, control_canvas, &(watchfirejj_ini_setting.endPoint.x), &(watchfirejj_ini_setting.endPoint.y), &(watchfirejj_ini_setting.leftDown), 0, 0);

    /* If the left button is still down, draw a line from the current    */
    /* pen position to the current mouse location.  If not, then         */
    /* deactivate this timer.                                            */
    if (!watchfirejj_ini_setting.leftDown)
        SetCtrlAttribute (panel, control_timer, ATTR_ENABLED, 0);
    else
    {
        // 마지막 포인트가 변경되었다면, 사각형을 갱신합니다.
        if(watchfirejj_ini_setting.preEndPoint.x != watchfirejj_ini_setting.endPoint.x || watchfirejj_ini_setting.preEndPoint.y != watchfirejj_ini_setting.endPoint.y)
        {
            watchfirejj_ini_setting.rect.left = watchfirejj_ini_setting.startPoint.x;
            watchfirejj_ini_setting.rect.top = watchfirejj_ini_setting.startPoint.y;
            
            // 높이 계산
            watchfirejj_ini_setting.rect.height = watchfirejj_ini_setting.endPoint.y - watchfirejj_ini_setting.startPoint.y;
            if(watchfirejj_ini_setting.rect.height < 0)
            {
                watchfirejj_ini_setting.rect.height = watchfirejj_ini_setting.startPoint.y - watchfirejj_ini_setting.endPoint.y;
                watchfirejj_ini_setting.rect.top = watchfirejj_ini_setting.endPoint.y;
            }    
            // 너비 계산
            watchfirejj_ini_setting.rect.width = watchfirejj_ini_setting.endPoint.x - watchfirejj_ini_setting.startPoint.x;
            if(watchfirejj_ini_setting.rect.width < 0)
            {
                watchfirejj_ini_setting.rect.width = watchfirejj_ini_setting.startPoint.x - watchfirejj_ini_setting.endPoint.x;
                watchfirejj_ini_setting.rect.left = watchfirejj_ini_setting.endPoint.x;
            }    

            // 캔버스를 지우고 사각형을 새로 그림
            SetCtrlAttribute(panel, control_canvas, ATTR_VISIBLE, 0);
            CanvasClear (panel, control_canvas, VAL_ENTIRE_OBJECT);
            CanvasDrawRect (panel, control_canvas, watchfirejj_ini_setting.rect, VAL_DRAW_FRAME);

            if(watchfirejj_ini_setting.rect.width > 0 && watchfirejj_ini_setting.rect.height > 0)
            {
                static char Buffer[20];
                double val;
                
                // 지도표시 컨트롤의 너비, 높이
                watchfirejj_ini_setting.canvas_width = (watchfirejj_ini_setting.mode == 0) ? MAP_CANVAS_Width : MAPMag_CANVAS_Width;
                watchfirejj_ini_setting.canvas_height = (watchfirejj_ini_setting.mode == 0) ? MAP_CANVAS_Height : MAPMag_CANVAS_Height;
                
                // 지도상의 실제 너비, 높이
                watchfirejj_ini_setting.map_width = (watchfirejj_ini_setting.map == 0) ? MAP_JJ_Width : MAP_MJ_WA_Width;
                watchfirejj_ini_setting.map_height = (watchfirejj_ini_setting.map == 0) ? MAP_JJ_Height : MAP_MJ_WA_Height;
            
                // 실제 넓이 계산(통합모드의 진주전체 지도)
                watchfirejj_ini_setting.rectWidth = watchfirejj_ini_setting.rect.width * watchfirejj_ini_setting.map_width / (double)watchfirejj_ini_setting.canvas_width * 1.0e-3;     /// km으로 환산
                watchfirejj_ini_setting.rectHeight = watchfirejj_ini_setting.rect.height * watchfirejj_ini_setting.map_height / (double)watchfirejj_ini_setting.canvas_height * 1.0e-3; /// km으로 환산
                watchfirejj_ini_setting.rectArea = watchfirejj_ini_setting.rectWidth * watchfirejj_ini_setting.rectHeight;  /// km2으로 환산됨
                
                //sprintf(g_KDBuffer, "(%dx%d) (%.1gx%.1g [km]) %.2g [㎢]", watchfirejj_ini_setting.rect.width, watchfirejj_ini_setting.rect.height,
                //                                                  watchfirejj_ini_setting.rectWidth, watchfirejj_ini_setting.rectHeight,
                //                                                  watchfirejj_ini_setting.rectArea);
                sprintf(g_KDBuffer, "%.2f [㎢]", watchfirejj_ini_setting.rectArea);
                
                //KD_SetStringVal_AdjValUnit2(panelHandle, PANEL_strTemperature1, (double)kdjatmoshpere0602.temperature, "℃", 4, 0);
                
                //val = KD_Adj_val_unit(watchfirejj_ini_setting.rectArea, "㎡", Buffer, 0);
                //sprintf(g_KDBuffer, "%g %s", val, Buffer);
                
                CanvasDrawTextAtPoint (panel, control_canvas, g_KDBuffer, VAL_APP_META_FONT,
                                       MakePoint (watchfirejj_ini_setting.rect.left, watchfirejj_ini_setting.rect.top),
                                       VAL_UPPER_LEFT);
            }
            SetCtrlAttribute(panel, control_canvas, ATTR_VISIBLE, 1);
            
            // 다음에 위치를 비교하기 위해 preEndPoint에 값을 대피
            watchfirejj_ini_setting.preEndPoint = watchfirejj_ini_setting.endPoint;
        }
    }
}


2006.4.13
허창원
List of Articles
번호 제목 글쓴이 날짜 조회 수
93 그래프 커서의 위치를 읽어와서 스트링 컨트롤에 표시하는 예 허창원 2006-06-16 3064
92 폴더가 있는지 체크하고, 없다면, 생성하는 예 허창원 2006-06-01 3161
91 주어진 경로명이 디렉토리(폴더)인지 파일인지 구분하려면... 허창원 2006-06-01 3029
90 Panel이 항상 위에 오도록 file 허창원 2006-05-25 3146
89 KD_RadioGroup KDManip.dll의 라디오그룹 사용 과정 메모 허창원 2006-05-10 2843
88 [Link] Reading and Writing Image Files 허창원 2006-05-03 2819
87 그래프의 Scaling Mode와 Range를 지정 예 허창원 2006-05-02 5408
86 저장할 때 데이터 폴더를 검사하여 필요하면 만들어서 저장하는 예 허창원 2006-04-18 2977
» 투명한 Canvas를 이용할 때 이런 모드... file 허창원 2006-04-13 3158
84 그래프 커서를 이용하려면 그래프의 Control Mode가... 허창원 2006-03-30 4474
83 테이블의 셀 인덱스 구하는 예 허창원 2006-03-07 2827
82 Rect, Point 구조체 선언된 userint.h의 일부 내용 허창원 2006-02-22 3236
81 List box에서 Delete 키를 눌렀을 때, 해당 Item 지우는 예 허창원 2006-02-02 3026
80 클립보드에 문자열 복사하기/가져오기 허창원 2006-01-09 3294
79 구간을 Linear/Log scale로 등분하고자 할 때 허창원 2005-12-27 3353
78 Build Error 중 Inconsistent type declarations... 해결방법 허창원 2005-12-23 3022
77 CVI에서 이용하는 Complex 데이터형 허창원 2005-12-22 2970
76 그래프 컨트롤 더블클릭하면 확대된 그래프 화면 보이기 허창원 2005-12-22 3076
75 명령버튼을 누를 때와 뗄 때에 각각 적절한 처리하기 file 허창원 2005-12-06 3912
74 Noisy Sine Wave 데이터 만들기 허창원 2005-11-24 3297