twitter logo GDI绘制
bachue
posted @ 2010年9月27日 07:09
in Win32 C Programming
with tags
windows c Win32 logo twitter api
, 3563 阅读
这次的作业,用GDI绘制任意卡通图,我不会画什么卡通图,于是就画了个twitter的logo。
按1(MM_TEXT),7(MM_ISOTROPIC),8(MM_ANISOTROPIC)会有不同的GDI映射。缩放窗口可以看出他们的区别。
#include<Windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); VOID DrawTwitter(HDC&); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { static TCHAR szAppName[]=TEXT("GDIPaint"); HWND hwnd; MSG msg; WNDCLASS wndclass; HBRUSH hBkBrush=CreateSolidBrush(RGB(0,204,255)); wndclass.style=CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=hBkBrush; wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } hwnd=CreateWindow(szAppName,TEXT("The GDI Paint"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,1050,450, NULL,NULL,hInstance,NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } DeleteObject(hBkBrush); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static HDC hdc; static PAINTSTRUCT ps; static RECT rect; static HPEN hCyanPen,hWhitePen,hOldPen; static LOGPEN logpen; static INT iMode=8; switch(message) { case WM_PAINT: hdc=BeginPaint(hwnd,&ps); GetWindowRect(hwnd,&rect); SetMapMode(hdc, iMode); SetViewportExtEx(hdc,rect.right-rect.left,rect.bottom-rect.top,NULL); SetWindowExtEx(hdc,1050,450,NULL); logpen.lopnColor=RGB(255,255,255); logpen.lopnWidth.x=70; logpen.lopnWidth.y=70; hWhitePen=CreatePenIndirect(&logpen); logpen.lopnColor=RGB(0,204,255); logpen.lopnWidth.x=35; logpen.lopnWidth.y=35; hCyanPen=CreatePenIndirect(&logpen); SelectObject(hdc,hWhitePen); hOldPen=(HPEN)SelectObject(hdc,hWhitePen); DrawTwitter(hdc); Ellipse(hdc,105,195,145,235); Ellipse(hdc,175,150,215,245); Ellipse(hdc,275,150,315,245); Ellipse(hdc,375,150,415,245); Ellipse(hdc,560,200,580,220); Ellipse(hdc,660,200,680,220); SelectObject(hdc,hCyanPen); DrawTwitter(hdc); SelectObject(hdc,hOldPen); DeleteObject(hCyanPen); DeleteObject(hWhitePen); EndPaint(hwnd,&ps); return 0; case WM_KEYDOWN: iMode=wParam-0x30; InvalidateRect(hwnd,NULL,TRUE); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); } VOID DrawTwitter(HDC& hdc) { //"t" MoveToEx(hdc,50,100,NULL); LineTo(hdc,50,200); Arc(hdc,50,125,200,275,50,200,125,275); MoveToEx(hdc,125,275,NULL); LineTo(hdc,140,275); MoveToEx(hdc,50,150,NULL); LineTo(hdc,140,150); //"w" MoveToEx(hdc,190,150,NULL); LineTo(hdc,190,200); Arc(hdc,190,125,290,275,190,200,290,200); MoveToEx(hdc,290,150,NULL); LineTo(hdc,290,200); Arc(hdc,290,125,390,275,290,200,390,200); MoveToEx(hdc,390,150,NULL); LineTo(hdc,390,200); //"i" MoveToEx(hdc,440,170,NULL); LineTo(hdc,440,275); Ellipse(hdc,435,110,445,120); //"t" MoveToEx(hdc,490,100,NULL); LineTo(hdc,490,200); Arc(hdc,490,125,640,275,490,200,565,275); MoveToEx(hdc,490,175,NULL); LineTo(hdc,565,175); //"t" MoveToEx(hdc,605,100,NULL); LineTo(hdc,605,200); Arc(hdc,605,125,810,275,605,200,680,275); MoveToEx(hdc,605,175,NULL); LineTo(hdc,680,175); //"e" MoveToEx(hdc,730,210,NULL); LineTo(hdc,840,210); Arc(hdc,730,155,850,275,840,210,810,240); //"r" MoveToEx(hdc,890,210,NULL); LineTo(hdc,890,275); Arc(hdc,890,155,980,265,935,155,890,210); MoveToEx(hdc,935,155,NULL); LineTo(hdc,1000,155); }
2011年7月21日 03:25
你为什么偏偏要用 GDI 啊。。。Linux 下用不了啊,用 clutter, cairo 和 OpenGL 都可以啊,怨念。。。
2011年7月28日 15:16
@Mike Ma: 说了是作业,规定的。