Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Вниз
Прозрачное STATIC-окно Найти похожие ветки
← →
Dmitry_177 (2006-11-19 23:50) [0]Создаю на форме (которое было создано 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); Почему оно не прозрачное?
← →
Dmitry_177 (2006-11-20 20:21) [1]Неужели никто с этим не сталкивался раньше? А еще как мне поменять цвет текста?
← →
Leonid Troyanovsky © (2006-11-20 20:43) [2]
> Dmitry_177 (20.11.06 20:21) [1]
> Неужели никто с этим не сталкивался раньше?
msdn, msdn and MSDN.
--
Regards, LVT.
← →
Rouse_ © (2006-11-20 20:44) [3]
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.
← →
Dmitry_177 (2006-11-21 15:52) [4]Спасибо за пример ))) Цвет поменять получилось, а вот Transporent всеже не знаю как сделать, у меня на форме рисуется рисунок, а надись должна быть поверх его...
← →
Rouse_ © (2006-11-21 17:55) [5]Сделай так:
на инициализации:
TransparentBrush := GetStockObject(NULL_BRUSH);
в обработчике:
WM_CTLCOLORSTATIC:
begin
SetBkMode(WParam, TRANSPARENT);
Result := TransparentBrush;
Exit;
end;
при разрушении
DeleteObject(TransparentBrush);
← →
Dmitry_177 (2006-11-21 19:13) [6]а переменная TransparentBrush типа HGDIOBJ? или другого какогонибудь типа?
← →
Dmitry_177 (2006-11-21 19:45) [7]а так почему-то не работает перерисовка текста, т.к. он изменяется... Попробовал и так какнибудь:
WM_CTLCOLORSTATIC: begin
Result := DefWindowProc(Window, Message, wParam, lParam);
GetWindowRect(WParam, WorkArea);
FillRect(WParam, WorkArea, 0);
SetTextColor(WParam, $FFFFFF);
SetBkMode(WParam, TRANSPARENT);
end;
Тоже не работает TRANSPORENT... а текст пишется белым цветом, т.е. это работает...
← →
Rouse_ © (2006-11-21 21:54) [8]Мдя... мыши плакали кололись, 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);
← →
Rouse_ © (2006-11-21 21:54) [9]
// Задаем симфол который будет отображаться ри вводе пароля
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.
← →
Dmitry_177 (2006-11-22 00:23) [10]Тоже самое, не работает...((( Посмотрел весь код и не работает ((( У меня текст меняется в сообщении WM_TIMER:
var
str: array [0..25] of Char;
...
WM_TIMER: SendMessage(hLabel, WM_SETTEXT, 0, Integer(PChar(@str)));
Так вот текст то прозрачный, но потом он пишется поверх уже написанного, т.е. не стирается старый и получается неразбериха, т.к. текст на тексте, старый и новый...
← →
Rouse_ © (2006-11-22 16:04) [11]репайнт делай WM_PAINT
← →
Dmitry_177 (2006-11-22 17:17) [12]Я так и думал что 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 17:29) [13]естественно отлавливать в главной оконной процедуре...
← →
Dmitry_177 (2006-11-22 17:44) [14]т.е. в обработке WM_PAINT главной формы, кроме рисования картинки рисовать еще текст? и Static-окно получается уже ненужно?
← →
Rouse_ © (2006-11-22 17:51) [15]Не нуно текст рисовать, просто SetText а потом WM_PAINT и будет тебе счастье
← →
Dmitry_177 (2006-11-22 18:26) [16]Что-то я не очень понял,
> 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-23 09:43) [17]SendMessage(Хэндл окна а не лейбла, WM_PAINT, 0, 0);
← →
Dmitry_177 (2006-11-23 13:48) [18]Так у меня почему-то не работает...
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 15:07) [19]Давайка целиком проект выложи куда нибудь. Что гадать попусту?
← →
Dmitry_177 (2006-11-23 15:22) [20]выложил..
← →
Dmitry_177 (2006-11-23 15:25) [21]он в этой теме тут: http://forum.sources.ru/index.php?showtopic=162329&st=0&#entry1353043
← →
Rouse_ © (2006-11-23 17:10) [22]там же и ответил
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.125 c