Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Плавное появление окна используя SetLayeredWindowAttributes()?

10K
08 февраля 2007 года
sxd
16 / / 06.09.2005
Скажите пожалуйста, если стоит задача плавного появления окна, но использовать функцию AnimateWindow() нельзя, можно ли как то заюзать SetLayeredWindowAttributes, примерно в таком стиле:

for (i = 1; i < 100; i++)
{
SetLayeredWindowAttributes();
...
}
Спасибо всем за "добрые" советы!
6.6K
08 февраля 2007 года
Scaiman
126 / / 25.07.2006
Код:
typedef void (CALLBACK*DLLFUNC2)(HWND,int,int,int);
DLLFUNC2    SetLayeredWindowAttributes;
SetWindowLongA(hWnd,GWL_EXSTYLE,WS_EX_LAYERED | GetWindowLongA(hWnd,GWL_EXSTYLE));
SetLayeredWindowAttributes=(DLLFUNC2)GetProcAddress(GetModuleHandleA("User32.dll"),"SetLayeredWindowAttributes");
while(Alpha!=255)
{
if(Alpha==45)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
Sleep(15);
SetLayeredWindowAttributes(hWnd,Alpha,Alpha,LMA_COLORKEY | LMA_ALPHA);
Alpha=Alpha+15;
}
ShowWindow(hWnd, SW_SHOW);
Alpha=240

правда ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd); особо и ненужны если у тебя простое окно, а я их использовал для плавного появления картинки.
10K
09 февраля 2007 года
sxd
16 / / 06.09.2005
Scaiman огромное спасибо Вы как раз почти угадали то, что мне надо! Вот посмотрите код делаю оуно в форме картинки и никак не могу сделать так, чтоб оно медленно появилось. Мне подсказали что сначала окно в виде картинки надо сделать невидимым при запуске программы, а потом заюзать SetLayeredWindowAttributes. Не покажешь (может посмотришь на досуге...PLEASE) как будет выглядеть конечный код.

Мой первоначальный код:
Код:
#include "stdafx.h"
#include <windows.h>

LRESULT CALLBACK WindowFunc(HWND, UINT,WPARAM,LPARAM);
char szWinName[] = "MyApp";
HINSTANCE hInst;
HBITMAP maskBitmap;
HWND hwnd;
bool dragging=false;
POINT MousePnt;

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wcl;
    BITMAP bi;
    BYTE bpp;
    DWORD TransPixel;
    DWORD pixel;
    int startx;
    INT i, j;

    wcl.hInstance = hThisInst;
    wcl.lpszClassName = szWinName;
    wcl.lpfnWndProc = WindowFunc;
    wcl.style = CS_HREDRAW | CS_VREDRAW;
    wcl.cbSize = sizeof(WNDCLASSEX);
    wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcl.lpszMenuName = NULL;
    wcl.cbClsExtra = 0;
    wcl.cbWndExtra = 0;
    wcl.hbrBackground = (HBRUSH) GetStockObject(3);
    if(!RegisterClassEx(&wcl)) return 0;

    hwnd = CreateWindow(szWinName, szWinName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 200, 200, NULL, NULL, hThisInst, NULL);

    int Style;
    Style = GetWindowLong(hwnd, GWL_STYLE);
    Style=Style || WS_CAPTION;
    Style=Style || WS_SYSMENU;
    SetWindowLong(hwnd, GWL_STYLE, Style);

    ShowWindow(hwnd, nWinMode);
    UpdateWindow(hwnd);

    maskBitmap = (HBITMAP)LoadImage(NULL, "mask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    if (!maskBitmap) return NULL;

    HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);

    GetObject(maskBitmap, sizeof( BITMAP ), &bi);

    bpp = bi.bmBitsPixel >> 3;

    BYTE *pBits = new BYTE[ bi.bmWidth * bi.bmHeight * bpp ];

    int  p = GetBitmapBits( maskBitmap, bi.bmWidth * bi.bmHeight * bpp, pBits );
    TransPixel = *(DWORD*)pBits;

    TransPixel <<= 32 - bi.bmBitsPixel;

    for (i = 0; i < bi.bmHeight; i++)
    {
        startx=-1;
        for (j = 0; j < bi.bmWidth; j++)
        {
            pixel = *(DWORD*)(pBits + (i * bi.bmWidth + j) * bpp) << (32 - bi.bmBitsPixel);
            if (pixel != TransPixel)
            {
                if (startx<0)
                {
                    startx = j;
                } else if (j == (bi.bmWidth - 1))
                {
                    Rgn = CreateRectRgn( startx, i, j, i + 1 );
                    CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR);
                    startx=-1;
                }
            } else if (startx>=0)
            {
                Rgn = CreateRectRgn(startx, i, j, i + 1);
                CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
                startx=-1;
            }
        }
    }
    delete pBits;
    SetWindowRgn(hwnd, ResRgn, TRUE);
    InvalidateRect(hwnd, 0, false);

    while(GetMessage(&msg, NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
        return msg.wParam;
}

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HDC hdcBits;

    RECT wndrect;
    POINT point;

    switch (message)
    {
    /*case WM_CLOSE:
        AnimateWindow(hwnd, 1000, AW_BLEND | AW_HIDE);
        return DefWindowProc(hwnd, message, wParam, lParam);

    //вот здесь и есть косяк с AnimateWindow() сначала медлено
             //появляется окно, а потом мгновенно изображение!

    case WM_CREATE:
        AnimateWindow(hwnd, 1000, AW_BLEND | AW_SLIDE);
        break;*/

    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        hdcBits = CreateCompatibleDC(hdc);
        SelectObject(hdcBits, maskBitmap);
        BitBlt(hdc, 0, 0, 200, 200, hdcBits, 0, 0, SRCCOPY);
        DeleteDC(hdcBits);
        EndPaint(hwnd, &ps);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_LBUTTONDOWN:
            GetCursorPos(&MousePnt);
            dragging = true;
            SetCapture(hwnd);
        break;

    case WM_MOUSEMOVE:
        if (dragging)
        {
            GetCursorPos(&point);
            GetWindowRect(hwnd, &wndrect);

            wndrect.left = wndrect.left+(point.x - MousePnt.x);
            wndrect.top  = wndrect.top +(point.y - MousePnt.y);

            SetWindowPos(hwnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
            MousePnt=point;
        }
        break;

    case WM_LBUTTONUP:
        if (dragging)
        {
            dragging=false;
            ReleaseCapture();
        }
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
6.6K
10 февраля 2007 года
Scaiman
126 / / 25.07.2006
Библиотеки отключишь некоторые.
10K
10 февраля 2007 года
sxd
16 / / 06.09.2005
Огромное спасибо Scaiman, код конечно хороший, но это уж точно для таких как Вы - Специалистов, нельзя бы показать на моём более простом и понятном, пожалуйста?
26K
16 февраля 2007 года
nuqta
1 / / 16.02.2007
если у тебя C++Builder 6

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
Form1->AlphaBlend=true;
for(int i=0; i<=255; ++i)
{
Form1->AlphaBlendValue=i;
Sleep(500);
}
Form1->AlphaBlend=false;
}
10K
17 февраля 2007 года
sxd
16 / / 06.09.2005
Спасибо nuqta. Вот обработал код Scaiman, чтоб BMP-ха вместо PNG образовавало нестандартное окно, которое медленно появляется, но что-то не так... Люди добрые помогите найти неисправность! Please...
10K
17 февраля 2007 года
sxd
16 / / 06.09.2005
Область окна появляется плавно, но оно не нестандартное, а обычное квадратное и BMP не появляется, зато появляется и исчезает плавно!
8.9K
02 марта 2007 года
Kap
77 / / 10.09.2006
Заюзай GDI+ и в цикле через тот же sleep показывай окно. Что тут сложного?! А еще лучше запусти таймер... Что значит "Не появляется BMP"? Оно у тебя без извращений с плавным появлением окна отображалось? И вообще- объясни толком- ЧЕГО ТЫ ХОЧЕШЬ ДОБИТЬСЯ?! А то, что- то я не уяснил.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог