Форум: "WinAPI";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизНазначение нового региона кнопке Найти похожие ветки
← →
Comp © (2004-10-25 20:03) [0]Здравствуйте, уважаемые мастера. Разрешите задать вам такой вопрос: Создаю кнопку, меняю процедуру обработки сообщений, создаю регион - все вроде бы нормально. Но почему-то не хочет назначаться новый регион моей кнопке.
Подскажите пожалуйста, что не так. Буду ОЧЕНЬ благодарен.
Код самый краткий - программа "экспериментальная".
Зараннее спасибо.
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-25 23:14) [1]Как я понял ты хочешь сделать округлую кнопку, но
Непонятно:
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.
← →
Comp © (2004-10-27 19:41) [2]
> [1] Kind (25.10.04 23:14)
Спасибо, друг.
Выручил по-настоящему.
Теперь все понял.
СПАСИБО ОГРОМНОЕ!
← →
Kind (2004-10-27 21:56) [3]Незачто :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c