您的位置:首页 > 其它

培训一:GDI绘图方法

2011-10-31 15:44 169 查看
http://blog.sina.com.cn/s/blog_493309600100cqft.html

培训一:GDI绘图方法

MFC程序,使用GDI绘图

//矢量图和位图的区别

//介绍DC、了解DC

//CBrush brush(RGB(255,0,0));

//CClientDC dc(this->GetParent()->GetParent());

//CWindowDC dc(this);

//dc.FillRect(CRect(0,0,500,500),&brush);

//基本图形的绘制

//线段

pDC->MoveTo(20,30);

pDC->LineTo(300,30);

//矩形

pDC->Rectangle(20,50,300,200);

//椭圆

pDC->Ellipse(20,50,300,200);

CPen pen, *pOldPen;

CBrush brush, *pOldBrush;

//1.使用画笔

pen.CreatePen(PS_SOLID,6,RGB(255,0,0));

pOldPen=pDC->SelectObject(&pen);

pDC->MoveTo(20,250);

pDC->LineTo(300,250);

pDC->SelectObject(pOldPen);

//2.使用画刷(填充)

//创建一个蓝色的画刷

brush.CreateSolidBrush(RGB(0,0,255));

pOldBrush=pDC->SelectObject(&brush);

pDC->Rectangle(20,300,300,400);

pDC->SelectObject(pOldBrush);

//创建一个蓝色的网格画刷

brush.DeleteObject();

brush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));

pOldBrush=pDC->SelectObject(&brush);

pDC->Rectangle(20,420,300,520);

pDC->SelectObject(pOldBrush);

//创建一个位图画刷

brush.DeleteObject();

CBitmap bitmap_brush;

bitmap_brush.LoadBitmap(IDB_BITMAP1);

brush.CreatePatternBrush(&bitmap_brush);

pOldBrush=pDC->SelectObject(&brush);

pDC->Rectangle(20,540,300,640);

pDC->SelectObject(pOldBrush);

//空画刷

brush.DeleteObject();

brush.CreateStockObject(NULL_BRUSH);

pDC->Rectangle(20,660,300,760);

pDC->SelectObject(pOldBrush);

//3.使用位图

//定义位图

CBitmap bitmap;

//保存位图信息;

BITMAP bmp;

//建立兼容设备

CDC dcCompatible;

dcCompatible.CreateCompatibleDC(pDC);

//从资源中装入位图

bitmap.LoadBitmap(IDB_BITMAP1);

//将位图选入设备

dcCompatible.SelectObject(&bitmap);

//获取位图信息

bitmap.GetBitmap(&bmp);

//拷贝

pDC->BitBlt(600,0,bmp.bmWidth,bmp.bmHeight,&dcCompatible,0,0,SRCCOPY);

//从文件中获取位图

HBITMAP hBitmap;

hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),

"res\\ball.bmp", //实际位图文件的路径

IMAGE_BITMAP,0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//从文件中装入位图

bitmap.Detach();

bitmap.Attach(hBitmap);

bitmap.GetBitmap(&bmp);

dcCompatible.SelectObject(&bitmap);

//绘制非透明位图(将dcCompatible上的内容拷贝到pDC中)

pDC->BitBlt(600,40,bmp.bmWidth,bmp.bmHeight,&dcCompatible,0,0,SRCCOPY);

pDC->StretchBlt(600,100,bmp.bmWidth*2,bmp.bmHeight*2,&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

//绘制透明位图(将dcCompatible上的内容拷贝到pDC中,同时去掉最后一个参数指定的颜色)

pDC->TransparentBlt(600,200,bmp.bmWidth,bmp.bmHeight,&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,RGB(255,0,0));

//4.输出文字

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkMode(TRANSPARENT);

CFont font;//当前字体

font.CreateFont(32,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,DEFAULT_PITCH | FF_SWISS,"宋体");

CFont *pOldFont=pDC->SelectObject(&font);

pDC->TextOut(50,320,"输出文字");

CSize cs;

cs=pDC->GetTextExtent("输出文字");

pDC->TextOut(50+cs.cx,320,"abcdefg");

pDC->SelectObject(pOldFont);

//复杂图形

int step=30;

int center_x=700;

int center_y=500;

float x,y;

x=center_x-300;

y=sin(x/600*6*3.14)*100;

pDC->MoveTo(x,center_y+y);

while (x<center_x+300)

{

y=sin(x/600*6*3.14)*100;

pDC->LineTo(x,center_y+y);

x+=step;

}

SDK 程序

#include <windows.h>

#include <stdio.h>

//声明窗口过程函数

LRESULT CALLBACK WinProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

);

//入口函数

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // command line

int nCmdShow // show state

)

{

//设计窗口类

WNDCLASS wndcls;

wndcls.cbClsExtra=0;

wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

wndcls.hInstance=hInstance;

wndcls.lpfnWndProc=WinProc;

wndcls.lpszClassName="win32";

wndcls.lpszMenuName=NULL;

wndcls.style=CS_HREDRAW | CS_VREDRAW;

//注册窗口类

RegisterClass(&wndcls);

//创建窗口

HWND hwnd;

hwnd=CreateWindow("win32","wind32程序",WS_OVERLAPPEDWINDOW,

0,0,600,400,NULL,NULL,hInstance,NULL);

//显示和更新窗口

ShowWindow(hwnd,SW_SHOWNORMAL);

UpdateWindow(hwnd);

//处理消息循环

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

//定义窗口过程函数

LRESULT CALLBACK WinProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

)

{

switch(uMsg)

{

case WM_CHAR:

char szChar[20];

sprintf(szChar,"char is %d",wParam);

MessageBox(hwnd,szChar,"win32",0);

break;

case WM_LBUTTONDOWN:

MessageBox(hwnd,"mouse clicked","win32",0);

HDC hdc;

hdc=GetDC(hwnd);

TextOut(hdc,0,50,"LbutonDown",strlen("LbutonDown"));

ReleaseDC(hwnd,hdc);

break;

case WM_PAINT:

HDC hDC;

PAINTSTRUCT ps;

hDC=BeginPaint(hwnd,&ps);

TextOut(hDC,0,0,"win32程序",strlen("win32程序"));

EndPaint(hwnd,&ps);

break;

case WM_CLOSE:

if(IDYES==MessageBox(hwnd,"是否真的结束?","win32程序",MB_YESNO))

{

DestroyWindow(hwnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: