Esempio n. 1
0
/*!
	ノーティファイメッセージの処理
	@param[in]	hWnd		親ウインドウのハンドル
	@param[in]	idFrom		NOTIFYを発生させたコントロールのID
	@param[in]	pstNmhdr	NOTIFYの詳細
	@return		処理した内容とか
*/
LRESULT Drt_OnNotify( HWND hWnd, INT idFrom, LPNMHDR pstNmhdr )
{
	INT		iTarget, iOffset, i;
	INT_PTR	iItems;
	LPSTR	pcConts = NULL;
	POINT	stMosPos;
	LPNMTTDISPINFO	pstDispInfo;

	MAAM_ITR	itItem;

	if( TTN_GETDISPINFO ==  pstNmhdr->code )	//	ツールチップの内容の問い合わせだったら
	{
		GetCursorPos( &stMosPos );	//	スクリーン座標
		ScreenToClient( hWnd, &stMosPos );	//	クライヤント座標に変換

		pstDispInfo = (LPNMTTDISPINFO)pstNmhdr;

		ZeroMemory( &(pstDispInfo->szText), sizeof(pstDispInfo->szText) );
		pstDispInfo->lpszText = NULL;

		if( !(gbAAtipView) ){	return 0;	}	//	非表示なら何もしないでおk

		FREE( gptTipBuffer );

		iTarget = DraughtTargetItemSet( &stMosPos );
		TRACE( TEXT("TARGET %d"), iTarget );

		if( gbThumb )	//	サムネイル
		{
			iOffset = gdVwTop * TPNL_HORIZ;
			iTarget = iOffset + iTarget;
			pcConts = AacAsciiArtGet( iTarget );	//	該当するインデックスAAを引っ張ってくる

			gptTipBuffer = SjisDecodeAlloc( pcConts );
			FREE( pcConts );
		}
		else
		{
			iItems = gvcDrtItems.size( );	//	現在個数
			if( iItems > iTarget )	//	保持数内であれば
			{
				for( i = 0, itItem = gvcDrtItems.begin(); gvcDrtItems.end() != itItem; i++, itItem++ )
				{
					if( iTarget == i )	//	ヒット
					{
						gptTipBuffer = SjisDecodeAlloc( itItem->pcItem );
						break;
					}
				}
			}
		}

		//	ここでNULLを返すと、それ以降のチップが出てこない
		if( gptTipBuffer  ){	pstDispInfo->lpszText = gptTipBuffer;	}
		else{					pstDispInfo->lpszText = TTMSG_NO_ITEM;	}
	}

	return 0;
}
Esempio n. 2
0
/*!
	HoverTip用のコールバック受取
	@param[in]	pVoid	未定義
	@return	確保した文字列・もしくはNULL
*/
LPTSTR CALLBACK DraughtHoverTipInfo( LPVOID pVoid )
{
	INT		iTarget, iOffset, i;
	INT_PTR	iItems;
	LPSTR	pcConts = NULL;
	LPTSTR	ptBuffer = NULL;

	MAAM_ITR	itItem;


	if( !(gbAAtipView) ){	return NULL;	}	//	非表示なら何もしないでおk
	if( 0 > giItemSel ){	return NULL;	}

	if( gbThumb )	//	サムネイル
	{
		iOffset = gdVwTop * TPNL_HORIZ;
		iTarget = iOffset + giItemSel;
		pcConts = AacAsciiArtGet( iTarget );	//	該当するインデックスAAを引っ張ってくる

		ptBuffer = SjisDecodeAlloc( pcConts );
		FREE( pcConts );
	}
	else
	{
		iTarget = giItemSel;
		iItems  = gvcDrtItems.size( );	//	現在個数
		if( iItems > iTarget )	//	保持数内であれば
		{
			for( i = 0, itItem = gvcDrtItems.begin(); gvcDrtItems.end() != itItem; i++, itItem++ )
			{
				if( iTarget == i )	//	ヒット
				{
					ptBuffer = SjisDecodeAlloc( itItem->pcItem );
					break;
				}
			}
		}
	}

	return ptBuffer;
}
Esempio n. 3
0
/*!
	AAのサムネ用イメージを作る
	@param[in]		hWnd	ウインドウハンドル
	@param[in,out]	pstItem	イメージ作りたいAAのデータとか
*/
UINT DraughtAaImageing( HWND hWnd, LPAAMATRIX pstItem )
{
	UINT_PTR	cchSize;
	LPTSTR		ptTextaa;
	INT		iRslt, iYdot, iXdot, iLine;
	HDC		hdc, hMemDC;
	HBITMAP	hOldBmp;
	RECT	rect;



	ptTextaa = SjisDecodeAlloc( pstItem->pcItem );
	StringCchLength( ptTextaa, STRSAFE_MAX_CCH, &cchSize );

	//	元AAのサイズ確定が必要
	iXdot = TextViewSizeGet( ptTextaa, &iLine );
	iYdot = iLine * LINE_HEIGHT;

	pstItem->iMaxDot = iXdot;
	pstItem->iLines  = iLine;

	if( giItemWidth >  iXdot )	iXdot = giItemWidth;
	if( giItemHeight > iYdot )	iYdot = giItemHeight;

	pstItem->stSize.cx = iXdot;
	pstItem->stSize.cy = iYdot;

	SetRect( &rect, 0, 0, iXdot, iYdot );
	//	あんまり大きいなら、左上限定とか?

	//	描画用ビットマップ作成
	hdc = GetDC( hWnd );

	//	サムネ用BMP・これはフルサイズ	//	pstItem->hThumbDC	pstItem->hOldBmp
	hMemDC = CreateCompatibleDC( hdc );
	pstItem->hThumbBmp = CreateCompatibleBitmap( hdc, rect.right, rect.bottom );
	hOldBmp = SelectBitmap( hMemDC, pstItem->hThumbBmp );
	SelectFont( hMemDC, ghAaFont );

	ReleaseDC( ghDraughtWnd, hdc );

	iRslt = PatBlt( hMemDC, 0, 0, rect.right, rect.bottom, WHITENESS );

	iRslt = DrawText( hMemDC, ptTextaa, cchSize, &rect, DT_LEFT | DT_NOPREFIX | DT_NOCLIP | DT_WORDBREAK );

	SelectFont( hMemDC, GetStockFont(DEFAULT_GUI_FONT) );
	SelectBitmap( hMemDC, hOldBmp );
	DeleteDC( hMemDC );

	FREE( ptTextaa );

	return 0;
}
Esempio n. 4
0
/*!
	見出しコンボックスに内容追加
	@param[in]	number	通し番号
	@param[in]	pcTitle	入れ込む文字列
	@return	継ぎ足したあとの項目数
*/
INT AaTitleAddString( UINT number, LPSTR pcTitle )
{
	AATITLE	stTitle;
	LPTSTR	ptTitle;

	ptTitle = SjisDecodeAlloc( pcTitle );

	ComboBox_AddString( ghComboxWnd, ptTitle );

	ZeroMemory( &stTitle, sizeof(AATITLE) );
	stTitle.number = number;
	StringCchCopy( stTitle.atTitle, MAX_STRING, ptTitle );

	gvcAaTitle.push_back( stTitle );

	FREE(ptTitle);

	return ComboBox_GetCount( ghComboxWnd );
}
Esempio n. 5
0
/*!
	指定の頁を、指定条件を受けて検索する
	@param[in]	hWnd		ウインドウハンドル
	@param[in]	ptFindText	検索したい文字列
	@param[in]	iTargetPage	検索頁
	@return	UINT	非0その頁に文字列があった 0なかった
*/
UINT AacItemFindOnePage( HWND hWnd, LPTSTR ptFindText, INT iTargetPage )
{
	LPSTR	pcItem;
	LPTSTR	ptTarget, ptFindPos;
	INT		iMoziPos;
	UINT	dFound = FALSE;

	//	中身もってくる
	pcItem = AacAsciiArtGet( iTargetPage );
	//	ユニコードに直して比較する
	ptTarget = SjisDecodeAlloc( pcItem );
	FREE( pcItem );

	ptFindPos = FindStringProc( ptTarget, ptFindText, &iMoziPos );	//	Viewer側
	if( ptFindPos ){	dFound = TRUE;	}	//	存在してるか?

	FREE( ptTarget );

	return dFound;
}
Esempio n. 6
0
/*!
	HoverTip用のコールバック受取
	@param[in]	pVoid	未定義
	@return	確保した文字列・もしくはNULL
*/
LPTSTR CALLBACK AaItemsHoverTipInfo( LPVOID pVoid )
{
	UINT_PTR	rdLength;
	LPSTR		pcConts = NULL;
	LPTSTR		ptBuffer = NULL;


	if( !(gbAAtipView) ){		return NULL;	}	//	非表示なら何もしないでおk
	if( 0 > gixNowToolTip ){	return NULL;	}

	pcConts = AacAsciiArtGet( gixNowToolTip );	//	該当するインデックスのAAを引っ張ってくる
	if( !pcConts  ){	return 0;	}

	ptBuffer = SjisDecodeAlloc( pcConts );
	rdLength = lstrlen( ptBuffer  );	//	文字列の長さ取得

	free( pcConts );

	TRACE( TEXT("MAA HOVER CALL %d, by[%d]"), gixNowToolTip, rdLength );

	return ptBuffer;
}
Esempio n. 7
0
/*!
	MAAからSJISを受け取って処理する・Editor側にもある
	@param[in]	hWnd	ウインドウハンドル
	@param[in]	pcCont	AAの文字列
	@param[in]	cbSize	バイト数・末端NULLは含まない
	@param[in]	dMode	使用モード・デフォもしくは個別指定
	@return		非0デフォ動作した 0指定モードだった
*/
UINT ViewMaaMaterialise( HWND hWnd, LPSTR pcCont, UINT cbSize, UINT dMode )
{
	LPTSTR		ptString;
	UINT_PTR	cchSize;
	UINT		uRslt = TRUE;	//	デフォ動作であるならTRUE<いつでもTRUEにした

//	FLASHWINFO	stFshWInfo;

	//	デフォ動作であるかどうか
//	if( dMode == gdUseMode ){		uRslt = TRUE;	}
	if( MAA_DEFAULT ==  dMode ){	dMode = gdUseMode;	}
	if( MAA_SUBDEFAULT== dMode ){	dMode = gdUseSubMode;	}

	if( MAA_UNICLIP == dMode )	//	ユニコード
	{
		ptString = SjisDecodeAlloc( pcCont );	//	ユニコードにしておく
		StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

		//	ユニコード的にクリッペ
		DocClipboardDataSet( ptString, (cchSize + 1) * 2, D_UNI );

		FREE(ptString);
	}
	else if( MAA_DRAUGHT == dMode ){	DraughtItemAdding( hWnd, pcCont );	}	//	ドラフトボードに追加
	else{	DocClipboardDataSet( pcCont, (cbSize + 1), D_SJIS );	}	//	SJISコピー


	//ZeroMemory( &stFshWInfo, sizeof(FLASHWINFO) );
	//stFshWInfo.cbSize    = sizeof(FLASHWINFO);	//	この構造体のサイズ
	//stFshWInfo.hwnd      = ghMaaWnd;	//	wktkさせたいウインダウのハンドル
	//stFshWInfo.dwFlags   = FLASHW_ALL;	//	キャプションとタスクバーのボタン両方
	//stFshWInfo.uCount    = 2;			//	wktkさせる回数
	//stFshWInfo.dwTimeout = 0;			//	間隔。0でデフォルト的な間隔
	//FlashWindowEx( &stFshWInfo );		//	wktkさせる

	return uRslt;
}
Esempio n. 8
0
/*!
	ノーティファイメッセージの処理
	@param[in]	hWnd		ウインドウハンドル
	@param[in]	idFrom		NOTIFYを発生させたコントロールのID
	@param[in]	pstNmhdr	NOTIFYの詳細
	@return		処理した内容とか
*/
LRESULT Aai_OnNotify( HWND hWnd, INT idFrom, LPNMHDR pstNmhdr )
{
	UINT_PTR		rdLength;
	LPSTR			pcConts = NULL;
	LPNMTTDISPINFO	pstDispInfo;

	if( TTN_GETDISPINFO ==  pstNmhdr->code )	//	ツールチップの内容の問い合わせだったら
	{
		pstDispInfo = (LPNMTTDISPINFO)pstNmhdr;

		if( !(gbAAtipView) )	//	非表示なら何もしないでおk
		{
			ZeroMemory( &(pstDispInfo->szText), sizeof(pstDispInfo->szText) );
			pstDispInfo->lpszText = NULL;
			return 0;
		}

		FREE( gptTipBuffer );

		pcConts = AacAsciiArtGet( gixNowSel );	//	該当するインデックスAAを引っ張ってくる
		if( !pcConts  ){	return 0;	}

		rdLength = strlen( pcConts );	//	文字列の長さ取得

		//gptTipBuffer = (LPTSTR)malloc( sizeof(TCHAR) * (rdLength+1) );
		//ZeroMemory( gptTipBuffer, sizeof(TCHAR) * (rdLength+1) );
		//MultiByteToWideChar( CP_ACP, MB_COMPOSITE, pcConts, -1, gptTipBuffer, (rdLength+1) );

		gptTipBuffer = SjisDecodeAlloc( pcConts );

		pstDispInfo->lpszText = gptTipBuffer;

		free( pcConts );
	}

	return 0;
}
Esempio n. 9
0
/*!
	クリップボードのデータをいただく・同じモノが、DocInsDelCtrl.cpp にある
	@param[in]	pVoid	特になし
	@return		確保した文字列・mallocしてるので、函数呼んだ方でfree忘れないように
*/
LPTSTR ClipboardDataGet( LPVOID pVoid )
{
	LPTSTR	ptString = NULL, ptClipTxt;
	LPSTR	pcStr, pcClipTp;	//	変換用臨時
	DWORD	cbSize;
	UINT	dEnumFmt;
	INT		ixCount, iC;
	HANDLE	hClipData;

	//	クリップボードの中身をチェキ・どっちにしてもユニコードテキストフラグはある
	if( IsClipboardFormatAvailable( CF_UNICODETEXT ) )
	{
		OpenClipboard( NULL );	//	クリップボードをオーポンする
		//	開けっ放しだと他のアプリに迷惑なのですぐ閉めるように

		dEnumFmt = 0;	//	初期値は0
		ixCount = CountClipboardFormats(  );
		for( iC = 0; ixCount > iC; iC++ )
		{	//	順番に列挙して、先にヒットしたフォーマットで扱う
			dEnumFmt = EnumClipboardFormats( dEnumFmt );
			if( CF_UNICODETEXT == dEnumFmt || CF_TEXT == dEnumFmt ){	break;	}
		}
		if( 0 == dEnumFmt ){	return NULL;	}
		//	それ以上列挙が無いか、函数失敗なら0になる

		//	クリップボードのデータをゲッツ!
		//	ハンドルのオーナーはクリップボードなので、こちらからは操作しないように
		//	中身の変更などもってのほかである
		hClipData = GetClipboardData( dEnumFmt );

		if( CF_UNICODETEXT == dEnumFmt )
		{
			//	取得データを処理。TEXTなら、ハンドルはグローバルメモリハンドル
			//	新たにコピーされたらハンドルは無効になるので、中身をコピーせよ
			ptClipTxt = (LPTSTR)GlobalLock( hClipData );
			cbSize    = GlobalSize( (HGLOBAL)hClipData );
			//	確保出来るのはバイトサイズ・テキストだと末尾のNULLターミネータ含む

			if( 0 < cbSize )
			{
				ptString = (LPTSTR)malloc( cbSize );
				StringCchCopy( ptString, (cbSize / 2), ptClipTxt );
			}
		}
		else	//	非ユニコードが優先されている場合
		{
			pcClipTp = (LPSTR)GlobalLock( hClipData );
			cbSize   = GlobalSize( (HGLOBAL)hClipData );

			if( 0 < cbSize )
			{
				pcStr = (LPSTR)malloc( cbSize );
				StringCchCopyA( pcStr, cbSize, pcClipTp );

				ptString = SjisDecodeAlloc( pcStr );	//	SJISの内容をユニコードにする
				free( pcStr );
			}
		}


		//	使い終わったら閉じておく
		GlobalUnlock( hClipData );
		CloseClipboard(  );
	}

	return ptString;
}
Esempio n. 10
0
/*!
	ファイルを確保
	@param[in]	ptFileName	指定されたファイル名で開く
	@return		LPARAM	0失敗 1〜成功
*/
LPARAM DocFileInflate( LPTSTR ptFileName )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT_PTR	cchSize;

	LPARAM	dNumber;

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	UINT	dSepRslt;
	LPTSTR	ptSepBuff;
#endif

#ifdef _DEBUG
	DWORD	dTcStart, dTcEnd;
#endif

	//TCHAR	atBuff[10];
	//ZeroMemory( atBuff, sizeof(atBuff) );

#ifdef _DEBUG
	dTcStart = GetTickCount(  );
#endif
	assert( ptFileName );	//	ファイル開けないのはバグ

	//	ファイル名が空っぽだったら自動的にアウツ!
	if( NULL == ptFileName[0] ){	return 0;	}

	//	レッツオーポン
	hFile = CreateFile( ptFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//InitLastOpen( INIT_SAVE, ptFileName );	//	複数ファイルでは意味が無い

	//	処理順番入替

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 4 );	//	バッファは少し大きめに取る
	ZeroMemory( pBuffer, iByteSize + 4 );

	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチェック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、&#0000;の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	ファイルを開くとき

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更

	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	dSepRslt = DocFileHugeCheck( ptString, cchSize );
	if(  1 == dSepRslt )	//	分割処理する
	{
		ptSepBuff = DocFileHugeSeparate( ptString, cchSize );
		if( !(ptSepBuff)  ){	return 0;	}	//	なんかミスってるなら中止

		FREE( pBuffer );	//	大本を一旦開放
		pBuffer = ptSepBuff;	//	最後に開放する領域としてポイントするところを変更
		ptString = ptSepBuff;	//	読込処理を続ける位置としてセット

		StringCchLength( ptString, STRSAFE_MAX_CCH , &cchSize );	//	サイズ読込直し
	}
	else if( 2 == dSepRslt )	//	読込中止
	{
		FREE( pBuffer );	//	大本を開放
		return 0;
	}
	//	0なら何もしない
#endif

	//	新しいファイル置き場の準備	2014/05/28↑にあったのを移動した
	dNumber = DocMultiFileCreate( NULL );	//	実際のファイルを開くとき
	if( 0 >= dNumber )	return 0;

	StringCchCopy( (*gitFileIt).atFileName, MAX_PATH, ptFileName );


	//	もしASTなら、先頭は[AA]になってるはず・分割は中でやる
	if( StrCmpN( AST_SEPARATERW, ptString, 4 ) )
	{
		DocStringSplitMLT( ptString , cchSize, DocPageLoad );
	}
	else
	{
		DocStringSplitAST( ptString , cchSize, DocPageLoad );
	}

	//	ファイル開いたらキャレットとかスクロールをリセットする
	ViewEditReset(  );

	FREE( pBuffer );	//	=ptString

	DocPageChange( 0  );	//	全部読み込んだので最初のページを表示する
	PageListViewChange( -1, -1 );	//	直前頁リセット

	AppTitleChange( ptFileName );

#ifdef _DEBUG
	dTcEnd = GetTickCount(  );
	TRACE( TEXT("LOAD START[%u]  END[%u]    ELAPSE[%u]"), dTcStart, dTcEnd, (dTcEnd - dTcStart) );
#endif

	return dNumber;
}
Esempio n. 11
0
/*!
	ASDなSJIS文字列を受け取って分解しつつページに入れる
	@param[in]	pcStr		分解対象SJIS文字列へのポインター
	@param[in]	cbSize		その文字列の文字数
	@param[in]	pfPageLoad	内容を入れるコールバック函数のアレ
	@return		UINT		作成した頁数
*/
UINT DocImportSplitASD( LPSTR pcStr, INT cbSize, PAGELOAD pfPageLoad )
{
//ASDなら、SJISのままで0x01,0x01、0x02,0x02を対応する必要がある
//0x01,0x01が改行、0x02,0x02が説明の区切り、アイテム区切りが改行

	LPSTR	pcCaret;	//	読込開始・現在位置
	LPSTR	pcEnd, pcDesc;
	UINT	iNumber;	//	通し番号カウント
	UINT	cbItem, d;
	BOOLEAN	bLast;

	LPTSTR		ptName, ptCont;
	UINT_PTR	cchItem;


	pcCaret = pcStr;	//	まずは最初から

	iNumber = 0;	//	通し番号0インデックス

	bLast = FALSE;


	do	//	とりやえず実行
	{
		pcEnd = NextLineA( pcCaret );	//	次の行までで1アイテム
		//if( !(*pcEnd) )	//	見つからなかったら=これが最後なら=NULL
		//{
		//	pcEnd = pcStr + cbSize;	//	CHARサイズで計算おk?
		//	bLast = TRUE;
		//}
		//	中身がNULLなだけで、ポインタは有効なので特に位置計算は不要か
		cbItem  = pcEnd - pcCaret;	//	壱行の文字数

		pcDesc = NULL;
		ptName = NULL;
		ptCont = NULL;

		for( d = 0; cbItem > d; d++ )
		{
			if( (0x0D == pcCaret[d]) && (0x0A == pcCaret[d+1]) )	//	末端であるか
			{
				pcCaret[d]   = 0x00;	//	末端なのでNULLにする
				pcCaret[d+1] = 0x00;

				if( pcDesc ){	ptName =  SjisDecodeAlloc( pcDesc );	}

				break;
			}

			//	処理順番注意
			if( (0x01 == pcCaret[d]) && (0x01 == pcCaret[d+1]) )	//	改行であるか
			{
				pcCaret[d]   = 0x0D;	//	¥r
				pcCaret[d+1] = 0x0A;	//	¥n
				d++;	//	変換したので次に進めるのがよい
			}

			if( (0x02 == pcCaret[d]) && (0x02 == pcCaret[d+1]) )	//	アイテムと説明の区切り
			{
				pcDesc = &(pcCaret[d+2]);	//	説明開始位置

				pcCaret[d]   = 0x00;	//	仕切りなのでNULLにする
				pcCaret[d+1] = 0x00;
				d++;	//	変換したので次に進めるのがよい
			}
		}

		ptCont = SjisDecodeAlloc( pcCaret );	//	作っておく
		StringCchLength( ptCont, STRSAFE_MAX_CCH, &cchItem );

		pfPageLoad( ptName, ptCont, cchItem );

		iNumber++;

		FREE( ptCont );
		FREE( ptName );

		pcCaret = pcEnd;

	}while( *pcCaret  );	//	データ有る限りループで探す

	return iNumber;
}
Esempio n. 12
0
/*!
	AA表示スタティックのオーナードロー・描画
	@param[in]	hWnd			親ウインドウハンドル
	@param[in]	*pstDrawItem	ドロー情報
	@return		なし
*/
VOID AaItemsDrawItem( HWND hWnd, CONST DRAWITEMSTRUCT *pstDrawItem )
{
	UINT_PTR	rdLen;
	INT_PTR	rdLength;
	LPSTR	pcConts = NULL;
	LPTSTR	ptConStr = NULL;
	RECT	rect, drawRect;
	POINT	stPoint;

	VIEWORDER	stVwrder;

	INT		rdNextItem;
	LONG	rdDrawPxTop, rdBottom;	//	描画の最上位、描画領域の高さMAX
	LONG	rdHeight, rdWidth;	//	アイテムの高さ・描画領域の幅

	HPEN	hOldPen;

	//	項目の外接四角形の取得
	rect = pstDrawItem->rcItem;
	rdBottom = rect.bottom;
	rdWidth  = rect.right;
	rdDrawPxTop = 0;

	SetBkMode( pstDrawItem->hDC , TRANSPARENT );	//	文字描画は背景透過で夜露死苦

	FillRect( pstDrawItem->hDC, &rect, ghBkBrush );	//	一旦背景塗りつぶして

	gvcViewOrder.clear();

	rdNextItem = gixTopItem;
	for( rdDrawPxTop = 0; rdBottom > rdDrawPxTop; rdNextItem++ )
	{
		pcConts = AacAsciiArtGet( rdNextItem );	//	一覧のトップを確認
		if( !pcConts ){	break;	}

		stVwrder.index = rdNextItem;

		ptConStr = SjisDecodeAlloc( pcConts );	//	表示内容ガメてくる
		StringCchLength( ptConStr, STRSAFE_MAX_CCH, &rdLen );
		rdLength = rdLen;

		free( pcConts );
#pragma message ("MAAの行間、ここで正しく計算するべき")
		//	文字列に合わせてRECT確保・計算だけで、まだ書込してない
		DrawText( pstDrawItem->hDC, ptConStr, rdLength, &rect, DT_LEFT | DT_EDITCONTROL | DT_NOPREFIX | DT_CALCRECT );
		drawRect = rect;
		rdHeight = drawRect.bottom;
		drawRect.bottom += rdDrawPxTop;
		drawRect.top     = rdDrawPxTop;
		if( drawRect.right < rdWidth )	drawRect.right = rdWidth;

		stVwrder.dHeight = rdHeight;
		stVwrder.dUpper  = drawRect.top;
		stVwrder.dDownr  = drawRect.bottom;

		//	項目ごとに互い違いの色にするか、区切り線を引く
		if( gbLineSep ){	FillRect( pstDrawItem->hDC, &drawRect, ghBkBrush );	}
		else
		{
			if( 1 & rdNextItem )	FillRect( pstDrawItem->hDC, &drawRect, GetStockBrush(LTGRAY_BRUSH) );
			else					FillRect( pstDrawItem->hDC, &drawRect, ghBkBrush );
		}

		//	AA描画
		DrawText( pstDrawItem->hDC, ptConStr, rdLength, &drawRect, DT_LEFT | DT_EDITCONTROL | DT_NOPREFIX );

		if( gbLineSep )	//	線を引く
		{
			hOldPen = SelectPen( pstDrawItem->hDC, ghSepPen );
			MoveToEx( pstDrawItem->hDC, drawRect.left, drawRect.bottom-1, NULL );
			LineTo( pstDrawItem->hDC, drawRect.right, drawRect.bottom-1 );
			SelectPen( pstDrawItem->hDC, hOldPen );
		}

		gvcViewOrder.push_back( stVwrder );

		rdDrawPxTop += rdHeight;

		free( ptConStr );
	}
	InvalidateRect( ghScrollWnd, NULL, TRUE );
	UpdateWindow( ghScrollWnd );

	//	カーソル位置確保し直し・ポッパップ表示用
	GetCursorPos( &stPoint );
	ScreenToClient( ghItemsWnd, &stPoint );
	Aai_OnMouseMove( hWnd, stPoint.x, stPoint.y, 0 );

	return;
}
Esempio n. 13
0
/*!
	ユーザ定義のアレを読み込む
	@param[in]	hWnd	メインウインドウハンドル
	@param[in]	bFirst	今回が最初であるか
	@return	非0中身取った処理した 0ファイルなかった
*/
INT UserDefInitialise( HWND hWnd, UINT bFirst )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT	cchSize;

	if( bFirst )	//	最初ならパス作っておく
	{
		ZeroMemory( gatUsDfPath, sizeof(gatUsDfPath) );
		StringCchCopy( gatUsDfPath, MAX_PATH, ExePathGet() );
		PathAppend( gatUsDfPath, TEMPLATE_DIR );
		PathAppend( gatUsDfPath, USER_ITEM_FILE );
	}

	hFile = CreateFile( gatUsDfPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//	今の内容破棄
	UserDefObliterate( hWnd );

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 2 );
	ZeroMemory( pBuffer, iByteSize + 2 );
	//	中身をいただく
	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチャック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、&#0000;の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	SJISの内容をユニコードにする

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更
	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

	//	ASTじゃなきゃダメ
	if( !( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) )
	{
		DocStringSplitAST( ptString , cchSize, UserDefItemLoad );
	}

	FREE( pBuffer );

	UserDefAppendMenu( hWnd );

	return 1;
}