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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #151  
Старый 14.12.2012, 00:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

К каждой библиотеке идут примеры, посмотри их.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (14.12.2012)
  #152  
Старый 14.12.2012, 00:47
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Покажите пожалуйста наглядный пример рисования текста на окне с использованием TextOut или DrawText, а то у меня чего-то не выходит.
Ответить с цитированием
  #153  
Старый 14.12.2012, 00:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Тут всё просто:
Код:
var
  aRect : TRect;
begin
  SetRect(aRect, 10, 10, 100, 20); // выставь координаты прямоугольника для текста
  DrawText(DC, PChar('Мой текст'), -1, aRect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  TextOut(DC, 10, 10, PChar('Мой текст'), 9);
end;

Использование DrawText можешь посмотреть в выложенном примере в процедуре ListViewDrawItem.
Код:
procedure ListViewDrawItem(lpdis : PDRAWITEMSTRUCT);
var
  aRect	: TRect;
begin
...
  DrawText(lpdis.hDC, PChar(LV_GetItemText(PlayList, lpdis.itemID, 1)), -1, aRect, DT_VCENTER or DT_END_ELLIPSIS);
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 14.12.2012 в 01:00.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (14.12.2012)
  #154  
Старый 15.12.2012, 00:43
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, возник вопрос: как проверить находится ли курсор на объекте?
Ответить с цитированием
  #155  
Старый 15.12.2012, 00:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Объект это контрол?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #156  
Старый 15.12.2012, 01:30
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Именно контрол (WinApi если что).
Ответить с цитированием
  #157  
Старый 15.12.2012, 01:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ты полнее скажи, что хочншь получить в итоге. Координаты курсора получают через GetCursorPos.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #158  
Старый 15.12.2012, 02:31
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

При нажатии на полосу прокрутки (MouseDown) и переместить за пределы, из-за этого не присвоится PBMouseDown на False, т.к. он присваивается на MouseUp.
Ответить с цитированием
  #159  
Старый 15.12.2012, 02:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Переделай так: (SetCapture(Wnd)/ReleaseCapture)
Код:
function PlayBarWndProc(Wnd : HWND; Msg, wParam, lParam : Longint) : Longint; stdcall;
var
  I     : Integer;
  Pt    : TPoint;
  aRect : TRect;
begin
  Result := CallWindowProc(hPlayBarPrev, Wnd, Msg, wParam, lParam);
  case Msg of
    // Сообщение при нажатии левой кнопки мыши по прогрессбару
    WM_LBUTTONDOWN :
    begin
      Pt.X := LOWORD(lParam);
      Pt.Y := HIWORD(lParam);
      // Получаем клиентские размеры окна
      GetClientRect(Wnd, aRect);
      // Устанавливаем позицию прогрессбара по клику
      I := Round(SendMessage(Wnd, PBM_GETRANGE, 0, 0) / aRect.Right * Pt.X);
      SendMessage(Wnd, PBM_SETPOS, I, 0);
      BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, I), BASS_POS_BYTE);
      PBMouseDown := True;
      SetCapture(Wnd);
    end;

    // Сообщение при перемещении курсора по прогрессбару
    WM_MOUSEMOVE :
    begin
      Pt.X := LOWORD(lParam);
      Pt.Y := HIWORD(lParam);
      // Получаем клиентские размеры окна
      GetClientRect(PlayBar, aRect);
      // Если нажата клавиша мыши, то ставим позицию прогрессбара по клику
      if GetKeyState(1) shr 31 = 1 then
        if PBMouseDown then
        begin
          I := Round(SendMessage(Wnd, PBM_GETRANGE, 0, 0) / aRect.Right * Pt.X);
          SendMessage(Wnd, PBM_SETPOS, I, 0);
          BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, I), BASS_POS_BYTE);
        end;
    end;

    // Сообщение при отжатии левой кнопки мыши по прогрессбару
    WM_LBUTTONUP :
    begin
      ReleaseCapture;
      PBMouseDown := False;
    end;
  end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (15.12.2012)
  #160  
Старый 15.12.2012, 11:39
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, вот порылся в интернете на счет трэя средствами WinApi - не нашёл, подскажите каким можно образом сворачивать программу в трэй и наоборот, еще и выводить сообщения.
Ответить с цитированием
  #161  
Старый 15.12.2012, 13:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот только не нужно про не нашёл, такой информации масса.
Код:
var
  TaskBarCreated: Boolean;

function TaskBarAddIcon(hWindow : HWND; ID : Cardinal; ICON : HICON; CallbackMessage : Cardinal; Tip : PChar) : Boolean;
var
  NID : TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd    := hWindow;
    uID    := ID;
    uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallbackMessage := CallbackMessage;
    hIcon  := Icon;
    lstrcpyn(szTip, Tip, SizeOf(szTip));
  end;
  Result := Shell_NotifyIcon(NIM_ADD, @NID);
end;

{----------------------------------------------------------}

function TaskBarModifyIcon(hWindow : HWND; ID : Cardinal; Flags : Cardinal; ICON : HICON; Tip : PChar) : Boolean;
var
  NID : TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd    := hWindow;
    uID    := ID;
    uFlags := Flags;
    hIcon  := Icon;
    lstrcpyn(szTip, Tip, SizeOf(szTip));
  end;
  Result := Shell_NotifyIcon(NIM_MODIFY, @NID);
end;

{----------------------------------------------------------}

function TaskBarDeleteIcon(hWindow : HWND; ID : Integer) : Boolean;
var
  NID : TNotifyIconData;
begin
  FillChar(NID, SizeOf(TNotifyIconData), 0);
  with NID do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd    := hWindow;
    uID    := ID;
  end;
  Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;

//---------------------------------------------------------
//                    прячем в Tray
//---------------------------------------------------------

procedure CreateTaskBarIcon(Wnd : HWND);
begin
  TaskBarCreated := TaskBarAddIcon(Wnd, ICON_ID, AppBossIcon, WM_TASKBAR, szBossName);
end;
...
function WndProc(Wnd : HWND; Msg, wParam, lParam : Longint) : Longint; stdcall;
begin
  Resut := 0;
  case Msg of
  WM_SYSCOMMAND :
  begin
    case LOWORD(wParam) of
      SC_MINIMIZE :
      begin
        CreateTaskbarIcon(Wnd);
        ShowWindow(Wnd, SW_MINIMIZE);
        ShowWindow(Wnd, SW_HIDE);
      end;
  
      SC_RESTORE :
      begin
        if TaskBarCreated then
        begin
          TaskBarDeleteIcon(Wnd, ICON_ID);
          TaskBarCreated := False;
          ShowWindow(Wnd, SW_RESTORE);
        end;
      end;
    end;
  end;

  WM_DESTROY :
  begin
    if TaskBarCreated then
      TaskBarDeleteIcon(Wnd, ICON_ID);
    PostQuitMessage(0);
    Exit;
  end;
  Result := DefWindowProc(Wnd, Msg, wParam, lParam);
end;
Более подробно смотри в сети.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (15.12.2012)
  #162  
Старый 16.12.2012, 01:27
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо! Все же вот плохо что мерцают окна, аж глаза режет. Вот нашел хорошую статью, однако пример двойной буферизации написан не на Delphi, не знаю как реализовать, помогите...
Ответить с цитированием
  #163  
Старый 16.12.2012, 01:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Так называемая "двойная буферизация" решается просто, нужно запретить перерисовку фона окна, но тогда это придётся делать самостоятельно.

Так запрещаем перерисовку фона
Код:
    WM_ERASEBKGND :
    begin
      Result := 1;
      Exit;
    end;
но теперь в сообщении WM_PAINT, нужно самим залить фон нужным цветом.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (16.12.2012)
  #164  
Старый 16.12.2012, 16:05
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
...в сообщении WM_PAINT, нужно самим залить фон нужным цветом.
Как заливать? FillRect и SetBkColor не помогает.
Ответить с цитированием
  #165  
Старый 17.12.2012, 09:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
GetClientRect(hwnd, rct);
FillRect(dc, rct, GetStockObject(WHITE_BRUSH));
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter