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

📄 painter.c

📁 《嵌入式Linux应用开发详解》中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            cos_d = dx * 1.0 / r2;            cos_f = ftofix (cos_d);            ang2 = facos (cos_f);            if (dy > 0) {                ang2 = fsub (0, ang2);            }            Arc (hdc, sx, sy, r, ang1, ang2);             cur_pt = 0; oldx = -1;        }        else {            int x = pts [cur_pt - 1].x;            int y = pts [cur_pt - 1].y;            MoveTo (hdc, x - 2, y - 2);            LineTo (hdc, x + 2, y + 2);            MoveTo (hdc, x - 2, y + 2);            LineTo (hdc, x + 2, y - 2);        }        break;    case IDM_SPLINE:        if (cur_pt == 4) {            SplineTo (hdc, pts);            cur_pt = 0; oldx = -1;        }        else {            int x = pts [cur_pt - 1].x;            int y = pts [cur_pt - 1].y;            MoveTo (hdc, x - 2, y - 2);            LineTo (hdc, x + 2, y + 2);            MoveTo (hdc, x - 2, y + 2);            LineTo (hdc, x + 2, y - 2);        }        break;    case IDM_FILLED_RECT:        if (cur_pt == 2) {            int w = ABS (pts[1].x - pts[0].x) + 1;            int h = ABS (pts[1].y - pts[0].y) + 1;            FillBox (hdc, MIN (pts[0].x, pts[1].x),                          MIN (pts[0].y, pts[1].y), w, h);            cur_pt = 0; oldx = -1;        }        break;    case IDM_FILLED_ELLIPSE:        if (cur_pt == 2) {            int rx = ABS (pts[1].x - pts[0].x);            int ry = ABS (pts[1].y - pts[0].y);            if (rx == ry)                FillCircle (hdc, pts[0].x, pts[0].y, rx);            else                FillEllipse (hdc, pts[0].x, pts[0].y, rx, ry);            cur_pt = 0; oldx = -1;        }        break;    case IDM_FILLED_POLYGON:        { /* draw vertice */            int x = pts [cur_pt - 1].x;            int y = pts [cur_pt - 1].y;            MoveTo (hdc, x - 2, y - 2);            LineTo (hdc, x + 2, y + 2);            MoveTo (hdc, x - 2, y + 2);            LineTo (hdc, x + 2, y - 2);        }        break;    case IDM_FLOOD_FILL:        FloodFill (hdc, pts[0].x, pts[0].y);        cur_pt = 0;        break;        case IDM_XU_POLYLINE:           PolylineTo(hdc,point,6);        break; }}static void FinishObject (HDC hdc){    if (obj_type == IDM_FILLED_POLYGON) {        FillPolygon (hdc, pts, cur_pt);        cur_pt = 0; oldx = -1;    }}static void ObjectOnMouseMove (HDC hdc, int x, int y){    switch (obj_type) {    case IDM_LINE:        if (cur_pt > 0) {            if (oldx >= 0) {                MoveTo (hdc, pts[0].x, pts[0].y);                LineTo (hdc, oldx, oldy);            }            MoveTo (hdc, pts[0].x, pts[0].y);            LineTo (hdc, x, y);            oldx = x; oldy = y;        }        break;    case IDM_ELLIPSE:    case IDM_FILLED_ELLIPSE:        if (cur_pt > 0) {            int rx;            int ry;            if (oldx >= 0) {                rx = ABS (oldx - pts[0].x);                ry = ABS (oldy - pts[0].y);                Ellipse (hdc, pts[0].x, pts[0].y, rx, ry);            }            rx = ABS (x - pts[0].x);            ry = ABS (y - pts[0].y);            Ellipse (hdc, pts[0].x, pts[0].y, rx, ry);            oldx = x; oldy = y;        }        break;    case IDM_RECT:    case IDM_FILLED_RECT:        if (cur_pt > 0) {            if (oldx >= 0) {                Rectangle (hdc, pts[0].x, pts[0].y, oldx, oldy);            }            Rectangle (hdc, pts[0].x, pts[0].y, x, y);            oldx = x; oldy = y;        }        break;    case IDM_ARC:        break;    case IDM_SPLINE:        break;    case IDM_FILLED_POLYGON:        break;    case IDM_FLOOD_FILL:        break;    case IDM_XU_POLYLINE:        break;	    }}static int PainterWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    HDC hdc;    switch (message) {        case MSG_CREATE:            srand (time (NULL));            break;        case MSG_PAINT:            hdc = BeginPaint (hWnd);            TabbedTextOut (hdc, 0, 0,                                  "\nPlease click to start...");            EndPaint (hWnd, hdc);            break;        case MSG_ACTIVEMENU:            if (wParam == 2) {                CheckMenuRadioItem ((HMENU)lParam,                    IDM_LINE, IDM_XU_POLYLINE,                     obj_type, MF_BYCOMMAND);            }        break;                case MSG_LBUTTONDOWN:            if (cur_pt >= MAX_POINTS)                break;            pts [cur_pt].x = LOWORD (lParam);            pts [cur_pt].y = HIWORD (lParam);            cur_pt ++;            hdc = GetClientDC (hWnd);            SetPenColor (hdc,                 RGB2Pixel (hdc, rand()%256, rand()%256, rand()%256));            SetBrushColor (hdc,                 RGB2Pixel (hdc, rand()%256, rand()%256, rand()%256));            DrawObject (hdc);            ReleaseDC (hdc);        break;        case MSG_RBUTTONDOWN:            hdc = GetClientDC (hWnd);            srand (time (NULL));            SetPenColor (hdc,                 RGB2Pixel (hdc, rand()%256, rand()%256, rand()%256));            SetBrushColor (hdc,                 RGB2Pixel (hdc, rand()%256, rand()%256, rand()%256));            FinishObject (hdc);            ReleaseDC (hdc);        break;        case MSG_MOUSEMOVE:            hdc = GetClientDC (hWnd);            SetPenColor (hdc, PIXEL_lightwhite);            SetBrushColor (hdc, PIXEL_lightwhite);            SetRasterOperation (hdc, ROP_XOR);            ObjectOnMouseMove (hdc, LOWORD(lParam), HIWORD(lParam));            ReleaseDC (hdc);        break;        case MSG_COMMAND:        switch (wParam)         {            case IDM_NEW:            case IDM_OPEN:            case IDM_SAVE:            case IDM_SAVEAS:            case IDM_CLOSE:            break;            case IDM_COPY:            break;            case IDM_PASTE:            break;                        case IDM_EXIT:                SendMessage (hWnd, MSG_CLOSE, 0, 0L);            break;            case IDM_LINE ... IDM_XU_POLYLINE:                cur_pt = 0;                obj_type = wParam;                oldx = -1;            break;                        case IDM_ABOUT_THIS:                MessageBox (hWnd,                     "MiniGUI Painter\n"                    "Copyright (C) 2001 Yongming Wei (ymwei@minigui.org).\n",                    "About MiniGUI Painter",                    MB_OK | MB_ICONINFORMATION | MB_BASEDONPARENT);            break;                        case IDM_ABOUT:#ifdef _MISC_ABOUTDLG#ifdef _LITE_VERSION                OpenAboutDialog (hWnd);#else                OpenAboutDialog ();#endif#endif            break;        }        break;        case MSG_CLOSE:            DestroyMainWindow (hWnd);            PostQuitMessage (hWnd);        return 0;    }    return DefaultMainWinProc (hWnd, message, wParam, lParam);}static void InitCreateInfo (PMAINWINCREATE pCreateInfo){    pCreateInfo->dwStyle = WS_CAPTION | WS_VISIBLE;    pCreateInfo->dwExStyle = 0;    pCreateInfo->spCaption = "MiniGUI Painter";    pCreateInfo->hMenu = createmenu();    pCreateInfo->hCursor = GetSystemCursor (IDC_PENCIL);    pCreateInfo->hIcon = 0;    pCreateInfo->MainWindowProc = PainterWinProc;    pCreateInfo->lx = 0;    pCreateInfo->ty = 0;    pCreateInfo->rx = pCreateInfo->lx + DEFAULT_WIDTH;    pCreateInfo->by = pCreateInfo->ty + DEFAULT_HEIGHT;    pCreateInfo->iBkColor = PIXEL_lightwhite;     pCreateInfo->dwAddData = 0;    pCreateInfo->hHosting = HWND_DESKTOP;}int MiniGUIMain (int args, const char* arg[]){    MSG Msg;    MAINWINCREATE CreateInfo;    HWND hMainWnd;#ifdef _LITE_VERSION    int i;    const char* layer = NULL;    RECT max_rect = {0, 0, 0, 0};    for (i = 1; i < args; i++) {        if (strcmp (arg[i], "-layer") == 0) {            layer = arg[i + 1];            break;        }    }    GetLayerInfo (layer, &max_rect, NULL, NULL, NULL);    if (JoinLayer (layer, arg[0],                 max_rect.left, max_rect.top,                 max_rect.left + 1024,                 max_rect.top + 768) == INV_LAYER_HANDLE) {        printf ("JoinLayer: invalid layer handle.\n");        exit (1);    }#endif    InitCreateInfo (&CreateInfo);    hMainWnd = CreateMainWindow (&CreateInfo);    if (hMainWnd == HWND_INVALID)        return -1;    while (GetMessage (&Msg, hMainWnd)) {        TranslateMessage (&Msg);        DispatchMessage (&Msg);    }    MainWindowThreadCleanup (hMainWnd);    return 0;}#ifndef _LITE_VERSION#include <minigui/dti.c>#endif#endif /* _USE_NEWGAL */

⌨️ 快捷键说明

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