Files
leocad/win/aboutdlg.cpp
T

205 lines
5.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// AboutDlg.cpp : implementation file
//
#include "stdafx.h"
#include "leocad.h"
#include "AboutDlg.h"
#include "config.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
CAboutDlg::~CAboutDlg()
{
m_Font.DeleteObject();
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_BN_CLICKED(IDC_ABTDLG_HOMEPAGE, OnHomepage)
ON_WM_CTLCOLOR()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg message handlers
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Initialize the OpenGL information box.
CString info, tmp;
PIXELFORMATDESCRIPTOR pfd;
OpenGLDescribePixelFormat(m_hViewDC, OpenGLGetPixelFormat(m_hViewDC), sizeof(PIXELFORMATDESCRIPTOR), &pfd);
info = ("Pixel Format: ");
if (pfd.iPixelType == PFD_TYPE_RGBA)
info += "RGBA, ";
else
info += "Color Index, ";
if (pfd.dwFlags & PFD_DOUBLEBUFFER)
info += "Double Buffer ";
else
info += "Single Buffer ";
if ((pfd.dwFlags & (PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT)) == 0)
info += "(Installable Client Driver)\r\n";
else if ((pfd.dwFlags & (PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT)) == (PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT))
info += "(Mini-Client Driver)\r\n";
else if ((pfd.dwFlags & (PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT)) == PFD_GENERIC_FORMAT)
info += "(Generic Software Driver)\r\n";
else if ((pfd.dwFlags & (PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT)) == PFD_GENERIC_ACCELERATED)
info += "(Unknown Driver Type)\r\n";
tmp.Format("Color bits: %d, Depth Buffer: %d bits\r\nOpenGL Version ", pfd.cColorBits, pfd.cDepthBits);
info += tmp;
info += (const char*)glGetString(GL_VERSION);
info += " (";
info += (const char*)glGetString(GL_RENDERER);
info += " - ";
info += (const char*)glGetString(GL_VENDOR);
info += ")";
SetDlgItemText(IDC_ABTDLG_INFO, info);
// Underline the homepage link.
LOGFONT lf;
CFont* pFont = GetDlgItem(IDC_ABTDLG_HOMEPAGE)->GetFont();
if (pFont != NULL)
{
pFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
m_Font.DeleteObject();
m_Font.CreateFontIndirect(&lf);
GetDlgItem(IDC_ABTDLG_HOMEPAGE)->SetFont(&m_Font);
}
// The following function appeared in Paul DiLascia's Jan 1998 MSJ articles.
// It loads a "hand" cursor from "winhlp32.exe" resources
// Get the windows directory
CString strWndDir;
GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
strWndDir.ReleaseBuffer();
strWndDir += _T("\\winhlp32.exe");
// This retrieves cursor #106 from winhlp32.exe, which is a hand pointer
HMODULE hModule = LoadLibrary(strWndDir);
if (hModule)
{
HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
m_hLinkCursor = CopyCursor(hHandCursor);
FreeLibrary(hModule);
}
AdjustHomepageWindow();
// Fix the version number.
SetDlgItemText(IDC_ABTDLG_VERSION, "LeoCAD Version " LC_VERSION_TEXT LC_VERSION_TAG);
return TRUE;
}
// Move and resize the window so that its client area has the same size as the hyperlink text.
// This prevents the hyperlink cursor being active when it is not over the text.
void CAboutDlg::AdjustHomepageWindow()
{
CWnd *pWnd = GetDlgItem(IDC_ABTDLG_HOMEPAGE);
ASSERT(::IsWindow(pWnd->GetSafeHwnd()));
// Get the current window rect
CRect rcWnd;
pWnd->GetWindowRect(rcWnd);
// For a child CWnd object, window rect is relative to the
// upper-left corner of the parent windows client area.
ScreenToClient(rcWnd);
// Get the current client rect
CRect rcClient;
pWnd->GetClientRect(rcClient);
// Calc border size based on window and client rects
int borderWidth = rcWnd.Width() - rcClient.Width();
int borderHeight = rcWnd.Height() - rcClient.Height();
// Get the extent of window text
CString strWndText;
pWnd->GetWindowText(strWndText);
CDC* pDC = pWnd->GetDC();
CFont* pOldFont = pDC->SelectObject(&m_Font);
CSize Extent = pDC->GetTextExtent(strWndText);
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);
// Get the text justification style
DWORD dwStyle = pWnd->GetStyle();
// Recalc window size and position based on text justification
if (dwStyle & SS_CENTERIMAGE)
rcWnd.DeflateRect(0, (rcWnd.Height() - Extent.cy) / 2);
else
rcWnd.bottom = rcWnd.top + Extent.cy;
if (dwStyle & SS_CENTER)
rcWnd.DeflateRect((rcWnd.Width() - Extent.cx) / 2, 0);
else if (dwStyle & SS_RIGHT)
rcWnd.left = rcWnd.right - Extent.cx;
else // SS_LEFT
rcWnd.right = rcWnd.left + Extent.cx;
// Move and resize the window
pWnd->MoveWindow(rcWnd.left, rcWnd.top, rcWnd.Width() + borderWidth, rcWnd.Height() + borderHeight);
}
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == IDC_ABTDLG_HOMEPAGE)
pDC->SetTextColor(RGB(0, 0, 255));
return hbr;
}
BOOL CAboutDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd->GetDlgCtrlID() == IDC_ABTDLG_HOMEPAGE)
{
if (m_hLinkCursor)
::SetCursor(m_hLinkCursor);
return TRUE;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
void CAboutDlg::OnHomepage()
{
ShellExecute(::GetDesktopWindow(), _T("open"), _T("http://www.leocad.org"), NULL, NULL, SW_NORMAL);
}