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