Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.09.2009, 19:32
Muxa Muxa вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 80
Репутация: 10
По умолчанию Progress Bar на WinAPI

Код:
program Project1;

uses
  Windows, Messages;

const
WndClass = 'TWinWnd';
WndCaption = '';
ProgBrID = 1;
PBS_MARQUEE = $08;
PBM_SETMARQUEE  = WM_USER+10;

var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;
  ProgBr: hwnd;


function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
Result:=0; 
  case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

begin
   with Wc do
   begin
      cbSize := SizeOf( Wc );
      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_WINDOW;
      lpszMenuName := nil;
      lpszClassName := WndClass;
   end;
   RegisterClassEx( Wc );
   Wnd := CreateWindowEx( 0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                          10, 10, 300, 100, 0, 0, hInstance, nil );


   ProgBr := CreateWindowEx( WS_EX_CLIENTEDGE, 'PROGRESS_CLASS', '',
                           WS_VISIBLE,
                           10, 10, 270, 20, Wnd, ProgBrID, hInstance, nil );
   SendMessage( ProgBr, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
   SetWindowLong (ProgBr, GWL_STYLE, (GetWindowLong (0, GWL_STYLE) or PBS_MARQUEE));
   SendMessage(ProgBr,PBM_SETMARQUEE, 1, 50);
   ShowWindow( Wnd, SW_SHOWNORMAL );

   while GetMessage( Msg, 0, 0, 0 ) do
   begin
      TranslateMessage( Msg );
      DispatchMessage( Msg );
   end;
   Halt( Msg.wParam );
end.

Почему-то мой ProgressBar не отображает на форме... В чем причина?. В общем должно быть как в Неро. Бегать полоска туда-сюда.
Ответить с цитированием
  #2  
Старый 30.09.2009, 20:13
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Потому что нет окна с классом 'PROGRESS_CLASS'
Код:
PROGRESS_CLASS = 'msctls_progress32';
Подключи модуль CommCtrl и не забудь вызвать InitCommonControls для инициализации библиотеки CommCtrl.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #3  
Старый 01.10.2009, 11:29
Muxa Muxa вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 80
Репутация: 10
По умолчанию

Что-то не выходит у меня( Все равно не отображает. Может вы выложите готовый проект?
Ответить с цитированием
  #4  
Старый 01.10.2009, 19:30
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Код:
  InitCommonControls;
  ....
  ....
  PrgBar := CreateWindowEx( WS_EX_CLIENTEDGE, PROGRESS_CLASS, '',
                           WS_VISIBLE or WS_CHILD,
                           10, 10, 270, 20, handle, 0, hInstance, nil );

Он у тебя должен был отображаться, но не в родительском окне, а в виде еще одного окна.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #5  
Старый 02.10.2009, 13:37
Muxa Muxa вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 80
Репутация: 10
По умолчанию

У меня выходит просто пустое окно.
Ответить с цитированием
  #6  
Старый 02.10.2009, 15:10
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Код:
SetWindowLong (ProgBr, GWL_STYLE, (GetWindowLong (0, GWL_STYLE) or PBS_MARQUEE));
А зачем ты делаешь его невидимым?

Код:
SetWindowLong (ProgBr, GWL_STYLE, (GetWindowLong (ProgBr, GWL_STYLE) or PBS_MARQUEE));
__________________
...сказал, и загрустил от бесспорной своей правоты

Последний раз редактировалось 0nni, 02.10.2009 в 16:01.
Ответить с цитированием
  #7  
Старый 02.10.2009, 19:39
Muxa Muxa вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 80
Репутация: 10
По умолчанию

Код:
program Project1;

uses
  Windows,
  Messages;
  {$R com_ctrl.res}
const
WndClass = 'TWinWnd';
WndCaption = '';
ProgBrID = 1;
PBS_MARQUEE = $08;
PBM_SETMARQUEE  = WM_USER+10;
var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;
  ProgBr: hwnd;

function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
  case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

begin

   with Wc do
   begin
      cbSize := SizeOf( Wc );
      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_WINDOW;
      lpszMenuName := nil;
      lpszClassName := WndClass;
   end;
   RegisterClassEx( Wc );
   Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,
                       10, 10, 300, 130, 0, 0, hInstance, nil );

  ProgBr := CreateWindowEx( 0, 'msctls_progress32', '', WS_POPUP or WS_VISIBLE, 20, 40, 100, 20, wnd, 0, hinstance, nil );
   SetWindowLong (ProgBr, GWL_STYLE, (GetWindowLong (ProgBr, GWL_STYLE) or PBS_MARQUEE));
   SendMessage(ProgBr,PBM_SETMARQUEE, 1, 10);
   ShowWindow( Wnd, SW_SHOWNORMAL );

   while GetMessage( Msg, 0, 0, 0 ) do
   begin
      TranslateMessage( Msg );
      DispatchMessage( Msg );
   end;
   Halt( Msg.wParam );
end.

И еще один нюанс. Как сделать так, чтобы окно прогресс бара принадлежало главному? А то получается так что окно можно таскать, а прогресс не лежит на нем и стоит на месте.

Последний раз редактировалось Muxa, 03.10.2009 в 08:21.
Ответить с цитированием
  #8  
Старый 03.10.2009, 08:41
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

WS_POPUP or WS_VISIBLE исправь на WS_CHILD or WS_VISIBLE
WS_CHILD - стиль дочернего окна

Почитай немного теории по винапи, вмне в свое время помогла "Азбука программирования на WinApi" и Program Files\Common Files\borland\MSHelp\WIN32.HLP - не забудь про него.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #9  
Старый 03.10.2009, 08:45
Muxa Muxa вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 80
Репутация: 10
По умолчанию

Все получилось. Оказывается решение было таким простым С меня +.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:30.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025