📄 cdlgabout.cpp
字号:
// e$Id: CDlgAbout.cpp,v 1.16 2004/09/04 05:51:35 genta Exp $
/*! @file
@brief バージョン情報ダイアログ
@author Norio Nakatani
@date 1998/3/13 作成
$Revision: 1.16 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 200, genta, jepro
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "CDlgAbout.h"
#include "sakura_rc.h" // 2002/2/10 aroka 復帰
#include "CBREGEXP.h"
#include "CPPA.h"
// Dec. 2, 2002 genta
#include "etc_uty.h"
// バージョン情報 CDlgAbout.cpp //@@@ 2002.01.07 add start MIK
#include "sakura.hh"
const DWORD p_helpids[] = { //12900
IDC_BUTTON_CONTACT, HIDC_ABOUT_BUTTON_CONTACT,
IDOK, HIDOK_ABOUT,
IDC_EDIT_ABOUT, HIDC_ABOUT_EDIT_ABOUT,
// IDC_STATIC_URL_UR, 12970,
// IDC_STATIC_URL_ORG, 12971,
// IDC_STATIC_UPDATE, 12972,
// IDC_STATIC_VER, 12973,
// IDC_STATIC, -1,
0, 0
}; //@@@ 2002.01.07 add end MIK
// From Here Feb. 7, 2002 genta
#if defined(__BORLANDC__)
# define COMPILER_TYPE "B"
#elif defined(__GNUG__)
# define COMPILER_TYPE "G"
#elif defined(_MSC_VER)
# if defined(_M_IA64)
# define COMPILER_TYPE "V_I64"
# elif defined(_M_AMD64)
# define COMPILER_TYPE "V_A64"
# else
# define COMPILER_TYPE "V"
# endif
#else
# define COMPILER_TYPE "U"
#endif
// To Here Feb. 7, 2002 genta
// From Here Nov. 7, 2000 genta
/*!
標準以外のメッセージを捕捉する
*/
INT_PTR CDlgAbout::DispatchEvent( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
INT_PTR result;
result = CDialog::DispatchEvent( hWnd, wMsg, wParam, lParam );
switch( wMsg ){
case WM_CTLCOLORDLG:
case WM_CTLCOLORSTATIC:
return (INT_PTR)GetStockObject( WHITE_BRUSH );
}
return result;
}
// To Here Nov. 7, 2000 genta
/* モーダルダイアログの表示 */
int CDlgAbout::DoModal( HINSTANCE hInstance, HWND hwndParent )
{
return (int)CDialog::DoModal( hInstance, hwndParent, IDD_ABOUT, NULL );
}
BOOL CDlgAbout::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hwndDlg;
char szMsg[2048];
char szFile[_MAX_PATH];
WIN32_FIND_DATA wfd;
SYSTEMTIME systimeL;
/* この実行ファイルの情報 */
::GetModuleFileName( ::GetModuleHandle( NULL ), szFile, sizeof( szFile ) );
// 2003.10.04 Moca ハンドルのクローズ忘れ
::ZeroMemory( &wfd, sizeof( wfd ));
HANDLE hFind = ::FindFirstFile( szFile, &wfd );
if( hFind != INVALID_HANDLE_VALUE ){
FindClose( hFind );
}
::FileTimeToLocalFileTime( &wfd.ftLastWriteTime, &wfd.ftLastWriteTime );
::FileTimeToSystemTime( &wfd.ftLastWriteTime, &systimeL );
/* バージョン情報 */
// Nov. 6, 2000 genta Unofficial Releaseのバージョンとして設定
// Jun. 8, 2001 genta GPL化に伴い、OfficialなReleaseとしての道を歩み始める
// Feb. 7, 2002 genta コンパイラ情報追加
// 2004.05.13 Moca バージョン番号は、プロセスごとに取得する
DWORD dwVersionMS, dwVersionLS;
GetAppVersionInfo( NULL, VS_VERSION_INFO,
&dwVersionMS, &dwVersionLS );
wsprintf( szMsg, "Ver. %d.%d.%d.%d " COMPILER_TYPE,
HIWORD( dwVersionMS ),
LOWORD( dwVersionMS ),
HIWORD( dwVersionLS ),
LOWORD( dwVersionLS )
);
::SetDlgItemText( m_hWnd, IDC_STATIC_VER, szMsg );
/* 更新日情報 */
wsprintf( szMsg, "Last Update: %d/%d/%d %02d:%02d:%02d",
systimeL.wYear,
systimeL.wMonth,
systimeL.wDay,
systimeL.wHour,
systimeL.wMinute,
systimeL.wSecond
);
::SetDlgItemText( m_hWnd, IDC_STATIC_UPDATE, szMsg );
// From Here Jun. 8, 2001 genta
// Edit Boxにメッセージを追加する.
int desclen = ::LoadString( m_hInstance, IDS_ABOUT_DESCRIPTION, szMsg, sizeof( szMsg ) );
if( desclen > 0 ){
::SetDlgItemText( m_hWnd, IDC_EDIT_ABOUT, szMsg );
}
// To Here Jun. 8, 2001 genta
// From Here Dec. 2, 2002 genta
// アイコンをカスタマイズアイコンに合わせる
HICON hIcon = GetAppIcon( m_hInstance, ICON_DEFAULT_APP, FN_APP_ICON, false );
HWND hIconWnd = GetDlgItem( m_hWnd, IDC_STATIC_MYICON );
if( hIconWnd != NULL && hIcon != NULL ){
::SendMessage( hIconWnd, STM_SETICON, (WPARAM)hIcon, 0 );
}
// To Here Dec. 2, 2002 genta
// URLウィンドウをサブクラス化する
m_UrlUrWnd.SubclassWindow( GetDlgItem( m_hWnd, IDC_STATIC_URL_UR ) );
m_UrlOrgWnd.SubclassWindow( GetDlgItem( m_hWnd, IDC_STATIC_URL_ORG ) );
/* 基底クラスメンバ */
return CDialog::OnInitDialog( m_hWnd, wParam, lParam );
}
BOOL CDlgAbout::OnBnClicked( int wID )
{
switch( wID ){
case IDC_BUTTON_CONTACT:
/* 「原作者連絡先」のヘルプ */ //Jan. 12, 2001 jepro `作者'の前に`原'を付けた
::WinHelp( m_hWnd, m_szHelpFile, HELP_CONTEXT, 8 );
return TRUE;
case IDC_STATIC_URL_UR:
case IDC_STATIC_URL_ORG:
// Web Browserの起動
{
char buf[512];
::GetWindowText( ::GetDlgItem( m_hWnd, wID ), buf, 512 );
ShellExecute( m_hWnd, NULL, buf, NULL, NULL, SW_SHOWNORMAL );
return TRUE;
}
//Jan. 12, 2001 JEPRO UR1.2.20.2 (Nov. 7, 2000) から以下のボタンは削除されているのでコメントアウトした
// case IDC_BUTTON_DOWNLOAD:
// /* 「最新バージョンのダウンロード」のヘルプ */
// ::WinHelp( m_hWnd, m_szHelpFile, HELP_CONTEXT, 112 );
// return TRUE;
}
/* 基底クラスメンバ */
return CDialog::OnBnClicked( wID );
}
//@@@ 2002.01.18 add start
LPVOID CDlgAbout::GetHelpIdTable(void)
{
return (LPVOID)p_helpids;
}
BOOL CUrlWnd::SubclassWindow( HWND hWnd )
{
// STATICウィンドウをサブクラス化する
// 元のSTATICは WS_TABSTOP, SS_NOTIFY スタイルのものを使用すること
if( m_hWnd != NULL )
return FALSE;
if( !IsWindow( hWnd ) )
return FALSE;
// サブクラス化を実行する
LONG_PTR lptr;
SetLastError( 0 );
lptr = SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG_PTR)this );
if( lptr == 0 && GetLastError() != 0 )
return FALSE;
m_pOldProc = (WNDPROC)SetWindowLongPtr( hWnd, GWLP_WNDPROC, (LONG_PTR)UrlWndProc );
if( m_pOldProc == NULL )
return FALSE;
m_hWnd = hWnd;
// 下線付きフォントに変更する
HFONT hFont;
LOGFONT lf;
hFont = (HFONT)SendMessage( hWnd, WM_GETFONT, (WPARAM)0, (LPARAM)0 );
GetObject( hFont, sizeof(lf), &lf );
lf.lfUnderline = TRUE;
m_hFont = CreateFontIndirect( &lf );
if(m_hFont != NULL)
SendMessage( hWnd, WM_SETFONT, (WPARAM)m_hFont, (LPARAM)FALSE );
return TRUE;
}
LRESULT CALLBACK CUrlWnd::UrlWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
CUrlWnd* pUrlWnd = (CUrlWnd*)GetWindowLongPtr( hWnd, GWLP_USERDATA );
HDC hdc;
POINT pt;
RECT rc;
switch ( msg ) {
case WM_SETCURSOR:
// カーソル形状変更
HCURSOR hCursor;
hCursor = LoadCursor( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDC_CURSOR_HAND ) );
SetCursor( hCursor );
return (LRESULT)0;
case WM_LBUTTONDOWN:
// キーボードフォーカスを自分に当てる
SendMessage( GetParent(hWnd), WM_NEXTDLGCTL, (WPARAM)hWnd, (LPARAM)1 );
break;
case WM_SETFOCUS:
case WM_KILLFOCUS:
// 再描画
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
break;
case WM_GETDLGCODE:
// デフォルトプッシュボタンのように振舞う(Enterキーの有効化)
// 方向キーは無効化(IEのバージョン情報ダイアログと同様)
return DLGC_DEFPUSHBUTTON | DLGC_WANTARROWS;
case WM_MOUSEMOVE:
// カーソルがウィンドウ内に入ったらタイマー起動
// ウィンドウ外に出たらタイマー削除
// 各タイミングで再描画
BOOL bHilighted;
pt.x = LOWORD( lParam );
pt.y = HIWORD( lParam );
GetClientRect( hWnd, &rc );
bHilighted = PtInRect( &rc, pt );
if( bHilighted != pUrlWnd->m_bHilighted ){
pUrlWnd->m_bHilighted = bHilighted;
InvalidateRect( hWnd, NULL, TRUE );
if( pUrlWnd->m_bHilighted )
SetTimer( hWnd, 1, 200, NULL );
else
KillTimer( hWnd, 1 );
}
break;
case WM_TIMER:
// カーソルがウィンドウ外にある場合にも WM_MOUSEMOVE を送る
GetCursorPos( &pt );
ScreenToClient( hWnd, &pt );
GetClientRect( hWnd, &rc );
if( !PtInRect( &rc, pt ) )
SendMessage( hWnd, WM_MOUSEMOVE, 0, MAKELONG( pt.x, pt.y ) );
break;
case WM_PAINT:
// ウィンドウの描画
PAINTSTRUCT ps;
HFONT hFont;
HFONT hOldFont;
TCHAR szText[512];
hdc = BeginPaint( hWnd, &ps );
// 現在のクライアント矩形、テキスト、フォントを取得する
GetClientRect( hWnd, &rc );
GetWindowText( hWnd, szText, 512 );
hFont = (HFONT)SendMessage( hWnd, WM_GETFONT, (WPARAM)0, (LPARAM)0 );
// テキスト描画
SetBkMode( hdc, TRANSPARENT );
SetTextColor( hdc, pUrlWnd->m_bHilighted? RGB( 0x84, 0, 0 ): RGB( 0, 0, 0xff ) );
hOldFont = (HFONT)SelectObject( hdc, (HGDIOBJ)hFont );
TextOut( hdc, 2, 0, szText, lstrlen( szText ) );
SelectObject( hdc, (HGDIOBJ)hOldFont );
// フォーカス枠描画
if( GetFocus() == hWnd )
DrawFocusRect( hdc, &rc );
EndPaint( hWnd, &ps );
return (LRESULT)0;
case WM_ERASEBKGND:
hdc = (HDC)wParam;
GetClientRect( hWnd, &rc );
// 背景描画
if( pUrlWnd->m_bHilighted ){
// ハイライト時背景描画
SetBkColor( hdc, RGB( 0xff, 0xff, 0 ) );
ExtTextOut( hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL );
}else{
// 親にWM_CTLCOLORSTATICを送って背景ブラシを取得し、背景描画する
HBRUSH hbr;
HBRUSH hbrOld;
hbr = (HBRUSH)SendMessage( GetParent( hWnd ), WM_CTLCOLORSTATIC, wParam, (LPARAM)hWnd );
hbrOld = (HBRUSH)SelectObject( hdc, hbr );
FillRect( hdc, &rc, hbr );
SelectObject( hdc, hbrOld );
}
return (LRESULT)1;
case WM_DESTROY:
// 後始末
KillTimer( hWnd, 1 );
SetWindowLongPtr( hWnd, GWLP_WNDPROC, (LONG_PTR)pUrlWnd->m_pOldProc );
if( pUrlWnd->m_hFont != NULL )
DeleteObject( pUrlWnd->m_hFont );
pUrlWnd->m_hWnd = NULL;
pUrlWnd->m_hFont = NULL;
pUrlWnd->m_bHilighted = FALSE;
pUrlWnd->m_pOldProc = NULL;
return (LRESULT)0;
}
return CallWindowProc( pUrlWnd->m_pOldProc, hWnd, msg, wParam, lParam );
}
//@@@ 2002.01.18 add end
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -