Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

Изменение размера кнопки   Найти похожие ветки 

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.008 c
14-37941
zzet
2003-12-19 22:54
2004.01.13
Share It - кто пользуется сервисом?


1-37735
Evgeny78
2003-12-30 13:06
2004.01.13
OLE Automation


14-37860
ИМХО
2003-12-20 12:02
2004.01.13
Microsoft Exchange


6-37822
DNT
2003-11-12 11:33
2004.01.13
Слишком много коннектов...


7-37953
LAMA3OID
2003-10-29 15:06
2004.01.13
Хук на функцию





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский