Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

GDI. Compatible DC и Transformation functions   Найти похожие ветки 

 
AlexRush ©   (2003-09-03 12:12) [0]

Вопрос:
Могут ли вообще функции трансформации координат
(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-03 12:23) [1]

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


 
MBo ©   (2003-09-03 13:05) [2]


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 13:13) [3]

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

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


 
AlexRush ©   (2003-09-04 14:31) [4]

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


 
AlexRush ©   (2003-09-04 17:20) [5]

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


 
MBo ©   (2003-09-04 17:37) [6]

Вон оно как ;)



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-42038
Brahman
2003-10-16 10:36
2003.11.13
Соционика


4-42268
VaS
2003-09-05 09:07
2003.11.13
CreateProcess - странная пауза при ожидании


7-42179
AndreySoft
2003-08-28 13:13
2003.11.13
Как определить объём жёсткого


3-40794
Vemer
2003-10-19 19:34
2003.11.13
Inner Join в Interbase


14-42002
Soft
2003-10-17 04:26
2003.11.13
Игры... которые убивают.