![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Назначение нового региона кнопке [D5, D6, D7, WinXP]
Comp © (2004-10-25 20:03:00)Здравствуйте, уважаемые мастера. Разрешите задать вам такой вопрос: Создаю кнопку, меняю процедуру обработки сообщений, создаю регион - все вроде бы нормально. Но почему-то не хочет назначаться новый регион моей кнопке.
Подскажите пожалуйста, что не так. Буду ОЧЕНЬ благодарен.
Код самый краткий - программа "экспериментальная".
Зараннее спасибо.
program Project1;
uses
messages,
windows;
{$R *.RES}
var
form: TWndClass;
hwn,Handle,button1,memo1,combo,label1: hwnd;
msg:TMSG;
rect:Trect;
OldTabControlProc: Pointer;
procedure windowcreate;
begin
Handle:=CreateWindow(
'Window','Моя Форма',
WS_TILEDWINDOW or WS_VISIBLE,
10,10,400,280,0,0,hwn,nil);
GetWindowRect(Handle,rect);
end;
procedure button;
begin
button1:=CreateWindow('Button','Кнопка',
WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,
210,95,100,25,Handle,0,hwn,nil);
end;
procedure MyButtonProc(hWnd,Msg,wParam,lParam:Longint); stdcall;
var
Reg: HRGN;
rc: TRect;
begin
case Msg of
WM_CREATE:
begin
Reg:=CreateEllipticRgn(0,0,100,25);
SetWindowRGN(button1,Reg,True);
CallWindowProc(OldTabControlProc, button1, Msg, wParam, lParam);
end;
else
CallWindowProc(OldTabControlProc, button1, Msg, wParam, lParam);
end;
end;
procedure EndOfProgram ;
begin
UnRegisterClass('Window',hwn);
ExitProcess(hwn);
end;
function WindowProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall;
begin
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
case Msg of
WM_DESTROY: EndOfProgram;
end;
end;
begin
hwn:=GetModuleHandle(nil);
with form do
begin
Style:= CS_PARENTDC;
hIcon:= LoadIcon(hwn,'MAINICON');
lpfnWndProc:= @WindowProc;
hInstance:= hwn;
hbrBackground:= COLOR_BTNFACE+1;
lpszClassName:= 'Window';
hCursor:= LoadCursor(0,IDC_ARROW);
end;
RegisterClass(form);
windowcreate;
button;
OldTabControlProc:=Pointer(SetWindowLong(Button1, GWL_WNDPROC, longint(@MyButtonProc)));
UpdateWindow(Button1);
// ShowWindow(Handle,cmdShow);
// UpdateWindow(Handle);
while(GetMessage(Msg,0,0,0))do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Kind (2004-10-27 21:56:00) [1]Незачто :)
Comp (2004-10-27 19:41:00) [2]
> [1] Kind (25.10.04 23:14)
Спасибо, друг.
Выручил по-настоящему.
Теперь все понял.
СПАСИБО ОГРОМНОЕ!
Kind (2004-10-25 23:14:00) [3]Как я понял ты хочешь сделать округлую кнопку, но
Непонятно:
WM_CREATE у кнопки не будет обрабатываться, потому что у тебя кнопка создаётся раньше, чем присваивается ей обработчик.
И без добавления стиля WS_CLIPCHILDREN к кнопке регион не срабатывал. Вот как у меня работает, кнопка меняется при нажатии на неё:
program Project1;
uses
messages,
windows;
{$R *.RES}
var
form: TWndClass;
hwn,Handle,button1,memo1,combo,label1: hwnd;
msg:TMSG;
rect:Trect;
OldTabControlProc: Pointer;
procedure windowcreate;
begin
Handle:=CreateWindow(
'Window','Ìîÿ Ôîðìà',
WS_TILEDWINDOW or WS_VISIBLE,
10,10,400,280,0,0,hwn,nil);
GetWindowRect(Handle,rect);
end;
procedure button;
begin
button1:=CreateWindow('Button','Êíîïêà',
WS_VISIBLE or WS_CHILD or WS_CLIPCHILDREN or BS_PUSHLIKE or BS_TEXT,
210,95,100,25,Handle,0,hwn,nil);
end;
procedure MyButtonProc(hWnd,Msg,wParam,lParam:Longint); stdcall;
var
Reg: HRGN;
rc: TRect;
begin
case Msg of
WM_LBUTTONDOWN:
begin
Reg:=CreateEllipticRgn(0,0,100,25);
SetWindowRGN(button1,Reg,True);
CallWindowProc(OldTabControlProc, button1, Msg, wParam, lParam);
end;
else
CallWindowProc(OldTabControlProc, button1, Msg, wParam, lParam);
end;
end;
procedure EndOfProgram ;
begin
UnRegisterClass('Window',hwn);
ExitProcess(hwn);
end;
function WindowProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall;
begin
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
case Msg of
WM_DESTROY: EndOfProgram;
end;
end;
begin
hwn:=GetModuleHandle(nil);
with form do
begin
Style:= CS_PARENTDC;
hIcon:= LoadIcon(hwn,'MAINICON');
lpfnWndProc:= @WindowProc;
hInstance:= hwn;
hbrBackground:= COLOR_BTNFACE+1;
lpszClassName:= 'Window';
hCursor:= LoadCursor(0,IDC_ARROW);
end;
RegisterClass(form);
windowcreate;
button;
OldTabControlProc:=Pointer(SetWindowLong(Button1, GWL_WNDPROC, longint(@MyButtonProc)));
UpdateWindow(Button1);
// ShowWindow(Handle,cmdShow);
// UpdateWindow(Handle);
while(GetMessage(Msg,0,0,0))do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.