Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Прозрачное 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 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.046 c
15-1174458723
Post_
2007-03-21 09:32
2007.04.15
Web- кам...


3-1168938121
SLP
2007-01-16 12:02
2007.04.15
долго работает хранимая процедура


15-1173870989
Большой Джек
2007-03-14 14:16
2007.04.15
Стрим подешевел до 8 баксов


15-1174469659
Vaitek__
2007-03-21 12:34
2007.04.15
Фотопаечать на Дому и СНПЧ


2-1174504496
White Barsik
2007-03-21 22:14
2007.04.15
TFileStream - чтение в динамический массив