Конференция "WinAPI" » движение области в WinAPI
 
  • Григораш (18.12.10 18:58) [0]
    Вот прога:
    program Win1;

    uses
     Windows,
     Messages;

    var
     WndClass: TWndClass;
     szAppName: PChar;
     WinHandle: HWnd;
     Msg: TMsg;
     i:integer;

    const
    n = 10;

    function MyWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM;
     lParam: LPARAM) : LRESULT; stdcall;

    var
     R: TRect;
     ps: TPaintStruct;
     Context, hdcm: HDC;
     Font: HFont;
     Brush: HBrush;
     PR: PRect;
     bmp: HBitmap;
     mass: array[1..n] of TPoint;

    begin
     case Msg of
       WM_PAINT:
       begin
         Context:= BeginPaint(hWnd, ps);
         bmp:=CreateCompatibleBitmap(Context,1100, 700);
         hdcm:=CreateCompatibleDC(Context);
         SelectObject(hdcm,bmp);
         try
           GetClientRect(hWnd, R);

           Font:= CreateFont(40,40,0,0, 470,60, 40, 0, DEFAULT_CHARSET,
           OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
           DEFAULT_PITCH, 'Tahoma');
           Brush := CreateHatchBrush(4, $FFFFFF);
           SelectObject(hdcm,Brush);
           try
           for i := 1 to n do
             begin
               mass[i].X:=100+Round(100*sin(i*2*Pi/n));
               mass[i].y:=100+Round(100*cos(i*2*Pi/n));
             end;
             //Rectangle(hdcm,0,0,1100,700);
             Polygon(hdcm, mass, 10);

           finally

           end;
           Brush:= CreateHatchBrush(4, $FF8888);

           SelectObject(hdcm, Brush);
           SelectObject(hdcm, Font);
           try
             r.left := ( i div(1))- 60;

             DrawText(hdcm, 'Microsoft Windows',-1,R,
             DT_SINGLELINE {or DT_CENTER} or DT_VCENTER);
             r.right := ( i div(5))+ 30;
            {ellipse (Hdcm,50 +  R.Right - R.Left, 100,
             300 + R.Right - R.Left,50);}

             Polygon(hdcm,mass,10);
             BitBlt(Context,0,0,1100,700,hdcm,0,0,srccopy);
              lineto(hdcm, 100,50) ;
           finally
             DeleteObject(Font);
             DeleteObject(Brush);
             deletedc(hdcm);
             deleteobject(bmp);
           end;
         finally

           EndPaint(hWnd, ps);
           Result:= 0;
         end;
       end;
       WM_TIMER:
         begin
          Inc(I, 50);
           GetClientRect(hWnd,R);
            If i<R.Right-R.Left then
           inc(I, 20)
           else  i:=0;
          InvalidateRect(hWnd, nil, True);
         end;

          WM_SIZING:
       begin
         PR := pointer(lParam);
         if PR.Right - PR.Left < 100 then
           PR.Right := PR.Left + 100;
         if Pr.Bottom - PR.Top < 100 then
           Pr.Bottom := PR.Top + 100;
         Result := 0;
       end;

       WM_DESTROY:
       begin
         PostQuitMessage(0);
         Result:= 0;
       end;
     else
       Result:= DefWindowProc(hWnd, Msg, wParam, lParam);
     end;

    end;

    begin
     szAppName:= 'Windows';

     WndClass.Style:= CS_HREDRAW or CS_VREDRAW;
     WndClass.lpfnWndProc:= @MyWndProc;
     WndClass.cbClsExtra:= 0;
     WndClass.cbWndExtra:= 0;
     WndClass.hInstance:= HInstance;
     WndClass.hIcon:= LoadIcon(HInstance, IDI_APPLICATION);
     WndClass.hCursor:= LoadCursor(HInstance, IDC_ARROW);
     WndClass.hbrBackground:= GetStockObject(White_BRUSH);
     WndClass.lpszMenuName:= nil;
     WndClass.lpszClassName:= szAppName;

     RegisterClass(WndClass);

     WinHandle:= CreateWindow(WndClass.lpszClassName,
                              '.....',
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              0,
                              0,
                              HInstance,
                              nil);
     ShowWindow(WinHandle, SW_SHOW);
     UpdateWindow(WinHandle);

     
     I:=0;
     SetTimer(winhandle, 1, 500, nil);

     while GetMessage(Msg, 0, 0, 0) do
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
    KillTimer(winhandle, 1);
    end.



    Как сделать,чтобы десятиугольник и надпись циклически горизонтально двигались(типа анимации)?
  • clickmaker © (18.12.10 19:27) [1]
    включить таймер, менять координаты и перерисовывать
  • clickmaker © (18.12.10 19:41) [2]
    а, таймер тут уже есть...
    а что тогда не получается?
  • han_malign (22.12.10 11:49) [3]

    > for i := 1 to n do
    ...
    > r.left := ( i div(1))- 60;
    ...
    > Inc(I, 50);

    - warning-и надо читать...
  • Студент (27.01.11 05:22) [4]
    Хм..... Где вы взяли этот код?

    Переделывать полностью не буду, а просто дам рекомендации:

    1) SetTimer(winhandle, 1, 50, nil);
    2) Удалить эти строки:
    hdcm: HDC; // (убрать из var)
    bmp: HBitmap;
    bmp:=CreateCompatibleBitmap(Context,1100, 700);
    hdcm:=CreateCompatibleDC(Context);
    SelectObject(hdcm,bmp);
    Polygon(Context, mass, 10); // (ту которая первая, зачем она?)
    BitBlt(Context,0,0,1100,700,hdcm,0,0,srccopy);
    deletedc(hdcm);
    deleteobject(bmp);
    Inc(I, 50);


    3) В MyWndProc добавить: var j: Integer;
    4) Все hdcm поменять на Context
    5) Завершающий штрих:

    for j:=1 to n do
     begin
     mass[j].X:=100+Round(100*Cos((j/n+i/(R.Right-R.Left))*2*Pi));
     mass[j].Y:=100+Round(100*Sin((j/n+i/(R.Right-R.Left))*2*Pi));
     end;

 
Конференция "WinAPI" » движение области в WinAPI
Есть новые Нет новых   [134431   +12][b:0][p:0.004]