Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2011, 11:56   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Отсутствие отрисовки на DC

В общем создал окно с 0-м размером:
Код:
Warehouse.Form[Index].Index := _CreateSize(0, 0, 0, 0, ELEM_TYPE_FORM);                           // Create size record in Warehouse.Size.
  Warehouse.Form[Index].Handle :=                                                                   // Create form handle.
   CreateWindowEx(0, Application.WinClass.lpszClassName, '',                                        // Set class name and caption.
                  WS_POPUP,                                                                         // Set style.
                  Warehouse.Size[Warehouse.Form[Index].Index].Left,                                 // Set left.
                  Warehouse.Size[Warehouse.Form[Index].Index].Top,                                  // Set top.
                  Warehouse.Size[Warehouse.Form[Index].Index].Width,                                // Set width.
                  Warehouse.Size[Warehouse.Form[Index].Index].Height,                               // Set height.
                  0, 0, Application.Handle, Nil);                                                   // Set parent.
Создалось.
Создаю на нем Static:
Код:
Warehouse.Form[Index].Image.Handle :=                                                             // Create image handle.
   CreateWindow(APP_STATIC, '',                                                                     // Create TImage control.
                WS_CHILD Or SS_BITMAP Or WS_VISIBLE,                                                // Styles of control.
                0,                                                                                  // Set left.
                0,                                                                                  // Set top.
                Warehouse.Size[Warehouse.Form[Index].Index].Width,                                  // Set width.
                Warehouse.Size[Warehouse.Form[Index].Index].Height,                                 // Set height.
                Warehouse.Form[Index].Handle,                                                       // Set parent handle.
                0, Application.Handle, Nil);                                                        // Set main parent handle.
Создался. Хендлы >0 и они разные.
Дальше ставлю свойства окна:
Код:
SetWindowLong(Warehouse.Form[Index].Handle,                                                       // Set window attributes.
                GWL_EXSTYLE,                                                                        // Style.
                GetWindowLong(Warehouse.Form[Index].Handle, GWL_EXSTYLE) Or WS_EX_LAYERED);         // Get old style + layered style.
  SetLayeredWindowAttributes(Warehouse.Form[Index].Handle,                                          // Handle of form.
                             0,                                                                     // Color.
                             255,                                                                   // Alpha blend value.
                             LWA_ALPHA);                                                            // Flag for alpha.
Поставил.
Создаю DC и буфер для отрисовки:
Код:
Warehouse.Form[Index].Image.DC := GetDC(Warehouse.Form[Index].Image.Handle);                      // Get device context for image.
  Warehouse.Form[Index].Buffer :=                                                                   // Create buffer texture.
   CreateTexture(Warehouse.Size[Warehouse.Form[Index].Index].Width,                                 // Set width.
                 Warehouse.Size[Warehouse.Form[Index].Index].Height,                                // Set height.
                 '');                                                                               // Set name.
Создал.
В программе вызываю изменение размеров:
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.02.2011, 11:58   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
Procedure _RecreateBuffer(FormNum : Integer);                                                      // Recreate buffer if form is resized.
 Var
  NewBuffer  : Integer;
  Visibility : LongBool;
 Begin
  Visibility := Warehouse.Form[FormNum].Visible;                                                    // Memorize visibile.
  If Visibility Then ShowForm(FormNum, FALSE);                                                      // Hide form.
  SetWindowPos(Warehouse.Form[FormNum].Handle,                                                      // Set new form window size\pos.
               HWND_BOTTOM,                                                                         // Z flag.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Left,                                  // New left.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Top,                                   // New top.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Width,                                 // New width.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Height,                                // New height.
               SWP_NOOWNERZORDER);                                                                  // Flags set.
  SetWindowPos(Warehouse.Form[FormNum].Image.Handle,                                                // Set "TImage" new size\pos.
               HWND_BOTTOM,                                                                         // Z flag.
               0,                                                                                   // Left.
               0,                                                                                   // Top.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Width,                                 // New width.
               Warehouse.Size[Warehouse.Form[FormNum].Index].Height,                                // New height.
               SWP_NOOWNERZORDER);                                                                  // Flags set.
  NewBuffer := CreateTexture(Warehouse.Size[Warehouse.Form[FormNum].Index].Width,                   // Create new texture for...
                             Warehouse.Size[Warehouse.Form[FormNum].Index].Height,                  // ...new buffer.
                             '');                                                                   // Zerowidth name.
  Draw(NewBuffer, Warehouse.Form[FormNum].Buffer, 0, 0);                                            // Draw old buffer on new.
  DestroyTexture(Warehouse.Form[FormNum].Buffer);                                                   // Destroy old texture.
  Warehouse.Form[FormNum].Buffer := NewBuffer;                                                      // Set new buffer.
  If Visibility Then ShowForm(FormNum, TRUE);                                                       // Show form.
 End;
Насчет размеров Static не уверен, но размеры и позиция главного окна меняются.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.02.2011, 11:59   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Загрузил текстуру:
Код:
Warehouse.Texture[Index].BitMap := LoadImage(GetModuleHandle(Nil),            // Load HBitMap from file.
                                                                   FileName,
                                                                   IMAGE_BITMAP,
                                                                   0, 0,
                                                                   LR_LOADFROMFILE);
рисую:
Код:
Procedure Draw(DestNum, SourceNum, X, Y : Integer); StdCall; Export;                               // Draw texture.
 Var
  DC1, DC2         : HDC;
  OldBmp1, OldBmp2 : HBitMap;
 Begin
  DC1 := CreateCompatibleDC(0);                                                                     // Create DC 1
  DC2 := CreateCompatibleDC(0);                                                                     // Create DC 2
  OldBmp1 := SelectObject(DC1, Warehouse.Texture[DestNum].BitMap);                                  // Get bitmaps dest.
  OldBmp2 := SelectObject(DC2, Warehouse.Texture[SourceNum].BitMap);                                // Get bitmaps source.
  If Warehouse.Texture[DestNum].Trans.Mode Then                                                     // If transparent mode enabled.
    TransparentBlt(DC1,                                                                             // Draw with transparent.
                   X, Y,                                                                            // Coordinates.
                   Warehouse.Size[Warehouse.Texture[SourceNum].Index].Width,                        // Width.
                   Warehouse.Size[Warehouse.Texture[SourceNum].Index].Height,                       // Height.
                   DC2,                                                                             // Target HDC.
                    0, 0,                                                                            // Left, Top.
                   Warehouse.Size[Warehouse.Texture[SourceNum].Index].Width,                        // Width.
                   Warehouse.Size[Warehouse.Texture[SourceNum].Index].Height,                       // Height.
                   Warehouse.Texture[DestNum].Trans.Color)                                          // Transparent color.
   Else                                                                                             // If transparent mode disabled.
    BitBlt(DC1,                                                                                     // Draw without transparent.
           X, Y,                                                                                    // Coordinates.
           Warehouse.Size[Warehouse.Texture[SourceNum].Index].Width,                                // Width.
           Warehouse.Size[Warehouse.Texture[SourceNum].Index].Height,                               // Height.
           DC2, 0, 0, SRCCOPY);                                                                     // Target, Left, Top, Flag.
  SelectObject(DC2, OldBmp2);
  SelectObject(DC1, OldBmp1);
  DeleteDC(DC2);                                                                                    // Free DC2.
  DeleteDC(DC1);                                                                                    // Free DC1.
 End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.02.2011, 11:59   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

И рисую буфер на экране:
Код:
 Procedure BufferDraw(FormNum : Integer); StdCall; Export;                                          // Draw buffer on screen.
 Var
  Loc : HDC;
  Bit : HBitMap;
 Begin
  If (Warehouse.Form[FormNum].Exists)  And                                                          // If form exists...
     (Warehouse.Form[FormNum].Mode = FORM_MODE_FREE) Then                                           // ...and form is free for draw.
   Begin
    Loc := CreateCompatibleDC(0);                                                                   // Create DC
    Bit := SelectObject(Loc, Warehouse.Form[FormNum].Buffer);                                       // Select buffer texture for DC
    { TODO Insert here controls drawing }
    BitBlt(Warehouse.Form[FormNum].Image.DC,                                                        // Draw on TImage.
            0, 0,                                                                                   // Left\Top.
            Warehouse.Size[Warehouse.Form[FormNum].Index].Width,                                    // Width.
            Warehouse.Size[Warehouse.Form[FormNum].Index].Height,                                   // Height.
            Loc,                                                                                    // Source DC.
            0, 0,                                                                                   // Left\Top.
            SRCCOPY);                                                                               // Mode.
    SelectObject(Loc, Bit);                                                                         // Select it back.
    DeleteDC(Loc);                                                                                  // Free DC.
   End;
 End;
И нифига. кроме заданного при создании цвета окошка ничего нет.

GetLastError 0.

P.S. Не вмещалось - ~11000 символов.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 04.02.2011 в 12:08.
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсутствие моего профиля в списке пользователей SunKnight О форуме и сайтах клуба 2 21.11.2009 13:52
Изменение параметров отрисовки OpenGL hotcooler17 Мультимедиа в Delphi 11 15.11.2009 13:01
отсутствие MFC 71U.DLL veresk Софт 1 05.02.2009 01:05
Отсутствие IP GAGARIN-NEW Работа с сетью в Delphi 1 17.01.2008 17:56
Проверка на отсутствие данных в БД Elena БД в Delphi 5 14.06.2007 16:10