← →
SHS
(2004-02-05 09:18)
[0]
Как вывести в TrayClock (TrayClockWClass) время в своём формате,
например с секундами? Проверяю программой Microsoft Spy++, в
Caption часов действительно содержаться мои данные, но в панели
не отображаются. Вот мой код:
var
hTaskbar, hTray, hClock: HWND;
procedure TForm1.FormCreate(Sender: TObject);
begin
hTaskbar := FindWindowEx(0, 0, «Shell_TrayWnd», nil);
hTray := FindWindowEx(hTaskbar, 0, «TrayNotifyWnd», nil);
hClock := FindWindowEx(hTray, 0, «TrayClockWClass», nil);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetWindowTextA(hClock, TimeToStr(Now));
UpdateWindow(hClock);
end;
← →
dr Tr0jan ©
(2004-02-05 15:04)
[1]
Попробуй убрать UpdateWindow, попробуй поставить период таймера 100 мс, попробуй все делать в отдельном потоке.
Такде можешь попробовать компонент TCoolTrayIcon, ИМХО, вышла уже 1.4 или больше, а может и 1.44, попробуй поищи!
А может быть дело даже в том, что часы в трее, это не текст а картика, а уж текст часов хранится как-раз для генерации картинки. Попробуй рисовать текст на канвасе часов.
← →
DVM ©
(2004-02-05 18:07)
[2]
> в
> Caption часов действительно содержаться мои данные, но в
> панели
> не отображаются. Вот мой код:
А кто сказал, что заголовок окна обязательно совпадает с текстом нарисованным на поверхности окна? Часы рисуют новое время раз в минуту (таймер имеет шаг минуту) или по WM_PAINT.
← →
SHS
(2004-02-06 15:43)
[3]
Сразу хочу поблагодарить за советы, спасибо!
Хочу ещё уточнить, значит я сам должен отрисовывать время? В правильном направлении иду с таким кодом или можно как-то эффективнее и красивее это сделать?
var
hTaskbar, hTray, hClock: HWND;
hCanvas: TCanvas;
procedure TForm1.FormCreate(Sender: TObject);
begin
hTaskbar := FindWindowEx(0, 0, «Shell_TrayWnd», nil);
hTray := FindWindowEx(hTaskbar, 0, «TrayNotifyWnd», nil);
hClock := FindWindowEx(hTray, 0, «TrayClockWClass», nil);
hCanvas := TCanvas.Create;
hCanvas.Handle := GetDC(hClock);
hCanvas.Brush.Style := bsClear;
hCanvas.Font.Color := clRed;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
hCanvas.TextOut(0, 10, TimeToStr(Now) );
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ReleaseDC(hClock, hCanvas.Handle);
hCanvas.Free;
end;
← →
DVM ©
(2004-02-06 19:04)
[4]
> В правильном направлении иду с таким кодом или можно как-то
> эффективнее и красивее это сделать?
Эффективнее, это использовать только функции GDI. Но это не тот случай, где будет ощутима разница.
Направление вроде правильное.
Форум программистов Vingrad
Поиск: |
|
Опции темы |
AntonChik |
|
||||
Бывалый Профиль
Репутация: 1
|
Здравствуйте,
2.далее готовим свою форму с часами и погодой
ну или тип того… Не знаю как правильно использовать для этого SetParent,Parent,ParentWindows и прочее… Помогите,пожалуйста… ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||||
|
|||||
Artemon |
|
||
а ты мне нравишься Профиль
Репутация: 7
|
Решение намного проще. 1) Получи Handle часов (что ты и сделал) P.S. ——————— Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
||
|
|||
Romikgy |
|
||||||
Любитель-программер Профиль
Репутация: 11
|
Добавлено @ 12:35
это лучше взять у
——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||||
|
|||||||
AntonChik |
|
||
Бывалый Профиль
Репутация: 1
|
2Artemon: Спасибо за TextOut…Только вот хотел спросить, насколько это будет, так сказать, оправданно, ведь придется обновлять текст довольно-таки часто (я думаю каждые 2-5 сек),т.к. каждую минуту обновляется время, да и панелька на месте не стоит (если включен autohide)…а ведь, вообще, погоду можно обновлять и раз в 10 мин… 2Romikgy: и на твою строку с SetParent пишется опять же Cannot convert void* to TWinControl * Это сообщение отредактировал(а) AntonChik — 21.2.2006, 06:22 ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||
|
|||
Romikgy |
|
||||||||||
Любитель-программер Профиль
Репутация: 11
|
Имхо каждую секунду
Чет какая то непонятка
Это прототип, где здесь void*???
Добавлено @ 10:37
——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||||||||
|
|||||||||||
AntonChik |
|
||
Бывалый Профиль
Репутация: 1
|
боюсь тут дело в перегрузке функции
… как с этим справиться??? ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: 11
|
дык это чейто метод!
——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
AntonChik |
|
||
Бывалый Профиль
Репутация: 1
|
увы, ‘SetParent’ is not a member of ‘System’ Это сообщение отредактировал(а) AntonChik — 21.2.2006, 14:00 ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||
|
|||
_hunter |
|
||
Эксперт Профиль
Репутация: 24
|
ну напиши просто someControl->Parent = someOtherControl; ——————— Tempora mutantur, et nos mutamur in illis… |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: 11
|
есть? ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
AntonChik |
|
||
Бывалый Профиль
Репутация: 1
|
2Romikgy: подключаю winuser.h ,но не помогает… 2_hunter: Form2->Parent=(TWinControl*)hWnd компиляется, но при обращении выкидывает AccessViolation… и все-таки как быть с перегрузкой SetParent..??? ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: 11
|
AntonChik, создай отдельную ф-цию, вне объявлений класса Form2, и вызови там ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
AntonChik |
|
||
Бывалый Профиль
Репутация: 1
|
спасибо. да, были такие мысли… конечно же работает (в смысле нет перегрузки и все такое)…но, вцелом, вся эта замутка с подменой часов — пустая затея… Это сообщение отредактировал(а) AntonChik — 22.2.2006, 13:31 ——————— «Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги |
||
|
|||
Romikgy |
|
||||
Любитель-программер Профиль
Репутация: 11
|
Да , новую тему
А че это? ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
|
Правила форума «С++ Builder» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | C++ Builder | Следующая тема » |
uses
windows, messages, ShellAPI;
const
ClassName = ‘MyClockWndClass’;
var
hTrayClock,Window:hWnd;
idTM:cardinal;
function SysDateToStr: string;
const
sDateFmt = ‘dddd, d MMMM yyyy’;
var
ST : TSystemTime;
begin
GetLocalTime(ST);
SetLength(Result, MAX_PATH);
GetDateFormat(LOCALE_USER_DEFAULT,0, @ST,pchar(sDateFmt), @Result[1], MAX_PATH);
end;
function SysTimeToStr:string;
const
sTimeFmt = ‘HH:mm’;
var
ST : TSystemTime;
begin
GetLocalTime(ST);
SetLength(Result,15);
GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@Result[1],15);
end;
procedure TimerProc(wnd:HWND;uMsg,idEvent,dwTime:UINT);stdcall;
begin
InvalidateRect(wnd,nil,true);
end;
procedure RecalcWndPos;
var
r:TRect;
X,Y:integer;
begin
X:=GetSystemMetrics(SM_CXDLGFRAME);
Y:=GetSystemMetrics(SM_CYDLGFRAME);
GetWindowRect(hTrayClock,r);
SetWindowPos(Window,0,r.Left+X,r.Top+Y, r.Right-r.Left,r.Bottom-r.Top-Y,0);
end;
function AppWndProc(wnd: HWND; uMsg:DWORD; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
var
DC : HDC;
ps :TPaintStruct;
pt :TPoint;
r :TRect;
Cmd : LongBool;
hm:HMenu;
begin
Result := 0;
case uMsg of
WM_SETTINGCHANGE: if wParam=SPI_SETWORKAREA then RecalcWndPos;
WM_PAINT:
begin
DC:=BeginPaint(wnd,ps);
GetClientRect(wnd,r);
SetBkMode(DC,TRANSPARENT);
SetTextColor(DC,RGB(255,255,0));
DrawText(DC,PChar(SysTimeToStr),-1,r,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(wnd,ps);
exit;
end;
WM_RBUTTONDOWN:
begin
hm:=CreatePopupMenu;
pt.X:=LOWORD(lParam);
pt.Y:=HIWORD(lParam);
ClientToScreen(wnd,pt);
Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,$101,’Exit’);
Insertmenu(hm,0,MF_BYPOSITION or MF_SEPARATOR,0,nil);
Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,$102,’Date/Time Settings’);
Insertmenu(hm,0,MF_BYPOSITION or MF_SEPARATOR,0,nil);
Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,dword(-1),PChar(SysDateToStr));
SetMenuDefaultItem(hm,0,1);
Cmd:=TrackPopupMenu(hM,TPM_LEFTALIGN or TPM_RIGHTBUTTON or
TPM_RETURNCMD,pt.X,pt.Y,0,Window,nil);
case longint(Cmd) of
$101: SendMessage(wnd,wm_destroy,0,0);
$102: ShellExecute(0,nil,’control.exe’,’date/time’,nil,SW_SHOW);
end;
DestroyMenu(hm);
end;
WM_DESTROY:
begin
PostQuitMessage(wparam);
KillTimer(wnd,idTM);
end
end;
Result := DefWindowProc(wnd, uMsg, wParam, lParam);
end;
procedure InitInstance;
var
AppWinClass: TWndClass;
begin
with AppWinClass do
begin
style:= CS_VREDRAW or CS_HREDRAW;
lpfnWndProc:= @AppWndProc;
cbClsExtra:= 0;
cbWndExtra:= 0;
hInstance:= hInstance;
hIcon:= LoadIcon(0,IDI_APPLICATION);
hCursor:= LoadCursor(0,IDC_ARROW);
hbrBackground:= GetStockObject(BLACK_BRUSH);
lpszMenuName:= nil;
lpszClassName:= ClassName;
end;
if RegisterClass(AppWinClass)=0 then Halt(1)
end;
procedure InitApplication;
begin
hTrayClock:=FindWindowEx(FindWindowEx(FindWindow(‘Shell_TrayWnd’,nil),0,’TrayNotifyWnd’,nil),0,’TrayClockWClass’,nil);
Window := CreateWindow(ClassName,nil, WS_POPUP or WS_DLGFRAME, 0,0,0,0, hTrayClock,0,HInstance,nil);
If Window=0 then halt(1);
RecalcWndPos;
end;
procedure InitWindow;
begin
idTM:=SetTimer(Window,1,1000,@TimerProc);
ShowWindow(Window, SW_SHOWNORMAL);
UpdateWindow(Window);
InvalidateRect(Window,nil,True)
end;
procedure MsgLoop;
var
Message:TMsg;
begin
while GetMessage(Message, 0, 0, 0) do
begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
Halt(Message.wParam)
end;
begin
InitInstance;
InitApplication;
InitWindow;
MsgLoop
end.