绘制椭圆函数
BOOL Ellipse( HDC hdc,
int x1, //椭圆外接矩形左上点x坐标
int y1, //椭圆外接矩形左上点y坐标
int x2, //椭圆外接矩形右下点x坐标
int y2 ); //椭圆外节矩形右下点y坐标
绘制圆角矩形
BOOL RoundRect( HDC hdc,
int x1, //外围矩形左上点x坐标
int y1, //外围矩形左上点y坐标
int x2, //外围矩形右下点x坐标
int y2, //外围矩形右下点y坐标
int A, //圆角上椭圆长,即2a
int B, //圆角上椭圆高,即2b
扇形 弓形
下面所谓的“起点”和“终点”我用图解说明:
图中(50,50)即是起点,用A表示;(300,300)即是终点,用B表示。A与矩形几何中心连接与椭圆相交得到A',B与几何中心连接与椭圆相交得到B‘,由于默认的图形绘制方向是逆时针,所以这个弓形是从A'开始绘制弧形到B',然后从B'绘制直线到A'。
图中扇形的绘制也是同样的方式实现的。
可以为WM_MOUCEMOVE消息实现响应函数,通过光标所在位置将坐标显示在窗体中以便观察坐标点。这个消息函数的实现,我放在本文最后部分。
BOOL Pie( HDC hdc
int x1, //外围矩形左上点x坐标
int y1, //外围矩形左上点y坐标
int x2, //外围矩形右下点x坐标
int y2, //外围矩形右下点y坐标
int x3, //起点x坐标
int y3, //起点y坐标
int x4, //终点x坐标
int y4 );//终点y坐标
BOOL Chord( HDC hdc
int x1, //外围矩形左上点x坐标
int y1, //外围矩形左上点y坐标
int x2, //外围矩形右下点x坐标
int y2, //外围矩形右下点y坐标
int x3, //弦起点x坐标(逻辑单位),截取椭圆的直线端点x坐标
int y3, //弦起点x坐标(逻辑单位),截取椭圆的直线端点y坐标
int x4, //弦终点X逻辑坐标,截取椭圆直线的端点X坐标
int y4 );//弦终点Y逻辑坐标,截取椭圆直线的端点Y坐标
//补充关于设置和获取画弧的方向问题
环境默认的圆弧绘制方向是:逆时针。
int GetArcDirection(__in HDC hdc);
参数:hdc指定绘图设备的句柄
返回值:如果出错返回0,否则返回hdc关联的当前指定的圆弧方向。
AD_COUNTERCLOCKWISE 弧与矩形按逆时针方向绘制。
AD_CLOCKWISE 弧与矩形按顺时针方向绘制。
int SetArcDirection(__in HDC hdc,__in int ArcDirection);
参数: ArcDirection 指定新的弧方向,为下列值之一:
AD_COUNTERCLOCKWISE 图形按逆时针方向绘制。
AD_CLOCKWISE 图形按顺时针方向绘制。
hdc指定绘图设备的句柄
返回值:如果成功,返回ArcDirection中的值,否则返回0。
实例运用:
#include <windows.h>
HINSTANCE hInst;
HPEN hPen;
HBRUSH hBru[4];
int sBru[4]={HS_VERTICAL, HS_HORIZONTAL,HS_CROSS,HS_DIAGCROSS};
void MyPaint( HDC hdc)
{
SelectObject(hdc,hPen);
SelectObject(hdc,hBru[0]);
Ellipse(hdc,20,20,270,150);
TextOut(hdc,120,160,"椭圆形",strlen("椭圆形"));
SelectObject(hdc,hBru[1]);
RoundRect(hdc,300,20,550,150,30,30);
TextOut(hdc,400,160,"圆角矩形",strlen("圆角矩形"));
SelectObject(hdc,hBru[2]);
Pie(hdc,20,210,270,340,50,50,300,300);
TextOut(hdc,120,350,"扇形",strlen("扇形") );
SelectObject(hdc,hBru[3]);
Chord(hdc,300,210,550,340,50,50,300,300);
TextOut(hdc,400,350,"弓形",strlen("弓形") );
}
//我的消息过程处理函数
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
int i;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
for( i = 0; i <= 3; i++ )
{
DeleteObject(hBru[i]);
}
DeleteObject(hPen);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message,wParam,lParam);
}
return 0;
}
//初始化实例函数
BOOL InistInstance( HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc;
int i;
hInst = hInstance;
hWnd = CreateWindow("seek","封闭图形",WS_OVERLAPPEDWINDOW, 350,110,CW_USEDEFAULT,50,NULL,NULL,hInstance,NULL);
if ( !hWnd )
{
return FALSE;
}
//MoveWindow( hWnd,350,110,450,250,true);
ShowWindow( hWnd, nCmdShow);
UpdateWindow( hWnd);
hPen = CreatePen(PS_SOLID,3,RGB(255,0,0));
for( i = 0; i <= 3; i++ )
{
hBru[i] = CreateHatchBrush(sBru[i],RGB(0,0,255));
}
hdc = GetDC(hWnd);
MyPaint(hdc);
ReleaseDC(hWnd,hdc);
return TRUE;
}
//我的窗口注册函数
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1 );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "seek";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
//程序入口函数
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MSG msg;
MyRegisterClass(hInstance);
if ( !InistInstance(hInstance,nCmdShow))
{
return FALSE;
}
while ( GetMessage( &msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
运行效果:
实现WM_MOUCEMOVE消息响应函数:
添加: #include <cstdio> 头文件
void MyPaintCord(HDC hdc, LPARAM lParam )
{
int x,y;
char str[20] = "";
x = LOWORD(lParam); //取得鼠标x坐标
y = HIWORD(lParam); //取得鼠标y坐标
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,500,320,"鼠标坐标",strlen("鼠标坐标") );
//下面的sprintf函数将x或是y的值是左对齐输出并且没有占位符号,这个问题解决如下:
sprintf(str,"x坐标:%04d",x);
TextOut(hdc,520,340,str,strlen(str));
sprintf(str,"y坐标:%04d",y);
TextOut(hdc,520,360,str,strlen(str));
}
在WndProc函数中添加:
case WM_MOUSEMOVE:
hdc = GetDC(hWnd);
MyPaintCord(hdc,lParam);
ReleaseDC(hWnd,hdc);
break;
相关内容链接:VC++之图形设备接口之CDC类之画弧函数及相关结构