Нарисовать линию на форме с получением дескриптор этой формы- C++(Си)

#include <windows.h>
 
#define RED RGB(255,0,0)
#define GRN RGB(0,255,0)
#define BLU RGB(0,0,255)
 
#define BLK RGB(0,0,0)
#define WHT RGB(255,255,255)
 
HPEN  getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF);
BOOL  SetPoint(HDC hDC, HPEN hPen, COORD PNT);
BOOL  PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END);
BOOL  PlotRect(HDC hDC, HPEN hPen, COORD BGN, COORD END);
BOOL  PlotCirc(HDC hDC, HPEN hPen, COORD BGN, COORD END);
COORD setCordScale(COORD POS, RECT pRECT);
 
int main()
{
        HWND hWnd = GetForegroundWindow();
        HPEN    RPEN = getPen(PS_SOLID, 2, RED);
        HPEN    GPEN = getPen(PS_SOLID, 2, GRN);
        HPEN    BPEN = getPen(PS_SOLID, 2, BLU);
    HPEN    WPEN = getPen(PS_SOLID, 3, WHT);
        RECT    pRECT= {0};
    COORD   POS  = {0};
        COORD   BGN  = setCordScale(POS,pRECT);
    GetWindowRect(hWnd,&pRECT);
        HDC hDC = GetWindowDC(hWnd);
    if(hDC)
    {
                SetBkMode(hDC,TRANSPARENT);
        SetPoint (hDC, WPEN, BGN);
                POS.X = BGN.X + 50;
                POS.Y = BGN.Y + 100;
 
                PlotRect(hDC, BPEN, BGN, POS);
                PlotLine(hDC, RPEN, BGN, POS);
                SetPoint (hDC, WPEN, BGN);
 
                BGN = POS;
                POS.X = BGN.X + 100;
                POS.Y = BGN.Y + 100;
                PlotCirc(hDC, GPEN, BGN, POS);
        }
        system("pause");
        return 0;
}
 
HPEN getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF)
{
        return CreatePen(iPEN_STYLE, iPEN_SIZE, iCOLORREF);
}
 
BOOL SetPoint(HDC hDC, HPEN hPen, COORD PNT)
{
        EXTLOGPEN pINFO;
        GetObject(hPen,sizeof(EXTLOGPEN),&pINFO);
        SelectObject(hDC,hPen);
        return Ellipse
        (
                hDC,
                PNT.X - pINFO.elpWidth,
                PNT.Y + pINFO.elpWidth, 
                PNT.X + pINFO.elpWidth,
                PNT.Y - pINFO.elpWidth
        );
}
 
BOOL PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
        SelectObject(hDC,hPen);
        MoveToEx(hDC,BGN.X,BGN.Y,NULL);
        return LineTo(  hDC,END.X,END.Y);
}
 
BOOL PlotRect(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
        SelectObject(hDC,hPen);
        return Rectangle(hDC,BGN.X, BGN.Y, END.X, END.Y);
}
 
BOOL  PlotCirc(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
        SelectObject(hDC,hPen);
        return Ellipse(hDC,BGN.X, BGN.Y, END.X, END.Y);
}
 
COORD setCordScale(COORD POS, RECT pRECT)
{
        if(POS.X == 0)
                POS.X = 1;
        if(POS.Y == 0)
                POS.Y = 1;
 
        int nROWS = 25;
        int nCOLS = 80;
 
        double CX = (pRECT.right - pRECT.left)/nCOLS;
        double CY = (pRECT.bottom - pRECT.top)/nROWS;
 
        //При текстовом режиме(text mode) экран  делится  на  ячейки
    //(80  или 40 колонок в ширину и 25 строк в высоту)
        POS.X *= CX;
        POS.Y *= CY;
 
        int xBORDER = GetSystemMetrics(SM_CXBORDER);//Ширина границы окна
        int yBORDER = GetSystemMetrics(SM_CYMENU);  //Высота заголовка окна ~= высоте строк меню
        int xDRAG       = GetSystemMetrics(SM_CXDRAG);  //Число пикселей на гориз дрожение мыши
        int yDRAG       = GetSystemMetrics(SM_CYDRAG);  //Число пикселей на вертик дрожение мыши
 
        POS.X += xBORDER + xDRAG;//Ширина границы окна + число пикселей на дрожение мыши
        POS.Y += yBORDER + yDRAG;
        return POS;
}

Leave a Comment