#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;
}