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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 13:52   #1
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию Win API рисование

итак
сеьезно я в апи не вникал, ибо для того что я пишу мне это не надо. единственное - это быстрое рисование, которое, как я понял, лучше всего осуществить именно через апи.
собственно вопрос:
вот эта часть кода
Код:
procedure TMainForm.Timer1Timer(Sender: TObject);
var M: HDC; x,y:integer;
begin
  MainForm.Caption:=inttostr(M);
  M:=CreateCompatibleDC(GetDC(MainForm.Handle));
  for x:=0 to 100 do
    for y:=0 to 100 do
      SetPixel(M,X,Y,0);
  BitBlt(GetDC(MainForm.Handle),0,0,100,100,M,0,0,SRCCOPY);
  DeleteDC(M);
end;
должна рисовать черный квадрат на форме. но не рисует. почему?
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 07.06.2009 в 13:57.
Granus вне форума Ответить с цитированием
Старый 07.06.2009, 15:27   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

CreateCompatibleDC
Цитата:
Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC.
На каждый GetDC должен быть ReleaseDC; получать DC формы и создавать свой DC лучше один раз в FormCreate.

Последний раз редактировалось Somebody; 07.06.2009 в 15:36.
Somebody вне форума Ответить с цитированием
Старый 07.06.2009, 15:39   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

а поконкретнее можно?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 07.06.2009, 15:53   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
var ...
  hBmp: HBITMAP;
...
hDc := CreateCompatibleDC(...);
hBmp := CreateCompatibleBitmap(hDc, <width>, <height>);
SelectObject(hDc, hBmp);
...
Somebody вне форума Ответить с цитированием
Старый 07.06.2009, 15:57   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

во)))
спасибо большое)

другая проблема
теперь рисунок всегда черный 0_о
Код:
var
   m,f: HDC;
   b: HBITMAP;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  f:=GetDC(MainForm.Handle);
  m:=CreateCompatibleDC(f);
  b:=CreateCompatibleBitmap(m,200,200);
  SelectObject(m,b);
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
var x,y:integer;
begin
  for x:=0 to 199 do
    for y:=0 to 199 do
      SetPixel(m,x,y,255);
  BitBlt(f,0,0,200,200,m,0,0,SRCCOPY);
end;
Форматируйте код, будьте людьми.

Последний раз редактировалось rpy3uH; 07.06.2009 в 21:36.
Granus вне форума Ответить с цитированием
Старый 07.06.2009, 18:31   #6
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Попробуйте так (ИМХО, с таймером TTimer БЫСТРО не получится):

Код:
var
  dc : HDC;

...
procedure TForm1.FormShow(Sender: TObject);
begin
  dc := GetDC (Handle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
   x, y : integer;
begin
  for x:=0 to 100 do
    for y:=0 to 100 do begin
      SetPixel(dc, x, y, RGB(10,45,222));       // Цвет в RGB
      BitBlt(dc, x, y, 1, 1, dc, 0, 0, SRCCOPY);
    end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ReleaseDC (Handle, dc);
end;
BaronTreep вне форума Ответить с цитированием
Старый 08.06.2009, 15:59   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Granus, не всегда, ещё и белый может быть.
См. CreateCompatibleBitmap
BaronTreep, а что от этого могло бы измениться?
Somebody вне форума Ответить с цитированием
Старый 09.06.2009, 20:05   #8
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Somebody, человек спросил про цвет, у меня (как я написал) цветной получается. Может я плохо понял? Тогда что не так?..
BaronTreep вне форума Ответить с цитированием
Старый 10.06.2009, 16:56   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В таком варианте и просто 255 должно так же работать - это же красный цвет, я имел в виду, что от RGB() в том коде ничего не поменяется. Там используется CreateCompatibleBitmap (так как в DC в памяти рисуется быстрее), а он согласно MSDN в таком варианте создаётся чёрно-белый.
Somebody вне форума Ответить с цитированием
Старый 13.06.2009, 18:51   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

а как сделать не черно-белый?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win Api alexov Общие вопросы C/C++ 4 29.01.2009 13:33
Win API aleks_n Общие вопросы Delphi 0 15.09.2008 11:07
Рисование графики на Win Api помогите exolot128 Помощь студентам 12 08.10.2007 15:24