У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.
Исправлено форматирование текста. — SchweinDeBurg
Здравствуйте, AlexGin, Вы писали:
AG>Здравствуйте, lord_206, Вы писали:
_>>У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.
AG> Установите Platform SDK — как минимум для Windows 2000
Вот код:
class CNoteApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWnd : public CFrameWnd
{
protected:
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP();
public:
};
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CNoteApp::InitInstance()
{
CMainWnd* pFrame = new CMainWnd;
HWND hWnd=pFrame->m_hWnd ;
pFrame->CreateEx(WS_EX_LAYERED,
0, _T("note"),
WS_OVERLAPPEDWINDOW,
400,
200,
200,
200,
NULL,
NULL,
NULL);
typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
lpfnSetLayeredWindowAttributes m_pSetLayeredWindowAttributes ;
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
m_pSetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
// If the import did not succeed, make sure your app can handle it!
if (NULL == m_pSetLayeredWindowAttributes)
return FALSE; // Bail out!!!
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
m_pSetLayeredWindowAttributes(hWnd, 0, (255 / 90) * 100, LWA_ALPHA);
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
this->m_pMainWnd=pFrame ;
return true;
}
Создается окно невидимое, срабатывает параметр CreateEx(WS_EX_LAYERED), но прозрачность не регулируется так как окно не видно. Создал окно с помощью мастера Windows 32 Aplication "hello world" все работает, а когда создаю в ручную (код выше) — не работает , видимо неправильно с передачей hWnd . Подскажите плиз в чем и где беда
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
А>BOOL CNoteApp::InitInstance()
А>{
А> CMainWnd* pFrame = new CMainWnd;
А> HWND hWnd=pFrame->m_hWnd ; - //hWnd - это не указатель, поэтому после изменения хэндла
//m_hWnd в pFrame(после создания) он всё равно останется
//равным 0x0000000, и все манипуляции над ним бесполезны
А>pFrame->CreateEx(WS_EX_LAYERED,
А> 0, _T("note"),
А> WS_OVERLAPPEDWINDOW,
А> 400,
А> 200,
А> 200,
А> 200,
А> NULL,
А> NULL,
А> NULL);
А> pFrame->ShowWindow(SW_SHOW);
А> pFrame->UpdateWindow();
this->>m_pMainWnd=pFrame ;
А>return true;
А>}
А>
HWND hWnd=pFrame->m_hWnd — если произвести это присваивание после строчки pFrame->CreateEx, то всё будет ОК и переменная hWnd будет содержать реальный хэндл только что созданного окна.
Или заменить везде hWnd на pFrame->GetSafeHwnd()...