Ветеран
Сообщения: 1264
Благодарности: 1024
|
Профиль
|
Отправить PM
| Цитировать
Цитата AlekseyPopovv:
А как в стандартных MsgBox поменять цвет? »
|
AlekseyPopovv, например, так:
Скрытый текст
Код:
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}\test
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
WH_CBT = 5;
HCBT_CREATEWND = 3;
WC_DIALOG = '#32770';
WM_INITDIALOG = $0110;
WM_ERASEBKGND = $0014;
WM_PAINT = $000F;
WM_CTLCOLORSTATIC = $0138;
WM_CTLCOLORBTN = $0135;
WM_DESTROY = $0002;
TRANSPARENT = 1;
type
PAINTSTRUCT = record
hdc: THandle;
fErase: BOOL;
rcPaint: TRect;
fRestore: BOOL;
fIncUpdate: BOOL;
rgbReserved: array [0..31] of Byte;
end;
function GetCurrentThreadId: DWORD; external 'GetCurrentThreadId@kernel32.dll stdcall';
function CallNextHookEx(hhk: THandle; nCode: Integer; wParam, lParam: Longint): Longint; external 'CallNextHookEx@user32.dll stdcall';
function SetWindowsHookEx(idHook: Integer; lpfn, hMod: Longint; dwThreadId: DWORD): THandle; external 'SetWindowsHookEx{#A}@user32.dll stdcall';
function UnhookWindowsHookEx(hhk: THandle): BOOL; external 'UnhookWindowsHookEx@user32.dll stdcall';
function SetWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint): Longint; external 'DefSubclassProc@comctl32.dll stdcall';
function GetClassName(hWnd: HWND; lpClassName: string; nMaxCount: Integer): Integer; external 'GetClassName{#A}@user32.dll stdcall';
function GetSysColorBrush(nIndex: Integer): THandle; external 'GetSysColorBrush@user32.dll stdcall';
function SetBkMode(hdc: THandle; iBkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';
function BeginPaint(hWnd: HWND; var lpPaint: PAINTSTRUCT): Longint; external 'BeginPaint@user32.dll stdcall';
function EndPaint(hWnd: HWND; const lpPaint: PAINTSTRUCT): Boolean; external 'EndPaint@user32.dll stdcall';
function FillRect(hDC: THandle; const lprc: TRect; hbr: THandle): Integer; external 'FillRect@user32.dll stdcall';
function GetUpdateRect(hWnd: HWND; var lpRect: TRect; bErase: BOOL): BOOL; external 'GetUpdateRect@user32.dll stdcall';
var
GCBTProc, GDlgProc: Longint;
GDlgHook, GBgndBrush: THandle;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function DlgProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): Longint;
var
ps: PAINTSTRUCT;
rc: TRect;
begin
case uMsg of
WM_INITDIALOG:
begin
if GBgndBrush = 0 then
GBgndBrush := GetSysColorBrush(13{COLOR_HIGHLIGHT для примера});
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;
WM_ERASEBKGND:
begin
GetUpdateRect(hWnd, rc, False);
FillRect(wParam, rc, GBgndBrush);
Result := 1;
end;
WM_PAINT:
begin
BeginPaint(hWnd, ps);
FillRect(ps.hdc, ps.rcPaint, GBgndBrush);
EndPaint(hWnd, ps);
end;
WM_CTLCOLORBTN, WM_CTLCOLORSTATIC:
begin
SetBkMode(wParam, TRANSPARENT);
Result := GBgndBrush;
end;
WM_DESTROY:
begin
RemoveWindowSubclass(hWnd, GDlgProc, 0);
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;
else
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;
end;
///////////////////////////////////////////////////////////////////
function CBTProc(nCode: Integer; wParam, lParam: Longint): Longint;
var
ClassName: string;
begin
case nCode of
HCBT_CREATEWND:
begin
ClassName := StringOfChar(#0, 64);
GetClassName(wParam, ClassName, Length(ClassName));
ClassName := TrimRight(ClassName);
case ClassName of
WC_DIALOG:
begin
if GDlgProc = 0 then
GDlgProc := CallbackAddr('DlgProc');
SetWindowSubclass(wParam, GDlgProc, 0, 0);
end;
end;
Result := 0;
end;
else
Result := CallNextHookEx(GDlgHook, nCode, wParam, lParam);
end;
end;
//////////////////
procedure HookDlg;
begin
if GCBTProc = 0 then
GCBTProc := CallbackAddr('CBTProc');
GDlgHook := SetWindowsHookEx(WH_CBT, GCBTProc, 0, GetCurrentThreadId);
end;
////////////////////
procedure UnHookDlg;
begin
UnhookWindowsHookEx(GDlgHook);
end;
///////////////////////////
procedure InitializeWizard;
begin
HookDlg;
end;
////////////////////////////
procedure DeinitializeSetup;
begin
if ExpandConstant('{wizardhwnd}') = '0' then Exit;
UnHookDlg;
end;
//////////////////////////////////////
function InitializeUninstall: Boolean;
begin
Result := True;
HookDlg;
end;
////////////////////////////////
procedure DeinitializeUninstall;
begin
UnHookDlg;
end;
|
Отправлено: 19:56, 21-03-2016
| #1445
|