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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перерисовка/обновление клиентской области окна 
V
    Опции темы
ImmortalAlexSan
Дата 9.1.2011, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Создаю окошко:


 
Код

 with WindowClass do

  begin

    Style:=cs_HRedraw or cs_VRedraw;

    lpfnWndProc:=@WindowProc;

    cbClsExtra:=0;

    cbWndExtra:=0;

    hInstance:=hInstance;

    hIcon:=LoadIcon(0,idi_Application);

    hCursor:=LoadCursor(0,idc_Arrow);

    hbrBackground:=Color_BtnFace+12; //цвет синий

    lpszMenuName:=@MainMenu;

    lpszClassName:=WndClass;

  end;

//Any code here

  Wnd:=CreateWindow

          (WndClass,

           WndCaption,

           WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN,

           cw_UseDefault,

           cw_UseDefault,

           cw_UseDefault,

           cw_UseDefault,

           0,

           MainMenu,

           HInstance,

           nil);

//Any code here

  ShowWindow(Wnd,CmdShow);

  UpdateWindow(Wnd);



Запускаю приложение - появляется окно БЕЛОГО цвета - разворачиваю - отрисовывается часть синяя там, где раньше области окна не было, сворачиваю-разворачиваю - окно цвета синего. Оно не обновляется при создании!
Обрабатываю сообщение WM_PAINT:


   
Код

 WM_PAINT:

    begin

      GetClientRect(Window,Rect);

      WndHDC:=BeginPaint(Window,PaintStruct);

      //BitBlt(WndHDC,Rect.Top,Rect.Left,Rect.Right,Rect.Bottom,

      //        0,0,0,BLACKNESS);

      EndPaint(Window,PaintStruct);

      SendMessage(Window,WM_NCPAINT,1,0);

    end;



Я комментировал строчку BitBlt (с ней работает нормально, только соответственно, цвет другой), но мне кажется такой подход неправильным. Помогите разобраться с правильным обновлением клиентской части окна, чтобы фон был такой, как при создании окна, а не белый, вообще не понимаю, почему винда сама не обрабатывает WM_PAINT как надо?! Столько перечитал справки, столько пробовал всего - результат отрицательный, и регионы создавал и InvalidateRect использовал, но он не работает с неправильной обработкой WM_PAINT! Заранее спасибо.
PM MAIL   Вверх
Rrader
  Дата 10.1.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Посмотрел код из соседней темы, подобное ведь приложение? В коде много ошибок, причем есть такие, которые не всегда срабатывают. Тебе задание - нужно все переписать аккуратно и с пониманием. smile  Сделаю небольшой разбор полетов.

1. Оконная процедура
Код

//функция обработки сообщений
function WindowProc (Window:HWnd; Message, WParam:Word;
                     LParam:LongInt): LongInt; stdcall;

Грубая ошибка в объявлении. Второй и третий параметр кастрированы. Если для идентификатора сообщения размерности Word всегда хватает, то для wParam - нет. Например, любой описатель, любой дескриптор, указатель, когда будет передаваться в оконную процедуру, будет обрезаться при использовании. Правильно писать так:
Код

function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
begin
  // Поехали
end;

2. Обработка WM_PAINT.
Код

    WM_PAINT:
    begin
      GetClientRect(Window,Rect);
      //tagPAINTSTRUCTInitialization(PaintStruct,Window,Rect);
      WndHDC:=BeginPaint(Window,PaintStruct);
      BitBlt(WndHDC,Rect.Top,Rect.Left,Rect.Right,Rect.Bottom,0,0,0,BLACKNESS);
      EndPaint(Window,PaintStruct);
      SendMessage(Window,WM_NCPAINT,1,0);
    end;

WM_NCPAINT здесь не нужен. BeginPaint сама заполняет структуру TPaintStruct, никаких лишних действий не требуется. Нужно возвратить 0, если сообщение обработано.
Код

WM_PAINT:
  begin
    GetClientRect(hWnd, Rect);
    WndHDC := BeginPaint(hWnd, PaintStruct);

    // Действия

    EndPaint(hWnd, PaintStruct);
    Result := 0;
    Exit;
  end;

3. Оконный класс
Код

  with WindowClass do
  begin
    Style:=cs_HRedraw or cs_VRedraw;
    lpfnWndProc:=@WindowProc;
    cbClsExtra:=0;
    cbWndExtra:=0;
    hInstance:=hInstance;
    hIcon:=LoadIcon(0,idi_Application);
    hCursor:=LoadCursor(0,idc_Arrow);
    hbrBackground:=Color_BtnFace+12;
    lpszMenuName:=@MainMenu;
    lpszClassName:=WndClass;
  end;

В hbrBackground должно заноситься значение, которое легко опознать. Нужен синий цвет? Используй
Код

hbrBackground := COLOR_BACKGROUND + 1;

Цитата(Справочные данные)

hbrBackground
Handle to the class background brush. This member can be a handle to the physical brush to be used for painting the background, or it can be a color value. A color value must be one of the following standard system colors (the value 1 must be added to the chosen color). If a color value is given, you must convert it to one of the following HBRUSH types: 
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT 

Если используешь блок with, нужно быть внимательным.
Код

hInstance:=hInstance; // Этот код ничего не делает
hInstance := SysInit.HInstance;  // Правильно



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
ImmortalAlexSan
Дата 10.1.2011, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



За разбор полетов благодарен очень, долго ждал этого! Я в WM_PAINT добавил SendMessage(Window,WM_NCPAINT,1,0) для того, чтобы рамка оконная перерисовывалась, а то, когда за границу рабочего стола увожу окно, рамка стирается. Подскажи пожалуйста что нужно написать в обработке перерисовки клиентской части окна, чтобы перерисовать его.
PM MAIL   Вверх
Rrader
  Дата 11.1.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата(ImmortalAlexSan @  11.1.2011,  02:56 Найти цитируемый пост)
когда за границу рабочего стола увожу окно, рамка стирается

Такой эффект был из-за ошибки в объявлении оконной процедуры. После исправления надобности в перерисовке неклиентской области нет.
Цитата(ImmortalAlexSan @  11.1.2011,  02:56 Найти цитируемый пост)
Подскажи пожалуйста что нужно написать в обработке перерисовки клиентской части окна, чтобы перерисовать его. 

Ты спрашиваешь о том, чего быть не должно. Т.е. ты перерисовываешь окно в обработчике перерисовки, а это звучит как бесконечный цикл. Хотя, если ты напишешь UpdateWindow() в коде обработки WM_PAINT, то ничего не будет (функция увидит, что регион обновления окна пуст, и вернет управление). Это к слову, так писать не надо.

Сформулируй вопрос правильно, что тебе нужно делать в обработчике WM_PAINT?


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
ImmortalAlexSan
Дата 11.1.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rrader, огромнейшее спасибо! Исправил переменные функции и всё стало нормально работать!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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