绘制馅饼图

【勇芳软件工作室】汉化HomePreviousNext

您可以使用线和曲线函数绘制饼图。用于绘制饼图的主要功能是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;