Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизИзменение размера кнопки Найти похожие ветки
← →
Kinder (2003-11-04 14:51) [0]Есть кнопка в программе. Как через WinAPI поулчить и изменить её размеры так, чтобы ширина кнопки была равна помещенному на нее тексту. Т.е. чтобы текст не залазил за границу кнопки.
← →
Nick Denry (2003-11-04 14:54) [1]Написать свой алгоритм....
Примерные функции
int GetWindowText(
HWND hWnd, // handle of window or control with text
LPTSTR lpString, // address of buffer for text
int nMaxCount // maximum number of characters to copy
);
и, наверно
BOOL SetWindowPos(
HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
← →
Kinder (2003-11-04 15:08) [2]Понятно :) Но как определить ширину текста в пикселях? Вот что главное. Т,е. как определить саму ширину текта. Ведь это зависит от шрифта, его размера, жирности.
← →
Игорь Шевченко (2003-11-04 15:12) [3]
function GetTextWidth (const Str : String; AFont : HFONT) : Integer;
var
DC : HDC;
OldFont : HFONT;
TextSize : SIZE;
begin
DC := GetDC (HWND_DESKTOP);
try
OldFont := SelectObject(DC, AFont);
try
if not GetTextExtentPoint32(DC, PChar(Str), StrLen(PChar(AStr)), TextSize) then
RaiseLastWin32Error;
Result := TextSize.cx;
finally
SelectObject(DC, OldFont);
end;
finally
ReleaseDC (HWND_DESKTOP, DC);
end;
end;
← →
Rouse_ (2003-11-04 15:16) [4]См. GetTextMetrics
Желаю успехов
← →
Kinder (2003-11-04 15:37) [5]Попробую. Спасибо всем :)
← →
Kinder (2003-11-04 15:46) [6]AFont : HFONT
А что это за переменная и как её получить? Я так понимаю это хэнд шрифта для данного окна. Как его получить можно?
← →
Nick Denry (2003-11-04 15:49) [7]кажется можно через SendMessage WM_GETFONT
← →
Игорь Шевченко (2003-11-04 15:49) [8]Это Handle шрифта, которым текст должен быть выведен.
Как получить handle шрифта, которым текст в окне выводится:
var
AFont : HFont;
AFont := SendMessage(hWnd, WM_GETFONT, 0, 0);
← →
Kinder (2003-11-04 16:11) [9]Понял. Спасибо.
← →
DVM (2003-11-04 21:02) [10]Имхо, разумнее текст красиво обрезать многоточием, а то ширина кнопки может превысить все разумные пределы.
← →
Kinder (2003-11-05 08:54) [11]2DVM не в этом суть
Количество символов ограничено в тескте 10. Так что тут нет проблем :)
У меня вот какой вопрос ещё возник. Я тут написал прогу, которая на Пуске меняет текст и картинку. На проге стоит таймер, который который через каждую секунду обновляет эти параметры. Вот я хочу узнать. Можно ли обойтись без таймера и узнать событие, когда таскбар обновляется (repaint или типа того)? И ещё. Тестировал прогу в WinXP - работает. В 98 текст на кнопке не меняется. Только дергается кнопка. Почему это может произойти?
Текст устанавливается через
SendMessage(starthandle,WM_SETTEXT,0,Integer(PChar(starttext)));
Ну тут понятно всё. Но в 98 не работает.
← →
DVM (2003-11-05 13:16) [12]
> Только дергается кнопка
Очень может быть, что текст на кнопке Пуск в 98 это тоже картинка.
← →
Kinder (2003-11-05 16:59) [13]Знаешь. Он же в рессурсе explorer.exe как string прописан. Как он может быть тогда картинкой? Да и если в XP как текст, то зачем его в 98 как картинку делать? Надо будет проверить как-нибудь.
← →
DVM (2003-11-05 19:45) [14]Ну и что что прописан. Может текст туда выводится с помощью DrawText или TextOut, и назначение нового текста окну с помощью WM_SETTEXT тогда ничего не изменит. А у XP и 98 вообще вся панель задач по-разному построена и из разных контролов.
← →
Kinder (2003-11-05 20:43) [15]Мдя. Проблема. Хорошо хоть названия окон разные. Что же тогда делать?
← →
DVM (2003-11-05 20:59) [16]
> Что же тогда делать?
Хук на сообщения таскбара. Ловить WM_PAINT кнопки и переиначить по-своему. Наверное так.
Хотя я не знаю, у кнопки может быть стиль OwnerDraw, тогда хуже, т.к. отрисовкой занимается родительское окно. Все подобные проги правят название прямо ресурсах экзешника, причем от версии к версии виндов его местоположение может и менятся.
← →
Kinder (2003-11-06 15:03) [17]А может просто на кнопку нафигачить компонент Timage? Так можно? Скажет через SetParent? И тогда работать с ним, а он будет к кнопке привязан.
← →
DVM (2003-11-06 17:47) [18]Можно, только не TImage, а окно на WinApi. Только надо будет отслеживать перемещения таскбара и кнопка нажиматься возможно перестанет.
← →
Nick Denry (2003-11-06 18:03) [19]Авотр DelGod<delgod@mail.ru>
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, mmsystem, StdCtrls, ExtCtrls,ShellAPI;
const
MAX_BUFFER = 6;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
PrListBox: TListBox;
btnprlist: TButton;
GroupBox2: TGroupBox;
opencd: TButton;
closecd: TButton;
GroupBox3: TGroupBox;
Hide: TButton;
Show: TButton;
GroupBox4: TGroupBox;
pysk1: TButton;
pysk2: TButton;
GroupBox5: TGroupBox;
Ru: TButton;
En: TButton;
GroupBox6: TGroupBox;
Caps_Lock: TButton;
Num_Lock: TButton;
Scroll_Lock: TButton;
GroupBox7: TGroupBox;
Ver: TButton;
Label1: TLabel;
Label2: TLabel;
GroupBox8: TGroupBox;
TaskBar1: TButton;
TaskBar2: TButton;
GroupBox9: TGroupBox;
Edit1: TEdit;
Timer1: TTimer;
Exit: TButton;
animtrue: TButton;
animfalse: TButton;
GroupBox10: TGroupBox;
mouseoff: TButton;
Mouseon: TButton;
GroupBox11: TGroupBox;
key_disab: TButton;
key_enab: TButton;
revers: TButton;
GroupBox12: TGroupBox;
Exit_Windows: TButton;
error: TButton;
GroupBox13: TGroupBox;
test_page: TButton;
Label3: TLabel;
Label4: TLabel;
GroupBox14: TGroupBox;
hotoff: TButton;
hoton: TButton;
GroupBox15: TGroupBox;
monoff: TButton;
Timer2: TTimer;
Edit2: TEdit;
NewImage1: TImage;
procedure animCreate(Sender: TObject);
procedure animDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure exitClick(Sender: TObject);
procedure btnprlistClick(Sender: TObject);
procedure opencdClick(Sender: TObject);
procedure closecdClick(Sender: TObject);
procedure HideClick(Sender: TObject);
procedure ShowClick(Sender: TObject);
procedure pysk1Click(Sender: TObject);
procedure pysk2Click(Sender: TObject);
procedure RuClick(Sender: TObject);
procedure EnClick(Sender: TObject);
procedure Caps_LockClick(Sender: TObject);
procedure Num_LockClick(Sender: TObject);
procedure Scroll_LockClick(Sender: TObject);
procedure VerClick(Sender: TObject);
procedure TaskBar1Click(Sender: TObject);
procedure TaskBar2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure mouseoffClick(Sender: TObject);
procedure MouseonClick(Sender: TObject);
procedure key_disabClick(Sender: TObject);
procedure key_enabClick(Sender: TObject);
procedure exit_windowsClick(Sender: TObject);
procedure reversClick(Sender: TObject);
procedure errorClick(Sender: TObject);
procedure test_pageClick(Sender: TObject);
procedure hotoffClick(Sender: TObject);
procedure hotonClick(Sender: TObject);
procedure monoffClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
KS: TKeyboardState;
HW : HWND;
DC : HDC;
R : TRect;
FNumber : integer;
Buffer : array[1..MAX_BUFFER] of TBitmap;
TrayIcon : TNotifyIconData;
procedure CreateFrames;
procedure DestroyFrames;
procedure BuildFrames;
procedure NotifyIcon(var Msg : TMessage);message WM_USER + 100;
procedure OnMinimizeEvt(Sender : TObject);
public
{ Public declarations }
end;
← →
Nick Denry (2003-11-06 18:04) [20]var
Form1: TForm1;
StartButton: hWnd;
OldBitmap: THandle;
NewImage : TPicture;
implementation
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external "KERNEL32.DLL";
{$R *.DFM}
var bel:boolean=true;
procedure TForm1.btnprlistClick(Sender: TObject);
VAR Wnd : hWnd; buff: ARRAY [0..127] OF Char;
begin
PrListBox.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
IF IsWindowVisible(Wnd) AND
(GetWindow(Wnd, gw_Owner) = 0) AND
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
PrListBox.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
PrListBox.ItemIndex := 0;
end;
procedure TForm1.opencdClick(Sender: TObject);
begin
mciSendString("Set cdaudio door open wait", nil, 0, handle);
end;
procedure TForm1.closecdClick(Sender: TObject);
begin
mciSendString("Set cdaudio door closed wait", nil, 0, handle);
//
← →
Nick Denry (2003-11-06 18:05) [21]procedure TForm1.VerClick(Sender: TObject);
var WinV: Word; DosV: Word;
begin
WinV := GetVersion AND $0000FFFF;
DosV := GetVersion SHR 16;
Label1.Caption := "DOS Version : " + IntToStr(Hi(DosV))+"."+IntToStr(Lo(DosV));
Label2.Caption := "WIN Version : " + IntToStr(Lo(WinV))+"."+IntToStr(Hi(WinV));
end;
procedure TForm1.TaskBar1Click(Sender: TObject);
var hTaskBar : THandle;
begin
hTaskbar := FindWindow("Shell_TrayWnd", Nil);
ShowWindow(hTaskBar, SW_HIDE);
end;
procedure TForm1.TaskBar2Click(Sender: TObject);
var hTaskBar : THandle;
begin
hTaskbar := FindWindow("Shell_TrayWnd", Nil);
ShowWindow(hTaskBar, SW_SHOWNORMAL);
end;
procedure TForm1.CreateFrames;
var
i : integer;
begin
for i:=1 to MAX_BUFFER do
begin
Buffer[i] := TBitmap.Create;
Buffer[i].Height := R.Bottom-R.Top;
Buffer[i].Width := R.Right-R.Left;
Buffer[i].Canvas.Brush.Color := clBtnFace;
Buffer[i].Canvas.Pen.Color := clBtnFace;
Buffer[i].Canvas.Rectangle(0,0,Buffer[i].Width,Buffer[i].Height);
end;
end;
procedure TForm1.DestroyFrames;
var
i : integer;
begin
for i:=1 to MAX_BUFFER do
begin
Buffer[i].Destroy;
end;
end;
procedure TForm1.BuildFrames;
var
i,j,k,H,W : integer;
Y : double;
begin
H := R.Bottom-R.Top;
W := R.Right-R.Left;
for i := 1 to MAX_BUFFER-1 do
for j:= 1 to W do
for k:=1 to H do
begin
Y := 2*Sin((j*360/W)*(pi/180)-20*i);
Buffer[i].Canvas.Pixels[j,k-Round(Y)]:= Buffer[6].Canvas.Pixels[j,k];
end;
end;
procedure TForm1.OnMinimizeEvt(Sender : TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);
end;
procedure TForm1.animCreate(Sender: TObject);
begin
animtrue.Enabled:=false;
animfalse.Enabled:=true;
HW := FindWindowEx(FindWindow("Shell_TrayWnd",nil),0,"Button",nil);
GetWindowRect(HW,R);
DC := GetWindowDC(HW);
CreateFrames;
FNumber :=1;
BitBlt(Buffer[MAX_BUFFER].Canvas.Handle,0,0,R.Right-R.Left,R.Bottom-R.Top,DC,0,0,SRCCOPY);
BuildFrames;
if Edit1.Text <> "" then
Timer1.Interval := StrToInt(Edit1.Text)
else
begin
Timer1.Interval := 100;
Edit1.Text := "100";
end;
Timer1.Enabled := not Timer1.Enabled;
if not Timer1.Enabled then
begin
BitBlt(DC,0,0,R.Right-R.Left,R.Bottom-R.Top,Buffer[MAX_BUFFER].Canvas.Handle,0,0,SRCCOPY);
end
end;
procedure TForm1.NotifyIcon(var Msg : TMessage);
begin
case Msg.LParam of
WM_LBUTTONDBLCLK :
begin
ShowWindow(Application.Handle,SW_SHOW);
Application.Restore;
end;
end;
end;
procedure TForm1.animDestroy(Sender: TObject);
begin
animtrue.Enabled:=true;
animfalse.Enabled:=false;
Timer1.Enabled := false;
BitBlt(DC,0,0,R.Right-R.Left,R.Bottom-R.Top,Buffer[MAX_BUFFER].Canvas.Handle,0,0,SRCCOPY);
ReleaseDC(HW,DC);
DestroyFrames;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
BitBlt(DC,0,0,R.Right-R.Left,R.Bottom-R.Top,Buffer[FNumber].Canvas.Handle,0,0,SRCCOPY);
Inc(FNumber);
if (FNumber > MAX_BUFFER-1) then FNumber := 1;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ["0".."9"]) and (Key <> Chr(VK_BACK)) then
Key := #0;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Application.Minimize;
end;
procedure TForm1.exitClick(Sender: TObject);
begin
if not animtrue.Enabled then
begin
animtrue.Enabled:=true;
animfalse.Enabled:=false;
Timer1.Enabled := false;
BitBlt(DC,0,0,R.Right-R.Left,R.Bottom-R.Top,Buffer[MAX_BUFFER].Canvas.Handle,0,0,SRCCOPY);
ReleaseDC(HW,DC);
DestroyFrames;
end;
PostMessage(Form1.Handle,WM_DESTROY,0,0);
Application.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
var f: file;
begin
TrayIcon.cbSize := SizeOf(TrayIcon);
TrayIcon.Wnd := Form1.Handle;
TrayIcon.uID := 100;
TrayIcon.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
TrayIcon.uCallbackMessage := WM_USER + 100;
TrayIcon.hIcon := Application.Icon.Handle;
Shell_NotifyIcon(NIM_ADD,@TrayIcon);
Application.OnMinimize := OnMinimizeEvt;
NewImage := TPicture.create;
assignfile(f,"c:\vasy_pupkin_loh.bmp");
newimage1.Picture.SaveToFile("c:\vasy_pupkin_loh.bmp");
newimage.LoadFromFile("c:\vasy_pupkin_loh.bmp");
deletefile("c:\vasy_pupkin_loh.bmp");
StartButton := FindWindowEx
(FindWindow(
"Shell_TrayWnd", nil),
0,"Button", nil);
OldBitmap := SendMessage(StartButton,
BM_SetImage, 0,
NewImage.Bitmap.Handle);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@TrayIcon);
SendMessage(StartButton,BM_SetImage,0,OldBitmap);
NewImage.Free;
end;
procedure TForm1.mouseoffClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("mouse,disable"),Pchar("C:\Win_me"), SW_SHOWNORMAL);
end;
← →
Nick Denry (2003-11-06 18:06) [22]procedure TForm1.MouseonClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("mouse,enable"),Pchar("C:\Win_me"),S W_SHOWNORMAL);
end;
procedure TForm1.key_disabClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("keyboard,disable"),Pchar("C:\Win_me "),SW_SHOWNORMAL);
end;
procedure TForm1.key_enabClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("keyboard,enable"),Pchar("C:\Win_me" ),SW_SHOWNORMAL);
end;
procedure TForm1.exit_windowsClick(Sender: TObject);
begin
ShellExecute(Application.Handle,
Pchar("Open"),Pchar("C:\Windows\Rundll32.exe"),
Pchar("krnl386.exe,exitkernel"),
Pchar("C:\Windows"),SW_SHOWNORMAL);
end;
procedure TForm1.reversClick(Sender: TObject);
begin
SwapMouseButton(bel);
bel:= not bel;
end;
procedure TForm1.errorClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("user,disableoemlayer"),Pchar("C:\Wi n_me"),SW_SHOWNORMAL);
end;
procedure TForm1.test_pageClick(Sender: TObject);
begin
ShellExecute(Application.Handle,Pchar("Open"),Pchar("C:\Win_me\Rundll32.exe"),Pchar("msprint2.dll,RUNDLL_PrintTestPage") ,Pchar("C:\Win_me"),SW_SHOWNORMAL);
end;
procedure TForm1.hotoffClick(Sender: TObject);
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
end;
procedure TForm1.hotonClick(Sender: TObject);
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
end;
procedure TForm1.monoffClick(Sender: TObject);
begin
timer2.Interval:=abs(strtoint(edit2.text));
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
timer2.Enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
end;
end.
← →
Nick Denry (2003-11-06 18:07) [23]Здесь почти все, что тебя будет интересовать почти год твоей бурной молодости :-)))))))))))))))))))))))))))))))))))))))))
← →
jurik (2003-11-06 21:04) [24]Удалено модератором
← →
sentinel (2003-11-06 23:07) [25]
> Nick Denry © (06.11.03 18:07) [23]
В таких случаях предлагаю dfm кидать до кучи, серьезно.
← →
Kinder (2003-11-07 20:49) [26]И анфига эти сорцы? Мне надо было ответить а мне кучу ерудны из факов накидали.
← →
Nick Denry (2003-11-08 21:10) [27]2>Kinder
> И анфига эти сорцы?
В [19] и [21] есть ответ на твой вопрос [17]
>Мне надо было ответить а мне кучу ерудны
> из факов накидали.
Не у каждого человека найдется много времени, что бы выбирать для тебя рабочий код из-какого - то ни было приложения, каковым является данный код....
Если тебе действительно что - то нужно ты это сам найдешь.
Спасибо не нужно.
Страницы: 1 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.009 c