![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#151
|
||||
|
||||
|
К каждой библиотеке идут примеры, посмотри их.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (14.12.2012)
| ||
|
#152
|
||||
|
||||
|
Покажите пожалуйста наглядный пример рисования текста на окне с использованием TextOut или DrawText, а то у меня чего-то не выходит.
|
|
#153
|
||||
|
||||
|
Тут всё просто:
Код:
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; Последний раз редактировалось angvelem, 14.12.2012 в 01:00. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (14.12.2012)
| ||
|
#154
|
||||
|
||||
|
Спасибо, возник вопрос: как проверить находится ли курсор на объекте?
|
|
#155
|
||||
|
||||
|
Объект это контрол?
|
|
#156
|
||||
|
||||
|
Именно контрол (WinApi если что).
|
|
#157
|
||||
|
||||
|
Ты полнее скажи, что хочншь получить в итоге. Координаты курсора получают через GetCursorPos.
|
|
#158
|
||||
|
||||
|
При нажатии на полосу прокрутки (MouseDown) и переместить за пределы, из-за этого не присвоится PBMouseDown на False, т.к. он присваивается на MouseUp.
|
|
#159
|
||||
|
||||
|
Переделай так: (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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (15.12.2012)
| ||
|
#160
|
||||
|
||||
|
Спасибо, вот порылся в интернете на счет трэя средствами WinApi - не нашёл, подскажите каким можно образом сворачивать программу в трэй и наоборот, еще и выводить сообщения.
|
|
#161
|
||||
|
||||
|
Вот только не нужно про не нашёл, такой информации масса.
Код:
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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (15.12.2012)
| ||
|
#162
|
||||
|
||||
|
Спасибо! Все же вот плохо что мерцают окна, аж глаза режет. Вот нашел хорошую статью, однако пример двойной буферизации написан не на Delphi, не знаю как реализовать, помогите...
|
|
#163
|
||||
|
||||
|
Так называемая "двойная буферизация" решается просто, нужно запретить перерисовку фона окна, но тогда это придётся делать самостоятельно.
Так запрещаем перерисовку фона Код:
WM_ERASEBKGND :
begin
Result := 1;
Exit;
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (16.12.2012)
| ||
|
#164
|
||||
|
||||
|
Цитата:
|
|
#165
|
||||
|
||||
|
Код:
GetClientRect(hwnd, rct); FillRect(dc, rct, GetStockObject(WHITE_BRUSH)); |