Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Медленно появляющееся окно нестандартной формы (в виде рисунка)  (Прочитано 9887 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sxd
Участник

ru
Offline Offline

« : 20-02-2007 20:14 » 

Привет Всем! Пытаюсь написать прогу, цель получить при создании нестандартного(в виде картинки) окна и его закрытии плавное появление и исчезновение. Помогите пожалуйста. Буду очень благодарен за помощь.
В "помощь" пример моего неработающего кода (окно плавно появляется но не обрезается по картинке) и компилированная прога какого-то автора кейгена.

Мой код (только на WinApi):

Код:
#define _WIN32_WINNT 0x0500
#include "stdafx.h"
#include <windows.h>
#include <shlwapi.h>
#include <commctrl.h>
#include <resource.h>

#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "shlwapi.lib")

typedef void (CALLBACK*MY_FUNC)(HWND,int,int,int);
const int LMA_ALPHA = 2, LMA_COLORKEY = 1, WS_EX_LAYERED = 0x80000;
int WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HINSTANCE hInstance;
WNDCLASS wc;
MSG msg;
RECT Rects;
PAINTSTRUCT ps;
HDC hDc;
HDC hMemDC;
HRGN hRng;
HDC myDC;
HBITMAP hBitmap;
MY_FUNC SetLayeredWindowAttributes;
int Alpha;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        HWND hWnd;
hInstance = GetModuleHandle(0);

        wc.style                = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc          = (WNDPROC) WndProc;
wc.cbClsExtra           = 0;
wc.cbWndExtra           = 0;
wc.hInstance            = hInstance;
wc.hIcon                = NULL;
wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground        = 0;
wc.lpszMenuName         = NULL;
wc.lpszClassName        = "Test";
if(!RegisterClass(&wc))
{
MessageBox(0,"Невозможно зарегестрировать класс.","Error",MB_OK|MB_ICONERROR);
ExitProcess(0);
};

hWnd = CreateWindow("Test", "TestWindow", CW_USEDEFAULT, 0, 0, 357, 595, NULL, NULL, hInstance, NULL);
        if(!hWnd)
{
MessageBox(0, "Возникла ошибка при создании окна.", "Error", MB_OK|MB_ICONERROR);
ExitProcess(0);
        };

        SetFocus(hWnd);

while (msg.message != WM_QUIT)
{
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
SetWindowLongA(hWnd, GWL_EXSTYLE, WS_EX_LAYERED | GetWindowLongA(hWnd, GWL_EXSTYLE));
SetLayeredWindowAttributes = (MY_FUNC)GetProcAddress(GetModuleHandleA("User32.dll"), "SetLayeredWindowAttributes");
//hBitmap=LoadBitmap(hInstance,"bitmap3.bmp");
//hBitmap = (HBITMAP)LoadImage (hInstance, MAKEINTRESOURCE (IDB_BITMAP3),IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hDc = GetWindowDC(hWnd);
hMemDC = CreateCompatibleDC(hDc);
SelectObject(hMemDC, hBitmap);
GetWindowRect(hWnd, &Rects);
GetClientRect(hWnd, &Rects);
myDC = hMemDC;
//hRng=Region(hMemDC,Rects.right,Rects.bottom);
hRng = CreateRectRgn(0, 0, Rects.right, Rects.bottom);
SetWindowRgn(hWnd, hRng, TRUE);
Alpha = 0;
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;
ReleaseDC(hWnd, hDc);
DeleteDC(hMemDC);
break;
}
case WM_DESTROY:
{
    DeleteObject(hBitmap);
PostQuitMessage(0);
break;
}
case WM_PAINT:
{
GetClientRect(hWnd, &Rects);
hDc = BeginPaint(hWnd, &ps);
//Rectangle (hDc,0,0,100,100);
hMemDC = CreateCompatibleDC(hDc);
SelectObject(hMemDC, hBitmap);
BitBlt(hDc, 0, 0, Rects.right, Rects.bottom, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
EndPaint(hWnd, &ps);
SetLayeredWindowAttributes(hWnd, Alpha, Alpha, LMA_COLORKEY | LMA_ALPHA);
break;
}
case WM_LBUTTONDOWN:
{
ReleaseCapture();
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
break;
}
case WM_CLOSE:
{
Alpha = 255;
while(Alpha != 0)
{
Sleep(15);
SetLayeredWindowAttributes(hWnd, Alpha, Alpha, LMA_COLORKEY | LMA_ALPHA);
Alpha = Alpha - 15;
};
PostQuitMessage(0);
break;
}
default:
{
return (DefWindowProc(hWnd, message, wParam, lParam));
break;
}
break;
}
 return 0;
}

* keygen.rar (56.69 Кб - загружено 889 раз.)
« Последнее редактирование: 20-02-2007 20:19 от sxd » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 20-02-2007 20:30 » 

Код:
hRng = CreateRectRgn(0, 0, Rects.right, Rects.bottom);
SetWindowRgn(hWnd, hRng, TRUE);
Ты регистрируеш прямоугольный регион для окна, и естественно получаеш прямоугольное окно. Создавай регион по контору твоей картинки. Тогда и окно будет по контуру картинки. Почитай статьи https://club.shelek.ru/viewart.php?id=181 https://club.shelek.ru/viewart.php?id=98. Статьи правда оринтированы на Дельфи. Но разобраться с регионами по ним можно.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sxd
Участник

ru
Offline Offline

« Ответ #2 : 21-02-2007 17:39 » 

Так я могу делать окно в виде картинки и могу сделать медленно появляющееся окно, но всё вместе связать никак не могу. Ну примерно чего надо заместо:
Код:
hRng = CreateRectRgn(0, 0, Rects.right, Rects.bottom);
SetWindowRgn(hWnd, hRng, TRUE);
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #3 : 21-02-2007 18:41 » 

Неплохой пример работы с регионами есть в книге Фленова "С++ глазами хакера". Она даже в сети где-то есть если поискать. И пример даже рабочий Улыбаюсь
Записан
sxd
Участник

ru
Offline Offline

« Ответ #4 : 22-02-2007 19:05 » 

Спасибо всем! Создал регион по контору картинки и всё удалось! Очень рад и благодарен за оказание помощи! Спасибо всем!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines