Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "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;

використовує
повідомлень,
windows;

{$ R * .RES}
було
form: TWndClass;
hwn, Handle, button1, memo1, combo, label1: hwnd;
msg: TMSG;
rect: Trect;
OldTabControlProc: Pointer;

procedure windowcreate;
починати
Handle: = CreateWindow (
   "Window","Ìîÿ Ôîðìà",
WS_TILEDWINDOW or WS_VISIBLE,
10,10,400,280,0,0, hwn, nil);
GetWindowRect (Handle, rect);
end;

procedure button;
починати
   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;
було
Reg: HRGN;
rc: TRect;
починати
case Msg of

WM_LBUTTONDOWN:
begin
Reg: = CreateEllipticRgn (0,0,100,25);
SetWindowRGN (button1, Reg, True);
CallWindowProc (OldTabControlProc, button1, Msg, wParam, lParam);
end;
ще
CallWindowProc (OldTabControlProc, button1, Msg, wParam, lParam);
end;
end;

procedure EndOfProgram;
починати
UnRegisterClass ( "Window", hwn);
ExitProcess (hwn);
end;

function WindowProc (hWnd, Msg, wParam, lParam: Longint): Longint; stdcall;
починати
Result: = DefWindowProc (hWnd, Msg, wParam, lParam);

case Msg of
WM_DESTROY: EndOfProgram;
end;

end;

починати
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.83 MB
Час: 0.049 c
6-1096695984
Ivolg
2004-10-02 09:46
2004.12.12
передача


1-1101889207
pomashok
2004-12-01 11:20
2004.12.12
mouse_event


1-1101715077
bodomizer
2004-11-29 10:57
2004.12.12
Величезні обсяги даних і робота з ними


1-1101715306
Molchanov
2004-11-29 11:01
2004.12.12
Видалення рядків з TRichEdit


1-1101714215
User1
2004-11-29 10:43
2004.12.12
Проблема з DLL





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська