Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рендеринг Tbitmap, на програмно созданой форме 
V
    Опции темы
SoWa
Дата 26.3.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Задача- на форме, созданой и инициализированой програмно, мне надо отобразить картинку.
Функция Draw не работает. Как быть?
Код

program Masochist;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages,Graphics;

function MyWndProc(Window: HWND; Mess: Word; WParam: Word; LParam: Longint):
 Longint; stdcall;
var
 MyHdc: HDC;
 ps: TPaintStruct;
 rect: TRect;
 bb: Tbitmap;

 procedure InitBimap;   //Тут инициализирую битмап
  begin
   bb:=Tbitmap.Create;
   bb.Width:=50;
   bb.Height:=50;
   bb.Canvas.Pixels[1,1]:=RGB(10,70,230);
  end;

begin
 case Mess of
  WM_CREATE: result:=0;
  WM_DESTROY: begin PostQuitMessage(0); Result:=0; end;
  WM_LBUTTONDOWN:
   begin
    MessageBox(Window, 'Text', 'Caption', MB_OK);
    MyHdc:=GetDC(Window);
    TextOut(MyHDC,150,50,'Try Minimize', 12); Ellipse(MyHdc,10,10,110,110);
    ReleaseDC(Window, MyHdc);
    Result:=0;
   end;
  WM_PAINT:
   begin
   MyHdc:=BeginPaint(Window,ps);
    GetClientRect(Window,rect); Rectangle(MyHdc,0,0,rect.Right,rect.Bottom);
    Rectangle(MyHdc,150,150,200,200);
//А вот тут надо его отрендерить в координатах 150 150.
    DrawText(MyHdc,'Hello',5,rect,DT_SINGLELINE OR DT_CENTER OR DT_VCENTER);
   EndPaint(Window, ps);
   Result:=0;
  end
 else
  Result:=DefWindowProc(Window, Mess, WParam, LParam);
 end;
end;
var
 wc: TWndClass; wnd: HWND; MSG: TMsg;


begin
  { TODO -oUser -cConsole Main : Insert code here }
   wc.style:=CS_HREDRAW OR CS_VREDRAW;
 wc.lpfnWndProc:=@MyWndProc;
 wc.cbClsExtra:=0; wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(THandle(nil), IDI_APPLICATION);
 wc.hCursor:=LoadCursor(THandle(nil), IDC_ARROW);
 wc.hbrBackground:=HBRUSH(GetStockObject(WHITE_BRUSH));
 wc.lpszMenuName:= nil;
 wc.lpszClassName:='MyWndClass';
 if (RegisterClass(wc)=0) then Exit;
 wnd:=CreateWindow('MyWndClass', 'application', WS_OVERLAPPEDWINDOW,200,150,400,300,0,0, HInstance, nil);
 ShowWindow(wnd, SW_RESTORE); UpdateWindow(wnd);
 while GetMessage(Msg,0,0,0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;

end.



--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Alexeis
Дата 26.3.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Ну можно API функцию BitBlt


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Quartz
Дата 26.3.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.6.2008

Репутация: 3
Всего: 4



"Функция Draw" - это Canvas.Draw? Так у Вас же канвы нет...

Это сообщение отредактировал(а) Quartz - 26.3.2009, 15:27
PM MAIL   Вверх
MetalFan
Дата 26.3.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



2 варианта:
1. отрисовать BitBlt, взяв TBitmap.Canvas.Handle
2. Создать TCanvas, присвоить хэндл и рисовать с пом.него.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
SoWa
Дата 26.3.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Так.
Если добавляю строку
Код

BitBlt(MyHdc, 150, 150, 50, 50, bb.Canvas.Handle, 150, 150, PATCOPY);

после рисования квадратика(который Rectangle), программа молча умирает при трассировке на этой строке.

Что касается Создать TCanvas, присвоить хэндл и рисовать с пом.него.
Это я создам канвас, присвою форме его хэндл, или наоборот, ему присвою хэндл формы? который MyHdc.
В обоих случаях(в MyHDC поместить хэндл канваса, и наоборот, хэндлу канваса присвоить MyHDC)
программа молча умирает на строке
Код

UpdateWindow(wnd);


Если можно, мне, тупому, кодом это дело обьяснить? smile А картинку я уж потом по старой памяти какнить сам в bb помещу


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Alexeis
Дата 26.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SoWa, похоже в программе есть ошибки работы с памятью или неверно указаны размеры битмапа.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 26.3.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(SoWa @  26.3.2009,  17:09 Найти цитируемый пост)
после рисования квадратика(который Rectangle), программа молча умирает при трассировке на этой строке.

а TBitmap кто создавать будет? в приведенном коде InitBitmap не вызывается

Добавлено через 1 минуту и 20 секунд
Цитата(SoWa @  26.3.2009,  17:09 Найти цитируемый пост)
Это я создам канвас, присвою форме его хэндл, или наоборот, ему присвою хэндл формы? который MyHdc.
В обоих случаях(в MyHDC поместить хэндл канваса, и наоборот, хэндлу канваса присвоить MyHDC)
программа молча умирает на строке

показывай код, как создаешь, присваиваешь...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
AntonN
Дата 26.3.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



в дельфи два tbitmap, который используется?


--------------------
user posted image
PM MAIL WWW   Вверх
SoWa
Дата 26.3.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Код

program Masochist;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages,Graphics;



function MyWndProc(Window: HWND; Mess: Word; WParam: Word; LParam: Longint):
 Longint; stdcall;
var
 MyHdc: HDC;
 ps: TPaintStruct;
 rect: TRect;
 bb: Tbitmap;


  procedure InitBitmap;
  begin
   bb:=Tbitmap.Create;
   bb.Width:=50;
   bb.Height:=50;
   bb.Canvas.Rectangle(10,10,40,40);
  end;


begin
InitBitmap;
 case Mess of
  WM_CREATE: result:=0;
  WM_DESTROY: begin PostQuitMessage(0); Result:=0; end;
  WM_LBUTTONDOWN:
   begin
    MessageBox(Window, 'Text', 'Caption', MB_OK);
    MyHdc:=GetDC(Window);
    TextOut(MyHDC,150,50,'Try Minimize', 12); Ellipse(MyHdc,10,10,110,110);
    ReleaseDC(Window, MyHdc);
    Result:=0;
   end;
  WM_PAINT:
   begin
   MyHdc:=BeginPaint(Window,ps);
    GetClientRect(Window,rect); Rectangle(MyHdc,0,0,rect.Right,rect.Bottom);
   // Rectangle(MyHdc,150,150,200,200);
//Сюда надо нарисовать то, что нарисовано в переменной bb, но вот BitBlt не рисует.
    BitBlt(MyHdc, 150, 150, 50, 50, bb.Canvas.Handle, 150, 150, PATCOPY);
    DrawText(MyHdc,'Hello',5,rect,DT_SINGLELINE OR DT_CENTER OR DT_VCENTER);
   EndPaint(Window, ps);
   Result:=0;
  end
 else
  Result:=DefWindowProc(Window, Mess, WParam, LParam);
 end;
end;
var
 wc: TWndClass; wnd: HWND; MSG: TMsg;


begin
  { TODO -oUser -cConsole Main : Insert code here }
   wc.style:=CS_HREDRAW OR CS_VREDRAW;
 wc.lpfnWndProc:=@MyWndProc;
 wc.cbClsExtra:=0; wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(THandle(nil), IDI_APPLICATION);
 wc.hCursor:=LoadCursor(THandle(nil), IDC_ARROW);
 wc.hbrBackground:=HBRUSH(GetStockObject(WHITE_BRUSH));
 wc.lpszMenuName:= nil;
 wc.lpszClassName:='MyWndClass';
 if (RegisterClass(wc)=0) then Exit;
 wnd:=CreateWindow('MyWndClass', 'Masochist application', WS_OVERLAPPEDWINDOW,200,150,400,300,0,0, HInstance, nil);
 ShowWindow(wnd, SW_RESTORE);
 UpdateWindow(wnd);
 while GetMessage(Msg,0,0,0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;

end.


В общем, да, я действительно уже позабыл что процедуры и вызывать еще надо smile
Вот, код на данный момент. Все свои тыканья с Хэндлами убрал, ибо я их уже не помню и ничего путного у меня не получится.
Программа не вылетает, но остается только отрендерить переменную bb. В комментах в коде- то место


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
MetalFan
Дата 26.3.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(SoWa @  26.3.2009,  18:44 Найти цитируемый пост)
begin
InitBitmap;

и как, программка наверное начинает память кушать?
зачем же при каждом вызове обработки сообщения вызывать инициализацию битмапа


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
SoWa
Дата 26.3.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Слушай, помоги плиз отрендерить. Меня память сейчас волнует в самую последнюю очередь.
А перенести процедуру и переменные в глобальные я всегда успею ;) Кстати, спасиб, что заметил smile

Это сообщение отредактировал(а) SoWa - 26.3.2009, 19:47


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
SoWa
Дата 26.3.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Оооочень прошу код, чтобы работало  smile 


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
AntonN
Дата 26.3.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Код

bb.canvas.rectangle(10,10,100,100);
bb.canvas.textout(10,10,'Ура!!!!!!!!!!!');



--------------------
user posted image
PM MAIL WWW   Вверх
SoWa
Дата 27.3.2009, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



AntonN, я по твоему совсем нуб?! Мне надо нарисовать эту переменную на форме! Понимаешь?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
SoWa
Дата 27.3.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Проблема решена созданием канваса, присваиванием ему хэндла формы и рисования на нем.
MetalFan получает плюсик, AntonN получает минусик. Рассмотрю жалобы в ПМ.
Тема исчерпана.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1133 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.