-
необходимо задать регион элементам окна.в частности статику (с картинкою) и кнопке. хоть MS Spy++ и показывает что всё как надо, но визуально никакого результата...
в одой статейке нашлось упоминание, что регионы нельзя задавать дочерним окнам, но в VCL же это как-то получается...=((
-
регион можно задавать любому окну
-
Но ты тоже не уважаешь нас. Зачем тебе отвечать ?
-
> Игорь Шевченко © (28.01.10 00:18) [2]
о_О?
-
-
-
ну и что же не так я спросил? поиск про регионы мне как раз и дал что регионы нельзя задавать дочерним окнам. цитирую:
> У функции SetWindowRgn есть ряд особенностей: > ... > 3) SetWindowRgn не работает для дочерних окон (окон созданных со стилем WS_CHILD).
-
Вася (28.01.10 02:23) [6] Больше не читай каку. procedure TForm1.Button1Click(Sender: TObject);
var
ButtonRect: TRect;
begin
FButton := CreateWindowEx(0, 'BUTTON','_OK_',
WS_CHILD or WS_VISIBLE or WS_CLIPSIBLINGS or BS_PUSHBUTTON,
10, 10, 70, 25, Handle, 0, HInstance, nil);
Windows.GetWindowRect(FButton, ButtonRect);
OffsetRect(ButtonRect, -ButtonRect.Left, -ButtonRect.Top);
FButtonRgn := CreateEllipticRgnIndirect (ButtonRect);
Win32Check((FButtonRgn <> 0) and (SetWindowRgn (FButton, FButtonRgn, true) <> 0));
end;
-
Насчет того, что ты не так спросил: если ты пишешь, что у тебя чего-то не получается, то приводи код не после наводящих вопросов, а сразу в вопросе, об чем, кстати, написано в ссылке [4]. Если ты где-то что-то прочитал, чего делать нельзя, дай ссылку на этот материал. Уважай потенциальных отвечающих, им вытягивать из тебя клещами "главную военную тайну" нафиг не сдалось, есть более интересные способы времяпровождения. unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
PopupMenu1: TPopupMenu;
File1: TMenuItem;
Help1: TMenuItem;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FRgn: HRGN;
FButtonRgn: HRGN;
FButton: HWND;
end;
var
Form1: TForm1;
implementation
procedure TForm1.FormShow(Sender: TObject);
begin
FRgn := CreateEllipticRgnIndirect (Button1.ClientRect);
SetWindowRgn(Button1.Handle, FRgn, true);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ButtonRect: TRect;
begin
FButton := CreateWindowEx(0, 'BUTTON','_OK_',
WS_CHILD or WS_VISIBLE or WS_CLIPSIBLINGS or BS_PUSHBUTTON,
10, 10, 70, 25, Handle, 0, HInstance, nil);
Windows.GetWindowRect(FButton, ButtonRect);
OffsetRect(ButtonRect, -ButtonRect.Left, -ButtonRect.Top);
FButtonRgn := CreateEllipticRgnIndirect (ButtonRect);
Win32Check((FButtonRgn <> 0) and (SetWindowRgn (FButton, FButtonRgn, true) <> 0));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Button1.Handle, GWL_STYLE,
GetWindowLong(Button1.Handle, GWL_STYLE) or BS_MULTILINE);
Button1.Caption := 'Press'#13#10'Me';
end;
procedure TForm1.Button2Click(Sender: TObject);
var
P: TPoint;
begin
P := ClientToScreen(Point(Button2.Left, Button2.Top + Button2.Height));
PopupMenu1.Popup (P.X, P.Y);
end;
end. object Form1: TForm1
Left = 191
Top = 108
Caption = 'Form1'
ClientHeight = 348
ClientWidth = 536
Color = clBackground
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 244
Top = 268
Width = 109
Height = 57
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 204
Top = 56
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 1
OnClick = Button2Click
end
object PopupMenu1: TPopupMenu
Left = 204
Top = 88
object File1: TMenuItem
Caption = '&File'
end
object Help1: TMenuItem
Caption = '&Help'
end
end
end
-
интересный код,спасибо...=) узнал несколько новых приёмов.=)) с кнопками вроде нормально,а вот статик с картинкой всё равно глючит... procedure TForm1.Button4Click(Sender: TObject); var StaticRect: TRect; begin FStatic:=CreateWindow('Static', '', WS_CHILD or SS_BITMAP or WS_VISIBLE, 10, 70, 0, 0, Handle, 0, HInstance, nil); FBmp:=LoadImage(HInstance, 'C:\pict.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); SendMessage(FStatic, STM_SETIMAGE, IMAGE_BITMAP, FBmp); Windows.GetWindowRect(FStatic, StaticRect); OffsetRect(StaticRect, -StaticRect.Left, -StaticRect.Top); FStaticRgn:=CreateEllipticRgnIndirect(StaticRect); SetWindowRgn(FStatic, FStaticRgn, true); end; в вашем примере только один баг остался - сворачиваю окно, разворачиваю - и снова статик квадратный.вот при перекрытии другими окнами не портится, а наоборот восстанавливается если после сворачивания. когда на VCL делаю то почему-то всегда лучше получается,у меня наоборот было: на чистом WinAPI написал - и при перекрытии портится...=(( а может я просто что-то не учёл? program Project1;
uses Windows, Messages, Commctrl;
var WinClass: TWndClass;
hInst, Handle, Image_01, hFont: HWND; Msg: TMsg;
Bmp: HBITMAP; rgn: HRGN; rect: TRect;
function WindowProc(HWND, Msg, wParam, lParam: Longint): Longint; Stdcall;
begin
Result:=DefWindowProc(HWND, Msg, wParam, lParam);
Case Msg Of
WM_MOUSEMOVE:
; WM_DESTROY:
begin
DeleteObject(hFont);
UnRegisterClass('mywndclass', hInst);
ExitProcess(hInst);
end;
end;
end;
begin
hInst:=GetModuleHandle(nil);
with WinClass do
begin
Style:=CS_PARENTDC;
hIcon:=LoadIcon(hInst, MAKEINTRESOURCE('MAINICON'));
lpfnWndProc:=@WindowProc;
hInstance:=hInst;
hbrBackground:=COLOR_BTNFACE+3;
lpszClassName:='mywndclass';
hCursor:=LoadCursor(0, IDC_ARROW);
end;
InitCommonControls;
RegisterClass(WinClass);
Handle:=CreateWindowEx(0, 'mywndclass', 'testprogram_05', WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SYSMENU, 400, 200, 400, 400, 0, 0, hInst, nil);
hFont:=CreateFont(-11, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH Or FF_DONTCARE, 'MS Sans Serif');
Image_01:=CreateWindow('Static', '', WS_CHILD Or SS_BITMAP Or WS_VISIBLE, 120, 180, 200, 100, Handle, 1, hInst, Nil);
Bmp:=LoadImage(hInst, 'C:\pict.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SendMessage(Image_01, STM_SETIMAGE, IMAGE_BITMAP, Bmp);
Windows.GetWindowRect(Image_01, rect);
OffsetRect(rect, -rect.Left, -rect.Top);
rgn:=CreateEllipticRgnIndirect(rect);
SetWindowRgn(Image_01, rgn, True);
while (GetMessage(Msg, 0, 0, 0)) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
-
> Вася (28.01.10 08:39) [9]
> FStatic:=CreateWindow('Static', '', WS_CHILD or SS_BITMAP > or WS_VISIBLE, 10, 70, 0, 0, Handle, 0, HInstance, nil);
or WS_CLIPSIBLINGS.
-- Regards, LVT.
-
спасибо!=) так совсем нормально стало...^__^
* ушёл учить флаги стилей *
|