Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GDI. Compatible DC и Transformation functions [D6, Win95/98, WinME, NT4, Win2k, WinXP]


AlexRush ©   (2003-09-03 12:12:00) 

Вопрос:
Могут ли вообще функции трансформации координат
(SetMapMode, SetViewPortOrgEx,SetViewPortExtEx, SetWindowExtEx,SetWindowOrgEx)
работать в виртуальным контекстом устроиства (Compatible DC)?
Если да, то как ?

Код:
Создание Compatible DC:

if not IsWindow(WindowFromDC(hDC))
then hDC:=Windows.GetWindowDC(hWnd);

hCDC:=CreateCompatibleDC(hDC);
if hCDC=0
then begin
SystemErrorMsg("CreateCompatibleDC");
exit;
end;
hCBMP:=CreateCompatibleBitmap(hDC,Width,Height);
SelectObject(hCDC,hCBMP);
SelectObject(hCDC,GetStockObject(WHITE_BRUSH));


Установка режима карты (координат):

if 0=SetMapMode(wndMap.CDC, MM_ISOTROPIC)
then SystemErrorMsg("SetMapMode");
if not SetViewPortOrgEx(wndMap.CDC, 0, wndMap.Height, nil)
then SystemErrorMsg("SetViewPortOrgEx");
if not SetViewPortExtEx(wndMap.CDC, wndMap.Width, -wndMap.Height, nil)
then SystemErrorMsg("SetViewPortExtEx");
if not SetWindowExtEx(wndMap.CDC, WinW, WinH, nil)
then SystemErrorMsg("SetWindowExtEx");
if not SetWindowOrgEx(wndMap.CDC, WinX, WinY, nil)
then SystemErrorMsg("SetWindowOrgEx");


Ни одна из фунций не возвращает ощибки...


MBo   (2003-09-04 17:37:00) [1]

Вон оно как ;)


AlexRush   (2003-09-04 17:20:00) [2]

...Разобрался... ошибка, как всегда, в DNA...
Всё дело в том, что вызов SetMapMode(hDC,MM_TEXT) восстанавливает экстенты, но не начала координат (origins), о чем в MSDN скромно умолчали..
Восстановил Ogr в (0,0) - всё зарабатоло.


AlexRush   (2003-09-04 14:31:00) [3]

2MBo
Работает только на простеньких примерах (ито не на всех, с зависимостью не разобрался). На реальной задаче - опять облом.


MBo   (2003-09-03 13:13:00) [4]

либо, если скорость не упадет,
StretchBlt(Canvas.Handle,0,0,500,500,CDC,0,0,500,-500,srccopy);
вместо строчек
SetMapMode(CDC,MM_Text)
BitBlt

т.е. логические координаты для каждого контекста - в его системе.


MBo   (2003-09-03 13:05:00) [5]


procedure TForm1.Button1Click(Sender: TObject);
var CDC:HDC;
hCBMP:HBITMAP;
begin
CDC:=CreateCompatibleDC(Canvas.Handle);
hCBMP:=CreateCompatibleBitmap(Canvas.Handle,500,500);
SelectObject(CDC,hCBMP);
SelectObject(CDC,GetStockObject(WHITE_BRUSH));
SetMapMode(CDC,MM_LOENGLISH);
Rectangle(CDC,10,-10,100,-100);
SetMapMode(CDC,MM_Text);//вот где собака порылась - иначе BitBlt, учитывающая лог. координаты
//обоих контекстов, не то дает, что нам хочется
BitBlt(Canvas.Handle,0,0,500,500,CDC,0,0,srccopy);
DeleteDC(CDC);
end;


MBo   (2003-09-03 12:23:00) [6]

Вроде бы для этих функций нет ограничений - CompatibleDC ли нет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо