mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-05 06:00:33 -04:00
322 lines
8.1 KiB
C++
322 lines
8.1 KiB
C++
#include <skeldal_win.h>
|
|
#include <windowsx.h>
|
|
#include <commctrl.h>
|
|
#include "uvodni.h"
|
|
#include "resource.h"
|
|
#include "konfig.h"
|
|
#include "install.h"
|
|
#include <io.h>
|
|
#include <SHLOBJ.H>
|
|
#include "..\game\version.h"
|
|
|
|
|
|
#define UVODNIOKNOCLASS "Uvodni okno hry Brany Skeldalu@bredysoft"
|
|
#define SELPOSX 0
|
|
#define SELPOSY 279
|
|
|
|
LRESULT UvodniWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
void RegistrujTriduOkna()
|
|
{
|
|
WNDCLASSEX cls;
|
|
memset(&cls,0,sizeof(cls));
|
|
cls.cbSize=sizeof(cls);
|
|
cls.hCursor=LoadCursor(NULL,IDC_ARROW);
|
|
cls.hInstance=GetModuleHandle(NULL);
|
|
cls.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MAINICON));
|
|
cls.lpfnWndProc=(WNDPROC)UvodniWinProc;
|
|
cls.lpszClassName=UVODNIOKNOCLASS;
|
|
if (RegisterClassEx(&cls)==NULL)
|
|
{
|
|
MessageBox(NULL,"Nelze registrovat tridu okna",NULL,MB_OK|MB_ICONSTOP);
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
static HBITMAP pozadi;
|
|
static HBITMAP selpozadi;
|
|
static HDC pozadi_dc;
|
|
static HDC selpozadi_dc;
|
|
static HBITMAP pozadi_dc_old;
|
|
static HBITMAP selpozadi_dc_old;
|
|
static int exitstatus=0;
|
|
|
|
static int GetSelection(HWND hWnd, DWORD pt,RECT *rcout)
|
|
{
|
|
POINT ptt;
|
|
BITMAP bmpi;
|
|
ptt.x=GET_X_LPARAM(pt);
|
|
ptt.y=GET_Y_LPARAM(pt);
|
|
ScreenToClient(hWnd,&ptt);
|
|
GetObject(selpozadi,sizeof(bmpi),&bmpi);
|
|
RECT rc;
|
|
rc.left=SELPOSX;
|
|
rc.top=SELPOSY;
|
|
rc.right=rc.left+bmpi.bmWidth;
|
|
rc.bottom=rc.top+bmpi.bmHeight;
|
|
for (int i=0;i<3;i++)
|
|
{
|
|
RECT rrc=rc;
|
|
rrc.top=rc.top+((rc.bottom-rc.top)*i)/3;
|
|
rrc.bottom=rc.top+((rc.bottom-rc.top)*(i+1))/3;
|
|
if (PtInRect(&rrc,ptt))
|
|
{
|
|
if (rcout) *rcout=rrc;
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static void UkazSelekci(HWND hWnd, HDC hDc, DWORD pt)
|
|
{
|
|
RECT rc;
|
|
int res=GetSelection(hWnd,pt,&rc);
|
|
if (res==-1) return;
|
|
BitBlt(hDc,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,selpozadi_dc,rc.left-SELPOSX,rc.top-SELPOSY,SRCCOPY);
|
|
}
|
|
|
|
static HFONT vfont;
|
|
|
|
static void ShowVersion(HDC dc)
|
|
{
|
|
HFONT fnt=(HFONT )SelectObject(dc,vfont);
|
|
char ver[200]="Version: "VERSION;
|
|
int len=strlen(ver);
|
|
SIZE sz;
|
|
::GetTextExtentPoint(dc,ver,len,&sz);
|
|
|
|
SetTextColor(dc,RGB(255,255,255));
|
|
SetBkMode(dc,TRANSPARENT);
|
|
TextOut(dc,630-sz.cx,450-sz.cy,ver,len);
|
|
SelectObject(dc,fnt);
|
|
}
|
|
|
|
static LRESULT UvodniWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
static int lastsel;
|
|
static RECT lastselrect;
|
|
switch (msg)
|
|
{
|
|
case WM_CREATE:
|
|
{
|
|
HDC wdc=GetDC(hWnd);
|
|
pozadi=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_UVODNIPOZADI));
|
|
selpozadi=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_UVODNISELECT));
|
|
pozadi_dc=CreateCompatibleDC(wdc);
|
|
selpozadi_dc=CreateCompatibleDC(wdc);
|
|
ReleaseDC(hWnd,wdc);
|
|
pozadi_dc_old=(HBITMAP)SelectObject(pozadi_dc,pozadi);
|
|
selpozadi_dc_old=(HBITMAP)SelectObject(selpozadi_dc,selpozadi);
|
|
lastsel=-1;
|
|
if (_access(SKELDALINI,06)!=0) PostMessage(hWnd,WM_APP,0,0);
|
|
vfont=CreateFont(15,0,0,0,0,0,0,0,0,0,0,0,0,"Arial");
|
|
return 1;
|
|
}
|
|
break;
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC wdc=BeginPaint(hWnd,&ps);
|
|
BitBlt(wdc,0,0,640,480,pozadi_dc,0,0,SRCCOPY);
|
|
ShowVersion(wdc);
|
|
UkazSelekci(hWnd,wdc,GetMessagePos());
|
|
EndPaint(hWnd,&ps);
|
|
}
|
|
break;
|
|
case WM_SETCURSOR:
|
|
if (lastsel!=-1)
|
|
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(32649)));
|
|
else
|
|
SetCursor(LoadCursor(NULL, IDC_ARROW));
|
|
break;
|
|
case WM_MOUSEMOVE:
|
|
{
|
|
RECT rc;
|
|
int p=GetSelection(hWnd,GetMessagePos(),&rc);
|
|
if (p!=lastsel)
|
|
{
|
|
InvalidateRect(hWnd,&rc,FALSE);
|
|
InvalidateRect(hWnd,&lastselrect,FALSE);
|
|
lastsel=p;
|
|
lastselrect=rc;
|
|
}
|
|
}
|
|
break;
|
|
case WM_CLOSE:
|
|
exitstatus=0;
|
|
DestroyWindow(hWnd);
|
|
break;
|
|
case WM_DESTROY:
|
|
SelectObject(pozadi_dc,pozadi_dc_old);
|
|
SelectObject(selpozadi_dc,selpozadi_dc_old);
|
|
DeleteObject(pozadi);
|
|
DeleteObject(selpozadi);
|
|
DeleteDC(pozadi_dc);
|
|
DeleteDC(selpozadi_dc);
|
|
PostQuitMessage(exitstatus);
|
|
DeleteObject(vfont);
|
|
break;
|
|
case WM_LBUTTONUP:
|
|
{
|
|
int p=GetSelection(hWnd,GetMessagePos(),NULL);
|
|
if (p!=-1)
|
|
{
|
|
switch (p)
|
|
{
|
|
case 2: exitstatus=0; DestroyWindow(hWnd);break;
|
|
case 0: exitstatus=1; DestroyWindow(hWnd);break;
|
|
case 1: OpenKonfig(hWnd);break;
|
|
// case 0: RunInstall(hWnd);break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case WM_APP:
|
|
if (RunInstall(hWnd)==FALSE) {exitstatus=0;DestroyWindow(hWnd);}
|
|
break;
|
|
default:return DefWindowProc(hWnd,msg,wParam,lParam);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
extern "C"
|
|
{
|
|
|
|
|
|
char OtevriUvodniOkno()
|
|
{
|
|
RECT rc;
|
|
|
|
char buff[256];
|
|
|
|
LoadString(GetModuleHandle(NULL),IDS_WINTITLE,buff,sizeof(buff));
|
|
|
|
InitCommonControls();
|
|
|
|
RegistrujTriduOkna();
|
|
GetClientRect(GetDesktopWindow(),&rc);
|
|
rc.left=(rc.right-640)/2;
|
|
rc.top=(rc.bottom-480)/2;
|
|
|
|
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,FALSE);
|
|
|
|
HWND hOknoWnd=CreateWindow(UVODNIOKNOCLASS,buff,WS_OVERLAPPED|WS_SYSMENU|WS_VISIBLE|WS_MINIMIZEBOX|WS_BORDER,rc.left,rc.top,640,480,NULL,NULL,GetModuleHandle(NULL),NULL);
|
|
MSG msg;
|
|
while (GetMessage(&msg,0,0,0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
UnregisterClass(UVODNIOKNOCLASS,GetModuleHandle(NULL));
|
|
return msg.wParam==1;
|
|
}
|
|
|
|
static void CreateAdvLink(char *advname)
|
|
{
|
|
char modname[MAX_PATH*4];
|
|
char linkname[MAX_PATH*4];
|
|
GetModuleFileName(NULL,modname,MAX_PATH*4);
|
|
CoInitialize(NULL);
|
|
SHGetSpecialFolderPath(NULL,linkname,CSIDL_DESKTOPDIRECTORY,TRUE);
|
|
strcat(linkname,"\\");
|
|
strcat(linkname,advname);
|
|
strcat(linkname,".lnk");
|
|
CreateLink(modname,linkname,"",advname);
|
|
}
|
|
|
|
|
|
static char selectedAdv[MAX_PATH];
|
|
static LRESULT SelectAdventureDlg(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
char temp[MAX_PATH];
|
|
switch (msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
WIN32_FIND_DATA fdata;
|
|
HANDLE fnd=FindFirstFile("*.adv",&fdata);
|
|
selectedAdv[0]=0;
|
|
if (fnd!=INVALID_HANDLE_VALUE)
|
|
{
|
|
HWND lsbx=GetDlgItem(hDlg,IDC_LIST);
|
|
LoadString(GetModuleHandle(NULL),IDS_DEFAULTADV,temp,sizeof(temp));
|
|
ListBox_AddString(lsbx,temp);
|
|
do ListBox_AddString(lsbx,fdata.cFileName); while (FindNextFile(fnd,&fdata));
|
|
FindClose(fnd);
|
|
ListBox_SetCurSel(lsbx,0);
|
|
EnableWindow(GetDlgItem(hDlg,IDC_CREATELINK),0);
|
|
}
|
|
else
|
|
EndDialog(hDlg,IDOK);
|
|
}
|
|
break;
|
|
case WM_DRAWITEM: if (wParam==IDC_LIST)
|
|
{
|
|
LPDRAWITEMSTRUCT drawinfo=(LPDRAWITEMSTRUCT)lParam;
|
|
char *c;
|
|
if (drawinfo->itemState & ODS_SELECTED)
|
|
{
|
|
SetTextColor(drawinfo->hDC,GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
SetBkColor(drawinfo->hDC,GetSysColor(COLOR_HIGHLIGHT));
|
|
}
|
|
else
|
|
{
|
|
SetTextColor(drawinfo->hDC,GetSysColor(COLOR_WINDOWTEXT));
|
|
SetBkColor(drawinfo->hDC,GetSysColor(COLOR_WINDOW));
|
|
}
|
|
ListBox_GetText(drawinfo->hwndItem,drawinfo->itemID,temp);
|
|
c=strrchr(temp,'.');
|
|
if (c) *c=0;
|
|
ExtTextOut(drawinfo->hDC,0,0,ETO_OPAQUE,&drawinfo->rcItem,"",0,NULL);
|
|
DrawText(drawinfo->hDC,temp,strlen(temp),&drawinfo->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_NOPREFIX);
|
|
}
|
|
break;
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
{
|
|
HWND lsbx=GetDlgItem(hDlg,IDC_LIST);
|
|
int cursel=ListBox_GetCurSel(lsbx);
|
|
if (cursel!=0)
|
|
{
|
|
ListBox_GetText(lsbx,cursel,selectedAdv);
|
|
if (IsDlgButtonChecked(hDlg,IDC_CREATELINK) & BST_CHECKED)
|
|
CreateAdvLink(selectedAdv);
|
|
}
|
|
EndDialog(hDlg,IDOK);
|
|
}
|
|
break;
|
|
case IDCANCEL:
|
|
EndDialog(hDlg,IDCANCEL);
|
|
break;
|
|
case IDC_LIST:
|
|
if (HIWORD(wParam)==LBN_DBLCLK)
|
|
PostMessage(hDlg,WM_COMMAND,IDOK,0);
|
|
if (HIWORD(wParam)==LBN_SELCHANGE)
|
|
EnableWindow(GetDlgItem(hDlg,IDC_CREATELINK),ListBox_GetCurSel(GetDlgItem(hDlg,IDC_LIST))!=0);
|
|
break;
|
|
|
|
default:return 0;
|
|
}
|
|
break;
|
|
default: return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
char SelectAdventure()
|
|
{
|
|
int ret=DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SELADV), NULL, (DLGPROC)SelectAdventureDlg);
|
|
if (ret==IDCANCEL) exit(0);
|
|
if (selectedAdv[0]==0) return 0;
|
|
return 1;
|
|
}
|
|
|
|
char *GetSelectedAdventure()
|
|
{
|
|
return selectedAdv;
|
|
}
|
|
|
|
}
|