Проблема с отрисовкой кнопок

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

Сообщение Ciber SLasH » Пн фев 16, 2004 9:55 pm

Народ, подскажите как принудительно вызвать WM_PAINT для кнопки. Возникла проблема с отрисовкой когда форму перетащить за край экрана, то всё что я нарисовал на кнопках исчезает и перерисовывается только при нажатии на кнопку. Нужно как-то принудительно вызвать прорисовку.
Ciber SLasH
Майор
 
Сообщений: 314
Зарегистрирован: Пн ноя 24, 2003 11:28 am
Откуда: Питер
Пункты репутации: 0

Сообщение dAnIK SeNT » Пн фев 16, 2004 10:37 pm

2Ciber SLasH
А в чем проблема? Берешь и посылаешь. Ну, примерно так:

Button1.Repaint();
или
SendMessage (Button1.Handle, WM_PAINT, bla-bla-bla);

после чего
Appllication.ProcessMessages();

Должно сработать.
Или я чего-то недопонимаю?
Последний раз редактировалось dAnIK SeNT Пн фев 16, 2004 10:39 pm, всего редактировалось 1 раз.
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Сообщение Ciber SLasH » Вт фев 17, 2004 2:21 am

Не получается !!!
При создании формы делаю: Application.OnMessage := AppMessage.
И в процедуре AppMessage обрабатываю все сообщения. Если допустим при клике крысы на форме послать сообщение о перерисовке кнопки, то ничего не получается - сообщение WM_PAINT для кнопки не приходит (дебагер даже не останавливается на WM_PAINT):
Код: выделить все
 if (Msg.hwnd = Form1.Handle) and (Msg.message = WM_LBUTTONDOWN) then
   begin
     SendMessage(RadioButton2.Handle, WM_PAINT, 0,0);
     Handled := true
   end;
 if (Msg.hwnd = RadioButton2.Handle) then
   begin
     case Msg.message of
       WM_PAINT:
         begin
         ...
         end;
     end
   end

Не помогает и PostMessage и Update и Repaint и Refrash Изображение
Последний раз редактировалось Ciber SLasH Вт фев 17, 2004 2:24 am, всего редактировалось 1 раз.
Ciber SLasH
Майор
 
Сообщений: 314
Зарегистрирован: Пн ноя 24, 2003 11:28 am
Откуда: Питер
Пункты репутации: 0

Сообщение Ciber SLasH » Вт фев 17, 2004 3:04 am

Теперь ясно почему WM_PAINT не срабатывает - я писал в обработчике WM_PAINT следующее:
Код: выделить все
var
 DC: HDC;
 PS: TPaintStruct;
begin
 Handled := false;
 if (Msg.hwnd = RadioButton1.Handle) then
   case Msg.message of
     WM_PAINT:
       begin
         DC := BeginPaint(Msg.hwnd, PS);
         ...
         EndPaint(Msg.hwnd, PS);
         Handled := true
       end;
   end
end;

если поменять DC := BeginPaint(Msg.hwnd, PS); на DC := GetDC(Msg.hwnd);, а EndPaint(Msg.hwnd, PS); на ReleaseDC(Msg.hwnd, DC); - то всё нормально.
Но возник новый вопрос: по какому событию мне производить перерисовку кнопок, если форму оттащили за экран, а потом вернули на место - при этом всё что я рисовал стирается.
Ciber SLasH
Майор
 
Сообщений: 314
Зарегистрирован: Пн ноя 24, 2003 11:28 am
Откуда: Питер
Пункты репутации: 0

Сообщение Ciber SLasH » Вт фев 17, 2004 8:12 pm

<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Но возник новый вопрос: по какому событию мне производить перерисовку кнопок, если форму оттащили за экран, а потом вернули на место - при этом всё что я рисовал стирается.<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
Решение найдено:
Код: выделить все
type
 TForm1 = class(TForm)
 private
   procedure WMMove(var Msg: TWMMove); message WM_MOVE;
 end;

procedure TForm1.WMMove(var Msg: TWMMove);
var
 Mes: tagMSG;
 Handled: Boolean;
begin
 inherited;
 Mes.hwnd := hRB[1];
 Mes.message := WM_PAINT;
 Mes.wParam := 0;
 Mes.lParam := 0;
 Form1.AppMessage(Mes, Handled);

 Mes.hwnd := hRB[2];
 Form1.AppMessage(Mes, Handled);

 Mes.hwnd := hRB[3];
 Form1.AppMessage(Mes, Handled)
end;
--------------------------------------
где hRb[1] - hRB[3] -- хендлы 3-х RadioButton'ов; AppMessage -- обработчик сообщений (Application.OnMessage := AppMessage)

Единственное осталось загадкой: сообщение WM_MOVE не хочет отлавливаться в обработчике AppMessage, работает только если отлавливать его в отдельном обработчике Изображение .
Ciber SLasH
Майор
 
Сообщений: 314
Зарегистрирован: Пн ноя 24, 2003 11:28 am
Откуда: Питер
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron