|
Программирование >> Процедурные приложения
TRUE), return TRUE; hWnd = CreateWindow(szProgName, PieChart Application , WS OVERLAPPEDWINDOW, CW USEDEFAULT, CW USEDEFAULT, CW USEDEFAULT, CW USEDEFAULT, (HWND)NULL, (HMENU)NULL, (HANDLE)hlnst, (LPSTR)NULL) ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(SlpMsg, 0, 0, 0)) { TranslateMessage(SlpMsg); DispatchMessage(SlpMsg); ) return(IpMsg.wParam); } BOOL CALLBACK AboutDlgProc(HWND hdlg, UINT messg, WPARAM wParam, LPARAM IParam) I switch (messg) { case WM INITDIALOG: break; case WM COMMAND: switch (wParam) case IDOK: EndDialog(hdlg, break; default: return FALSE; } break; default: return FALSE; } BOOL CALLBACK PieDlgProc(HWND hdlg, UINT messg, WPARAM wParam, LPARAM IParam) { switch (messg) { case WM INITDIALOG: return FALSE; case WM COMMAND: switch (wParam) { case IDOK: GetDlgltemText(hdlg, DMJTITLE, szTString, 80); iWedgesize[0] GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, GetDlgltemlnt(hdlg, case IDCANCEL: EndDialog(hdlg, default: return FALSE; } break; default: return FALSE; } return TRUE;
TRUE); break; FALSE); break; UINT messg, LRESULT CALLBACK WndProc(HWND hWnd, WPARAM wParam, LPARAM IParam) { HDC hdc; PAINTSTRUCT ps; HBRUSH hBrush; static HINSTANCE hlnstl, hlnst2; static int xClientView, yClientView; unsigned int iTotalwedge[maxnumwedge+1]; int i, iNWedges; iNWedges = 0; ford = 0; i. < maxnurawedge; i++) { if<iWedgesize[i] != 0) iNWedges++; } iTotalwedge[0] = 0; for(i = 0; i < iNWedges; i++) iTotalwedge[i+1] = iTotalwedge[i] + iWedgesize[i]; switch (messg) ( case WM SIZE: xClientView - LOWORD(IParam); yClientView = HIWORD(IParam); break; case WM CREATE: hlnstl = ((LPCREATESTRUCT) IParam)->hlnstance; hlnst2 = ((LPCREATESTRUCT) IParam)->hlnstance; break; case WM COMMAND: switch (wParam) { case IDM ABOUT: DialogBox(hlnstl, AboutDlgBox , hWnd, (DLGPROC) AboutDlgProc)i break/case IDM INPUT: DialogBox(hlnst2, PieDlgBox , hWnd, (DLGPROC) PieDlgProc); InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); break; case IDM EXIT: SendMessage(hWnd, WM CLOSE, 0, OL); break; default: break; } break; case WM PAINT: hdc = BeginPaint(hWnd, Sps); SetMapMode(hdc, MM ISOTROPIC); SetWindowExtExfhdc, 500, 500, NULL); SetViewportExtEx(hdc, xClientView, -yClientView, NULL); SetViewportOrgEx(hdc, xClientView/2, yClientView/2, NULL); if(xClientView > 200) TextOut(hdc, strlen (szTString) * (-8/2), 240, szTString, strlen (szTString)); for(i= 0; i < iNWedges; i++){ hBrush = CreateSolidBrush.(lCo;l.or [i]) ; SelectObject(hdc, hBrush); Pie(hdc, -200, 200, 200, -20:0 .. : (int)(radius*cos(2*pi*iTotalWedge[i]/ iTotalWedgeJiNWedges])), (int)(radius*sin(2*pi*iToialWedge[iJ/ ITotalWedge[iNWedges])), (int)(radius*cos(2*pi*iTotalWedge[i+1]/ iTotalWedge tiNWedges])), (int)(radius*sin(2*pi*iTotalWedge[i+l]/ iTotalWedge[iNWedges]))); } ValidateRect (hWnd, NULL); EndPaint (hWnd, Sps); 1 break; case WM DESTROY: PostQuitMessage (0); break; default: return (DefWindowProc (hWnd, messg, wParam, IParam) ) ; return(0); Ниже мы несколько подробнее проанализируем содержимое приведенных файлов. Файл Р1Е.Н Файл заголовков приложения содержит уникальные идентификаторы команд меню. Обратите внимание на идентификаторы с префиксом ом , представляющие поля диалогового окна, в которые пользователь будет вводить значения. Файл РIЕ.RС Файл ресурсов приложения содержит команду подключения указателя мыши (piecursor), а также описания меню (piemenu) и двух диалоговых окон (aboutdlgbox и piedlgbox). На рис. 17.16 показано диалоговое окно About. Рис. 17.16. Окно About Процесс создания этих окон был рассмотрен в предыдущей главе. В описании диалогового окна для каждого элемента управления задаются его размеры и координаты на экране. Редактор ресурсов вычисляет эти значения автоматически. Впрочем, вы можете просто ввести данный файл в текстовом виде, а редактор скомпилирует его и воссоздаст описанные в нем ресурсы. Файл PIE.C Программа, записанная в файле PIE.C, создает круговую диаграмму, содержащую до десяти секторов. Если в меню выбрать команду Input, откроется диалоговое окно PieChartData, в котором пользователь может установить число секторов и задать их относительную ширину, а также ввести заголовок диаграммы. Эти данные передаются в программу после щелчка на кнопке ОК. Информация, поступающая от диалоговых окон, обрабатывается в ветви caseIDOKпосредством процедуры PieDlgProcO. Текст заголовка возвращается функцией GetDlgltemText(), а числовые значения - функцией GetDlgltemlnt(). Последняя принимает четыре аргумента. Первые два - это дескриптор окна и идентификатор элемента управления. Третий аргумент является указателем на булеву переменную, устанавливаемую в TRUEпри успешном завершении функции. В нашем случае для простоты его значение задано равным null. Четвертый аргумент определяет, следует ли вводимое значение интерпретировать как знаковое (аргумент не равен нулю) или беззнаковое (аргумент равен нулю). Введенные значения сохраняются в глобальном массиве iWedgesize[ ]. Основная работа выполняется в процедуре WndProc(), где обрабатываются пять сообщений: wm size, wm create, wm command, wm paintи wmjdestroy. Сообщение wm sizeпосылается всякий раз, когда изменяются размеры окна приложения. Информация о размерах сохраняется в переменных xciientviewи yClientViewи впоследствии, при обработке сообщения wm paint, используется для настройки масштаба диаграммы. В процессе обработки сообщения wm create создаются два дескриптора приложения, hlnstlи hlnst2, которые затем передаются функции DialogBox(), генерирующей экземпляры двух диалоговых окон. При выборе какой-либо команды меню генерируется сообщение wm command. Если это сообщение имеет подтип IDM ABOUT, открывается окно About, а если подтип idm input- окно ввода данных. При получении сообщения idm exitприложение закрывает свое главное окно и завершает работу. Код рисования непосредственно диаграммы содержится в блоке обработки сообщения wm paint. По умолчанию в системе установлен режим отображения мм техт. В этом режиме
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |