Hint на системных кнопках, Как енто делается?
Falk0ner, вс, 06/07/2008 - 15:34.
Взято из http://forum.sources.ru
Автор: Rouse_
Hint на системных кнопках, Как енто делается?
Довольно сложный вопрос. Так просто не сделаешь. Нужно отлавливать WM_NCMOUSEMOVE и WM_NCHITTEST в них блокировать системный хинт и отрисовывать свой. Нет временипример делать. Но тут еще одно - если ты их решил модифицировать, то тебе нужно еще и два системных меню русифицировать. то которое в заголовке формы и то которое в тулбаре внизу. Это на порядок проще и делается вот таким кодом:
unit Unit1;
{©Drkb v.3(2007): www.drkb.ru}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ChangeMenuLanguage(AHandle: THandle);
const
RusTranscriptionCount = 6;
SysMenuID: array [0..RusTranscriptionCount - 1] of UINT =
(SC_RESTORE, SC_MOVE, SC_SIZE, SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE);
RusTranscription: array [0..RusTranscriptionCount - 1] of String =
( '&Восстановить', '&Переместить', '&Размер', '&Свернуть',
'Р&азвернуть', '&Закрыть'#9'Alt+F4');
var
SysMenu: HMENU;
MenuItem: TMenuItemInfo;
ItemCount, I, A: Integer;
MenuString: array [0..MAXCHAR - 1] of Char;
begin
SysMenu := GetSystemMenu(AHandle, False);
if SysMenu <> 0 then
begin
ItemCount := GetMenuItemCount(SysMenu);
for I := 0 to ItemCount - 1 do
begin
ZeroMemory(@MenuItem, SizeOf(TMenuItemInfo));
MenuItem.cbSize := SizeOf(TMenuItemInfo);
MenuItem.fMask := MIIM_ID or MIIM_STRING or MIIM_BITMAP;
MenuItem.dwTypeData := MenuString;
MenuItem.cch := MAXCHAR;
if GetMenuItemInfo(SysMenu, I, True, MenuItem) then
for A := 0 to RusTranscriptionCount - 1 do
if SysMenuID[A] = MenuItem.wID then
begin
MenuItem.dwTypeData := PChar(RusTranscription[A]);
MenuItem.cch := Length(RusTranscription[A]);
if not SetMenuItemInfo(SysMenu, I, True, MenuItem) then RaiseLastOSError;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ChangeMenuLanguage(Handle);
ChangeMenuLanguage(Application.Handle);
end;
{©Drkb v.3(2007): www.drkb.ru}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ChangeMenuLanguage(AHandle: THandle);
const
RusTranscriptionCount = 6;
SysMenuID: array [0..RusTranscriptionCount - 1] of UINT =
(SC_RESTORE, SC_MOVE, SC_SIZE, SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE);
RusTranscription: array [0..RusTranscriptionCount - 1] of String =
( '&Восстановить', '&Переместить', '&Размер', '&Свернуть',
'Р&азвернуть', '&Закрыть'#9'Alt+F4');
var
SysMenu: HMENU;
MenuItem: TMenuItemInfo;
ItemCount, I, A: Integer;
MenuString: array [0..MAXCHAR - 1] of Char;
begin
SysMenu := GetSystemMenu(AHandle, False);
if SysMenu <> 0 then
begin
ItemCount := GetMenuItemCount(SysMenu);
for I := 0 to ItemCount - 1 do
begin
ZeroMemory(@MenuItem, SizeOf(TMenuItemInfo));
MenuItem.cbSize := SizeOf(TMenuItemInfo);
MenuItem.fMask := MIIM_ID or MIIM_STRING or MIIM_BITMAP;
MenuItem.dwTypeData := MenuString;
MenuItem.cch := MAXCHAR;
if GetMenuItemInfo(SysMenu, I, True, MenuItem) then
for A := 0 to RusTranscriptionCount - 1 do
if SysMenuID[A] = MenuItem.wID then
begin
MenuItem.dwTypeData := PChar(RusTranscription[A]);
MenuItem.cch := Length(RusTranscription[A]);
if not SetMenuItemInfo(SysMenu, I, True, MenuItem) then RaiseLastOSError;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ChangeMenuLanguage(Handle);
ChangeMenuLanguage(Application.Handle);
end;
Взято из http://forum.sources.ru
Автор: Rouse_
Отправить комментарий