![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 ли нет.