Форум: "WinAPI";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];
Внизне получается задать регион элементам окна Найти похожие ветки
← →
Вася (2010-01-28 00:08) [0]необходимо задать регион элементам окна.в частности статику (с картинкою) и кнопке.
хоть MS Spy++ и показывает что всё как надо, но визуально никакого результата...
в одой статейке нашлось упоминание, что регионы нельзя задавать дочерним окнам, но в VCL же это как-то получается...=((
← →
Игорь Шевченко © (2010-01-28 00:18) [1]регион можно задавать любому окну
← →
Игорь Шевченко © (2010-01-28 00:18) [2]Но ты тоже не уважаешь нас. Зачем тебе отвечать ?
← →
Вася (2010-01-28 00:45) [3]> Игорь Шевченко © (28.01.10 00:18) [2]
о_О?
← →
Игорь Шевченко © (2010-01-28 00:48) [4]http://segfault.kiev.ua/smart-questions-ru.html
← →
Германн © (2010-01-28 01:53) [5]
> Игорь Шевченко © (28.01.10 00:48) [4]
>
> http://segfault.kiev.ua/smart-questions-ru.html
>
Это что-то новенькое. :)
← →
Вася (2010-01-28 02:23) [6]ну и что же не так я спросил?
поиск про регионы мне как раз и дал что регионы нельзя задавать дочерним окнам.
цитирую:
> У функции SetWindowRgn есть ряд особенностей:
> ...
> 3) SetWindowRgn не работает для дочерних окон (окон созданных со стилем WS_CHILD).
← →
Игорь Шевченко © (2010-01-28 02:41) [7]Вася (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;
← →
Игорь Шевченко © (2010-01-28 02:46) [8]Насчет того, что ты не так спросил: если ты пишешь, что у тебя чего-то не получается, то приводи код не после наводящих вопросов, а сразу в вопросе, об чем, кстати, написано в ссылке [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
{$R *.DFM}
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
← →
Вася (2010-01-28 08:39) [9]интересный код,спасибо...=)
узнал несколько новых приёмов.=))
с кнопками вроде нормально,а вот статик с картинкой всё равно глючит...
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:
;//Windows.Beep(400, 400);
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);
//SendMessage(Image_01, WM_SETFONT, hFont, 0);
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.
← →
Leonid Troyanovsky © (2010-01-28 11:55) [10]
> Вася (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.
← →
Вася (2010-01-29 07:30) [11]спасибо!=)
так совсем нормально стало...^__^
* ушёл учить флаги стилей *
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c