![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачное STATIC-окно [D7, WinXP]
Dmitry_177 © (2006-11-19 23:50:00)Создаю на форме (которое было создано hWindow := CreateWindowEx(WS_EX_LAYERED, WindowName, WindowName, WS_POPUP or WS_SYSMENU, cw_UseDefault, cw_UseDefault, 283, 149, 0, 0, HInstance, nil);) STATIC-окно что бы оно было прозрачным, т.е. Transporent, чтобы прямоугольник был прозрачным кроме текста, но этого почему-то не происходит... Создаю это окно так: CreateWindowEx(WS_EX_TRANSPARENT, 'STATIC', '00:00:00', SS_LEFT or WS_CHILD or WS_VISIBLE, 18, 34, 168, 52, hWindow, 0, HInstance, nil); Почему оно не прозрачное?
Rouse_ (2006-11-23 17:10:00) [1]там же и ответил
Dmitry_177 (2006-11-23 15:25:00) [2]он в этой теме тут: http://forum.sources.ru/index.php?showtopic=162329&st=0entry1353043
Dmitry_177 (2006-11-23 15:22:00) [3]выложил..
Rouse_ (2006-11-23 15:07:00) [4]Давайка целиком проект выложи куда нибудь. Что гадать попусту?
Dmitry_177 (2006-11-23 13:48:00) [5]Так у меня почему-то не работает...
Result := 0;
case Message of
WM_PAINT: begin
dc := BeginPaint(hWindow, ps);
hMemDC := CreateCompatibleDC(dc);
SelectObject(hMemDC, hBMP);
GetClientRect(hWindow, rect);
BitBlt(dc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
EndPaint(hWindow, ps);
end;
WM_TIMER: begin
GetTimeFormat(0, 0, nil, 'HH:mm:ss', DateTime, 8);
SendMessage(hLabelTime, WM_SETTEXT, 0, Integer(PChar(@DateTime)));
SendMessage(hWindow, WM_PAINT, 0, 0);
end;
Rouse_ (2006-11-23 09:43:00) [6]SendMessage(Хэндл окна а не лейбла, WM_PAINT, 0, 0);
Dmitry_177 (2006-11-22 18:26:00) [7]Что-то я не очень понял,
> Rouse_ © (22.11.06 17:51) [15]
> Не нуно текст рисовать, просто SetText
В смысле SetWindowText в WM_TIMER или в WM_PAINT?
> Rouse_ © (22.11.06 17:51) [15]
> а потом WM_PAINT и будет тебе счастье
WM_PAINT посылать надо или что? SendMessage(hLabelTime, WM_PAINT, 0, 0);?
делаю так:
var
DateTime: array [0..7] of Char;
function WindowProc(Window: HWnd; Message: Word; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := 0;
case Message of
WM_TIMER: begin
GetTimeFormat(0, 0, nil, 'HH:mm:ss', DateTime, 8);
SendMessage(hLabelTime, WM_SETTEXT, 0, Integer(PChar(@DateTime))); // или SetWindowText(hLabelTime, PChar(@DateTime));
SendMessage(hLabelTime, WM_PAINT, 0, 0);
end;
WM_PAINT: begin
//GetTimeFormat(0, 0, nil, 'HH:mm:ss', DateTime, 8);
// SetWindowText(hLabelTime, PChar(@DateTime)); // попробовал и тут эти строки, безрезультатно
dc := BeginPaint(window, ps);
hMemDC := CreateCompatibleDC(dc);
SelectObject(hMemDC, hBMP);
GetClientRect(window, rect);
BitBlt(dc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
EndPaint(window, ps);
end;
...
Rouse_, объясни пожалуйста получше что нужно сделать, а то не очень понятно...
Rouse_ (2006-11-22 17:51:00) [8]Не нуно текст рисовать, просто SetText а потом WM_PAINT и будет тебе счастье
Dmitry_177 (2006-11-22 17:44:00) [9]т.е. в обработке WM_PAINT главной формы, кроме рисования картинки рисовать еще текст? и Static-окно получается уже ненужно?
Rouse_ (2006-11-22 17:29:00) [10]естественно отлавливать в главной оконной процедуре...
Dmitry_177 (2006-11-22 17:17:00) [11]Я так и думал что WM_PAINT... а без него никак? А еще такой вопрос, попробовал я посылать сообщение WM_PAINT, с нулевыми параметрами static-окну после изменения текста, но это ничего не дало... Пробовал слать WM_PAINT и главному окну, тоже самое, также пробовал UpdateWindow, тоже толку не дало... Но у меня вопрос в том, какой WM_PAINT отлавливать? Тот который рисует на форме картинку (Rouse_ © (21.11.06 21:54) [8]), т.е. главной формы или WM_PAINT static-окна? Если второе подскажите пожалуйста как это сделать, там же нету callback-функции как в главной форме...
Rouse_ (2006-11-22 16:04:00) [12]репайнт делай WM_PAINT
Dmitry_177 (2006-11-22 00:23:00) [13]Тоже самое, не работает...((( Посмотрел весь код и не работает ((( У меня текст меняется в сообщении WM_TIMER:
var
str: array [0..25] of Char;
...
WM_TIMER: SendMessage(hLabel, WM_SETTEXT, 0, Integer(PChar(@str)));
Так вот текст то прозрачный, но потом он пишется поверх уже написанного, т.е. не стирается старый и получается неразбериха, т.к. текст на тексте, старый и новый...
Rouse_ (2006-11-21 21:54:00) [14]
// Задаем симфол который будет отображаться ри вводе пароля
SendMessage(Edit, EM_SETPASSWORDCHAR, Ord('*'), 0);
// Создаем Label
Label1 := CreateWindow('STATIC', PChar(TXT_STATUS),
WS_VISIBLE or WS_CHILD, 10, 13, 230, 14, Handle, 0, hInstance, nil);
// Создаем нужный шрифт
hFontNormal := CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');
// назначаем этот шрифт всем оконным элементам
if hFontNormal <> 0 then
begin
SendMessage(btnOk, WM_SETFONT, hFontNormal, 0);
SendMessage(btnCancel, WM_SETFONT, hFontNormal, 0);
SendMessage(Edit, WM_SETFONT, hFontNormal, 0);
SendMessage(Label1, WM_SETFONT, hFontNormal, 0);
end;
// Создаем пустую кисть
TransparentBrush := GetStockObject(NULL_BRUSH);
// Показываем окно
ShowWindow(Handle, SW_SHOW);
// Ставим его поверх всех
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE);
// Ставим фокус в поле ввода
SetFocus(Edit);
// Начинаем крутить цикл выборки сообщений
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Rouse_ (2006-11-21 21:54:00) [15]Мдя... мыши плакали кололись, MSDN то хоть читал?
RC файл: BACKGROUND BITMAP "test.bmp"
program AdvApiForm;
{$R 'bitmap.res' 'bitmap.rc'}
uses
Windows,
Messages;
resourcestring
TXT_CAPTION = 'Ввод пароля';
TXT_INSTALL = 'Принять';
TXT_CANCEL = 'Отмена';
TXT_STATUS = 'Введите пароль:';
TXT_NEWUSER = 'Значение пароля: ';
var
MainWindow : TWndClassEx;
Handle,
hFontNormal,
btnOk,
btnCancel,
Edit,
Label1 : HWND;
Msg : TMsg;
Left,
Top,
Width,
Height : Integer;
TransparentBrush: HGDIOBJ;
const
BTN_APPLY_ID = 100;
BTN_CANCEL_ID = 105;
EDIT_ID = 110;
// Центрирование формы
// =============================================================================
procedure CenterMainForm;
var
ScrWidth, ScrHeight: Cardinal;
begin
ScrWidth := GetSystemMetrics(SM_CXSCREEN);
ScrHeight := GetSystemMetrics(SM_CYSCREEN);
Left := (Integer(ScrWidth) - Width) div 2;
Top := (Integer(ScrHeight) - Height) div 2;
end;
// Определение размеров картинки
// =============================================================================
function PictureSize: TSize;
var
ResHandle: HWND;
ResData: HWND;
BMI: PBitmapInfo;
begin
Result.cx := 0;
Result.cy := 0;
ResHandle := FindResource(HInstance,
'BACKGROUND', RT_BITMAP);
if ResHandle <> 0 then
begin
ResData := LoadResource(HInstance, ResHandle);
if ResData <> 0 then
try
BMI := LockResource(ResData);
if Assigned(BMI) then
try
Result.cx := BMI.bmiHeader.biWidth;
Result.cy := BMI.bmiHeader.biHeight;
finally
UnlockResource(ResData);
end;
finally
FreeResource(ResData);
end;
end;
end;
// Отрисовка картинки на форме
// =============================================================================
procedure ShowPicture;
function Rect(Left, Top, Right, Bottom: Integer): TRect;
begin
Result.Left := Left;
Result.Top := Top;
Result.Right := Right;
Result.Bottom := Bottom;
end;
var
Bitmap: HBITMAP;
BitmapSize: TSize;
DC, BitmapDC, OldDC: HDC;
bLeft, bTop: Cardinal;
_Rect: TRect;
S: String;
Pen: HPEN;
begin
Bitmap := LoadBitmap(HInstance, 'BACKGROUND');
if Bitmap <> 0 then
try
BitmapSize := PictureSize;
DC := GetDC(Handle);
try
BitmapDC := CreateCompatibleDC(DC);
try
OldDC := SelectObject(BitmapDC, Bitmap);
try
bLeft := (Width - BitmapSize.cx);
BitBlt(DC, bLeft, 0, BitmapSize.cx, BitmapSize.cy, BitmapDC, 0, 0, SRCCOPY);
finally
SelectObject(OldDC, Bitmap);
end;
finally
DeleteDC(BitmapDC);
end;
finally
ReleaseDC(Handle, DC);
end;
finally
DeleteObject(Bitmap);
end;
end;
// Главная оконная процедура
// =============================================================================
function WindowProc(Wnd: HWND; Msg: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
S: String;
Len: Integer;
DC: HDC;
begin
Result := 0;
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
WM_COMMAND:
begin
case LoWord(WParam) of
BTN_APPLY_ID: // Нажатие на кнопку "Принять"
begin
Len := SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0);
Inc(Len);
SetLength(S, Len);
SendMessage(Edit, WM_GETTEXT, Len, Integer(@S[1]));
MessageBox(Handle, PChar(TXT_NEWUSER + S), PChar(TXT_CAPTION), MB_OK);
PostQuitMessage(0);
Result := 0;
end;
BTN_CANCEL_ID: // Нажатие на кнопку "Отмена"
begin
PostQuitMessage(0);
Result := 0;
end;
EDIT_ID: // Обработчик Edit-а
// В зависимости от кол-ва символов, включаем/отключаем кнопку "Принять"
EnableWindow(btnOk, Boolean(SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0)));
end;
end;
WM_CTLCOLORSTATIC: // Изменения цвета STATIC
begin
if LParam = Label1 then
begin
// Выставляем цвет
SetTextColor(WParam, $FF0000);
// Делаем фон прозрачным
SetBkMode(WParam, TRANSPARENT);
// Возвращаем результатом хэндл кисти
Result := TransparentBrush;
end;
end;
WM_PAINT:
begin
ShowPicture;
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
else
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
end;
// Здесь программа стартует
// =============================================================================
begin
// Инициализируем оконный класс
with MainWindow do
begin
cbSize := SizeOf(MainWindow);
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := COLOR_BTNFACE + 1;
lpszMenuName := nil;
lpszClassName := 'TAccessForm';
end;
MainWindow.hInstance := HInstance;
// Регистрируем оконный класс
if RegisterClassEx(MainWindow) = 0 then Exit;
// Подготавливаем координаты для центрирования формы
Width := 360;
Height := 130;
CenterMainForm;
// Создаем форму
Handle := CreateWindow('TAccessForm',
PChar(TXT_CAPTION), WS_OVERLAPPED or WS_SYSMENU,
Left, Top, Width, Height, 0, 0, HInstance, nil);
// Создаем кнопку "Принять"
btnOk := CreateWindow('BUTTON', PChar(TXT_INSTALL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
270, 65, 75, 25, Handle, BTN_APPLY_ID, hInstance, nil);
// Отключаем ее до ввода пароля
EnableWindow(btnOk, False);
// Создаем кнопку "Отмена"
btnCancel := CreateWindow('BUTTON', PChar(TXT_CANCEL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE,
190, 65, 75, 25, Handle, BTN_CANCEL_ID, hInstance, nil);
// Создаем поле ввода
Edit := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', nil, WS_CHILD or WS_VISIBLE,
10, 30, 335, 21, Handle, EDIT_ID, HInstance, nil);
Dmitry_177 (2006-11-21 19:45:00) [16]а так почему-то не работает перерисовка текста, т.к. он изменяется... Попробовал и так какнибудь:
WM_CTLCOLORSTATIC: begin
Result := DefWindowProc(Window, Message, wParam, lParam);
GetWindowRect(WParam, WorkArea);
FillRect(WParam, WorkArea, 0);
SetTextColor(WParam, $FFFFFF);
SetBkMode(WParam, TRANSPARENT);
end;
Тоже не работает TRANSPORENT... а текст пишется белым цветом, т.е. это работает...
Dmitry_177 (2006-11-21 19:13:00) [17]а переменная TransparentBrush типа HGDIOBJ? или другого какогонибудь типа?
Rouse_ (2006-11-21 17:55:00) [18]Сделай так:
на инициализации:
TransparentBrush := GetStockObject(NULL_BRUSH);
в обработчике:
WM_CTLCOLORSTATIC:
begin
SetBkMode(WParam, TRANSPARENT);
Result := TransparentBrush;
Exit;
end;
при разрушении
DeleteObject(TransparentBrush);
Dmitry_177 (2006-11-21 15:52:00) [19]Спасибо за пример ))) Цвет поменять получилось, а вот Transporent всеже не знаю как сделать, у меня на форме рисуется рисунок, а надись должна быть поверх его...
Rouse_ (2006-11-20 20:44:00) [20]
program Access;
uses
Windows,
Messages;
resourcestring
TXT_CAPTION = 'Ввод пароля';
TXT_INSTALL = 'Принять';
TXT_CANCEL = 'Отмена';
TXT_STATUS = 'Введите пароль:';
TXT_NEWUSER = 'Значение пароля: ';
var
MainWindow : TWndClassEx;
Handle,
hFontNormal,
btnOk,
btnCancel,
Edit,
Label1 : HWND;
Msg : TMsg;
Left,
Top,
Width,
Height : Integer;
const
BTN_APPLY_ID = 100;
BTN_CANCEL_ID = 105;
EDIT_ID = 110;
// Центрирование формы
// =============================================================================
procedure CenterMainForm;
var
ScrWidth, ScrHeight: Cardinal;
begin
ScrWidth := GetSystemMetrics(SM_CXSCREEN);
ScrHeight := GetSystemMetrics(SM_CYSCREEN);
Left := (Integer(ScrWidth) - Width) div 2;
Top := (Integer(ScrHeight) - Height) div 2;
end;
// Главная оконная процедура
// =============================================================================
function WindowProc(Wnd: HWND; Msg: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
S: String;
Len: Integer;
DC: HDC;
begin
Result := 0;
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
WM_COMMAND:
begin
case LoWord(WParam) of
BTN_APPLY_ID: // Нажатие на кнопку "Принять"
begin
Len := SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0);
Inc(Len);
SetLength(S, Len);
SendMessage(Edit, WM_GETTEXT, Len, Integer(@S[1]));
MessageBox(Handle, PChar(TXT_NEWUSER + S), PChar(TXT_CAPTION), MB_OK);
PostQuitMessage(0);
Result := 0;
end;
BTN_CANCEL_ID: // Нажатие на кнопку "Отмена"
begin
PostQuitMessage(0);
Result := 0;
end;
EDIT_ID: // Обработчик Edit-а
// В зависимости от кол-ва символов, включаем/отключаем кнопку "Принять"
EnableWindow(btnOk, Boolean(SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0)));
end;
end;
WM_CTLCOLORSTATIC: // Изменения цвета STATIC
begin
if LParam = Label1 then
begin
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
SetTextColor(WParam, $FF0000);
end;
end;
else
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
end;
// Здесь программа стартует
// =============================================================================
begin
// Инициализируем оконный класс
with MainWindow do
begin
cbSize := SizeOf(MainWindow);
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := COLOR_BTNFACE + 1;
lpszMenuName := nil;
lpszClassName := 'TAccessForm';
end;
MainWindow.hInstance := HInstance;
// Регистрируем оконный класс
if RegisterClassEx(MainWindow) = 0 then Exit;
// Подготавливаем координаты для центрирования формы
Width := 360;
Height := 130;
CenterMainForm;
// Создаем форму
Handle := CreateWindow('TAccessForm',
PChar(TXT_CAPTION), WS_OVERLAPPED or WS_SYSMENU,
Left, Top, Width, Height, 0, 0, HInstance, nil);
// Создаем кнопку "Принять"
btnOk := CreateWindow('BUTTON', PChar(TXT_INSTALL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
270, 65, 75, 25, Handle, BTN_APPLY_ID, hInstance, nil);
// Отключаем ее до ввода пароля
EnableWindow(btnOk, False);
// Создаем кнопку "Отмена"
btnCancel := CreateWindow('BUTTON', PChar(TXT_CANCEL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE,
190, 65, 75, 25, Handle, BTN_CANCEL_ID, hInstance, nil);
// Создаем поле ввода
Edit := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', nil, WS_CHILD or WS_VISIBLE,
10, 30, 335, 21, Handle, EDIT_ID, HInstance, nil);
// Задаем симфол который будет отображаться ри вводе пароля
SendMessage(Edit, EM_SETPASSWORDCHAR, Ord('*'), 0);
// Создаем Label
Label1 := CreateWindow('STATIC', PChar(TXT_STATUS),
WS_VISIBLE or WS_CHILD, 10, 13, 230, 14, Handle, 0, hInstance, nil);
// Создаем нужный шрифт
hFontNormal := CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');
// назначаем этот шрифт всем оконным элементам
if hFontNormal <> 0 then
begin
SendMessage(btnOk, WM_SETFONT, hFontNormal, 0);
SendMessage(btnCancel, WM_SETFONT, hFontNormal, 0);
SendMessage(Edit, WM_SETFONT, hFontNormal, 0);
SendMessage(Label1, WM_SETFONT, hFontNormal, 0);
end;
// Показываем окно
ShowWindow(Handle, SW_SHOW);
// Ставим его поверх всех
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE);
// Ставим фокус в поле ввода
SetFocus(Edit);
// Начинаем крутить цикл выборки сообщений
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.