ALTE DOCUMENTE
|
|||
Единицами измере 17317m1212r ;ния координат при выводе текста и графики в Windows являются логические единицы. При выводе информации на конкретное устройство логические единицы преобразуются в физические (пиксели). Процесс преобразования единиц измере 17317m1212r ;ния из логических в физические определяется текущим режимом отображения (mappind mode). По умолчанию одна логическая единица равна одному пикселю. Однако, изменив режим отображения, можно изменить соотношение логических и физических единиц.
Кроме изменения режима преобразования единиц измере 17317m1212r ;ния координат, можно устанавливать и другие параметры, оказывающие влияние на процесс отображения информации. Во-первых, можно задавать ширину и высоту окна в текущих логических единицах. Во-вторых, Вы можете задавать физические размеры области вывода. Область вывода (viewport) - это прямоугольная область, в которой выводится информация. По умолчанию область вывода совпадает с рабочей областью окна.
В данном разделе рассматриваются функции API, позволяющие управлять режимом отображения, логическими размерами окна и областью вывода.
. Для установки текущего режима отображения (mappind mode) используется функция SetMapMode()
int SetMapMode(HDC hdc, int mode);
hdc mode
Текущий режим отображения (mappind mode)
MM_ANISOTROPIC | ||
MM_HIENGLISH | ||
MM_HIMETRIC | ||
MM_ISOTROPIC | ||
MM_LOMETRIC | ||
MM_LOENGLISH | ||
|
||
MM_TWIPS |
SetMapMode()
MM_LOMETRIC. Во-вторых, Вы можете пожелать задействовать в своей программе те единицы измере 17317m1212r ;ния, которые используются для объектов реального мира. В-третьих, может возникнуть необходимость изменить масштаб изображения (увеличить или уменьшить его, сохраняя или изменяя при этом пропорции объектов). И, наконец, может потребоваться установить соотношение размеров по осям X Y X Y
MM_ISOTROPIC MM_ANISOTROPIC MM_ISOTROPIC MM_ANISOTROPIC используются только для программно определенных логических единиц, физические размеры Окна остаются неопределенными до тех пор, пока Вы не зададите их явно). Для задания размеров окна (extents) используется функция API SetWindowExtEx()
BOOL SetWindowExtEx(HDC hdc, int Xextent, int Yextent, LPSIZE size);
hdc Xextent Yextent задают размеры (extents) окна по горизонтали и вертикали в логических единицах. Предыдущие размеры окна копируются в структуру типа SIZE size NULL SetWindowExtEx() MM_ISOTROPIC MM_ANISOTROPIC
SIZE
typedef struct tagSIZE
SIZE;
Вы просто определяете размеры окна в установленных Вами логических единицах (или, точнее, определяете соотношение логических единиц, используемых окном, и физических единиц - пикселей, используемых устройством отображения). Так, одно и то же реальное окно может иметь логические размеры 100 на 100 или 50 на 75. Разница будет только в соотношении логических единиц и пикселей при выводе графических объектов.
. Как уже упоминалось, область вывода (viewport) - это область, в которую физически выводится информация. Размеры области вывода можно определить при помощи функции SetViewportExtEx()
BOOL SetViewportExtEx(HOC hdc, int Xextent, int Yextent, LPSIZE size};
hdc Xextent Yextent SIZE size NULL SetViewportExtEx() MM_ISOTROPIC MM_ANISOTROPIC
MM_TEXT
Вывод программы автоматически отображается из контекста устройства окна (в логических единицах) в область вывода (в пикселях) и соответственно масштабируется. Поэтому, изменяя размеры области вывода, Вы изменяете видимые размеры отображаемых в ней объектов. Таким образом, при увеличении размеров области вывода содержимое ее тоже увеличится и, наоборот, - при уменьшении размеров области вывода ее содержимое уменьшится. Это будет показано в следующем примере 17317m1212r ;.
SetViewportOrgEx()
BOOL SetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT OldOrg);
hdc X Y POINT OldOrg NULL
Изменение начала области вывода приводит к тому, что выводимая в окно информация будет отображаться в другом месте. В приведенном ниже примере 17317m1212r ; будет показано, как это можно осуществить.
MM ANISOTROPIC
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Graph.h"
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
char szWinName[] = " "; //
char str[255]; // Буфер строки вывода
int maxX, maxY; // Размеры экрана
int X=10, Y=10; // Размеры области вывода
int orgX orgY
HDC memdc; // DC виртуального окна
HBITMAP hbit; // Растр - это виртуальное окно
HBRUSH hbrush, hOldbrush; // Дескрипторы кистей
HPEN hOldpen; // Дескриптор прежнего пера
HPEN hRedpen,hGreenpen,hBluepen,hYellowpen; //
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
return msg.wParam;
}
// Windows и получает в качестве параметров сообщения
// из очере 17317m1212r ;ди сообщений данного приложения
LRESULT CALLBACK WindowFunc HWND hwnd
UINT message,
WPARAM wParam,
LPARAM lParam)
break;
case WM_PAINT: // Пере 17317m1212r ;рисовка
// DC */
hdc=BeginPaint(hwnd,&paintstruct);
//
SetMapMode hdc MM ANISOTROPIC
SetWindowExtEx(hdc,200,200,NULL);
SetViewportExtEx(hdc,X,Y,NULL);
SetViewportOrgEx(hdc,orgX,orgY,NULL);
BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
// DC
EndPaint(hwnd,&paintstruct);
break;
case WM_DESTROY: // Завершение программы
// Удалить созданные перья
DeleteObject(hRedpen);
DeleteObject(hGreenpen);
DeleteObject(hBluepen);
DeleteObject(hYellowpen);
DeleteDC(memdc); //
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в данной
// функции, направляются на обработку по
// умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
return 0;
}
#include <Windows.h>
#include "Graph.h"
MYMENU MENU
MYMENU ACCELERATORS
Следует учесть, что файл определений Graph.h должен быть дополнен двумя константами, и иметь следующий вид:
#define ID_LINES 100
#define ID_RECTANGLES 101
#define ID_ELLIPSES 102
#define ID_SIZE 103
#define ID_ORG 104
#define ID_RESET 105
#define ID_HELP 106
Windows
|