您可以使用线和曲线函数绘制饼图。用于绘制饼图的主要功能是AngleArc功能,需要您提供饼图中心的坐标,饼图的半径,起始角度和扫掠角度。以下是用户可以用来输入这些值的对话框。
应用程序的资源脚本(.RC)文件中找到的对话框模板指定了上述对话框(其高度,其包含的控件及其样式)的特征,如下所示。
AngleArc DIALOG 6,18,160,100
STYLE WS_DLGFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
标题“饼图”
FONT 8,“MS Sans Serif”
BEGIN
EDITTEXT IDD_X, 18, 22, 25, 12, ES_AUTOHSCROLL
LTEXT "X", 102, 4, 24, 9, 8
EDITTEXT IDD_Y, 18, 39, 25, 12, ES_AUTOHSCROLL
LTEXT "Y", 104, 5, 42, 12, 8
LTEXT“中心”,105,19,11,23,8
EDITTEXT IDD_RADIUS, 103, 9, 32, 12, ES_AUTOHSCROLL
EDITTEXT IDD_STARTANGLE, 103, 31, 32, 12, ES_AUTOHSCROLL
EDITTEXT IDD_SWEEPANGLE, 103, 53, 32, 12, ES_AUTOHSCROLL
LTEXT“Radius”,109,73,11,25,8
LTEXT“起始角”,110,59,33,42,8
LTEXT“扫频”,111,55,55,43,8
PUSHBUTTON "OK", IDD_OK, 9, 82, 40, 14
PUSHBUTTON“取消”,IDD_CANCEL,110,82,40,14en
END
在应用程序的源文件中找到的对话框过程通过以下步骤检索数据(中心坐标,圆弧半径和起始和俯仰角):
应用程序定义的ClearBits函数将接收用户输入的数组初始化为零。
2.应用程序定义的GetStrLngth函数检索用户输入的字符串的长度。
3.应用程序定义的RetrieveInput函数检索用户输入的值。
以下示例代码显示对话框过程。
BOOL CALLBACK ArcDlgProc(HWND hdlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
CHAR chInput[4]; /* receives control-window input */
int cch; /* array-size and count variable */
开关(uMsg){
case WM_INITDIALOG:
return FALSE;
case WM_COMMAND:
开关(wParam){
/*
*如果用户按OK按钮,检索
*在各种AngleArc中输入的数据
*控件。
*/
case IDD_OK:
/*
*检索弧的x坐标
* 中央。
*/
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg,IDD_X,chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
nX = (int)RetrieveInput(chInput, cch);
/*
*检索弧的y坐标
* 中央。
*/
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg,IDD_Y,chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
nY = (int)RetrieveInput(chInput, cch);
/ *检索弧的半径。*/
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg,IDD_RADIUS,chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
dwRadius = (DWORD) RetrieveInput(chInput, cch);
/ *检索起始角度。*/
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg,IDD_STARTANGLE,chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
xStartAngle = (float) RetrieveInput(chInput,
cch);
/ *检索扫描角度。*/
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg,IDD_SWEEPANGLE,chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
xSweepAngle = (float) RetrieveInput(chInput,
cch);
EndDialog(hdlg, FALSE);
return TRUE;
/*
*如果用户按下CANCEL按钮,关闭
* 对话框。
*/
case IDD_CANCEL:
EndDialog(hdlg, FALSE);
return TRUE;
} / * end switch(wParam)* /
break;
默认:
return FALSE;
} / * end switch(message)* /
UNREFERENCED_PARAMETER(lParam);
}
虚空Clearbits(LPTSTR开瑞,砖Ilength)
{
int i;
for (i = 0; i < iLength; i++)
cArray[i] = 0;
}
砖Getstrlngth(LPTSTR开瑞)
{
int i = 0;
while (cArray[i++] != 0);
return i - 1;
}
DWORD RetrieveInput(LPTSTR cArray,int iLength)
{
int i, iTmp;
double dVal, dCount;
dVal = 0.0;
dCount = (double) (iLength - 1);
/ *将ASCII输入转换为浮点值。*/
for (i = 0; i < iLength; i++) {
iTmp = cArray[i] - 0x30;
dVal = dVal + (((double)iTmp) * pow(10.0, dCount--));
}
return (DWORD) dVal;
}
要绘制饼图的每个部分,将用户输入的值传递给AngleArc功能。要使用当前画笔填充饼图,请将路由括弧中的调用嵌入AngleArc.以下代码示例显示了定义的路径括号和对AngleArc的调用。
int nX;
int nY;
DWORD dwRadius;
float xStartAngle;
float xSweepAngle;
case (IDM_ANGLEARC):
DialogBox((HINSTANCE)GetModuleHandle(NULL),
(LPTSTR) “AngleArc”
hwnd, (DLGPROC) ArcDlgProc);
hdc = GetDC(hwnd);
BeginPath(hdc);
SelectObject(hdc,
GetStockObject(GRAY_BRUSH));
MoveToEx(hdc, nX, nY, (LPPOINT) NULL);
AngleArc(HDC,NX,NY,dwRadius,
xStartAngle, xSweepAngle);
LineTo(hdc, nX, nY);
EndPath(hdc);
StrokeAndFillPath(hdc);
ReleaseDC(hwnd, hdc);
break;