winamp/Src/auth/Loginbox/pageInfo.cpp

132 lines
3.3 KiB
C++
Raw Normal View History

2024-09-24 12:54:57 +00:00
#include "./pageInfo.h"
#include "./common.h"
#include "./loginGui.h"
#include "../resource.h"
static HRESULT CALLBACK LoginPageInfo_CreateInstance(HWND hwnd, HWND hLoginbox, LoginPage **instance)
{
if (NULL == instance) return E_POINTER;
if (NULL == hwnd || NULL == hLoginbox) return E_INVALIDARG;
*instance = new LoginPageInfo(hwnd, hLoginbox);
if (NULL == instance) return E_OUTOFMEMORY;
return S_OK;
}
LoginPageInfo::LoginPageInfo(HWND hwnd, HWND hLoginbox)
: LoginPage(hwnd, hLoginbox)
{
}
LoginPageInfo::~LoginPageInfo()
{
}
HWND LoginPageInfo::CreatePage(HWND hLoginbox, HWND hParent)
{
return LoginPage::CreatePage(hLoginbox, MAKEINTRESOURCE(IDD_PAGE_INFO),
hParent, NULL, LoginPageInfo_CreateInstance);
}
void LoginPageInfo::UpdateLayout(BOOL fRedraw)
{
LoginPage::UpdateLayout(fRedraw);
RECT pageRect;
if (FALSE == GetPageRect(&pageRect))
return;
HWND hMessage = GetDlgItem(hwnd, IDC_MESSAGE);
if (NULL == hMessage) return;
INT cx, cy;
cx = pageRect.right - pageRect.left;
HDC hdc = GetDCEx(hMessage, NULL, DCX_CACHE | DCX_NORESETATTRS);
if (NULL != hdc)
{
HFONT fontControl = (HFONT)SendMessage(hMessage, WM_GETFONT, 0, 0L);
HFONT fontOrig = (HFONT)SelectObject(hdc, fontControl);
INT maxWidth = LoginBox_GetAveStrWidth(hdc, 80);
if (cx > maxWidth) cx = maxWidth;
SelectObject(hdc, fontOrig);
ReleaseDC(hMessage, hdc);
}
LoginBox_GetWindowTextSize(hMessage, cx, &cx, &cy);
if(cy > (pageRect.bottom - pageRect.top))
cy = pageRect.bottom - pageRect.top;
RECT messageRect;
GetWindowRect(hMessage, &messageRect);
MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&messageRect, 2);
if (messageRect.left != pageRect.left ||
messageRect.top != pageRect.top ||
(messageRect.right - messageRect.left) != cx ||
(messageRect.bottom - messageRect.top) != cy)
{
SetWindowPos(hMessage, NULL, pageRect.left, pageRect.top, cx, cy,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
if (FALSE != fRedraw)
{
HRGN rgn1 = CreateRectRgnIndirect(&messageRect);
HRGN rgn2 = CreateRectRgn(pageRect.left, pageRect.top, pageRect.left + cx, pageRect.top + cy);
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
RedrawWindow(hwnd, NULL, rgn1, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ERASENOW | RDW_VALIDATE | RDW_ALLCHILDREN);
DeleteObject(rgn1);
DeleteObject(rgn2);
}
}
}
BOOL LoginPageInfo::OnInitDialog(HWND hFocus, LPARAM param)
{
HFONT fontText = NULL;
LoginGuiObject *loginGui;
if (SUCCEEDED(LoginGuiObject::QueryInstance(&loginGui)))
{
fontText = loginGui->GetTextFont();
loginGui->Release();
}
if (NULL != fontText)
{
HWND hMessage = GetDlgItem(hwnd, IDC_MESSAGE);
if (NULL != hMessage)
SendMessage(hMessage, WM_SETFONT, (WPARAM)fontText, 0L);
}
LoginPage::OnInitDialog(hFocus, param);
return FALSE;
}
void LoginPageInfo::OnSetMessage(LPCWSTR pszMessage)
{
HWND hMessage = GetDlgItem(hwnd, IDC_MESSAGE);
if (NULL != hMessage)
{
SetWindowText(hMessage, pszMessage);
INT showWindow = (NULL != pszMessage && L'\0' != *pszMessage) ? SW_SHOWNA : SW_HIDE;
ShowWindow(hMessage, showWindow);
}
}
INT_PTR LoginPageInfo::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case NLPIM_SETMESSAGE: OnSetMessage((LPCWSTR)lParam); return TRUE;
}
return __super::DialogProc(uMsg, wParam, lParam);
}