//ls.h #ifndef __LS_H__ #define __LS_H__ #include <windows.h> #include <stack> #include <string> #include <math.h> #ifndef PI #define PI 3.1415926f #endif using namespace std; /******************************************************** * class knot用来存储画图的点的信息,画笔所在的位置及状态 * 即x,y坐标及方向。 *******************************************************/ class knot { public: double x; double y; double direction; knot(void); knot(POINT pt); }; /********************************************************** * iteration * 对所给的字符串s1,将其中的字符key用规则字符串rule替换 * n为指定的替换次数 * 当n赋值为1时只做一次替换,可以用来实现多规则的替换 **********************************************************/ void iteration(string &s1,char key,string &rule,int n); /********************************************************** * drawLS * 按照给定的LS语句s画图 * 其中len表示F所对应的长度,angle对应+/-所对应的角度,pt为初始点 * hdc为所要画图的DC环境 * 所能识别的文法包括Ff[]+- *********************************************************/ void drawLS(HDC &hdc,string &s,int len,double angle,POINT &pt); #endif //ls.cpp #include <ls.h> knot::knot(void) { x=0; y=0; direction=0; } knot::knot(POINT pt) { x=pt.x; y=pt.y; direction=0; } void iteration(string &s1,char key,string &rule,int n) { if(n==0) return; int len=s1.length(); string temp; for(int i=0; i<len; i++) { if(s1[i]==key) temp+=rule; else temp+=s1[i]; } s1=temp; iteration(s1,key,rule,n-1); } void drawLS(HDC &hdc,string &s,int len,double angle,POINT &pt) { knot pk(pt),nk; stack<knot> sk; MoveToEx(hdc,pk.x,pk.y,&pt); pk.direction=90; for(int i=0; i<s.length(); i++) { switch(s[i]) { case 'F': nk.x=pk.x+len*cos(pk.direction*PI/180); nk.y=pk.y-len*sin(pk.direction*PI/180); nk.direction=pk.direction; LineTo(hdc,nk.x,nk.y); pk=nk; break; case 'f': MoveToEx(hdc,pk.x,pk.y,&pt); break; case '[': sk.push(pk); break; case ']': pk=sk.top(); sk.pop(); MoveToEx(hdc,pk.x,pk.y,&pt); break; case '+': pk.direction=pk.direction+angle; break; case '-': pk.direction=pk.direction-angle; break; default: break; } } } 综合应用的demo /************************************************************* * Author : Haipeng * Date : 2010/5/1 * Description : LS-SYSTEM *************************************************************/ #include <windows.h> #include <string> #include <stack> #include <math.h> #define PI 3.1415926 #include <ls.h> using namespace std; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[] = "LS"; HINSTANCE hInst; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ hInst=hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = CreateSolidBrush(RGB(0,0,0)); /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "LS-SYSTEM", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 400, /* The programs width */ 400, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT pst; HDC hdc; string s="F"; string rule="F[-F][+F]F"; int len=10; double angle=35; int degree=5; POINT pt= {200,390}; HPEN redpen=CreatePen(PS_SOLID,1,RGB(255,0,0)); HPEN greenpen=CreatePen(PS_SOLID,1,RGB(0,255,0)); switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_PAINT: hdc=GetWindowDC(hwnd); SelectObject(hdc,greenpen); BeginPaint(hwnd,&pst); iteration(s,'F',rule,degree); drawLS(hdc,s,len,angle,pt); EndPaint(hwnd,&pst); break; case WM_SIZE: InvalidateRect(hwnd,NULL,TRUE); break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } 我将ls.cpp编译之后的ls.o用ar生成libhp.a这个是我私人的库。只要编译时-lhp就可以了。