Menggambar Bagan Pai
Anda dapat menggunakan fungsi garis dan kurva untuk menggambar bagan pai. Fungsi utama yang digunakan untuk menggambar bagan pai adalah fungsiAngleArc, yang mengharuskan Anda untuk menyediakan koordinat pusat pai, radius pai, sudut awal, dan sudut sapuan. Cuplikan layar berikut ini memperlihatkan kotak dialog yang bisa digunakan pengguna untuk memasukkan nilai-nilai ini.
Nilai yang diperlihatkan di atas menghasilkan bagan pai berikut.
Templat kotak dialog ditemukan di skrip sumber daya aplikasi (. File RC) menentukan karakteristik kotak dialog sebelumnya (tingginya, kontrol yang dikandungnya, dan gayanya), sebagai berikut.
AngleArc DIALOG 6, 18, 160, 100
STYLE WS_DLGFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Pie Chart"
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 "Center", 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 "Start Angle", 110, 59, 33, 42, 8
LTEXT "Sweep Angle", 111, 55, 55, 43, 8
PUSHBUTTON "OK", IDD_OK, 9, 82, 40, 14
PUSHBUTTON "Cancel", IDD_CANCEL, 110, 82, 40, 14
END
Prosedur kotak dialog, yang ditemukan dalam file sumber aplikasi, mengambil data (koordinat tengah, radius busur, dan memulai dan menyapu sudut) dengan mengikuti langkah-langkah berikut:
- Fungsi ClearBits yang ditentukan aplikasi menginisialisasi array yang menerima input pengguna ke nol.
- Fungsi GetStrLngth yang ditentukan aplikasi mengambil panjang string yang dimasukkan oleh pengguna.
- Fungsi RetrieveInput yang ditentukan aplikasi mengambil nilai yang dimasukkan oleh pengguna.
Contoh kode berikut menunjukkan prosedur kotak dialog.
void ClearBits(LPTSTR, int);
int GetStrLngth(LPTSTR);
DWORD RetrieveInput(LPTSTR, int);
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
switch (uMsg)
{
case WM_INITDIALOG:
return FALSE;
case WM_COMMAND:
switch (wParam)
{
// If the user pressed the OK button, retrieve the
// data that was entered in the various AngleArc
// controls.
case IDD_OK:
// Retrieve the x-coordinate of the arc's center.
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg, IDD_X, chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
nX = (int)RetrieveInput(chInput, cch);
// Retrieve the y-coordinate of the arc's center.
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg, IDD_Y, chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
nY = (int)RetrieveInput(chInput, cch);
// Retrieve the radius of the arc.
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg, IDD_RADIUS, chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
dwRadius = (DWORD) RetrieveInput(chInput, cch);
// Retrieve the start angle.
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg, IDD_STARTANGLE, chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
xStartAngle = (float) RetrieveInput(chInput, cch);
// Retrieve the sweep angle.
ClearBits(chInput, sizeof(chInput));
GetDlgItemText(hdlg, IDD_SWEEPANGLE, chInput,
sizeof(chInput));
cch = GetStrLngth(chInput);
xSweepAngle = (float) RetrieveInput(chInput, cch);
EndDialog(hdlg, FALSE);
return TRUE;
// If user presses the CANCEL button, close the
// dialog box.
case IDD_CANCEL:
EndDialog(hdlg, FALSE);
return TRUE;
} // end switch (wParam)
break;
default:
return FALSE;
} // end switch (message)
UNREFERENCED_PARAMETER(lParam);
}
void ClearBits(LPTSTR cArray, int iLength)
{
int i;
for (i = 0; i < iLength; i++)
cArray[i] = 0;
}
int GetStrLngth(LPTSTR cArray)
{
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);
// Convert ASCII input to a floating-point value.
for (i = 0; i < iLength; i++)
{
iTmp = cArray[i] - 0x30;
dVal = dVal + (((double)iTmp) * pow(10.0, dCount--));
}
return (DWORD) dVal;
}
Untuk menggambar setiap bagian bagan pai, teruskan nilai yang dimasukkan oleh pengguna ke fungsiAngleArc. Untuk mengisi bagan pai menggunakan kuas saat ini, tanamkan panggilan ke AngleArc dalam kurung lintasan. Sampel kode berikut menunjukkan tanda kurung jalur yang ditentukan dan panggilan ke AngleArc.
int nX;
int nY;
DWORD dwRadius;
float xStartAngle;
float xSweepAngle;
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);