ewoke: (Default)
[personal profile] ewoke
захотел я значит порисовать на Си. нашел исходник:



инклуд_виндовс_аш , жж не дает применять символы "больше" или "меньше"

#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) мне выводит следующие ошибки, честно, вызывающие желание разбить тяжелым предметом монитор, хоть он разумеется и не причем.

123

первое сообщение выворачивает мне мозги наизнанку.
что, сволота, тебе еще нужно? я просто хочу песать на ЯВУ, можно?

..

хороший 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!

bas

и возникает простой вопрос: нахера все настолько усложнять, что написание подобной по классу программы становилось по сложности сопоставимо с написанием драйвера? Си не ЯВУ, это средний уровень, но все же.

хороший сайт по теме http://free-basic.ru
( http://free-basic.ru/tree_generator.html AWESOME особенно если sleep 1000 поставить перед loop в самом конце исходника)
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

ewoke: (Default)
ewoke

October 2025

S M T W T F S
   1234
5 67891011
121314 15161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2026 03:49 pm
Powered by Dreamwidth Studios