Графика под Вин
Oct. 6th, 2014 06:58 pmзахотел я значит порисовать на Си. нашел исходник:
инклуд_виндовс_аш , жж не дает применять символы "больше" или "меньше"
#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;
}
и дело не в том, что он там делает (рисует), а в том, как оно вообще может компилироваться.
что нужно после include windows.h вставить #include "stdafx.h", я на 15 минуту догадался.
но потом оно (MS VC 6.0) мне выводит следующие ошибки, честно, вызывающие желание разбить тяжелым предметом монитор, хоть он разумеется и не причем.

первое сообщение выворачивает мне мозги наизнанку.
что, сволота, тебе еще нужно?я просто хочу песать на ЯВУ, можно?
..
хороший faq по теме http://www.viva64.com/ru/b/0265/
..
подумал, Си (под вин) уже лет 15 мне не дается, может ну его в пень?
гугл ("freebasic") -> http://freebasic.net/get -> качаем .zip
дальше, http://www.freebasic.net/wiki/wikka.php?wakka=TutHowToProgGame1
берем кодес
Screen 13,8,2,0 ' Sets the graphic mode
Circle (150, 90), 10, 15
Do Loop Until Inkey$ = "Q" Or Inkey$ = "q"
не зная ничего о параметрах командной строки компилятора, делаем "fbc.exe ololo.bas"
получаем ololo.exe!

и возникает простой вопрос: нахера все настолько усложнять, что написание подобной по классу программы становилось по сложности сопоставимо с написанием драйвера? Си не ЯВУ, это средний уровень, но все же.
хороший сайт по теме http://free-basic.ru
( http://free-basic.ru/tree_generator.html AWESOME особенно если sleep 1000 поставить перед loop в самом конце исходника)
инклуд_виндовс_аш , жж не дает применять символы "больше" или "меньше"
#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;
}
и дело не в том, что он там делает (рисует), а в том, как оно вообще может компилироваться.
что нужно после include windows.h вставить #include "stdafx.h", я на 15 минуту догадался.
но потом оно (MS VC 6.0) мне выводит следующие ошибки, честно, вызывающие желание разбить тяжелым предметом монитор, хоть он разумеется и не причем.

первое сообщение выворачивает мне мозги наизнанку.
что, сволота, тебе еще нужно?
..
хороший faq по теме http://www.viva64.com/ru/b/0265/
..
подумал, Си (под вин) уже лет 15 мне не дается, может ну его в пень?
гугл ("freebasic") -> http://freebasic.net/get -> качаем .zip
дальше, http://www.freebasic.net/wiki/wikka.php?wakka=TutHowToProgGame1
берем кодес
Screen 13,8,2,0 ' Sets the graphic mode
Circle (150, 90), 10, 15
Do Loop Until Inkey$ = "Q" Or Inkey$ = "q"
не зная ничего о параметрах командной строки компилятора, делаем "fbc.exe ololo.bas"
получаем ololo.exe!

и возникает простой вопрос: нахера все настолько усложнять, что написание подобной по классу программы становилось по сложности сопоставимо с написанием драйвера? Си не ЯВУ, это средний уровень, но все же.
хороший сайт по теме http://free-basic.ru
( http://free-basic.ru/tree_generator.html AWESOME особенно если sleep 1000 поставить перед loop в самом конце исходника)