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

Вниз

Назначение нового региона кнопке   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.024 c
1-1101892691
big noob
2004-12-01 12:18
2004.12.12
подскажите алгоритм как число написать прописью


1-1101484613
GOgo
2004-11-26 18:56
2004.12.12
Заставка


1-1101608873
noob
2004-11-28 05:27
2004.12.12
Event


3-1100619712
~Blade~
2004-11-16 18:41
2004.12.12
Обновление таблицы в адо


1-1101777731
Змей
2004-11-30 04:22
2004.12.12
две формы в активе