Конференция "WinAPI" » не получается задать регион элементам окна
 
  • Вася (28.01.10 00:08) [0]
    необходимо задать регион элементам окна.в частности статику (с картинкою) и кнопке.
    хоть MS Spy++ и показывает что всё как надо, но визуально никакого результата...

    в одой статейке нашлось упоминание, что регионы нельзя задавать дочерним окнам, но в VCL же это как-то получается...=((
  • Игорь Шевченко © (28.01.10 00:18) [1]
    регион можно задавать любому окну
  • Игорь Шевченко © (28.01.10 00:18) [2]
    Но ты тоже не уважаешь нас. Зачем тебе отвечать ?
  • Вася (28.01.10 00:45) [3]
    > Игорь Шевченко ©   (28.01.10 00:18) [2]

    о_О?
  • Игорь Шевченко © (28.01.10 00:48) [4]
  • Германн © (28.01.10 01:53) [5]

    > Игорь Шевченко ©   (28.01.10 00:48) [4]
    >
    > http://segfault.kiev.ua/smart-questions-ru.html
    >

    Это что-то новенькое. :)
  • Вася (28.01.10 02:23) [6]
    ну и что же не так я спросил?
    поиск про регионы мне как раз и дал что регионы нельзя задавать дочерним окнам.
    цитирую:

    > У функции SetWindowRgn есть ряд особенностей:
    > ...
    > 3) SetWindowRgn не работает для дочерних окон (окон созданных со стилем WS_CHILD).
  • Игорь Шевченко © (28.01.10 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;

  • Игорь Шевченко © (28.01.10 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

  • Вася (28.01.10 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 © (28.01.10 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.
  • Вася (29.01.10 07:30) [11]
    спасибо!=)
    так совсем нормально стало...^__^

    * ушёл учить флаги стилей *
 
Конференция "WinAPI" » не получается задать регион элементам окна
Есть новые Нет новых   [134431   +16][b:0][p:0.004]