#pragma once


/**
Tools for Windows ライブラリ

*/

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif


#include  "..\stdafx.h"
#include  "WinBase_Resource.h"

#include  "BasicLib.h"

#include  <userenv.h>
#include  <imagehlp.h>
#include  <locale.h>




//
namespace jbxwl {



///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Uicode

//
// locale が正しくないと，日本語の変換は失敗する
//
Buffer    tc2Buffer(TCHAR*  tchar, int size=0);
Buffer    ts2Buffer(LPCTSTR str,   int size=0);

CString	  mbs2ts(char*   str);
//char*	  ts2mbs(LPCTSTR str);	// 要 free.  NULL は絶対に返ってこない

int		  copy_ts2Buffer(LPCTSTR str, Buffer* buf);
int		  cat_ts2Buffer (LPCTSTR str, Buffer* buf);

unsigned long int file_size_t(LPCTSTR fn); 
BOOL	  file_exist_t    (LPCTSTR fn);
CString	  get_file_name_t (LPCTSTR str);
CString	  numbering_name_t(LPCTSTR fmt, int n);

tList*	  get_dir_files_t(LPCTSTR dirn);

void	  setResourceLocale(void);
void      setSystemLocale(void);


//
// 要 free.  NULL は絶対に返ってこない
// 
inline char*  ts2mbs(LPCTSTR str)
{
	Buffer buf = ts2Buffer(str);
	return (char*)buf.buf;
}







///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Parameter

CString   get_tstr_param_tList(tList* lt, char* key, LPCTSTR dflt);




///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  User

CString   GetCurrentUserHomeFolder(void);
CString   GetDefaultUserHomeFolder(void);
CString	  MakeWorkingFolderPath(LPCTSTR fnm, BOOL local, LPCTSTR dir=NULL, BOOL make=FALSE);



///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Mouse

TCHAR*	GetMouseCursorType(void);




///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Time

// 1分計 0-59999ms を返す．
unsigned short	GetMsecondsTimer(void);
unsigned short  GetMsecondsLapTimer(unsigned short pm, unsigned short* nt=NULL);




///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  CMenu

CMenu*  GetMenu_byID(CMenu* pMenu, UINT id);
CMenu*  GetMenu_byStringID(CMenu* pMenu, UINT id);
CMenu*  GetMenu_byName(CMenu* pMenu, LPCTSTR name);




///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Resource

inline  CString  LoadString_byID(UINT id)
{
	CString mesg;
	mesg.LoadString(id);
	return mesg;
}






///////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Message

void  SendWinMessage(UINT mesg);


// プログラムの再起動
void  RebootProgram(void);
BOOL  WaitPidTerm(int tm);





/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Event Handler クラス

class  EventHandler
{
public:
	EventHandler(void);
	~EventHandler(void) { free();}

	HANDLE  m_handle;
	DWORD	m_wait_err;


public:
	HANDLE	create(BOOL manual=TRUE, BOOL initial=FALSE, LPCTSTR hname=NULL, LPSECURITY_ATTRIBUTES sec=NULL);
	void	free(void);

	BOOL	wait(DWORD msec=INFINITE);
};





/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  ディスパッチャー

/**
void  DisPatcher(int sno=0, unsigned int signal1, unsigned int signal2, ...);
  
  機能：シグナル（メッセージ）キューに溜まったシグナル（メッセージ）をディスパッチする．
  		引数に，無視する（ディスパッチしない）シグナル（メッセージ）を複数（可変）個指定可能．
		プログラム自体を終了させるシグナル（メッセージ）がキューにあった場合は，プログラムを
  		強制終了させる．Windowsの場合は WM_QUIT (0x0111)
  
  		Windows 用のみ実装．Linux の処理の仕方は知らない.......（不勉強です）
  
  引数：無視するシグナル（メッセージ）の数，無視するシグナル１，無視するシグナル２，.........
  		シグナル（メッセージ）自体は unsigned int で指定する．
  		無視するシグナル（メッセージ）を指定しない場合は，引数無しで呼び出し可能
  
  例  ：DisPatcher(1, WM_NCLBUTTONDOWN);
  		DisPatcher();    DisPatcher(0) と同じ  
*/  		
void	DisPatcher(int sno=0, ...);



}		// namespace
