Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |
Спасибо. Помогло, но на 100% я пока не удовлетворён. При... 22.09.08 07:55 Число просмотров: 1652
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Спасибо. Помогло, но на 100% я пока не удовлетворён. При появлении окна теперь оно как-то странно подёргивается. Такое ощущение, что сначала отображается непрозрачное окно, потом оно скрывается и отображается прозрачное.
Ещё заметил, что если ShowWindow стоит сразу же после CreateWindow, то происходит выше озвученное подёргивание, а если вызвать ShowWindow после всех манипуляций, то окно сначала мигает чёрным цветом.
Вот код:
#include <windows.h>
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
#define WS_EX_COMPOSITED 0x02000000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
UpdateWindow(hwnd);
ShowWindow(hwnd, SW_SHOWNORMAL);
hm = GetModuleHandle("USER32.DLL");
pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");
LONG wStyle = GetWindowLongPtr(hwnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_STYLE, wStyle);
wStyle = GetWindowLongPtr(hwnd,GWL_EXSTYLE);
wStyle |= WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_EXSTYLE, wStyle);
SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
if (pfn)
{
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
pfn(hwnd, 0, 200, LWA_ALPHA);
}
// UpdateWindow(hwnd);
// ShowWindow(hwnd, SW_SHOWNORMAL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc( hwnd, iMsg, wParam, lParam );
}
}
---
|
<programming>
|
[Win32] Устранить чёрное мигание прозрачного окна 21.09.08 06:08
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
В Интернете нашёл пример прозрачного окна. Всё сделано, как написано в MSDN, но почему-то перед открытием окна оно мигает чёрным цветом. Если убрать функции прозрачности, то всё нормально. Почему так? Вот код:
#include <windows.h>
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
hm = GetModuleHandle("USER32.DLL");
pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");
if (pfn)
{
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
pfn(hwnd, 0, 200, LWA_ALPHA);
}
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (iMsg)
{
case WM_CREATE:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc( hwnd, iMsg, wParam, lParam );
}
}
---
|
 |
[Win32] Собрал пример - ничего не мигает 22.09.08 20:19
Автор: amirul <Serge> Статус: The Elderman
|
Так что проверить не могу, но попробуй все таки обработать WM_ERASEBKGND - это очень частый виновник всех и всяческих миганий.
|
 |
Так вроде не мигает, если добавить anti-flickering, что само... 22.09.08 07:03
Автор: void <Grebnev Valery> Статус: Elderman Отредактировано 22.09.08 07:04 Количество правок: 1
|
Так вроде не мигает, если добавить anti-flickering, что само по-себе полезно при resize:
hWnd = ::CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
::ShowWindow(hWnd, nCmdShow);
::UpdateWindow(hWnd);
LONG wStyle = ::GetWindowLongPtr(hWnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED;
::SetWindowLongPtr(hWnd,GWL_STYLE, wStyle);
wStyle = ::GetWindowLongPtr(hWnd,GWL_EXSTYLE);
wStyle |= WS_EX_COMPOSITED;
::SetWindowLongPtr(hWnd,GWL_EXSTYLE, wStyle);
::SetWindowLongPtr(hWnd, GWL_EXSTYLE, GetWindowLongPtr(hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
::SetLayeredWindowAttributes( hWnd, 0, 200, LWA_ALPHA);
Кстати, Get/SetWindowLongPtr лучше чем Get/SetWindowLong.
Помогло?
|
 |  |
Спасибо. Помогло, но на 100% я пока не удовлетворён. При... 22.09.08 07:55
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Спасибо. Помогло, но на 100% я пока не удовлетворён. При появлении окна теперь оно как-то странно подёргивается. Такое ощущение, что сначала отображается непрозрачное окно, потом оно скрывается и отображается прозрачное.
Ещё заметил, что если ShowWindow стоит сразу же после CreateWindow, то происходит выше озвученное подёргивание, а если вызвать ShowWindow после всех манипуляций, то окно сначала мигает чёрным цветом.
Вот код:
#include <windows.h>
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
#define WS_EX_COMPOSITED 0x02000000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
UpdateWindow(hwnd);
ShowWindow(hwnd, SW_SHOWNORMAL);
hm = GetModuleHandle("USER32.DLL");
pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");
LONG wStyle = GetWindowLongPtr(hwnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_STYLE, wStyle);
wStyle = GetWindowLongPtr(hwnd,GWL_EXSTYLE);
wStyle |= WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_EXSTYLE, wStyle);
SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
if (pfn)
{
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
pfn(hwnd, 0, 200, LWA_ALPHA);
}
// UpdateWindow(hwnd);
// ShowWindow(hwnd, SW_SHOWNORMAL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc( hwnd, iMsg, wParam, lParam );
}
}
---
|
 |  |  |
Ws_ex_composited - говорит виндовз xp, что надо использовать... 22.09.08 15:20
Автор: void <Grebnev Valery> Статус: Elderman
|
> Такое ощущение, что сначала отображается непрозрачное окно, > потом оно скрывается и отображается прозрачное.
WS_EX_COMPOSITED - говорит виндовз XP, что надо использовать даблбуфферинг при выводе окна. Тот же самый эффект - "залипание" и немедленный вывод окна с изменнёнными размерами, при изменении размеров. На виста и так всё работает красиво, без этих "улучшений".
|
 |  |  |  |
Т.е. под XP без моргания окно сделать не получится? 04.10.08 02:14
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Но ведь такие приложения как Kasperky Antivirus, Avast не моргают при выводе таких окон.
|
 |  |  |  |  |
Я тебе отвечал на твой конкретный вопрос. Что же до того,... 04.10.08 03:42
Автор: void <Grebnev Valery> Статус: Elderman
|
> Но ведь такие приложения как Kasperky Antivirus, Avast не > моргают при выводе таких окон. Я тебе отвечал на твой конкретный вопрос. Что же до того, когда моргает, когда нет - напиши Win API приложение. Сделай там TabControl. Попробуй поизменяй размеры родительского окна, так чтобы TabControl автоматически делал resize. Если контролы на табе и сам таб замигают, тогда давай и обсудим.
|
 |  |  |  |  |  |
У меня даже пустое окно моргает. Пример я приводил выше... 04.10.08 05:54
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
У меня даже пустое окно моргает. Пример я приводил выше. Твои рекомендации учёл, окно продолжает моргать. Или мы на разных языках говорим?
|
|
|