You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
595 lines
17 KiB
595 lines
17 KiB
/* File: \WACKER\TDLL\new_cnct.c (Created: 2-Feb-1994)
|
|
*
|
|
* Copyright 1990,1995 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 11 $
|
|
* $Date: 5/15/02 4:31p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include <commctrl.h>
|
|
|
|
extern BOOL WINAPI SetWindowStyle(HWND hwnd, DWORD style, BOOL fExtended);
|
|
int gnrlPickIconDlg(HWND hDlg);
|
|
|
|
#include <term\res.h>
|
|
|
|
#include "stdtyp.h"
|
|
#include "session.h"
|
|
#include "mc.h"
|
|
#include "globals.h"
|
|
#include "misc.h"
|
|
#include "tdll.h"
|
|
#include "htchar.h"
|
|
#include "errorbox.h"
|
|
#include "assert.h"
|
|
#include "hlptable.h"
|
|
|
|
#if !defined(DlgParseCmd)
|
|
#define DlgParseCmd(i,n,c,w,l) i=LOWORD(w);n=HIWORD(w);c=(HWND)l;
|
|
#endif
|
|
|
|
struct stSaveDlgStuff
|
|
{
|
|
/*
|
|
* Put in whatever else you might need to access later
|
|
*/
|
|
HSESSION hSession;
|
|
|
|
TCHAR achSessName[FNAME_LEN];
|
|
};
|
|
|
|
typedef struct stSaveDlgStuff SDS;
|
|
|
|
#define IDC_IC_ICON 101
|
|
#define IDC_TF_NAME 102
|
|
#define IDC_LB_NAME 105
|
|
#define IDC_EF_NAME 106
|
|
#define IDC_TF_ICON 107
|
|
#define IDC_LB_LIST 108
|
|
#define IDC_PB_BROWSE 109
|
|
|
|
#define NC_CUT1 103
|
|
#define NC_CUT2 110
|
|
|
|
// Design change - 4/14/94: Don't show Wackers New Connection icon
|
|
// in selection list. - mrw
|
|
//
|
|
#define ICON_COUNT 16
|
|
|
|
BOOL NCD_WM_DRAWITEM(LPDRAWITEMSTRUCT pD);
|
|
BOOL NCD_WM_COMPAREITEM(LPCOMPAREITEMSTRUCT pC);
|
|
BOOL NCD_WM_DELETEITEM(LPDELETEITEMSTRUCT pD);
|
|
BOOL NCD_WM_MEASUREITEM(LPMEASUREITEMSTRUCT pM);
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION: NewConnectionDlg
|
|
*
|
|
* DESCRIPTION: Dialog manager stub
|
|
*
|
|
* ARGUMENTS: Standard Windows dialog manager
|
|
*
|
|
* RETURNS: Standard Windows dialog manager
|
|
*
|
|
*/
|
|
INT_PTR CALLBACK NewConnectionDlg(HWND hDlg, UINT wMsg, WPARAM wPar, LPARAM lPar)
|
|
{
|
|
HWND hwndChild;
|
|
INT nId;
|
|
INT nNtfy, fBad;
|
|
SDS *pS;
|
|
int nLoop;
|
|
HWND hwnd;
|
|
BOOL fRc;
|
|
DWORD dwMaxComponentLength;
|
|
DWORD dwFileSystemFlags;
|
|
HICON hIcon;
|
|
int nSelected;
|
|
int cy;
|
|
RECT rc;
|
|
|
|
static fLongNamesSupported;
|
|
static DWORD aHlpTable[] = { IDC_EF_NAME, IDH_TERM_NEWCONN_NAME,
|
|
IDC_LB_NAME, IDH_TERM_NEWCONN_NAME,
|
|
//IDC_TF_NAME, IDH_TERM_NEWCONN_NAME,
|
|
IDC_TF_ICON, IDH_TERM_NEWCONN_ICON,
|
|
IDC_LB_LIST, IDH_TERM_NEWCONN_ICON,
|
|
//IDC_IC_ICON, IDH_TERM_NEWCONN_ICON,
|
|
IDCANCEL, IDH_CANCEL,
|
|
IDOK, IDH_OK,
|
|
0, 0};
|
|
|
|
//
|
|
// MSDN docs state these are all reserved device names. REV: 5/14/2002
|
|
//
|
|
static const TCHAR *apszBadNames[] =
|
|
{
|
|
"LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
|
|
"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
|
|
"EPT", "NUL", "PRN", "CLOCK$", "CON", "AUX", NULL
|
|
};
|
|
static const TCHAR *apszBadNTNames[] =
|
|
{
|
|
"MAILSLOT", "PIPE", "UNC", NULL
|
|
};
|
|
|
|
TCHAR ach[FNAME_LEN];
|
|
|
|
switch (wMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
pS = (SDS *)malloc(sizeof(SDS));
|
|
|
|
// Set no matter what so we can always free
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pS);
|
|
|
|
if (pS == (SDS *)0)
|
|
{
|
|
/* TODO: decide if we need to display an error here */
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
}
|
|
|
|
pS->hSession = (HSESSION)lPar;
|
|
mscCenterWindowOnWindow(hDlg, GetParent(hDlg));
|
|
|
|
// Determine whether long filenames are supported. JRJ 12/94
|
|
fRc = GetVolumeInformation(NULL, // pointer to root dir path buffer
|
|
NULL, // pointer to volume name buffer
|
|
0, // length of volume name buffer
|
|
NULL, // pointer to volume serial number buffer
|
|
&dwMaxComponentLength, // the prize - what I'm after
|
|
&dwFileSystemFlags, // ptr to file system flag DWORD
|
|
NULL, // pointer to file system name buffer
|
|
0); // length of file system name buffer
|
|
|
|
if(dwMaxComponentLength == 255)
|
|
{
|
|
// There is support for long file names.
|
|
|
|
// Allow a max name lenght of 249. That's 255 minus the
|
|
// extension length (3), minus the smallest path length,
|
|
// (i.e. C:\) also (3).
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_EF_NAME, EM_SETLIMITTEXT, 249, 0);
|
|
fLongNamesSupported = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// There IS NOT support for long file names. Limit to eight.
|
|
SendDlgItemMessage(hDlg, IDC_EF_NAME, EM_SETLIMITTEXT, 8, 0);
|
|
fLongNamesSupported = FALSE;
|
|
}
|
|
|
|
// This dialog may also be called to change the session icon,
|
|
// so display the name and icon if we already have one.
|
|
//
|
|
sessQueryName(pS->hSession, ach, sizeof(ach)/sizeof(TCHAR));
|
|
StrCharCopyN(pS->achSessName, ach, sizeof(pS->achSessName)/sizeof(TCHAR));
|
|
if (!sessIsSessNameDefault(ach))
|
|
{
|
|
SetDlgItemText(hDlg, IDC_EF_NAME, ach);
|
|
mscModifyToFit(GetDlgItem(hDlg, IDC_TF_NAME), ach, SS_WORDELLIPSIS);
|
|
SetDlgItemText(hDlg, IDC_TF_NAME, ach);
|
|
}
|
|
else if (ach[0] != TEXT('\0'))
|
|
{
|
|
SetDlgItemText(hDlg, IDC_TF_NAME, ach);
|
|
|
|
// Set the new connection icon ID, if it's a new connection.
|
|
// --jcm 2/23/95.
|
|
//
|
|
sessSetIconID(pS->hSession, IDI_PROG);
|
|
}
|
|
|
|
hIcon = sessQueryIcon(pS->hSession);
|
|
|
|
if (hIcon != (HICON)0)
|
|
SendDlgItemMessage(hDlg, IDC_IC_ICON, STM_SETICON,
|
|
(WPARAM)hIcon, 0);
|
|
|
|
/* Fiddle with the list box */
|
|
hwnd = GetDlgItem(hDlg, IDC_LB_LIST);
|
|
|
|
SendMessage(hwnd,
|
|
LB_SETCOLUMNWIDTH,
|
|
GetSystemMetrics(SM_CXICON) + 12,
|
|
0L);
|
|
|
|
/* compute the height of the listbox based on icon dimensions */
|
|
GetClientRect(hwnd, &rc);
|
|
cy = GetSystemMetrics(SM_CYICON);
|
|
cy += GetSystemMetrics(SM_CYHSCROLL);
|
|
cy += GetSystemMetrics(SM_CYEDGE) * 3;
|
|
SetWindowPos(hwnd,
|
|
NULL,
|
|
0, 0,
|
|
rc.right, cy,
|
|
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
/* It's an owner drawn list box, just set the ICON ids for later */
|
|
nSelected = FALSE;
|
|
for (nLoop = 0; nLoop < ICON_COUNT; nLoop += 1)
|
|
{
|
|
SendMessage(hwnd,
|
|
LB_INSERTSTRING,
|
|
nLoop,
|
|
(LPARAM)"Hilgraeve is Great !!!");
|
|
|
|
// Design change - 4/14/94: Don't show Wackers New Connection
|
|
// icon in selection list. - mrw
|
|
//
|
|
SendMessage(hwnd,
|
|
LB_SETITEMDATA,
|
|
nLoop,
|
|
nLoop + IDI_PROG1);
|
|
|
|
if (sessQueryIconID(pS->hSession) == (IDI_PROG1 + nLoop))
|
|
{
|
|
SendMessage(hwnd,
|
|
LB_SETCURSEL,
|
|
nLoop, 0L);
|
|
nSelected = TRUE;
|
|
}
|
|
}
|
|
|
|
if (!nSelected)
|
|
{
|
|
SendMessage(hwnd,
|
|
LB_SETCURSEL,
|
|
0, 0L);
|
|
}
|
|
break;
|
|
|
|
case WM_DRAWITEM:
|
|
if (wPar == IDC_LB_LIST)
|
|
return NCD_WM_DRAWITEM((LPDRAWITEMSTRUCT)lPar);
|
|
break;
|
|
|
|
case WM_COMPAREITEM:
|
|
if (wPar == IDC_LB_LIST)
|
|
return NCD_WM_COMPAREITEM((LPCOMPAREITEMSTRUCT)lPar);
|
|
break;
|
|
|
|
case WM_DELETEITEM:
|
|
if (wPar == IDC_LB_LIST)
|
|
return NCD_WM_DELETEITEM((LPDELETEITEMSTRUCT)lPar);
|
|
break;
|
|
|
|
case WM_MEASUREITEM:
|
|
if (wPar == IDC_LB_LIST)
|
|
return NCD_WM_MEASUREITEM((LPMEASUREITEMSTRUCT)lPar);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
doContextHelp(aHlpTable, wPar, lPar, TRUE, TRUE);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
doContextHelp(aHlpTable, wPar, lPar, FALSE, FALSE);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (pS)
|
|
{
|
|
free(pS);
|
|
pS = NULL;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
/*
|
|
* Did we plan to put a macro in here to do the parsing ?
|
|
*/
|
|
DlgParseCmd(nId, nNtfy, hwndChild, wPar, lPar);
|
|
|
|
switch (nId)
|
|
{
|
|
case IDOK:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
fBad = FALSE;
|
|
|
|
// Set session name and icon.
|
|
//
|
|
ach[0] = TEXT('\0');
|
|
nSelected = GetDlgItemText(hDlg, IDC_EF_NAME, ach, sizeof(ach) / sizeof(TCHAR));
|
|
|
|
if (ach[0] == TEXT('\0'))
|
|
{
|
|
TCHAR msg[MAX_PATH];
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_GNRL_NEED_SESSION_NAME, msg,
|
|
sizeof(msg)/sizeof(TCHAR));
|
|
TimedMessageBox(hDlg, msg, NULL,
|
|
MB_OK | MB_ICONHAND, 0);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_EF_NAME));
|
|
fBad = TRUE;
|
|
}
|
|
else
|
|
{
|
|
TCHAR ach2[MAX_PATH];
|
|
TCHAR invalid_chars[MAX_PATH];
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_GNRL_INVALID_FILE_CHARS, invalid_chars,
|
|
sizeof(invalid_chars)/sizeof(TCHAR));
|
|
|
|
if (StrCharPBrk(ach, invalid_chars) != NULL)
|
|
{
|
|
TCHAR msg[MAX_PATH];
|
|
|
|
LoadString(glblQueryDllHinst(),
|
|
IDS_GNRL_INVALID_CHARS, ach2,
|
|
sizeof(ach2)/sizeof(TCHAR));
|
|
wsprintf(msg, ach2, invalid_chars);
|
|
|
|
TimedMessageBox(hDlg, msg, NULL,
|
|
MB_OK | MB_ICONHAND, 0);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_EF_NAME));
|
|
fBad = TRUE;
|
|
}
|
|
|
|
if (fBad)
|
|
break;
|
|
|
|
TCHAR_Trim(ach);
|
|
|
|
// Check the name against known device names.
|
|
//
|
|
fBad = FALSE;
|
|
|
|
for(nLoop = 0; apszBadNames[nLoop] != NULL; nLoop++)
|
|
{
|
|
if (StrCharCmpi(apszBadNames[nLoop], ach) == 0)
|
|
{
|
|
LoadString(glblQueryDllHinst(),IDS_GNRL_INVALID_NAME,
|
|
ach2, sizeof(ach2) / sizeof(TCHAR));
|
|
wsprintf(ach, ach2, invalid_chars);
|
|
|
|
TimedMessageBox(hDlg, ach, NULL,
|
|
MB_OK | MB_ICONHAND, 0);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_EF_NAME));
|
|
fBad = TRUE;
|
|
break;
|
|
}
|
|
} //for(nLoop = 0; apszBadNames[nLoop] != NULL; nLoop++)
|
|
|
|
if (!fBad && IsNT())
|
|
{
|
|
for(nLoop = 0; apszBadNTNames[nLoop] != NULL; nLoop++)
|
|
{
|
|
if (StrCharCmpi(apszBadNTNames[nLoop], ach) == 0)
|
|
{
|
|
LoadString(glblQueryDllHinst(),IDS_GNRL_INVALID_NAME,
|
|
ach2, sizeof(ach2) / sizeof(TCHAR));
|
|
wsprintf(ach, ach2, invalid_chars);
|
|
|
|
TimedMessageBox(hDlg, ach, NULL,
|
|
MB_OK | MB_ICONHAND, 0);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_EF_NAME));
|
|
fBad = TRUE;
|
|
break;
|
|
}
|
|
} //for(nLoop = 0; apszBadNTNames[nLoop] != NULL; nLoop++)
|
|
}
|
|
|
|
if (fBad)
|
|
{
|
|
break;
|
|
}
|
|
|
|
sessSetName(pS->hSession, ach);
|
|
sessUpdateAppTitle(pS->hSession);
|
|
|
|
/*
|
|
* Check and see if a new Icon has been selected
|
|
*/
|
|
hwnd = GetDlgItem(hDlg, IDC_LB_LIST);
|
|
assert(hwnd);
|
|
|
|
if (hwnd)
|
|
{
|
|
/* Get the ICON from the list box */
|
|
nLoop = (int)SendMessage(hwnd, LB_GETCURSEL, 0, 0L);
|
|
|
|
if (nLoop == LB_ERR)
|
|
nLoop = 0;
|
|
|
|
nLoop = (int)SendMessage(hwnd, LB_GETITEMDATA, nLoop, 0);
|
|
sessSetIconID(pS->hSession, nLoop);
|
|
|
|
PostMessage(sessQueryHwnd(pS->hSession), WM_SETICON,
|
|
(WPARAM)TRUE, (LPARAM)sessQueryIcon(pS->hSession));
|
|
} // (hwnd)
|
|
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
pS = (SDS *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
sessQueryName(pS->hSession, ach, sizeof(ach)/sizeof(TCHAR));
|
|
if (!sessIsSessNameDefault(ach))
|
|
{
|
|
sessSetName(pS->hSession, pS->achSessName);
|
|
}
|
|
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
} // if (ach[0] == TEXT('\0'))
|
|
} // switch(nId)
|
|
|
|
break; // WM_COMMAND
|
|
|
|
default:
|
|
return FALSE;
|
|
} //switch (wMsg)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* NCD_WM_DRAWITEM
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is called when the owner drawn list box used to display
|
|
* ICONs sends its parent a WM_DRAWITEM message.
|
|
*
|
|
* ARGUMENTS:
|
|
* pD -- pointer to the draw structure
|
|
*
|
|
* RETURNS:
|
|
*
|
|
*/
|
|
BOOL NCD_WM_DRAWITEM(LPDRAWITEMSTRUCT pD)
|
|
{
|
|
int x, y;
|
|
HICON hicon;
|
|
#if(WINVER >= 0x0500)
|
|
DWORD dwOldLayout;
|
|
#endif
|
|
|
|
//hicon = LoadIcon(glblQueryDllHinst(), MAKEINTRESOURCE(pD->itemData));
|
|
hicon = extLoadIcon(MAKEINTRESOURCE(pD->itemData));
|
|
|
|
if (hicon == (HICON)0)
|
|
return FALSE;
|
|
|
|
if (pD->itemState & ODS_SELECTED)
|
|
SetBkColor(pD->hDC, GetSysColor(COLOR_HIGHLIGHT));
|
|
else
|
|
SetBkColor(pD->hDC, GetSysColor(COLOR_WINDOW));
|
|
/* repaint the selection state */
|
|
ExtTextOut(pD->hDC, 0, 0, ETO_OPAQUE, &pD->rcItem, NULL, 0, NULL);
|
|
|
|
x = (pD->rcItem.left + pD->rcItem.right - GetSystemMetrics(SM_CXICON)) / 2;
|
|
y = (pD->rcItem.top + pD->rcItem.bottom - GetSystemMetrics(SM_CYICON)) / 2;
|
|
|
|
#if(WINVER >= 0x0500)
|
|
/* Bug #345406 : Don't mirror the icon. */
|
|
dwOldLayout = GetLayout(pD->hDC);
|
|
if (dwOldLayout && dwOldLayout != GDI_ERROR)
|
|
{
|
|
SetLayout(pD->hDC, dwOldLayout | LAYOUT_BITMAPORIENTATIONPRESERVED);
|
|
}
|
|
#endif
|
|
DrawIcon(pD->hDC, x, y, hicon);
|
|
|
|
#if(WINVER >= 0x0500)
|
|
if (dwOldLayout && dwOldLayout != GDI_ERROR)
|
|
{
|
|
SetLayout(pD->hDC, dwOldLayout);
|
|
}
|
|
#endif
|
|
|
|
/* if it has the focus, draw the focus */
|
|
if (pD->itemState & ODS_FOCUS)
|
|
DrawFocusRect(pD->hDC, &pD->rcItem);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* NCD_WM_COMPAREITEM
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is called when the owner drawn list box used to display
|
|
* ICONs sends its parent a WM_COMPAREITEM message.
|
|
*
|
|
* ARGUMENTS:
|
|
* pC -- pointer to the structure to fill in.
|
|
*
|
|
* RETURNS:
|
|
* ZERO -- they all compare the same.
|
|
*
|
|
*/
|
|
BOOL NCD_WM_COMPAREITEM(LPCOMPAREITEMSTRUCT pC)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* NCD_WM_DELETEITEM
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is called when the owner drawn list box used to display
|
|
* ICONs sends its parent a WM_DELETEITEM message.
|
|
*
|
|
* ARGUMENTS:
|
|
* pD -- pointer to the structure to fill in.
|
|
*
|
|
* RETURNS:
|
|
* TRUE;
|
|
*
|
|
*/
|
|
BOOL NCD_WM_DELETEITEM(LPDELETEITEMSTRUCT pD)
|
|
{
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* NCD_WM_MEASUREITEM
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is called when the owner drawn list box used to display
|
|
* ICONs sends its parent a WM_MEASUREITEM message. It fills in the
|
|
* structure and returns.
|
|
*
|
|
* ARGUMENTS:
|
|
* pM -- pointer to the structure to fill in.
|
|
*
|
|
* RETURNS:
|
|
* TRUE.
|
|
*
|
|
*/
|
|
BOOL NCD_WM_MEASUREITEM(LPMEASUREITEMSTRUCT pM)
|
|
{
|
|
|
|
pM->itemWidth = GetSystemMetrics(SM_CXICON);
|
|
pM->itemWidth += 12;
|
|
|
|
pM->itemHeight = GetSystemMetrics(SM_CYICON);
|
|
pM->itemHeight += 4;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
* FUNCTION:
|
|
* DisplayError
|
|
*
|
|
* DESCRIPTION:
|
|
* Displays and error message.
|
|
*
|
|
* ARGUMENTS:
|
|
* hwnd - dialog box handle
|
|
* idText - id of text
|
|
* idTitle - id of title
|
|
*
|
|
* RETURNS:
|
|
*
|
|
* AUTHOR: Mike Ward, 19-Jan-1995
|
|
*/
|
|
static void DisplayError(const HWND hwnd, const int idText, const int idTitle)
|
|
{
|
|
|
|
}
|