Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

206 lines
5.7 KiB
C++

#include "stdafx.h"
#include "cspcfd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT CALLBACK OFN_SpcHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
UINT CALLBACK OFN_SpcHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hParent;
#ifdef _DEBUG
if ((uMsg == WM_NOTIFY) || (uMsg == WM_COMMAND)) {
int a = WM_COMMAND;
uMsg++;
uMsg--;
}
#endif
hParent = ::GetParent(hDlg);
if (hParent) {
CSpcFileDialog& DLG = (uMsg == WM_INITDIALOG) ? *(CSpcFileDialog*)((OPENFILENAME*)lParam)->lCustData: *(CSpcFileDialog*)CWnd::FromHandlePermanent(hDlg);
if (&DLG) {
if (uMsg == WM_INITDIALOG)
DLG.m_bWM_INITDIALOG = TRUE;
if (DLG.m_bWM_INITDIALOG && !DLG.m_bWM_DESTROY) {
if (uMsg == WM_DESTROY)
DLG.m_bWM_DESTROY = TRUE;
BOOL bRet = FALSE;
if (DLG.DoMessage(hParent, uMsg, wParam, lParam, bRet))
return bRet;
}
}
}
return CSpcFileDialog::DoOldProc(hDlg, uMsg, wParam, lParam);
}
UINT CSpcFileDialog::DoOldProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static CFileDialog s_FD(FALSE, NULL, NULL);
return (*s_FD.m_ofn.lpfnHook)(hDlg, uMsg, wParam, lParam);
}
CSpcFileDialog::CSpcFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt/* = NULL*/, LPCTSTR lpszFileName/* = NULL*/, DWORD dwFlags/* = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT*/, LPCTSTR lpszFilter/* = NULL*/, CWnd* pParentWnd/* = NULL*/)
: CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd),
m_dwStyle(0), m_uID(SPCHOOK_CONTROL_ID), m_hInstance(NULL)
{
m_bWM_INITDIALOG = FALSE;
m_bWM_DESTROY = FALSE;
}
void CSpcFileDialog::SetTitle(const char* pcszTitle)
{
m_ofn.lpstrTitle = pcszTitle;
}
void CSpcFileDialog::SetWorkingDir(const char* pcszWorkingDir)
{
m_ofn.lpstrInitialDir = pcszWorkingDir;
}
void CSpcFileDialog::SetFilterIndex(int nFilterIndex)
{
m_ofn.nFilterIndex = nFilterIndex;
}
int CSpcFileDialog::GetFilterIndex() const
{
return m_ofn.nFilterIndex;
}
void CSpcFileDialog::SetCustomFilter(const char* pcszName/* = NULL*/, const char* pcszExt/* = NULL*/)
{
char* p = m_strCustFilter.GetBuffer(m_ofn.nMaxCustFilter = 512);
m_ofn.lpstrCustomFilter = p;
if (!pcszName) {
pcszName = "사용자 정의 파일";
}
strcpy(p, pcszName);
p = &p[strlen(pcszName)];
p++; // skip '\0';
if (!pcszExt) {
pcszExt = "*.*";
}
strcpy(p, pcszExt);
p = &p[strlen(pcszExt)];
p++; // skip '\0';
*p = '\0';
}
void CSpcFileDialog::EnableHook(const char* pcszWindowText, DWORD dwStyle/* = (DWORD)(-1)*/)
{
m_strWindowText.Assign(pcszWindowText);
ASSERT(dwStyle);
m_dwStyle = dwStyle;
m_ofn.Flags |= (OFN_ENABLEHOOK | OFN_EXPLORER);
m_ofn.Flags &= ~OFN_HIDEREADONLY;
m_ofn.lpfnHook = OFN_SpcHookProc;
m_ofn.lCustData = (DWORD)this;
}
BOOL CSpcFileDialog::DoMessage(HWND hParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bRet)
{
switch(uMsg) {
case WM_INITDIALOG:
if (m_dwStyle) {
//0x480 // 파일 이름 Edit
HWND hReadOnly = ::GetDlgItem(hParent, 0x0410); // Read Only
if (hReadOnly) {
if (m_dwStyle == (DWORD)(-1)) {
::SetWindowText(hReadOnly, m_strWindowText);
} else {
CRect r;
::GetWindowRect(hReadOnly, &r);
::ShowWindow(hReadOnly, SW_HIDE);
::ScreenToClient(hParent, &r.TopLeft());
::ScreenToClient(hParent, &r.BottomRight());
int nRet = DoOveride(hParent, r);
if (nRet != 0)
EndDialog(nRet);
}
}
}
break;
case WM_DESTROY:
DoDestroy();
break;
}
return FALSE;
}
int CSpcFileDialog::DoOveride(HWND hParent, CRect& r)
{
return 0; // ok!
}
void CSpcFileDialog::DoDestroy()
{
}
CSelFileDialog::CSelFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt/* = NULL*/, LPCTSTR lpszFileName/* = NULL*/, DWORD dwFlags/* = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT*/, LPCTSTR lpszFilter/* = NULL*/, CWnd* pParentWnd/* = NULL*/)
: CSpcFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
EnableHook(NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS);
m_nSEL = -1;
}
int CSelFileDialog::GetSEL() const
{
ASSERT(m_dwStyle && (m_dwStyle != (DWORD)(-1)));
return m_nSEL;
}
BOOL CSelFileDialog::OnFileNameOK()
{
ASSERT(::IsWindow(m_Combo));
m_nSEL = m_Combo.GetCurSel();
return CSpcFileDialog::OnFileNameOK();
}
int CSelFileDialog::DoOveride(HWND hParent, CRect& r)
{
r.bottom = r.top + 300;
if (!m_hInstance) {
m_hInstance = AfxGetApp()->m_hInstance;
}
HWND hWndCombo = ::CreateWindow("ComboBox", m_strWindowText, m_dwStyle, r.left, r.top, r.Width(), r.Height(), hParent, (HMENU)m_uID, m_hInstance, NULL);
if (hWndCombo) {
m_Combo.Attach(hWndCombo);
m_Combo.ResetContent();
int i, nSize = m_aSELs.GetSize();
ASSERT(nSize > 0);
CStr* p = &m_aSELs.GetAt(0);
for(i = 0; i < nSize; i++) {
m_Combo.AddString(p->String());
p++;
}
m_Combo.SetCurSel(m_nSEL);
return 0;
}
return -2;
}
void CSelFileDialog::DoDestroy()
{
if (::IsWindow(m_Combo)) {
m_Combo.Detach();
}
}